在TfidfVectorizer中移除法语和英语停用词

5

我正在尝试在TfidfVectorizer中删除英语和法语的停用词。到目前为止,我只成功地从英语中删除了停用词。当我尝试输入法语停用词时,我收到一个错误消息,说它不是内置的。

实际上,我得到了以下错误消息:

ValueError: not a built-in stop list: french

我有一个文本文件,包含700行混合法语和英语的文本。

我正在使用Python进行这700行的聚类项目。然而,我的聚类出现了问题:我得到了满是法语停用词的聚类,这破坏了我的聚类效果。

我的问题如下:

有没有办法添加法语停用词或手动更新内置的英语停用词列表,以便我可以摆脱这些不必要的单词?

以下是包含我的停用词代码的TfidfVectorizer代码:

tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
                             min_df=0.2, stop_words='english',
                             use_idf=True, tokenizer=tokenize_and_stem, 
ngram_range=(1,3))

去除这些法语停用词将使我能够拥有代表在我的文档中反复出现的单词的簇。如果对此问题的相关性有任何疑问,我上周已提出过类似的问题。然而,它与使用TfidfVectorizer不同。非常感谢您的帮助。谢谢。

1
这可能与你的情境无关,但是以防万一,如果你在使用stop_words数组时依赖于列表/文件中的unicode/utf8字符,那么你可能需要更改它们以避免警告。具体做法请参考:https://dev59.com/yoLba4cB1Zd3GeqPibgV - aschultz
3个回答

13

你可以使用NLTKSpacy这两个Python中超级流行的NLP库中的好的停用词包。由于achultz已经添加了使用stop-words库的代码片段,我将展示如何使用NLTK或Spacy。

NLTK:

from nltk.corpus import stopwords

final_stopwords_list = stopwords.words('english') + stopwords.words('french')
tfidf_vectorizer = TfidfVectorizer(max_df=0.8,
  max_features=200000,
  min_df=0.2,
  stop_words=final_stopwords_list,
  use_idf=True,
  tokenizer=tokenize_and_stem,
  ngram_range=(1,3))

NLTK总共提供了334个停用词。

Spacy:

from spacy.lang.fr.stop_words import STOP_WORDS as fr_stop
from spacy.lang.en.stop_words import STOP_WORDS as en_stop

final_stopwords_list = list(fr_stop) + list(en_stop)
tfidf_vectorizer = TfidfVectorizer(max_df=0.8,
  max_features=200000,
  min_df=0.2,
  stop_words=final_stopwords_list,
  use_idf=True,
  tokenizer=tokenize_and_stem,
  ngram_range=(1,3))

Spacy提供了总共890个停用词。


PS:Spacy 是我个人最喜欢的。 - Ankur Sinha

1

Igor Sharm提到了手动完成任务的方法,但也许您可以安装停用词包。这样,由于TfidfVectorizer允许将列表作为stop_words参数,

from stop_words import get_stop_words

my_stop_word_list = get_stop_words('english') + get_stop_words('french')

tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
                             min_df=0.2, stop_words=my_stop_word_list,
                             use_idf=True, tokenizer=tokenize_and_stem, 
ngram_range=(1,3))

你也可以根据需要阅读和解析github项目中的french.txt文件,如果你只想包含一些单词。

3
完全同意这也是一个好方法,因为需要的操作更少,但在实际应用中,在每个研究领域中都有一些特定的停用词,当你知道研究主题时很显然(例如当所有文档都涉及体育时,您可以通过删除诸如“运动”、“运动员”等单词来增强搜索),甚至对数据的 idf 进行小型研究也可以为您提供有价值的见解,哪些单词最可能成为停用词(当然,包括众所周知的停用词总是一个好主意,但一些额外的内容可以大大改善模型)。 - Igor sharm

0
在我的经验中,解决这个问题最简单的方法是在预处理阶段手动删除停用词(同时从其他地方获取最常见的法语短语列表)。
此外,检查哪些停用词在您的文本/模型中最常出现的英语和法语(通过它们的出现次数或idf),并将它们添加到停用词中,在预处理阶段排除它们会很方便。
如果您喜欢使用tfidfvectorizer内置方法删除单词,则考虑制作一个要包括法语和英语的停用词列表,并将它们作为参数传递。
stopwords=[a,he,she,le,...]
tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
                             min_df=0.2, stop_words=stopwords,analyzer=’word’,
                             use_idf=True, tokenizer=tokenize_and_stem) 

重要的事情是,引用自文档

“english”目前是唯一支持的字符串值

因此,现在您将不得不手动添加一些停用词列表,您可以在网上找到任何地方,然后根据您的主题进行调整,例如: 停用词


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