如何在WordNetLemmatizer中传递词性?

问题描述 投票:0回答:1

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

'一个18岁的男孩星期四因涉嫌被移交检察官最后窃取了价值约1500万日元(134,300美元)的加密货币警方说,今年是通过入侵数字货币存储网站来实现的。``此案是日本首例刑事指控警方就加密货币损失对黑客进行追捕说。','\ n','男孩,来自To木县宇都宫市因未成年而被隐姓埋名的地区,据称,黑客入侵了Monappy网站后,用户偷了这笔钱可以在8月14日至9月1日之间保留虚拟货币monacoin去年。”,“他使用了称为Tor的软件,因此很难识别谁正在访问系统,但警方通过分析留在网站服务器上的通讯记录。”,“警察说男孩已经接受了指控,并称他为说,“我觉得自己找到了一个没人知道的窍门,就好像我在玩电子游戏。”,“他利用了网站的功能,使用户可以将货币转移到另一个用户,知道如果转移,系统将发生故障在短时间内被重复。”,“他反复提交对自己的货币转移请求,使系统不堪重负,让他在自己的帐户中注册更多的钱。”,“大约7700用户受到影响,运营商将赔偿他们。后来将被盗的摩纳哥放入由其他人建立的帐户中加密货币运营商,以不同的方式收到付款加密货币和购买的物品,例如智能手机,警察说。”,“据Monappy的运营商说,被盗的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)

从代码中很明显,我正在使用熊猫。但是,在这里我给出了示例文本。

我的问题所在是:

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)

尽管代码运行时没有任何错误,引理函数无法正常工作。

预先感谢。

pandas nltk python-3.7 lemmatization part-of-speech
1个回答
0
投票

在上面的代码中,您试图对词干进行词素化。当lemmatizer遇到一个无法识别的单词时,它将简单地返回该单词。例如,词干offline会产生offlin,而当您通过lemmatizer运行该词时,它只会给出相同的单词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']

哪个是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.