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?
4 Réponses :
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)
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))
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 .
Belle prise. Mis à jour avec une regex plus robuste.
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.