4

我有以下代码用于从输入文本文件中获取一个单词并使用 WordNet 打印该单词的同义词、定义和例句。它根据词性将同义词与同义词分开,即动词的同义词和形容词的同义词分开打印。

单词 flabbergasted 的同义词有 1) flabbergast , boggle , bowl over 它们是动词和 2) dumbfounded , dumfounded , flabbergasted , stupefied , Thunderstruck , 目瞪口呆 , 目瞪口呆是形容词。

如何打印词性和同义词?我在下面提供了到目前为止的代码:


import nltk
from nltk.corpus import wordnet as wn
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
fp = open('sample.txt','r')
data = fp.read()
tokens= nltk.wordpunct_tokenize(data)
text = nltk.Text(tokens)
words = [w.lower() for w in text]
for a in words:
   print a 
syns = wn.synsets(a)
for s in syns:
   print 
   print "definition:" s.definition
   print "synonyms:"
   for l in s.lemmas:
      print l.name
   print "examples:"
   for b in s.examples:
      print b
   print 
4

3 回答 3

2

只需调用pos()同义词集。列出引理的所有 POS:

>>> from nltk.corpus import wordnet as wn
>>> syns = wn.synsets('dog')
>>> set([x.pos() for x in syns])
{'n', 'v'}

不幸的是,这似乎没有在任何地方记录,除了源代码,它显示了可以在同义词集上调用的其他方法。

Synset 属性,可通过同名方法访问:

  • name:此同义词集的规范名称,使用此同义词集的第一个引理形成。
    请注意,如果该字符串使用不同的引理来标识同义词集,则这可能与传递给构造函数的名称不同。
  • pos:synset 的词性,匹配模块级属性 ADJ、ADJ_SAT、ADV、NOUN 或 VERB 之一。
  • lemmas:此同义词集的引理对象列表。
  • definition:此同义词集的定义。
  • examples:此同义词集的示例字符串列表。
  • offset:此同义词集的 WordNet dict 文件中的偏移量。
  • lexname:包含此同义词集的词典编纂器文件的名称。
于 2019-11-26T11:42:34.737 回答
1

看起来你搞砸了你的缩进:

for a in words:
   print a 
syns = wn.synsets(a)

似乎syns = wn.synsets(a)应该在wordsfor 循环内,因此您可以对每个单词执行此操作:

for w in words:
    print w
    syns = wn.synsets(w)
    for s in syns:
        print
        print "definition:", s.definition
        print "synonyms:"
        for l in s.lemmas:
            print l.name
        print "examples:"
        for b in s.examples:
            print b
    print
于 2011-05-11T19:02:12.020 回答
1

引理有一个synset属性,该属性在其属性中有自己的词性pos。所以,如果我们有一个引理 as l,我们可以像这样访问它的 spech 部分:

>>> l = Lemma('gladden.v.01.joy')
>>> l.synset.pos
'v'

更一般地说,我们可以将其扩展为一个循环来读取您的文件。我正在使用该with语句,因为它会在循环完成后很好地关闭文件。

>>> with open('sample.txt') as f:
...     raw = f.read()
...     for sentence in nltk.sent_tokenize(raw):
...         sentence = nltk.wordpunct_tokenize(sentence)
...         for word in sentence:
...             for synset in wn.synsets(word):
...                 for lemma in synset.lemmas:
...                     print lemma.name, lemma.synset.pos
...

如果您想确保只选择与您当前正在谈论的词具有相同词性的词条,那么您还需要识别该词的词性:

>>> import nltk
>>> from nltk.corpus import wordnet as wn
>>> with open('sample.txt') as f:
...     raw = f.read()
...     for sentence in nltk.sent_tokenize(raw):
...         sentence = nltk.pos_tag(nltk.wordpunct_tokenize(sentence))
...         for word, pos in sentence:
...             print word, pos

我将把这两者作为练习留给读者。

于 2011-06-08T10:18:30.297 回答