首页 > 解决方案 > 如何在 WordNetLemmatizer 中传递词性?

问题描述

我正在预处理文本数据。但是,我面临着词形还原的问题。以下是示例文本:

“周四,一名 18 岁的男孩因涉嫌去年通过入侵数字货币存储网站窃取了价值约 1500 万日元(合 134,300 美元)的加密货币而被提交给检察官,警方说。 ', '\n', '这名来自栃木县宇都宫市的男孩因未成年人而被隐去姓名,据称被盗去年 8 月 14 日至 9 月 1 日期间,黑客入侵了 Monappy 网站,用户可以在该网站上保存虚拟货币 monacoin。警方通过分析网站服务器上留下的通讯记录确认了他的身份。', '警方说男孩承认了这些指控,并引用他的话说,“我觉得我发现了一个没人知道的把戏,就好像我在玩电子游戏一样。”', '他接受了利用网站功能的弱点,使用户能够将货币转移给另一个用户,因为他知道如果在短时间内重复转移,系统会出现故障。', '他反复向自己提交货币转移请求,使系统不堪重负,并允许他在他的账户中注册更多的钱。','大约 7,700 名用户受到影响,运营商将赔偿他们。','男孩后来将被盗的莫纳币存入了另一个加密货币运营商设立的账户,警方说,他们收到了另一种加密货币的付款并购买了智能手机等物品。被盗。

我的代码是:

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)

尽管代码在没有任何错误的情况下运行,但引理函数无法按预期工作。

提前致谢。

标签: pandasnltkpython-3.7lemmatizationpart-of-speech

解决方案


在您上面的代码中,您试图对已被词干的词进行词形还原。当 lemmatizer 遇到一个它无法识别的单词时,它会简单地返回那个单词。例如,词干offline产生offlin,当你通过词形还原器运行它时,它只会返回相同的单词,offlin.

你的代码应该被修改为 lemmatize 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']

这是正确的。


推荐阅读