从文件中删除停用词

时间:2017-03-08 14:33:01

标签: python csv pandas

我想从我的文件中的数据列中删除停用词。 我过滤了最终用户说话时的界限。 但它并没有用<dd><pre>@Html.ActionLink(m.PostContent, "DisplayFullPost","Post", new {Id = m.PostId }, null )</pre></dd> 过滤掉停用词 我究竟做错了什么?

usertext.apply(lambda x: [word for word in x if word not in stop_words])

3 个答案:

答案 0 :(得分:1)

您可以构建停用词的正则表达式模式,并调用向量化str.replace来删除它们:

In [124]:
stop_words = ['a','not','the']
stop_words_pat = '|'.join(['\\b' + stop +  '\\b' for stop in stop_words])
stop_words_pat

Out[124]:
'\\ba\\b|\\bnot\\b|\\bthe\\b'

In [125]:    
df = pd.DataFrame({'text':['a to the b', 'the knot ace a']})
df['text'].str.replace(stop_words_pat, '')

Out[125]:
0         to  b
1     knot ace 
Name: text, dtype: object

在这里,我们执行列表理解以使用'\b'构建围绕每个停用词的模式,这是一个中断,然后我们or使用'|'所有单词

答案 1 :(得分:1)

两个问题:

首先,您有一个名为stop_words的模块,稍后您将创建一个名为stop_words的变量。这是不好的形式。

其次,您将lambda函数传递给.apply,希望其x参数为列表,而不是列表中的值。

也就是说,您正在执行df.apply(sqrt)而不是df.apply(lambda x: [sqrt(val) for val in x])

您应该自己进行列表处理:

clean = [x for x in usertext if x not in stop_words]

或者你应该使用一次只需一个单词的函数来执行apply:

clean = usertext.apply(lambda x: x if x not in stop_words else '')

正如@ Jean-FrançoisFabre在评论中建议的那样,如果你的stop_words是一个集合而不是一个列表,你可以加快速度:

from stop_words import get_stop_words

nl_stop_words = set(get_stop_words('dutch'))    # NOTE: set

usertext = ...
clean = usertext.apply(lambda word: word if word not in nl_stop_words else '')

答案 2 :(得分:0)

clean = usertext.apply(lambda x:  x if x not in stop_words else '')