pandas - 如何在 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)
尽管代码在没有任何错误的情况下运行,但引理函数无法按预期工作。
提前致谢。
解决方案
在您上面的代码中,您试图对已被词干的词进行词形还原。当 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']
这是正确的。
推荐阅读
- java - Java 8 在 HTTPS 请求中找不到受信任的证书
- c++ - 在 C++ 中为自身添加一个数字
- javascript - 使用自动完成时不触发 onchange - 可能吗?
- javascript - 尝试在其他应用程序中加载 webpack 生成的文件不起作用
- google-analytics-firebase - GA4 数据 api - 自定义维度中的(未设置)
- python - 如何通过单击python中的按钮开始处理
- php - renderWith 不覆盖模板
- android - Android:systemNavigationBarIconBrightness 在应用程序恢复后恢复为亮
- python - 使用 VSCode 交互窗口时的默认 Python 路径
- python - 一个查找所有组合而不重复的函数,加起来是一个数字