当我在scikit中提供自定义词汇时,为什么我不能为CountVectorizer指定最小频率?

时间:2014-05-18 02:25:19

标签: python scikit-learn

据我所知,在Python中的Scikit-learn软件包中创建计数向量化器时,可以指定最小频率。但是,如果你不提供先验词典,我想知道是否只有这种情况?当我提供自己的自定义词汇表(列表)时,此参数似乎不起作用。

为了解决这个问题,我重新阅读了min_df参数的文档:

Parameters :

min_df : float in range [0.0, 1.0] or int, optional, 1 by default

    When building the vocabulary, ignore terms that have a term frequency strictly lower than the given threshold.  

    This value is also called cut-off in the literature.   

    If float, the parameter represents a proportion of documents, integer absolute counts. This parameter is ignored if vocabulary is not None.

就我而言,我向CountVectorizer提供了一个自定义词汇表,该词汇表由我之前获得的自己的术语组成。

cv = CountVectorizer(vocabulary=my_own_terms, min_df=3)
X = cv.fit_transform(a_big_corpus)

当我看输出时,我会得到一次,两次等各种术语。

有没有人在他们的工作中发生这种情况,如果是这样,是否有可能解决方案?提前谢谢。

2 个答案:

答案 0 :(得分:5)

通过提供词汇集,这意味着您希望完全这组词汇。其他任何事情都无关紧要,即使一个术语只出现一次或者在要转换的文本中根本不出现。否则,它与您想要完全该词汇集的隐含意图(通过提供vocabulary参数)相矛盾。因此,应该忽略min_df约束似乎是合理的,根据文档就是这种情况。

根据您的后续评论,您似乎想要的是:

  

我想要'确切地说'我的词汇中的那些项目,但如果一个单词只出现一次,那么我就不想要了。

这基本上意味着您希望预先提取的词汇集中的术语足够频繁出现。换句话说,你实际上并不真正想要那些词汇。我可能会这样做:

  1. 从头开始为您的数据提供全新的CounterVectorizer
  2. 将上面新安装的矢量化器的词汇与你先前的词汇集合相交。
  3. 使用在步骤2中相交的词汇表构造实际变换的实际CountVectorizer
  4. 您的方法直接跳到第3步,这就是为什么矢量化程序无法按预期工作的原因。

答案 1 :(得分:3)

一般来说,使用vocabulary的目的是说您想要词汇表中的那些项目,因此min_df不适用。如果您仍然需要最低频率,则必须进行矢量化,查看哪些太小,然后将其从自定义词汇表中删除并重新进行矢量化。 (据我所知,没有办法从现有的CountVectorizer的词汇表中删除项目。)