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

时间:2017-12-21 02:58:06

标签: python scikit-learn nlp

我正在尝试按关键字对文档进行聚类。我正在使用以下代码制作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)

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个术语列表。

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

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

有两种方法:

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

    stop_words
  2. 如果你有一个固定的词汇,只想要计算这些词(即你的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 列表),只需设置terms的{​​{1}}参数:

    vocabulary

答案 1 :(得分:0)

我没有弄清楚如何在问题中要求的级别上解决问题。但是,我想出了一个现在适用的hacky解决方案。

我可以通过以下方式使用我手工制作的术语集:

1)从terms = tfidf_vectorizer.get_feature_names()开始,打印出terms

2)制作一个名为unwanted_terms的清单,并手工填写第1步中不需要的条款。

3)在我的文档顶部,我导入停用词:

stopwords = nltk.corpus.stopwords.words('english')

将我不想要的字词列表添加到停用词:

for item in not_needed_words_list:
    stopwords.append(item)