Как преобразовать список токенов в список лемм wordnet с помощью nltk? - PullRequest
0 голосов
/ 21 ноября 2018

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

0 голосов
/ 21 ноября 2018

Вы звоните 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']
...