Я пытаюсь написать функцию, которая будет возвращать список определений NLTK для «токенов», размеченных из текстового документа с учетом ограничения части речи слова.
Сначала я преобразовал тег, заданный nltk.pos_tag, в тег, используемый wordnet.synsets, а затем по очереди применил .word_tokenize(), .pos_tag(), .synsets, как показано в следующем коде:
import numpy as np
import nltk
from nltk.corpus import wordnet as wn
import pandas as pd
#convert the tag to the one used by wordnet.synsets
def convert_tag(tag):
tag_dict = {'N': 'n', 'J': 'a', 'R': 'r', 'V': 'v'}
try:
return tag_dict[tag[0]]
except KeyError:
return None
#tokenize, tag, and find synsets (give the first match between each 'token' and 'word net_tag')
def doc_to_synsets(doc):
token = nltk.word_tokenize(doc)
tag = nltk.pos_tag(token)
wordnet_tag = convert_tag(tag)
syns = wn.synsets(token, wordnet_tag)
return syns[0]
#test
doc = 'document is a test'
doc_to_synsets(doc)
который, если он запрограммирован правильно, должен возвращать что-то вроде
[Synset('document.n.01'), Synset('be.v.01'), Synset('test.n.01')]
Однако Python выдает сообщение об ошибке:
'list' object has no attribute 'lower'
Я также заметил, что в сообщении об ошибке говорится
lemma = lemma.lower()
Означает ли это, что мне также нужно «лемматизировать» мои токены как этот предыдущий поток а> подсказать? Или я должен применить .lower() к текстовому документу, прежде чем делать все это?
Я новичок в wordnet, на самом деле не знаю, вызывает ли проблема .synsets или виновата часть nltk. Будет очень признателен, если кто-то может просветить меня по этому поводу.
Спасибо.
[Изменить] трассировка ошибок
AttributeError Traceback (most recent call last)
<ipython-input-49-5bb011808dce> in <module>()
22 return syns
23
---> 24 doc_to_synsets('document is a test.')
25
26
<ipython-input-49-5bb011808dce> in doc_to_synsets(doc)
18 tag = nltk.pos_tag(token)
19 wordnet_tag = convert_tag(tag)
---> 20 syns = wn.synsets(token, wordnet_tag)
21
22 return syns
/opt/conda/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py in synsets(self, lemma, pos, lang, check_exceptions)
1481 of that language will be returned.
1482 """
-> 1483 lemma = lemma.lower()
1484
1485 if lang == 'eng':
AttributeError: 'list' object has no attribute 'lower'
Итак, после использования кода, любезно предложенного @dugup и $udiboy1209, я получаю следующий вывод:
[[Synset('document.n.01'),
Synset('document.n.02'),
Synset('document.n.03'),
Synset('text_file.n.01'),
Synset('document.v.01'),
Synset('document.v.02')],
[Synset('be.v.01'),
Synset('be.v.02'),
Synset('be.v.03'),
Synset('exist.v.01'),
Synset('be.v.05'),
Synset('equal.v.01'),
Synset('constitute.v.01'),
Synset('be.v.08'),
Synset('embody.v.02'),
Synset('be.v.10'),
Synset('be.v.11'),
Synset('be.v.12'),
Synset('cost.v.01')],
[Synset('angstrom.n.01'),
Synset('vitamin_a.n.01'),
Synset('deoxyadenosine_monophosphate.n.01'),
Synset('adenine.n.01'),
Synset('ampere.n.02'),
Synset('a.n.06'),
Synset('a.n.07')],
[Synset('trial.n.02'),
Synset('test.n.02'),
Synset('examination.n.02'),
Synset('test.n.04'),
Synset('test.n.05'),
Synset('test.n.06'),
Synset('test.v.01'),
Synset('screen.v.01'),
Synset('quiz.v.01'),
Synset('test.v.04'),
Synset('test.v.05'),
Synset('test.v.06'),
Synset('test.v.07')],
[]]
Теперь проблема сводится к извлечению первого совпадения (или первого элемента) каждого списка из списка «syns» и превращению их в новый список. Для пробного документа «документ является тестом» он должен возвращать:
[Synset('document.n.01'), Synset('be.v.01'), Synset('angstrom.n.01'), Synset('trial.n.02')]
который представляет собой список первого совпадения для каждого токена в текстовом документе.
lemma = lemma.lower()
поставитьprint(lemma)
- person RulerOfTheWorld   schedule 29.08.2017