【问题标题】:Printing the part of speech along with the synonyms of the word打印词性以及单词的同义词
【发布时间】:2011-05-11 15:30:00
【问题描述】:

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

flabbergasted 这个词的同义词有 1) flabbergast , boggle , bowl over 是动词和 2) dumbfounded , dumfounded , flabbergasted , stupefied , Thunderstruck ,dumbstruck ,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 

【问题讨论】:

    标签: python nltk wordnet


    【解决方案1】:

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

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

    不幸的是,除了source code 之外,似乎没有任何地方记录这一点,它显示了可以在同义词集上调用的其他方法。

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

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

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        【解决方案3】:

        引理有一个synset 属性,它在其pos 属性中有自己的词性。所以,如果我们有一个引理为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
        

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

        【讨论】:

        • pos 函数给我以下错误:lemma.synset.pos AttributeError: 'function' object has no attribute 'pos'
        • 感谢您的来信。自从我写了这个答案以来,NLTK API 发生了变化。我会找时间更新这个答案。
        • 你能告诉我使用带有同义词集的引理可以给出 pos 的函数
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        • 1970-01-01
        相关资源
        最近更新 更多