如何在 Scikit-learn 中手工设计 TfidfVectorizer 的功能?

Tim*_*rth 3 python nlp scikit-learn

我正在尝试按关键字对文档进行聚类。我正在使用以下代码来制作tdidf-matrix

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer(max_df=.8, max_features=1000,
                             min_df=0.07, stop_words='english',
                             use_idf=True, tokenizer=tokenize_and_stem, 
                             ngram_range=(1,2))

tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
Run Code Online (Sandbox Code Playgroud)

print(tfidf_matrix.shape) 返回(567, 209),这意味着有 567 个文档,每个文档都有 scikit-learn TdidfVectorizer 检测到的 209 个特征词的某种混合。

现在,我曾经terms = tfidf_vectorizer.get_feature_names()获得术语列表。跑步print(len(terms))给予209

其中许多单词对于任务来说是不必要的,并且它们会给聚类增加噪音。我手动浏览了该列表并提取了有意义的功能名称,从而生成了一个新terms列表。现在,跑步print(len(terms))可以给67

然而,运行tfidf_vectorizer.fit_transform(documents)仍然给出 的形状(567, 209),这意味着该fit_transform(documents)函数仍然使用 209 个术语的嘈杂列表,而不是手动选择的 67 个术语列表。

如何tfidf_vectorizer.fit_transform(documents)使用 67 个手动选择的术语列表来运行该函数?我在想,也许这需要我向我的机器上的 Scikit-Learn 包添加至少一项功能,对吗?

任何帮助是极大的赞赏。谢谢!

小智 5

有两种方法:

  1. 如果您已经确定了停用词列表(您称它们为“任务不必要的”),只需将它们放入 的参数中stop_words即可TfidfVectorizer在创建词袋时忽略它们。但请注意,如果您将参数设置为自定义列表,
    则将不再使用预定义的英语停用词。stop_words如果您想将预定义的英语列表与其他停用词结合起来,只需添加两个列表:

    from sklearn.feature_extraction.stop_words import ENGLISH_STOP_WORDS
    stop_words = list(ENGLISH_STOP_WORDS) + ['your','additional', 'stopwords']
    tfidf_vectorizer = TfidfVectorizer(stop_words=stop_words) # add your other params here
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您有固定的词汇表并且只想计算这些单词(即您的terms列表),只需设置以下vocabulary参数TfidfVectorizer

    tfidf_vectorizer = TfidfVectorizer(vocabulary=terms) # add your other params here
    
    Run Code Online (Sandbox Code Playgroud)