2010-10-14 5 views
2

J'essaie de faire défiler un tas de documents que je dois mettre chaque mot dans une liste pour ce document. Je le fais comme ça. stoplist est juste une liste de mots que je veux ignorer par défaut.Comment utiliser rstrip pour supprimer les caractères de fin?

texts = [[word for word in document.lower().split() if word not in stoplist] 
     for document in documents] 

Je suis revenu avec une liste de documents, et dans chacune de ces listes, une liste de mots. Certains mots contiennent encore la ponctuation finale ou d'autres anomalies. Je pensais que je pouvais le faire, mais il ne semble pas fonctionner droit

texts = [[word.rstrip() for word in document.lower().split() if word not in stoplist] 
     for document in documents] 

Ou

texts = [[word.rstrip('.,:!?:') for word in document.lower().split() if word not in stoplist] 
     for document in documents] 

Mon autre question est la suivante. Je peux voir des mots comme celui-ci où je veux garder le mot, mais vider les chiffres/caractères spéciaux.

agency[15] 
assignment[72], 
you’ll 
america’s 

Donc, pour nettoyer la plupart des autres bruits, je pensais que je devrais garder enlever les caractères de la fin d'une chaîne jusqu'à ce qu'il soit un zA-Z ou s'il y a plus de caractères spéciaux que les caractères alpha dans un chaîne, jetez-le. Vous pouvez voir cependant dans mes deux derniers exemples, la fin de la chaîne est un caractère alpha. Donc, dans ces cas, je devrais juste ignorer le mot en raison de la quantité de caractères spéciaux (plus de caractères alpha). Je pensais que je devrais juste chercher la fin des chaînes parce que je voudrais garder les mots coupés intacts si possible.

Fondamentalement, je veux supprimer toute ponctuation de fin sur chaque mot, et éventuellement un sous-programme qui gère les cas que je viens de décrire. Je ne suis pas sûr de savoir comment faire cela ou si c'est le meilleur moyen.

Répondre

3
>>> a = ['agency[15]','assignment72,','you’11','america’s'] 
>>> import re 
>>> b = re.compile('\w+') 
>>> for item in a: 
...  print b.search(item).group(0) 
... 
agency 
assignment72 
you 
america 
>>> b = re.compile('[a-z]+') 
>>> for item in a: 
...  print b.search(item).group(0) 
... 
agency 
assignment 
you 
america 
>>> 

Mise à jour

>>> a = "I-have-hyphens-yo!" 
>>> re.findall('[a-z]+',a) 
['have', 'hyphens', 'yo'] 
>>> re.findall('[a-z-]+',a) 
['-have-hyphens-yo'] 
>>> re.findall('[a-zA-Z-]+',a) 
['I-have-hyphens-yo'] 
>>> re.findall('\w+',a) 
['I', 'have', 'hyphens', 'yo'] 
>>> 
+0

Qu'en est-il des mots qui ont des traits d'union? Je voudrais garder ces mots intacts si possible. Les exemples peuvent être auto-rythmés, contre-renseignement, etc. – Nathan

+0

Mis à jour avec majuscules/traits d'union – Robus

+0

Cela fonctionne parfaitement, merci! – Nathan

1

Peut-être essayer re.findall à la place, avec un motif comme [a-z]+:

import re 
word_re = re.compile(r'[a-z]+') 
texts = [[match.group(0) for match in word_re.finditer(document.lower()) if match.group(0) not in stoplist] 
      for document in documents] 

texts = [[word for word in word_re.findall(document.lower()) if word not in stoplist] 
      for document in documents] 

Vous pouvez facilement modifier l'expression régulière pour obtenir les mots que vous voulez. Autre version utilise re.split:

import re 
word_re = re.compile(r'[^a-z]+') 
texts = [[word for word in word_re.split(document.lower()) if word and word not in stoplist] 
      for document in documents] 
+0

Je suis une erreur sur le premier "AttributeError: objet 'str' n'a pas d'attribut" groupe" et « UnboundLocalError: variable locale 'mot' référencé avant l'affectation "sur votre deuxième exemple. – Nathan

+1

Je suis désolé, j'ai corrigé les exemples, ils devraient fonctionner correctement maintenant. –

Questions connexes