我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

CountVectorizer词袋模型,可以用于语料库的词频统计。对于中文来说,还需要配合类似“结巴分词”之类的分词程序。那么,本文重点要说的是:面对无穷多的语料,CountVectorizer如何控制词汇表数量呢?将词汇表控制在一定的范围内,可以有效的防止内存的无意义消耗。解决这个问题,还是需要返回来查看cv.fit_transform()函数。

苏南大叔:CountVectorizer模型,如何控制词汇表?fit和transform方法 - 控制词汇表范围
CountVectorizer模型,如何控制词汇表?fit和transform方法(图1-1)

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10python@3.11.0scikit-learn@1.2.2

前文回顾

对于中文来说,由于不像英文一样,具有空格这个天然的分词标准,所以需要借助分词程序对文本进行处理,才能获得在CountVectorizer可用的语料库。

CountVectorizer拿到分好词的语料库之后,才会对文本token进行统计处理。

控制词汇表

最终的CountVectorizer结果之一,词汇表cv.vocabulary_代表了最终的结论范围。那么,它是语料库里面出现过的全部的词儿么?显示答案可能是否定的。

  • 首先,CountVectorizer默认是会过滤掉单字的词儿。
  • 其次,可以配置停用词列表来减少词汇表范围。
  • 再次,CountVectorizer.fit()的内容,产出的词汇表就来自于此。.transform()的内容是被统计的语料库。

所以,根据上述思路,确定可用的控制词汇表的三个方案。

方案一,控制token_pattern正则

如果目标词汇都是有规律的,并且恰好你是个正则表达式大神,则不妨试试这个方案。下面的代码,是用于增大目标词汇范围的,用于包括单字的词儿。当然,如果你修改一下正则表达式的话,增大或者缩小范围,都并不是问题。

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(token_pattern="[\u4e00-\u9fa5_a-zA-Z0-9]{1,}")  # 词袋模型

方案二,控制停用词

默认情况下,是不设置停用词的。也就是说可以通过设置停用词的方式,来减少目标词汇的范围。

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(stop_words=["一只", "非常"])  # 词袋模型

当然,也可以从.txt文件里面加载获得停用词列表。

with open("./中文停用词.txt", "rb") as fp:
    stopwords = fp.read().decode("utf-8")
stop_words_list = stopwords.splitlines()  # 按行分割,每行一个停用词

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(stop_words=stop_words_list)

方案三,分离fit和transform

CountVectorizer原版的词袋模型的结果,是这样获得的:

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
cv.fit_transform(corpus)

这个.fit_transform()实际上是两个步骤,一个是.fit(),一个是.transform()

  • 在机器学习的各种模型里面,.fit()都是用于学习基本信息的。这里也是一样,.fit()的过程,产生了词汇表的范围。
  • .transform(),实际上就相当于各种机器学习模型里面的.predict(),用于获得最终结果的统计值。

那么,这里如果在.fit().transform()里面,传递的是两个不同的语料库的话。那么,前者的语料库就控制了词汇表的范围,而后面的语料库就控制的被统计的数量范围。或者说:.fit()的是训练集,.transform()的是测试集。

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
cv.fit(corpus[:3])
cv_fit = cv.transform(corpus[3:])

这段代码把语料库corpus分割成了两部分,第一部分语料库用于传入.fit(),用于生成被统计的词汇表。第二部分语料库用于传入.transform(),用于生成统计的计数值。

CountVectorizer模型的.transform(),相当于传统的机器学习分类的.predict()函数。毕竟这个CountVectorizer模型并不是个分类预测的过程,而是个分类转换transform的过程。

完整代码

本代码基于下面这篇文章的代码,进行改造。

本文完整代码如下:

这是付费可看内容,收费5元。

输出:

狗子 ,词频是: 0
猫咪 ,词频是: 0
虎子 ,词频是: 1
黑色 ,词频是: 0

结语

本文描述了三种可能的控制CountVectorizer模型的词汇表的方案,可以用于解释:为什么有的词儿没有被统计进来的问题。更多sklearn的机器学习的经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    sklearn