机器学习,如何利用CountVectorizer来做词频统计?
发布于 作者:苏南大叔 来源:程序如此灵动~在python
代码中,如何做词频统计呢?如果做的是中文词频统计呢?有哪些地方需要做设置?本文中利用python
的CountVectorizer
来做词频统计,可以统计英文(以空格分割),也可以统计中文(用逗号分割)。
你现在的看的是苏南大叔的博客,这个博客记录计算机代码的故事。本文描述如何利用CountVectorizer
来做中文词频统计。测试环境:win10
,python@3.6.8
,sklearn@0.24.2
。
安装sklearn
词频统计功能CountVectorizer
来自于sklearn
。安装sklearn
的方式是:
pip install sklearn
最新的版本号是sklearn@0.24.2
。可以用下面的代码来获得版本号:
import sklearn
print(sklearn.__version__)
测试代码
from sklearn.feature_extraction.text import CountVectorizer
texts = ["dog cat fish fish dog 喜欢,doggy", '我,是,苏南大叔,有,一只,cat', '苏南大叔,来自,北京大学']
cv = CountVectorizer(stop_words=list(["是","了","一只","cat","来自"]))
cv_fit = cv.fit_transform(texts)
# cv.fit(texts)
# cv_fit = cv.transform(texts)
print(cv.get_stop_words()) # frozenset({'来自', '是', 'cat', '一只', '了'})
# print(cv.stop_words_) # 总是为空,没啥用
print(cv.get_feature_names()) # ['dog', 'doggy', 'fish', '北京大学', '喜欢', '苏南大叔']
print(cv.vocabulary_, type(cv.vocabulary_))
# {'dog': 0, 'fish': 2, '喜欢': 4, 'doggy': 1, '苏南大叔': 5, '北京大学': 3} <class 'dict'>
print(cv_fit) # (0, 0) 2 (0, 2) 2
print(cv_fit.toarray()) # [[2 1 2 0 1 0]]
print(cv_fit.toarray().sum(axis=0)) # 每个词在所有文档中的词频 [2 1 2 1 1 2]
输出内容:
frozenset({'一只', '来自', '是', '了', 'cat'})
['dog', 'doggy', 'fish', '北京大学', '喜欢', '苏南大叔']
{'dog': 0, 'fish': 2, '喜欢': 4, 'doggy': 1, '苏南大叔': 5, '北京大学': 3} <class 'dict'>
(0, 0) 2
(0, 2) 2
(0, 4) 1
(0, 1) 1
(1, 5) 1
(2, 5) 1
(2, 3) 1
[[2 1 2 0 1 0]
[0 0 0 0 0 1]
[0 0 0 1 0 1]]
[2 1 2 1 1 2]
准备文档
这个词频统计的过程,可以对一条条文档进行词语统计。所以,在进行词频统计之前,需要对要分析的文档,进行整理。
texts
就是分词过的文档组合,分词的标准可以是空格,或者中英文标点符号等。- 如果这条文档是使用空格进行分割的话,则不用特殊处理。但是对于中文这类不使用空格分割的语言来说的话,就需要先使用结巴分词类似的工具进行分词处理。
texts = ["dog cat fish 喜欢,doggy", '我,是,苏南大叔,有,一只,cat', '苏南大叔,来自,北京大学']
结巴分词的使用,可以参考下面的链接:
停用词
CountVectorizer
可以传入很多参数,其中最重要的是:可以传入停用词参数stop_words
,格式是个list
。这个list
内的单词,在统计的时候,会被忽略掉,不进行统计。
cv = CountVectorizer(stop_words=list(["是","了","一只","cat","来自"]))
值的特别说明的是,在使用结巴分词的时候,官方没有stop_words
参数。如果要设置停用词的话,是自定义代码,循环剔除相关词语的。所以,如果使用了结巴分词,又使用了CountVectorizer
做词频统计的话。可能面临着停用词两次过滤的可能性。
如果自己没有啥想法,又要设置停用词的话,github
上面有些停用词模版。比如下面的这个:
可以通过下面的代码,读取到相关的停用词:
def stop_words():
ret = []
with open("stop_words.txt", encoding='utf-8') as f:
ret = [l.strip() for l in f]
ret.append("额外的词")
return ret
stop_words = stop_words()
进行分词【核心】
分词的过程,可以使用方法fit_transform()
。
cv_fit = cv.fit_transform(texts)
也可以分开写代码:
cv.fit(texts)
cv_fit = cv.transform(texts)
执行这些分词后,就可以获得一些后续的变量了。
获得停用词
获得停用词,代码如下:
print(cv.get_stop_words()) # frozenset({'来自', '是', 'cat', '一只', '了'})
# print(cv.stop_words_) # 总是为空,没啥用
不过,好像是也米有啥用的函数。
获得字词表【重要】
这个就是获得被统计的字词,测试代码:
print(cv.get_feature_names()) # ['dog', 'doggy', 'fish', '北京大学', '喜欢', '苏南大叔']
print(cv.vocabulary_, type(cv.vocabulary_))
# {'dog': 0, 'fish': 2, '喜欢': 4, 'doggy': 1, '苏南大叔': 5, '北京大学': 3} <class 'dict'>
文档中所有被分词的词儿,经过停用词的过滤,剩下的词儿。
- 编辑成字典属性
vocabulary_
。这个字典变量看起来有些奇怪,编号在value位置,词儿在key的位置,而且顺序是打乱的。 - 如果想获得顺序正常的列表的话,可以使用
get_feature_names()
函数。
词频统计结果
print(cv_fit) # (0, 0) 1 (0, 2) 1
分词结果的格式是:
(被分词的文档编号,词儿编号) 出现次数
===============================================================
print(cv_fit.toarray()) # [[2 1 2 0 1 0][0 0 0 0 0 1][0 0 0 1 0 1]]
这个结果的格式是:
[[文档0词0次数,文档0词1次数,文档0词2次数],[文档1词0次数,文档1词1次数,文档1词2次数]]
===============================================================
print(cv_fit.toarray().sum(axis=0)) # 每个词在所有文档中的词频
这个的结果,其实就是cv_fit.toarray()
在x
轴方向的投影之和。格式是:
[词0总次数,词1总次数,词2总次数,词3总次数]
相关文档
- https://newsn.net/say/python-def.html
- https://newsn.net/say/python-dir.html
- https://newsn.net/say/python-set-diff.html
- https://newsn.net/say/jieba-cut.html
- https://newsn.net/say/jieba-lcut.html
综述
本文中,主要讲述如何利用CountVectorizer
来做词频统计。主要是对中文进行分析的时候,需要提取对文档进行分词处理。分好词之后,然后根据需要设置停用词。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。