为什么在scikit learn中提供自定义词汇时,无法为CountVectorizer指定最小频率?
我了解到,在使用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 个回答
3
一般来说,使用 vocabulary
的目的是为了确保你只想要那些特定的词汇,所以 min_df
就不适用了。如果你还是想设定一个最小频率,那你需要先进行向量化,看看哪些词的出现次数太少,然后把它们从你自定义的词汇中删掉,再进行一次向量化。(据我所知,已经存在的 CountVectorizer 的词汇表中是无法直接删除词的。)
5
提供词汇集的意思是你想要的就是那一套词汇。其他的词汇无所谓,即使某个词在要转换的文本中只出现一次或者根本没有出现。这是因为你通过提供vocabulary
参数,实际上是想要那一套词汇。所以,min_df
这个限制可以被忽略,这在文档中也是这么说的。
根据你后面的评论,似乎你想要的是:
我想要的就是我词汇表中的那些词,但如果某个词只出现一次,那我就不想要它。
这基本上意味着你希望在你预先提取的词汇集中,选择那些出现频率足够高的词。换句话说,你其实并不是真的想要那一套词汇。我可能会这样做:
- 从头开始在你的数据上创建一个全新的
CounterVectorizer
。 - 找出新创建的向量化器的词汇和你原本的词汇集之间的交集。
- 用步骤2中交集的词汇来构建实际的
CountVectorizer
,这个向量化器会进行真正的转换。
你的方法直接跳到了第3步,这就是为什么向量化器没有按你预期的那样工作。