我正在预处理文本数据。但是,我面临着残词化的问题。下面是示例文本:
'一个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)
尽管代码运行时没有任何错误,引理函数无法正常工作。
预先感谢。
在上面的代码中,您试图对词干进行词素化。当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']
哪个是正确的。