如何使用NLTK打印Wordnet的全部内容?

10

NLTK提供了在Brown(或Gutenberg)语料库中打印所有单词的函数。但是等效的函数似乎在Wordnet上无法工作。

是否有一种通过NLTK完成此操作的方法?如果没有,该如何实现?

这个可以运行:

from nltk.corpus import brown as b
print b.words()

这会导致一个AttributeError错误:

from nltk.corpus import wordnet as wn
print wn.words()
3个回答

23

对于WordNet而言,它是一个单词义项资源库,因此该资源中的元素按照义项(也称为synsets)进行索引。

要遍历synsets

>>> from nltk.corpus import wordnet as wn
>>> for ss in wn.all_synsets():
...     print ss
...     print ss.definition()
...     break
... 
Synset('able.a.01')
(usually followed by `to') having the necessary means or skill or know-how or authority to do something

对于每个synset(sense/concept),都有一个与之关联的单词列表,称为lemmas:这些lemmas是我们在查词典时使用的单词的规范(“根”)形式。
使用一行代码获取WordNet中所有lemmas的完整列表:
>>> lemmas_in_wordnet = set(chain(*[ss.lemma_names() for ss in wn.all_synsets()]))

有趣的是,wn.words()也会返回所有的lemma_names

>>> lemmas_in_words  = set(i for i in wn.words())
>>> len(lemmas_in_wordnet)
148730
>>> len(lemmas_in_words)
147306

但是奇怪的是,使用 wn.words() 收集的单词总数存在一些差异。

将 wordnet 的完整内容打印成文本似乎是一件过于雄心勃勃的事情,因为 wordnet 的结构有点像一个分层图,同义词集相互连接,每个同义词集都有自己的属性/特性。这就是为什么 wordnet 文件不仅仅被保存为单个文本文件的原因。

要查看同义词集包含的内容:

>>> first_synset = next(wn.all_synsets())
>>> dir(first_synset)
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_all_hypernyms', '_definition', '_examples', '_frame_ids', '_hypernyms', '_instance_hypernyms', '_iter_hypernym_lists', '_lemma_names', '_lemma_pointers', '_lemmas', '_lexname', '_max_depth', '_min_depth', '_name', '_needs_root', '_offset', '_pointers', '_pos', '_related', '_shortest_hypernym_paths', '_wordnet_corpus_reader', 'also_sees', 'attributes', 'causes', 'closure', 'common_hypernyms', 'definition', 'entailments', 'examples', 'frame_ids', 'hypernym_distances', 'hypernym_paths', 'hypernyms', 'hyponyms', 'instance_hypernyms', 'instance_hyponyms', 'jcn_similarity', 'lch_similarity', 'lemma_names', 'lemmas', 'lexname', 'lin_similarity', 'lowest_common_hypernyms', 'max_depth', 'member_holonyms', 'member_meronyms', 'min_depth', 'name', 'offset', 'part_holonyms', 'part_meronyms', 'path_similarity', 'pos', 'region_domains', 'res_similarity', 'root_hypernyms', 'shortest_path_distance', 'similar_tos', 'substance_holonyms', 'substance_meronyms', 'topic_domains', 'tree', 'unicode_repr', 'usage_domains', 'verb_groups', 'wup_similarity']

浏览这个 howto 会有助于了解如何访问WordNet中所需的信息:http://www.nltk.org/howto/wordnet.html


我正在使用NLTK 3.0.3,lemmas_in_words = set(i for i in wn.words()) 给出了以下错误:AttributeError: 'WordNetCorpusReader'对象没有'words'属性。 - zadrozny
升级到NLTK 3.1 pip install -U nltk =) - alvas
1
谢谢。那个起了作用。顺便说一下,我看到你在台湾大学。今年我去台湾呆了几个月,非常喜欢它。 - zadrozny
2
很高兴这个答案有所帮助。顺便说一下,“NTU”是有歧义的,wn.synsets('NTU') = [ Synset('Nanyang_Technological_University.n.1'), Synset('National_Taiwan_University.n.1') ] - alvas

2
这将生成一个同义词集中所有单词的输出结果:
from nltk.corpus import wordnet as wn
synonyms=[]
for word in wn.words():
    print (word,end=":")
    for syn in wn.synsets(word):
      for l in syn.lemmas():
        synonyms.append(l.name())
    print(set(synonyms),end="\n")
    synonyms.clear()

2
附上一些解释会很好! - Vaibhav
这将生成一个同义词集中所有单词的同义词输出。 - Raveena
2
请编辑您的问题并提供详细信息。仅包含代码的答案往往会被标记为“低质量”并被删除。 - Graham

2
请尝试以下操作:
for word in wn.words():
    print word

这应该能够工作,因为 wn.words() 实际上是一个生成字符串序列的迭代器,而不是像 b.words 那样的字符串列表。 for 循环会导致迭代器逐个生成单词。

我有:AttributeError: 'WordNetCorpusReader'对象没有'words'属性。 - zadrozny
嗯...尝试以下两行代码,看看你是否会得到与我相同的响应:wn.words Out[10]: <bound method WordNetCorpusReader.words of <WordNetCorpusReader in u'/Users/sbarkin/nltk_data/corpora/wordnet'>> wn.words()Out[11]: <dictionary-keyiterator at 0x1128cae68> - Steven Barkin
不好意思,你使用的是哪个NLTK?我在用3.0.4版本。 - zadrozny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接