CountVectorizer模型,如何控制词汇表?fit和transform方法
发布于 作者:苏南大叔 来源:程序如此灵动~CountVectorizer
词袋模型,可以用于语料库的词频统计。对于中文来说,还需要配合类似“结巴分词”之类的分词程序。那么,本文重点要说的是:面对无穷多的语料,CountVectorizer
如何控制词汇表数量呢?将词汇表控制在一定的范围内,可以有效的防止内存的无意义消耗。解决这个问题,还是需要返回来查看cv.fit_transform()
函数。
苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10
,python@3.11.0
,scikit-learn@1.2.2
。
前文回顾
对于中文来说,由于不像英文一样,具有空格这个天然的分词标准,所以需要借助分词程序对文本进行处理,才能获得在CountVectorizer
可用的语料库。
CountVectorizer
拿到分好词的语料库之后,才会对文本token
进行统计处理。
- https://newsn.net/say/sklearn-count-vectorizer.html
- https://newsn.net/say/sklearn-cv.html
- https://newsn.net/say/sklearn-multinomialnb.html
控制词汇表
最终的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
的过程。
完整代码
本代码基于下面这篇文章的代码,进行改造。
本文完整代码如下:
输出:
狗子 ,词频是: 0
猫咪 ,词频是: 0
虎子 ,词频是: 1
黑色 ,词频是: 0
结语
本文描述了三种可能的控制CountVectorizer
模型的词汇表的方案,可以用于解释:为什么有的词儿没有被统计进来的问题。更多sklearn
的机器学习的经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。