将 wordnet txt 转换为 python nltk 中的列表

transforming wordnet txt into lists in python 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)))

它returns一长串wordnet中的所有名词名称:

例如

epoch
Caliphate
Christian_era
Common_era
day
year_of_grace
Y2K
generation
anniversary

如何将这个既不是字符串也不是列表的输出转换为列表?非常感谢。

而不是打印到标准输出:

print lemma.name()

为什么不将其附加到列表中并 return 列表?

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)))

它没有 return 任何东西。您的功能是打印,而不是return打印。

您需要 return 一个列表。作为旁注,您应该将函数参数重命名为 list。你会无意中破坏某些东西。

一个选择是稍微修改您的函数以附加到列表,然后 return 即:

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()]

这两个功能 return 具有相同信息的列表。请注意,我删除了 wn.all_synsets(wn.NOUN) 周围的 list() 函数包装器,因为函数 return 是 list.

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 语句将抛出异常。

如果您只需要词条列表,请查看 OMW(Open Multilingual WordNet)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)