Чтобы найти синонимы, определения и примеры предложений с помощью WordNet

Мне нужно взять текстовый файл с одним словом. Затем мне нужно найти имена, определения и примеры lemma_names, используя wordnet. Я прочитал книгу: "Обработка текста на Python с помощью Cookbook NLTK 2.0", а также "Обработка естественного языка с использованием NLTK", чтобы помочь мне в этом направлении. Хотя я понял, как это можно сделать с помощью терминала, я не могу сделать то же самое с помощью текстового редактора.

Например, если входной текст имеет слово "flabbergasted", выход должен быть таким образом:

ошарашил (глагол) flabbergast, boggle, чаша, преодолеваемая с изумлением; "Это ошеломило ум!" (прилагательное) ошеломленное, ошеломленное, ошеломленное, ошеломленное, громовое, ошеломленное, ошарашенное - как будто безумное удивление и удивление; "Круг полицейского был ошеломлен ее отрицанием того, что видел несчастный случай"; "ошеломленные ольдермены были безмолвными"; "был потрясен новостями о его продвижении"

Синтесы, определения и примеры предложений получены из WordNet напрямую!

У меня есть следующий фрагмент кода:


from __future__ import division
import nltk
from nltk.corpus import wordnet as wn


tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
fp = open("inpsyn.txt")
data = fp.read()

#to tokenize input text into sentences

print '\n-----\n'.join(tokenizer.tokenize(data))# splits text into sentences

#to tokenize the tokenized sentences into words

tokens = nltk.wordpunct_tokenize(data)
text = nltk.Text(tokens)
words = [w.lower() for w in text]  
print words     #to print the tokens

for a in words:
    print a

syns = wn.synsets(a)
print "synsets:", syns

for s in syns:
    for l in s.lemmas:
        print l.name
    print s.definition
    print s.examples

Я получаю следующий вывод:


flabbergasted

['flabbergasted']
flabbergasted
synsets: [Synset('flabbergast.v.01'), Synset('dumbfounded.s.01')]
flabbergast
boggle
bowl_over
overcome with amazement
['This boggles the mind!']
dumbfounded
dumfounded
flabbergasted
stupefied
thunderstruck
dumbstruck
dumbstricken
as if struck dumb with astonishment and surprise
['a circle of policement stood dumbfounded by her denial of having seen the accident', 'the flabbergasted aldermen were speechless', 'was thunderstruck by the news of his promotion']

Есть ли способ получить часть речи вместе с группой имен леммы?

Ответы

Ответ 1

def synset(word):
    wn.synsets(word)

ничего не возвращает, поэтому по умолчанию вы получаете None

вам следует написать

def synset(word):
    return wn.synsets(word)

Извлечение имен леммы:

from nltk.corpus import wordnet
syns = wordnet.synsets('car')
syns[0].lemmas[0].name
>>> 'car'
[s.lemmas[0].name for s in syns]
>>> ['car', 'car', 'car', 'car', 'cable_car']


[l.name for s in syns for l in s.lemmas]
>>>['car', 'auto', 'automobile', 'machine', 'motorcar', 'car', 'railcar', 'railway_car', 'railroad_car', 'car', 'gondola', 'car', 'elevator_car', 'cable_car', 'car']

Ответ 2

Здесь я создал модуль, который может быть легко использован (импортирован) и с переданной ему строкой, вернет все слова леммы строки.

Модуль:

#!/usr/bin/python2.7
''' pass a string to this funciton ( eg 'car') and it will give you a list of
words which is related to cat, called lemma of CAT. '''
from nltk.corpus import wordnet as wn
import sys
#print all the synset element of an element
def lemmalist(str):
    syn_set = []
    for synset in wn.synsets(str):
        for item in synset.lemma_names:
            syn_set.append(item)
    return syn_set

Использование:

Примечание: имя модуля - lemma.py, следовательно, "из леммы импорта лемматиста"

>>> from lemma import lemmalist
>>> lemmalist('car')
['car', 'auto', 'automobile', 'machine', 'motorcar', 'car', 'railcar', 'railway_car', 'railroad_car', 'car', 'gondola', 'car', 'elevator_car', 'cable_car', 'car']

Ура!

Ответ 3

synonyms = []
for syn in wordnet.synsets("car"):
    for l in syn.lemmas():
        synonyms.append(l.name())
print synonyms

Ответ 4

В NLTK 3.0, lemma_names был изменен с атрибута на метод. Поэтому, если вы получите сообщение об ошибке:

TypeError: 'method' object is not iterable

Вы можете исправить это, используя:

>>> from nltk.corpus import wordnet as wn
>>> [item for sysnet in wn.synsets('car') for item in sysnet.lemma_names()]

Это выведет:

>>> [
       'car', 'auto', 'automobile', 'machine', 'motorcar', 'car', 
       'railcar', 'railway_car', 'railroad_car', 'car', 'gondola', 
       'car', 'elevator_car', 'cable_car', 'car'
    ]