Как передать часть речи в WordNetLemmatizer?

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

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

Мой код:

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)

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

Моя проблемная зона:

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)

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

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


person Piyush Ghasiya    schedule 30.10.2019    source источник


Ответы (1)


В приведенном выше коде вы пытаетесь лемматизировать слова, которые были выделены. Когда лемматизатор сталкивается со словом, которое он не распознает, он просто возвращает это слово. Например, определение основы 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']

Что правильно.

person bivouac0    schedule 30.10.2019
comment
Спасибо, это работает. Но один вопрос, вы сказали в своем предыдущем посте, что часть речи также требуется в WordNetLemmatizer. Но здесь вы не использовали его. Я хочу знать, лемматизирует ли этот код только «глагол» или каждую часть речи, такую ​​​​как существительное, прилагательное, наречие и т. Д. - person Piyush Ghasiya; 30.10.2019
comment
В приведенном выше коде используется pos='v', поэтому будут применяться правила глагола. Я считаю, что Wordnet работает так, что по умолчанию применяет правила для существительных, и если вы хотите, чтобы он работал с глаголом и т. д., вам нужно указать тип POS. Это означает, что вам нужно запустить теггер для исходного размеченного текста, а затем передать n, v или a в Wordnet, если вы хотите, чтобы он работал правильно для всех слов. - person bivouac0; 30.10.2019
comment
›Это означает, что вам нужно запустить тегировщик для исходного размеченного текста, а затем передать n, v или a в Wordnet, если вы хотите, чтобы он работал правильно для всех слов. Можете ли вы сказать, как это сделать в коде? - person Piyush Ghasiya; 30.10.2019
comment
Взгляните на NLTK. Если тег начинается с N перехода n к лемматизатору и т. д., вы можете вместо этого использовать Spacy. Несколько проще и точнее. - person bivouac0; 30.10.2019