Печать части речи вместе с синонимами слова

У меня есть следующий код для взятия слова из входного текстового файла и печати синонимов, определений и примеров предложений для этого слова с помощью WordNet. Он отделяет синонимы от синонима на основе части речи, то есть синонимы, которые являются глаголами, и синонимы, являющиеся прилагательными, печатаются отдельно.

Например, для слова ошеломленный синонимами являются: 1) ошеломленный, ошеломленный, над которым стоят глаголы, и 2) ошеломленный, ошеломленный, ошеломленный, ошеломленный, ошеломленный, ошеломленный, ошеломленный, которые являются прилагательными.

Как напечатать часть речи вместе с синонимами? Я предоставил код, который у меня есть ниже:


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 

person ash    schedule 11.05.2011    source источник


Ответы (3)


Просто вызовите pos() в Synset. Чтобы перечислить все POS для леммы:

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

К сожалению, это нигде не задокументировано, кроме исходного кода, который показывает другие методы, которые могут быть вызваны в наборе synset.

Атрибуты Synset, доступные через одноименные методы:

  • name: Каноническое имя этого синсета, сформированное с использованием первой леммы этого синсета. Обратите внимание, что это имя может отличаться от имени, переданного конструктору, если в этой строке использовалась другая лемма для идентификации набора синхросигналов.
  • pos: часть речи synset, соответствующая одному из атрибутов уровня модуля ADJ, ADJ_SAT, ADV, NOUN или VERB.
  • lemmas: Список объектов Lemma для этого синсета.
  • definition: Определение для этого синсета.
  • examples: список примеров строк для этого набора синхронизации.
  • offset: смещение в файле WordNet dict этого набора данных.
  • lexname: имя файла лексикографа, содержащего этот набор данных.
person jrc    schedule 26.11.2019

Похоже, вы испортили отступ:

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
person zeekay    schedule 11.05.2011

У леммы есть атрибут 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

Я оставлю согласование этих двух вещей в качестве упражнения для читателя.

person Tim McNamara    schedule 08.06.2011
comment
функция pos выдает следующую ошибку: lemma.synset.pos AttributeError: объект 'function' не имеет атрибута 'pos' - person Coder 477; 20.05.2015
comment
Спасибо за замечание. NLTK API изменился с тех пор, как я написал этот ответ. Я найду время, чтобы обновить этот ответ. - person Tim McNamara; 20.05.2015
comment
Можете ли вы сказать мне функцию, которая может выдавать pos, используя лемму с synset - person Coder 477; 20.05.2015