当使用sklearn TfidfVectorizer时,停用词移除过程是在什么时候执行的?

5
如果我将一个自定义的停用词列表传递给TfidfVectorizer,那么停用词什么时候被移除呢?根据文档

stop_words : string {‘english’}, list, or None (default)

...

如果是一个列表,则假定该列表包含停用词,所有这些停用词都将从结果标记中删除。仅适用于analyzer == 'word'

因此,似乎这个过程是在分词之后进行的,对吗?疑问是因为如果分词还涉及词干处理,那么我认为存在误判(而不是移除)停用词的风险,因为经过词干处理后,它们不再被识别。
1个回答

2
您说得对。在分词完成后,stop_words被应用于已经获取的标记,并转换为n-gram序列,详见feature_extraction/text.py。分词器接收经过预处理的文本,不涉及停用词。
默认的分词器不会转换文本,但如果您提供自己的分词器以执行诸如词干提取之类的操作,则需要同时对停用词进行词干提取。或者,您可以在分词器函数内部直接进行过滤。

谢谢,如果我想在将语料库传递给sklearn之前进行去除过程,已经对语料库进行了标记化和词干处理,我想我只需要做一些像tokens = [w for w in tokens if w not in stop_words]这样的事情。你提到了n-gram,但我认为n-gram(如果n>1)是后来产生的:1)标记化2)停用词去除3)n-gram,我是对的吗?最后,我仍然有我在问题结尾提到的疑问:我想不出一个具体的例子,但如果一个单词是停用词,但在词干处理后不是,它就不会被删除。 - Eugenio
tokens = [w for w in tokens if w not in stop_words] 正是 scikit-learn 所做的,可以查看我提供的 GitHub 链接。之后它会处理 n-grams。 - Maxim
再次感谢,您有关于我提到的问题的任何线索吗(停用词未被删除,因为在词干处理后它们不再是停用词)? - Eugenio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接