2017-08-23 5 views
0

Je souhaite supprimer les mots marqués avec les balises de partie de discours spécifiques VBD et VBN de mon fichier CSV. Mais, je reçois l'erreur « IndexError: liste des index hors de portée » après avoir entré le code suivant:Comment puis-je supprimer tous les tags POS à l'exception de 'VBD' et 'VBN' de mon fichier CSV?

for word in POS_tag_text_clean: 
    if word[1] !='VBD' and word[1] !='VBN': 
     words.append(word[0]) 

Mon fichier CSV a 10 avis de 10 personnes et le nom de la ligne est Comment.

Voici mon code complet:

df_Comment = pd.read_csv("myfile.csv") 

def clean(text): 
    stop = set(stopwords.words('english')) 
    exclude = set(string.punctuation) 
    lemma = WordNetLemmatizer() 
    tagged = nltk.pos_tag(text) 

    text = text.rstrip() 
    text = re.sub(r'[^a-zA-Z]', ' ', text) 
    stop_free = " ".join([i for i in text.lower().split() if((i not in stop) and (not i.isdigit()))]) 
    punc_free = ''.join(ch for ch in stop_free if ch not in exclude) 
    normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split()) 
    return normalized 

text_clean = [] 
for text in df)Comment['Comment']: 
    text_clean.append(clean(text).split()) 
print(text_clean) 

POS_tag_text_clean = [nltk.pos_tag(t) for t in text_clean] 
print(POS_tag_text_clean) 


words=[] 
for word in POS_tag_text_clean: 
    if word[1] !='VBD' and word[1] !='VBN': 
     words.append(word[0]) 

Comment puis-je corriger l'erreur?

+0

Dans le titre, le 'NN' et 'JJ' devrait être remplacé par 'VBD' et 'VBN'. Pardon. – bluesun

+0

Veuillez ajouter où se trouve l'erreur. –

+0

L'erreur ('IndexError: index de la liste hors de portée) se produit après avoir entré le dernier code ci-dessus; pour mot dans POS_tag_text_clean: si mot [1]! = 'VBD' et mot [1]! = 'VBN': mots.append (mot [0]) – bluesun

Répondre

0

Il est un peu difficile à comprendre votre problème sans exemple et les sorties correspondantes, mais il est peut-être ceci:

En supposant que text est une chaîne, text_clean sera une liste de listes de chaînes, où chaque chaîne représente un mot. Après le marquage de la partie du discours, POS_tag_text_clean sera donc une liste de listes de tuples, chaque ligne contenant un mot et son étiquette.

Si j'ai raison, alors votre dernière boucle boucle sur les éléments de votre base de données plutôt que sur les mots, comme le suggère le nom de la variable. Si un élément n'a qu'un mot (ce qui n'est pas si improbable, puisque vous filtrez beaucoup dans clean()), votre appel à word[1] échouera avec une erreur similaire à celle que vous signalez.

Au lieu de cela, essayez ce code:

words = [] 
for item in POS_tag_text_clean: 
    words_in_item = [] 
    for word in item: 
     if word[1] !='VBD' and word[1] !='VBN': 
     words_in_item .append(word[0]) 
    words.append(words_in_item) 
+0

Oui! C'est ce que je voulais. Vraiment merci pour votre aide :) – bluesun

+0

Great. Pourriez-vous également accepter la réponse? – Tobias

+0

Tobias, pourriez-vous s'il vous plaît laissez-moi savoir comment extraire les mots marqués avec les balises de partie-de-discours spécifiques, telles que NN et RBS? – bluesun