Как преобразовать список токенов в список лемм wordnet с помощью nltk?
У меня есть список токенов, извлеченных из источника в формате PDF. Я могу предварительно обработать текст и токенизировать его, но я хочу пройтись по токенам и преобразовать каждый токен в списке в его лемму в корпусе Wordnet. Итак, мой список токенов выглядит так:
['0000', 'Everyone', 'age', 'remembers', 'Þ', 'rst', 'heard', 'contest', 'I', 'sitting', 'hideout', 'watching', ...]
Там нет лемм слов, таких как "Все", "0000", "Þ" и многие другие, которые мне нужно исключить. Но для таких слов, как "возраст", "помнит", "слышал" и т. Д. Список токенов должен выглядеть следующим образом:
['age', 'remember', 'hear', ...]
Я проверяю синонимы через этот код:
syns = wn.synsets("heard")
print(syns[0].lemmas()[0].name())
На данный момент я создал функцию clean_text() в Python для предварительной обработки. Это выглядит так:
def clean_text(text):
# Eliminating punctuations
text = "".join([word for word in text if word not in string.punctuation])
# tokenizing
tokens = re.split("\W+", text)
# lemmatizing and removing stopwords
text = [wn.lemmatize(word) for word in tokens if word not in stopwords]
# converting token list into synset
syns = [text.lemmas()[0].name() for text in wn.synsets(text)]
return text
Я получаю ошибку:
syns = [text.lemmas()[0].name() for text in wn.synsets(text)]
AttributeError: 'list' object has no attribute 'lower'
Как получить список токенов для каждой леммы?
Полный код:
import string
import re
from wordcloud import WordCloud
import nltk
from nltk.tokenize.treebank import TreebankWordDetokenizer
from nltk.corpus import wordnet
import PyPDF4
import matplotlib
import numpy as np
from PIL import Image
stopwords = nltk.corpus.stopwords.words('english')
moreStopwords = ['clin97803078874365pallr1indd'] # additional stopwords to be removed manually.
wn = nltk.WordNetLemmatizer()
data = PyPDF4.PdfFileReader(open('ReadyPlayerOne.pdf', 'rb'))
pageData = ''
for page in data.pages:
pageData += page.extractText()
# print(pageData)
def clean_text(text):
text = "".join([word for word in text if word not in string.punctuation])
tokens = re.split("\W+", text)
text = [wn.lemmatize(word) for word in tokens if word not in stopwords]
syns = [text.lemmas()[0].name() for text in wordnet.synsets(text)]
return syns
print(clean_text(pageData))
1 ответ
Ты звонишь wordnet.synsets(text)
со списком слов (проверьте, что text
в этот момент), и вы должны назвать это с word
, Предварительная обработка wordnet.synsets
пытается применить .lower()
к его параметрам и, следовательно, к ошибке (AttributeError: 'list' object has no attribute 'lower'
).
Ниже приведена функциональная версия clean_text
с исправлением этой проблемы:
import string
import re
import nltk
from nltk.corpus import wordnet
stopwords = nltk.corpus.stopwords.words('english')
wn = nltk.WordNetLemmatizer()
def clean_text(text):
text = "".join([word for word in text if word not in string.punctuation])
tokens = re.split("\W+", text)
text = [wn.lemmatize(word) for word in tokens if word not in stopwords]
lemmas = []
for token in text:
lemmas += [synset.lemmas()[0].name() for synset in wordnet.synsets(token)]
return lemmas
text = "The grass was greener."
print(clean_text(text))
Возвращает:
['grass', 'Grass', 'supergrass', 'eatage', 'pot', 'grass', 'grass', 'grass', 'grass', 'grass', 'denounce', 'green', 'green', 'green', 'green', 'fleeceable']