3
votes

Suppression de chaînes de la liste commençant par certaines expressions

J'ai une liste de chaînes associées aux hashtags Twitter. Je souhaite supprimer des chaînes entières qui commencent par certains préfixes.

Par exemple:

import nltk 

for line in testlist:
tokens = nltk.tokenize.word_tokenize(line)
for token in tokens:
    for word in prefixes:
        if token.startswith(word):
            token = token.replace(word,"")
            print(token)

Je voudrais pour supprimer les URL de l'image, les hashtags et les @

J'ai essayé plusieurs choses jusqu'à présent, à savoir en utilisant la méthode startswith () et le replace () .

Par exemple:

prefixes = ['pic.twitter.com', '#', '@']
bestlist = []

for line in testlist:
    for word in prefixes:
        line = line.replace(word,"")
        bestlist.append(line)

Cela semble se débarrasser de 'pic.twitter.com', mais pas la série de lettres et de chiffres à la fin de l'URL. Ces chaînes sont dynamiques et auront une URL de fin différente à chaque fois ... c'est pourquoi je veux me débarrasser de la chaîne entière si elles commencent par ce préfixe.

J'ai également essayé de tout tokeniser, mais replace () ne supprime toujours pas le mot entier:

testlist = ['Just caught up with #FlirtyDancing. Just so cute! Loved it. ', 'After work drinks with this one @MrLukeBenjamin no dancing tonight though @flirtydancing @AshleyBanjo #FlirtyDancing pic.twitter.com/GJpRUZxUe8', 'Only just catching up and @AshleyBanjo you are gorgeous #FlirtyDancing', 'Loved working on this. Always a pleasure getting to assist the wonderful @kendrahorsburgh on @ashleybanjogram wonderful new show !! #flirtydancing pic.twitter.com/URMjUcgmyi', 'Just watching #FlirtyDancing & \n@AshleyBanjo what an amazing way to meet someone.. It made my heart all warm & fuzzy for these people! both couples meet back up.. pic.twitter.com/iwCLRmAi5n',]

Je commence à perdre espoir dans le startswith () et la méthode replace () , et je pense que je pourrais aboyer le mauvais arbre avec ces deux éléments.

Y a-t-il une meilleure façon de procéder? Comment puis-je obtenir le résultat souhaité en supprimant toutes les chaînes commençant par #, @ et pic.twitter?


0 commentaires

4 Réponses :


3
votes

Vous pouvez utiliser une expression régulière pour spécifier les types de mots que vous souhaitez remplacer et utiliser re.sub

Just caught up with  Just so cute! Loved it. 
After work drinks with this one  no dancing tonight though    
Only just catching up and  you are gorgeous 
Loved working on this. Always a pleasure getting to assist the wonderful  on  wonderful new show !!  
Just watching  & 
 what an amazing way to meet someone.. It made my heart all warm & fuzzy for these people! both couples meet back up.. 

import re

testlist = ['Just caught up with #FlirtyDancing. Just so cute! Loved it. ', 'After work drinks with this one @MrLukeBenjamin no dancing tonight though @flirtydancing @AshleyBanjo #FlirtyDancing pic.twitter.com/GJpRUZxUe8', 'Only just catching up and @AshleyBanjo you are gorgeous #FlirtyDancing', 'Loved working on this. Always a pleasure getting to assist the wonderful @kendrahorsburgh on @ashleybanjogram wonderful new show !! #flirtydancing pic.twitter.com/URMjUcgmyi', 'Just watching #FlirtyDancing & \n@AshleyBanjo what an amazing way to meet someone.. It made my heart all warm & fuzzy for these people! both couples meet back up.. pic.twitter.com/iwCLRmAi5n',]
regexp = r'pic\.twitter\.com\S+|@\S+|#\S+'

res = [re.sub(regexp, '', sent) for sent in testlist]
print(res)


0 commentaires

2
votes

Cette solution n'utilise pas d'expression régulière ni aucune importation supplémentaire.

python test.py 
Just caught up with Just so cute! Loved it.
After work drinks with this one no dancing tonight though
Only just catching up and you are gorgeous
Loved working on this. Always a pleasure getting to assist the wonderful on wonderful new show !!
Just watching & what an amazing way to meet someone.. It made my heart all warm & fuzzy for these people! both couples meet back up..

Cela donne le résultat suivant:

prefixes = ['pic.twitter.com', '#', '@']
testlist = ['Just caught up with #FlirtyDancing. Just so cute! Loved it. ', 'After work drinks with this one @MrLukeBenjamin no dancing tonight though @flirtydancing @AshleyBanjo #FlirtyDancing pic.twitter.com/GJpRUZxUe8', 'Only just catching up and @AshleyBanjo you are gorgeous #FlirtyDancing', 'Loved working on this. Always a pleasure getting to assist the wonderful @kendrahorsburgh on @ashleybanjogram wonderful new show !! #flirtydancing pic.twitter.com/URMjUcgmyi', 'Just watching #FlirtyDancing & \n@AshleyBanjo what an amazing way to meet someone.. It made my heart all warm & fuzzy for these people! both couples meet back up.. pic.twitter.com/iwCLRmAi5n',]


def iter_tokens(line):
    for word in line.split():
        if not any(word.startswith(prefix) for prefix in prefixes):
            yield word

for line in testlist:
    row = list(iter_tokens(line))
    print(' '.join(row))


0 commentaires

1
votes

Vous devez utiliser des expressions régulières plutôt que des chaînes statiques. replace ne reconnaît pas les expressions régulières. Vous devez utiliser re.sub à la place. Pour supprimer les URL comme vous l'avez décrit d'une seule chaîne s , vous auriez besoin de quelque chose comme ce qui suit:

import re
re.sub('pic\.twitter\.com[^a-zA-Z0-9,.\-!/()=?`*;:_{}\[\]\|~%-]*', '', s)

Pour faire correspondre les balises, les réponses et les URL que vous pouvez effectuer opérations sub successives, ou combiner toutes les expressions régulières en une seule expression. Le premier est meilleur si vous avez de nombreux modèles et doit être combiné avec re.compile.

Notez que cela ne correspondra qu'aux URL avec le domaine twitter.com et le sous-domaine pic. Pour correspondre à n'importe quelle URL, vous devrez augmenter l'expression régulière avec le modèle de correspondance approprié. Voir peut-être ce message . P >

edit: a généralisé l'expression régulière selon la RFC 3986 selon Commentaire de I.Am.A.Guy .


1 commentaires

Belle prise. Mis à jour avec une regex plus robuste.



1
votes
prefixes = {'pic.twitter.com', '#', '@'} # use sets for faster lookups

def clean_tweet(tweet):
    return " ".join(for word in line.split() if (word[:15] not in prefixes) or (word[0] not in prefixes))
Or look at:https://www.nltk.org/api/nltk.tokenize.htmlTweetTokenizer can solve much of your problems.

0 commentaires