2013-03-12 2 views
2
import nltk 
from nltk import * 
from nltk.corpus import wordnet as wn 

output=[] 
wordlist=[] 

entries = nltk.corpus.cmudict.entries() 

for entry in entries[:200]: #create a list of words, without the pronounciation since.pos_tag only works with a list 
    wordlist.append(entry[0]) 

for word in nltk.pos_tag(wordlist): #create a list of nouns 
    if(word[1]=='NN'): 
     output.append(word[0]) 

for word in output: 
    x = wn.synsets(word) #remove all words which does not have synsets (this is the problem) 
    if len(x)<1: 
     output.remove(word) 

for word in output[:200]: 
    print (word," ",len(wn.synsets(word))) 

Я пытаюсь удалить все слова без синтеза, но по какой-то причине он не работает. После запуска программы я обнаружил, что хотя слово имеет len (wn.synsets (word)) = 0, оно не удаляется из моего списка. Может ли кто-нибудь сказать мне, что пошло не так?Оператор Python IF с nltk.wordnet.synsets

ответ

5

Вы не можете перебирать список и удалять текущий элемент одновременно. Вот это игрушка пример, который демонстрирует проблему:

In [73]: output = range(10) 

In [74]: for item in output: 
    ....:  output.remove(item) 

Вы могли бы ожидать, что все элементы в output должны быть удалены. Но вместо того, чтобы половина из них по-прежнему остаются:

In [75]: output 
Out[75]: [1, 3, 5, 7, 9] 

Почему вы не можете зациклить и удалить одновременно:

Представьте Python, используя внутренний счетчик, чтобы помнить индекс тока когда он проходит через for-loop.

Когда счетчик равен 0 (первый раз через петлю), Python выполняет

output.remove(item) 

Fine. В output есть еще один элемент. Но тогда Python увеличивает счетчик на 1. Таким образом, следующее значение слова: output[1], , которое является третьим Элемент в исходном списке.

0 <-- first item removed 
1 <-- the new output[0] ** THIS ONE GETS SKIPPED ** 
2 <-- the new output[1] -- gets removed on the next iteration 

The (обходной путь) решение:

Вместо либо перебрать копию output или построить новый список. В этом случае я считаю более эффективным создание нового списка:

new_output = [] 
for word in output: 
    x = wn.synsets(word) 
    if len(x)>=1: 
     new_output.append(word) 
Смежные вопросы