Pandas 如何在WordNetLemmatizer中传递词性?

Pandas 如何在WordNetLemmatizer中传递词性?,pandas,nltk,python-3.7,lemmatization,part-of-speech,Pandas,Nltk,Python 3.7,Lemmatization,Part Of Speech,我正在预处理文本数据。然而,我面临着柠檬化的问题。 以下是示例文本: 周四,一名18岁男孩因涉嫌犯罪而被移交检察官 去年盗窃了价值约1500万元人民币(合13.43万美元)的加密货币 警方说,去年,他入侵了一个数字货币存储网站, "这是日本首起被提起刑事诉讼的案件 警方以加密货币损失为由对一名黑客进行追查 说.“,”\n“这个男孩,来自东京宇都宫市 因为他是未成年人,他的名字被扣留了, 据称是在黑客攻击Monappy网站后偷了钱 可以在8月14日至9月1日期间保留虚拟货币monacoin 去年,

我正在预处理文本数据。然而,我面临着柠檬化的问题。 以下是示例文本:

周四,一名18岁男孩因涉嫌犯罪而被移交检察官 去年盗窃了价值约1500万元人民币(合13.43万美元)的加密货币 警方说,去年,他入侵了一个数字货币存储网站, "这是日本首起被提起刑事诉讼的案件 警方以加密货币损失为由对一名黑客进行追查 说.“,”\n“这个男孩,来自东京宇都宫市 因为他是未成年人,他的名字被扣留了, 据称是在黑客攻击Monappy网站后偷了钱 可以在8月14日至9月1日期间保留虚拟货币monacoin 去年,他使用了一种叫Tor的软件,这使得它很难实现 识别谁正在访问系统,但警方通过 正在分析网站服务器上留下的通信记录。“,” 警方说,这名男孩已经承认了这些指控,并引用他的话说 他说:“我觉得我发现了一个没人知道的把戏,而且做得好像我 “我们在玩电子游戏。”,“他利用了一个游戏中的弱点 网站的功能,允许用户将货币转移到 另一个用户,知道如果传输,系统将出现故障 “在很短的时间内被重复了。”他反复提交 向他本人提出的货币转账请求,压倒了系统和 允许他在自己的账户上注册更多的钱 用户受到了影响,运营商将对他们进行赔偿 后来把偷来的硬币存入另一家银行的账户 加密货币运营商,以不同的方式收到付款 加密货币和购买的物品,如智能手机,警方 “据莫纳皮的经营者说,被偷的莫纳皮硬币 一直使用一个始终连接互联网的系统,以及 那些保持离线状态的设备并没有被盗

我的代码是:

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

您的代码应该被修改为使
单词
,如下所示

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']

这是正确的。

谢谢,这很有效。但是有一个问题,你在之前的帖子中说,在WordNetLemmatizer中也需要词性。但这里你没有用。我想知道这段代码是否只将动词或词性的每一个部分(如名词、形容词、副词等)进行柠檬化。上面的代码使用了
pos='v'
,因此它将应用动词规则。我相信Wordnet的工作方式是,它默认应用名词规则,如果你想让它操作动词,等等。。你需要告诉它POS类型。这意味着您需要在原始标记化文本上运行标记器,然后将
n
v
a
传递给Wordnet(如果您希望它对所有单词都能正常工作)。这意味着您需要在原始标记化文本上运行标记器,然后将n、v或a传递给Wordnet(如果您希望它对所有单词都能正常工作)。你能告诉我如何在代码中做到这一点吗。如果标签以
N
开头,则将
N
传递给lemmatizer,以此类推。。你可以考虑使用。它更容易,更准确。