У меня есть список токенов, извлеченных из 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))