打印词性以及单词的同义词

时间:2011-05-11 15:30:00

标签: python nltk wordnet

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

flabbergasted这个词的例子同义词是1)flabbergast,boggle,碗是动词和2)傻眼,笨拙,大惊小怪,恍恍惚惚,雷鸣般的,笨拙的,dumbstricken是形容词。

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


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 

3 个答案:

答案 0 :(得分:1)

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

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

syns = wn.synsets(a)似乎应位于words for循环中,因此您可以为每个单词执行此操作:

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

答案 1 :(得分:0)

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

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

我将把这两者作为读者的练习进行调和。

答案 2 :(得分:0)

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

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

不幸的是,除了source code以外,其他地方似乎都没有记录,{{3}}显示了可以在同义集上调用的其他方法。

  

同义词集属性,可通过具有相同名称的方法访问:

     
      
  • name:此同义词集的规范名称,使用该同义词集的第一个引理形成。请注意,这可能与名称不同   如果该字符串使用了不同的引理来传递给构造函数,则
      识别同义词集。
  •   
  • pos:同义词集的语音部分,与模块级别属性ADJ,ADJ_SAT,ADV,NOUN或VERB之一匹配。
  •   
  • lemmas:此同义词集的引理对象的列表。
  •   
  • definition:此同义词集的定义。
  •   
  • examples:此同义词集的示例字符串的列表。
  •   
  • offset:此同义词集在WordNet dict文件中的偏移量。
  •   
  • lexname:包含此同义词集的词典编辑器文件的名称。
  •