将列中的值作为参数传递给 nltk 雪球词干分析器
Passing value in column as parameter in apply with nltk snowball stemmer
传递 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: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
试试这个。
df['text_stemmed']=df.apply(lambda x: stemming(x['text_nostop'], x['language']), axis=1)
编辑:当您在 df['text_tokenized'].apply(lambda x: ...)
等特定列上使用 apply
时,lambda 函数在 x 上,即 text_tokenized
列的每一行,而 df['language']
不应用于特定行,而是应用于整个 pandas 系列。
也就是说,当你尝试lambda x: remove_stopwords(x, df['language'])
时,df['language']
的返回值不是对应行的某个'language'值,而是一个pandas包含 'english' 和 'swedish' 的系列。
0 english
1 swedish
所以你的第二个 apply
代码也应该改变:
df['text_nostop'] = df.apply(lambda x: remove_stopwords(x['text_tokenized'], x['language']), axis=1)
传递 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: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
试试这个。
df['text_stemmed']=df.apply(lambda x: stemming(x['text_nostop'], x['language']), axis=1)
编辑:当您在 df['text_tokenized'].apply(lambda x: ...)
等特定列上使用 apply
时,lambda 函数在 x 上,即 text_tokenized
列的每一行,而 df['language']
不应用于特定行,而是应用于整个 pandas 系列。
也就是说,当你尝试lambda x: remove_stopwords(x, df['language'])
时,df['language']
的返回值不是对应行的某个'language'值,而是一个pandas包含 'english' 和 'swedish' 的系列。
0 english
1 swedish
所以你的第二个 apply
代码也应该改变:
df['text_nostop'] = df.apply(lambda x: remove_stopwords(x['text_tokenized'], x['language']), axis=1)