使用用户提供的列表从 pandas df 中删除停用词

remove stopwords from pandas df with user-supplied list

我有一个 raw_corpus 并且正在尝试使用用户定义的停用词列表删除停用词(我编辑了 nltk 英语停用词文件)。我的停用词文件一定有问题吗?

这是输入 pandas df raw_corpus:

这是我的代码:

#my own custom stopwords list
stoplist="/User/dlhoffman/nltk_data/corpora/stopwords/english"
#filter out stopwords
raw_corpus['constructed_recipe'] = raw_corpus['constructed_recipe'].apply(lambda x: [item for item in x if 
item not in stoplist])
#running the code below verifies empty dataframe
#raw_corpus['constructed_recipe'] = raw_corpus['constructed_recipe'].apply(lambda x: [])

这是结果 - 显然不是我想要的!怎么了?:

pd.Series.apply 使用生成器表达式应该可以工作:

import pandas as pd
import re

df = pd.DataFrame([['this is the first test string'],
                   ['this is yet another test'],
                   ['this is a third test item'],
                   ['this is the final test string']],
                  columns=['String'])

replace_set = {'this', 'is'}

df['String'] = df['String'].str.split(' ').apply(lambda x: ' '.join(k for k in x if k not in replace_set))

# df
#                     String
# 0    the first test string
# 1         yet another test
# 2        a third test item
# 3    the final test string

说明

  • pd.Series.str.split 按空格拆分单词,返回一系列列表,每个列表项一个单词。
  • pd.Series.apply 接受一个 lambda(匿名)函数作为输入,有效地将函数应用于循环中系列中的每个项目。
  • 生成器表达式 (k for k in x if k not in replace_set) returns k 的每个值作为可迭代对象 if 条件。
  • ' '.join 用于生成器表达式,从生成的单词中形成一个字符串。