2015-09-11 23 views
0

我运行了以下功能:转化共发现TXT成蟒蛇NLTK名单

import nltk 
from nltk.corpus import wordnet as wn 

def noun_names(list): 
    for synset in list: 
     for lemma in synset.lemmas(): 
      print lemma.name() 

noun_names(list(wn.all_synsets(wn.NOUN))) 

并返回名词的所有名称的共发现一个长长的清单:

例如

epoch 
Caliphate 
Christian_era 
Common_era 
day 
year_of_grace 
Y2K 
generation 
anniversary 

我该如何把这个输出既不是字符串也不是列表,并将它变成列表?非常感谢。

回答

0

除了打印到标准输出与您:

print lemma.name() 

为什么不把它添加到列表,并返回列表?

def noun_names(list): 
    names = [] 
    for synset in list: 
     for lemma in synset.lemmas(): 
      names.append(lemma.name()) 
    return names 

names = noun_names(list(wn.all_synsets(wn.NOUN))) 
+0

太谢谢你了。我以前试图做到这一点,但我忘记了最后一行“返回名称”,它完成了循环。很有帮助! – DRG

+0

不用担心 - 您应该也可以注意Andy的警告 - 在Python中命名列表“列表”通常是一个危险的命题。 – georgeofallages

0

它没有返回任何东西。您的功能是印刷,不返回。

您需要返回一个列表。作为一个附注,你应该从list重命名你的函数参数。你会无意中破坏一些东西。

一种选择是稍微修改你的函数追加到一个列表,然后返回:

def noun_names(word_list): 
    lemma_list = [] 
    for synset in word_list: 
     for lemma in synset.lemmas(): 
      lemma_list.append(lemma.name()) 
    return lemma_list 

另一种选择是上述改变成一个列表理解:

def noun_names(word_list): 
    return [lemma.name() for synset in word_list for lemma in synset.lemmas()] 

这两个函数都会返回一个具有相同信息的列表。请注意,由于函数返回list,所以我删除了list()函数包装器wn.all_synsets(wn.NOUN)

lemma_list1 = noun_names(wn.all_synsets(wn.NOUN)) 
lemma_list2 = noun_names_1(wn.all_synsets(wn.NOUN)) 
print len(lemma_list1), len(lemma_list2), len(lemma_list1) == len(lemma_list2), lemma_list1 == lemma_list2 

即最终打印语句输出:

146347 146347 True True 

这表明两个列表具有相同数量的元素(146347每个和第一True)和列表本身是相等的。代码中的一个更合适的测试是:

assert len(lemma_list1) == len(lemma_list2) 
assert lemma_list1 == lemma_list2 

如果列表是不一样的长度或等于assert声明会抛出异常。

+0

非常感谢Andy,对于建议和详细的回复。我是NLP新手,很高兴看到这样一个有用的在线社区。 – DRG

0

如果你只需要引理的列表,请访问OMW(开放多语种共发现)http://compling.hss.ntu.edu.sg/omw/

$ wget http://compling.hss.ntu.edu.sg/omw/wns/eng.zip 
$ unzip eng.zip 
$ cut -f3 eng/wn-data-eng.tab | (read;cat)