传递df[language]适用于停用词,但不适用于雪球茎。有办法解决这个问题吗?

到目前为止我还没有发现任何线索...

import nltk
from nltk.corpus import stopwords
import pandas as pd
import re

df = pd.DataFrame([['A sentence in English', 'english'], ['En mening på svenska', 'swedish']], columns = ['text', 'language'])

def tokenize(text):
    tokens = re.split('\W+', text)
    return tokens

def remove_stopwords(tokenized_list, language):
    stopword = nltk.corpus.stopwords.words(language)
    text = [word for word in tokenized_list if word not in stopword]
    return text

def stemming(tokenized_text, l):
    ss = nltk.stem.SnowballStemmer(l)
    text = [ss.stem(word) for word in tokenized_text]
    return text

df['text_tokenized'] = df['text'].apply(lambda x: tokenize(x.lower()))
df['text_nostop'] = df['text_tokenized'].apply(lambda x: remove_stopwords(x, df['language']))
df['text_stemmed'] = df['text_nostop'].apply(lambda x: stemming(x, df['language']))


我希望它能像使用停用词一样,使用英语和瑞典语作为语言来阻止雪球。我收到如下的error消息:


  ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

最佳答案

试试这个吧。

df['text_stemmed']=df.apply(lambda x: stemming(x['text_nostop'], x['language']), axis=1)


编辑:在诸如apply之类的特定列上使用df['text_tokenized'].apply(lambda x: ...)时,lambda函数位于x上,这是text_tokenized列的每一行,而df['language']并不应用于特定行,而是整个熊猫系列。

也就是说,当您尝试lambda x: remove_stopwords(x, df['language'])时,df['language']的返回值不是对应行的特定“语言”值,而是一个包含“英语”和“瑞典语”的熊猫系列。

0    english
1    swedish


因此,使用apply的第二个代码也应该更改:

df['text_nostop'] = df.apply(lambda x: remove_stopwords(x['text_tokenized'], x['language']), axis=1)

关于python - 将列中的值作为参数传递给nltk snowball stemmer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57182902/

10-14 16:05
查看更多