我知道在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)
当我查看输出时,我得到了出现一次,两次等的各种术语。
是否有人在工作中遇到过这种情况,如果是,是否有可能的解决方案?
通过提供词汇表集,这意味着您希望完全该词汇表集。其他任何内容都无关紧要,即使某个术语在要转换的文本中只出现一次或根本不出现。否则,它与您希望完全那组词汇表的隐含意图(通过提供vocabulary
参数)相矛盾。因此,忽略min_df
约束似乎是合理的,根据文档是这样的。
根据你的后续评论,你想要的似乎是:
我希望我的词汇表中"恰好"有这些词,但如果一个词只出现过一次,那么我不想要它。
这基本上意味着您希望在预先提取的词汇表集中出现的术语足够频繁。换句话说,你其实并不需要这些词汇。我可能会这样做:
- 在您的数据上从头开始安装一个全新的
CounterVectorizer
。 - 取上面新拟合的矢量器的词汇表与你的先验词汇表集的交集。
- 构造实际的
CountVectorizer
,它使用步骤2中相交的词汇表进行实际转换。
您的方法直接跳转到步骤3,这就是为什么矢量器没有像您预期的那样工作。
一般来说,使用vocabulary
的目的是说明您想要的正是词汇表中的这些项,因此min_df
不适用。如果仍然需要最小频率,则必须进行向量化,看看哪些频率太小,然后将它们从自定义词汇表中删除并重新向量化。(据我所知,没有办法从现有CountVectorizer的词汇表中删除项。)