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

python代码中,如何做词频统计呢?如果做的是中文词频统计呢?有哪些地方需要做设置?本文中利用pythonCountVectorizer来做词频统计,可以统计英文(以空格分割),也可以统计中文(用逗号分割)。

苏南大叔:机器学习,如何利用CountVectorizer来做词频统计? - nlp词频统计
机器学习,如何利用CountVectorizer来做词频统计?(图2-1)

你现在的看的是苏南大叔的博客,这个博客记录计算机代码的故事。本文描述如何利用CountVectorizer来做中文词频统计。测试环境:win10python@3.6.8sklearn@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]

苏南大叔:机器学习,如何利用CountVectorizer来做词频统计? - nlp分词代码
机器学习,如何利用CountVectorizer来做词频统计?(图2-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总次数]

相关文档

综述

本文中,主要讲述如何利用CountVectorizer来做词频统计。主要是对中文进行分析的时候,需要提取对文档进行分词处理。分好词之后,然后根据需要设置停用词。

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

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

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

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