利用jieba进行中文分词并进行词频统计

1.安装jieba库

在windows的Anaconda环境下如果没有设置环境变量,则从Dos命令先进入...\Anaconda3\Scripts 目录中,然后运行以下命令即可:

pip install jieba

2.分词示例

我们先用一段文本来进行分词并做词频统计:

央视网消息:当地时间11日,美国国会参议院以88票对11票的结果通过了一项动议,允许国会“在总统以国家安全为由决定征收关税时”发挥一定的限制作用。这项动议主要针对加征钢铝关税的232调查,目前尚不具有约束力。动议的主要发起者——共和党参议员鲍勃·科克说,11日的投票只是一小步,他会继续推动进行有约束力的投票。

可以看到,这段文本当中还包含了很多标点符号和数字,显然这不是我们想要的,所以在分词的时候要去掉这些。

2.1 普通分词模式

import jieba
import re
cut_words=[]
for line in open('./text1.txt',encoding='utf-8'):
    line.strip('\n')
    line = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", line)
    seg_list=jieba.cut(line,cut_all=False)
    cut_words.append(" ".join(seg_list))
print(cut_words)


>> 结果

['央视网 消息 当地 时间 日 美国国会参议院 以票 对票 的 结果 通过 了 
一项 动议 允许 国会 在 总统 以 国家 安全 为 由 决定 征收 关税 时 发挥 
一定 的 限制 作用 这项 动议 主要 针对 加征 钢铝 关税 的 调查 目前 尚 
不 具有 约束力 动议 的 主要 发起者 共和党 参议员 鲍勃 科克 说 日 的 
投票 只是 一 小步 他会 继续 推动 进行 有 约束力 的 投票']

2.1 全分词模式

import jieba
import re
cut_words=[]
for line in open('./text1.txt',encoding='utf-8'):
    line.strip('\n')
    line = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", line)
    seg_list=jieba.cut(line,cut_all=True)
    cut_words.append(" ".join(seg_list))
print(cut_words)

>> 结果

['央视 央视网 视网 消息 当地 时间 日 美国 美国国会 美国国会参议院 国会 参议 
参议院 议院 以 票 对 票 的 结果 通过 了 一项 动议 允许 许国 国会 在 总统 以
 国家 家安 安全 为 由 决定 征收 关税 时 发挥 一定 的 限制 制作 作用 这项 
动议 的 主要 发起 发起者 共和 共和党 党参 参议 参议员 议员 鲍 勃 科克 说 
日 的 投票 只是 一小 小步 他 会 继续 推动 进行 有 约束 约束力 的 投票']

3.词频统计

做词频统计需要用到另外一个包collection中的Counter计数器(如果没有自行安装,安装方法同jieba一样)。但是需要注意的是,像上面那样分词后的形式不能做词频统计,因为Counter是将list中的一个元素视为一个词,所以在上面要略微修改。

import jieba
import re
from collections import Counter
cut_words=""
for line in open('./text1.txt',encoding='utf-8'):
    line.strip('\n')
    line = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", line)
    seg_list=jieba.cut(line,cut_all=False)
    cut_words+=(" ".join(seg_list))
all_words=cut_words.split()
print(all_words)
c=Counter()
for x in all_words:
    if len(x)>1 and x != '\r\n':
        c[x] += 1

print('\n词频统计结果:')
for (k,v) in c.most_common(2):# 输出词频最高的前两个词
    print("%s:%d"%(k,v))


>> 结果

['央视网', '消息', '当地', '时间', '日', '美国国会参议院', '以票', 
'对票', '的', '结果', '通过', '了', '一项', '动议', '允许', '国会',
 '在', '总统', '以', '国家', '安全', '为', '由', '决定', '征收', 
 '主要', '针对', '加征', '钢铝', '关税', '的', '调查', '目前', '尚', 
 '参议员', '鲍勃', '科克', '说', '日', '的', '投票', '只是', '一', 
 '小步', '他会', '继续', '推动', '进行', '有', '约束力', '的', '投票']

词频统计结果:
动议:3
关税:2

4.添加自定义分词规则

什么叫添加自定义规则呢? 比如下面这个词:“南京市”。

import jieba
jieba.load_userdict('../data/user_cut_dic.txt')
str = "南京市"
r = jieba.cut(str,cut_all=False)
temp = ' '.join(r)
print(temp)

jieba默认会将它看成一个整体。明显这也是大多数情况下我们期望的结果,但真的就不会有“南京”和“市”这种分词方式吗?

jieba提供了两种方式来解决:

第一种:导入用户自定义的分词样例(就像是自定义停用词一样)的本地文件;
比如在此处,我在../data/user_cut_dic.txt中添加了如下样例:

南京 999999999 

得到了如下结果:“南京 市”,其中后面的数字是倾向于这种分词的权重(比重),中间用一个空格隔开。

第二种:在代码中添加分词建议;

import jieba
jieba.suggest_freq(('南京',"市"), True)
str = "南京市"
r = jieba.cut(str,cut_all=False)
temp = ' '.join(r)
print(temp)

更多内容欢迎扫码关注公众号月来客栈!
在这里插入图片描述

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页