Как передать часть речи в WordNetLemmatizer? - PullRequest
0 голосов
/ 30 октября 2019

Я предварительно обрабатываю текстовые данные. Однако я столкнулся с проблемой лемматизации. Ниже приведен пример текста:

'В четверг в прокуратуру был направлен 18-летний мальчик, который якобы похитил в прошлом году криптовалюту на сумму около 15 миллионов иен (134 300 долларов США), взломав сайт хранения цифровой валюты. Полиция сообщила: «Это первое в Японии дело, в котором против хакера были возбуждены уголовные дела за потери в криптовалюте.», «\ n», «Мальчик из города Уцуномия, Точиги»Префектура, имя которой не разглашается из-за того, что он несовершеннолетний, якобы украл деньги после взлома Monappy, веб-сайта, где пользователи могут хранить виртуальную валюту monacoin в период с 14 августа по 1 сентября прошлого года ».« Он использовал программное обеспечение под названиемЭто затрудняет определение того, кто получает доступ к системе, но полиция опознала его, проанализировав записи сообщений, оставленные на сервере веб-сайта ».« Полиция сказала, что мальчик признался в обвинениях, цитируя его как «Я чувствовалкак я нашел трюк, которого никто не знает, и сделал это так, как будто ямы играем в видеоигры. »,« Он воспользовался недостатком функции веб-сайта, которая позволяет пользователю переводить валюту другому пользователю, зная, что система будет работать неправильно, если переводы будут повторяться в течение короткого периода времени. ',' Он неоднократно подавал запросы на перевод валюты самому себе, подавляя систему и позволяя ему регистрировать больше денег на своем счете. ',' Было затронуто около 7 700 пользователей, и оператор возместит их. ',' Мальчик позже положилПохищенные монакоины на счете, созданном другим оператором криптовалюты, получали выплаты в другой криптовалюте и покупали такие предметы, как смартфон, сообщила полиция. '' По словам оператора Monappy, украденные монакоины хранились с использованием системы спостоянное подключение к интернету, и те, кто оставался в автономном режиме, не были украдены. '

Мой код:

import pandas as pd
import nltk
from nltk.stem import PorterStemmer
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords

df = pd.read_csv('All Articles.csv')
df['Articles'] = df['Articles'].str.lower()

stemming = PorterStemmer()
stops = set(stopwords.words('english'))
lemma = WordNetLemmatizer()

def identify_tokens(row):
    Articles = row['Articles']
    tokens = nltk.word_tokenize(Articles)
    token_words = [w for w in tokens if w.isalpha()]
    return token_words


df['words'] = df.apply(identify_tokens, axis=1)


def stem_list(row):
    my_list = row['words']
    stemmed_list = [stemming.stem(word) for word in my_list]
    return (stemmed_list)


df['stemmed_words'] = df.apply(stem_list, axis=1)


def lemma_list(row):
    my_list = row['stemmed_words']
    lemma_list = [lemma.lemmatize(word, pos='v') for word in my_list]
    return (lemma_list)


df['lemma_words'] = df.apply(lemma_list, axis=1)


def remove_stops(row):
    my_list = row['lemma_words']
    meaningful_words = [w for w in my_list if not w in stops]
    return (meaningful_words)


df['stem_meaningful'] = df.apply(remove_stops, axis=1)


def rejoin_words(row):
    my_list = row['stem_meaningful']
    joined_words = (" ".join(my_list))
    return joined_words


df['processed'] = df.apply(rejoin_words, axis=1)

Как видно из кода, я использую панд,Однако здесь я привел пример текста.

Моя проблемная область:

def lemma_list(row):
    my_list = row['stemmed_words']
    lemma_list = [lemma.lemmatize(word, pos='v') for word in my_list]
    return (lemma_list)

df['lemma_words'] = df.apply(lemma_list, axis=1)

Хотя код работает без каких-либо ошибок, функция леммы не работает ожидаемым образом.

Заранее спасибо.

1 Ответ

1 голос
/ 30 октября 2019

В приведенном выше коде вы пытаетесь лемматизировать слова, которые были взяты. Когда лемматизатор сталкивается со словом, которое он не распознает, он просто возвращает это слово. Например, при использовании offline получается offlin, а когда вы запускаете его через лемматизатор, оно просто возвращает то же слово offlin.

Ваш код должен быть изменен на лемматизацию words, вот так ...

def lemma_list(row):
    my_list = row['words']  # Note: line that is changed
    lemma_list = [lemma.lemmatize(word, pos='v') for word in my_list]
    return (lemma_list)
df['lemma_words'] = df.apply(lemma_list, axis=1)
print('Words: ',  df.ix[0,'words'])
print('Stems: ',  df.ix[0,'stemmed_words'])
print('Lemmas: ', df.ix[0,'lemma_words'])

Это приводит к ...

Words:  ['and', 'those', 'kept', 'offline', 'were', 'not', 'stolen']
Stems:  ['and', 'those', 'kept', 'offlin',  'were', 'not', 'stolen']
Lemmas: ['and', 'those', 'keep', 'offline', 'be',   'not', 'steal']

Что является правильным.

...