jieba分词+collections 词频统计+WordCloud 词云_topk=20-程序员宅基地

技术标签: 文本挖掘分析  

请参见:
https://github.com/fxsjy/jieba
https://www.jianshu.com/p/883c2171cdb5
https://www.cnblogs.com/qq21270/p/7695275.html

jieba分词

“结巴”中文分词:做最好的 Python 中文分词组件

安装

pip install  jieba -i https://pypi.tuna.tsinghua.edu.cn/simple

特点

  1. 支持四种分词模式:
模式 描述
精确模式 试图将句子最精确地切开,适合文本分析
全模式 把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义
搜索引擎模式 在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词
paddle模式 利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词
  1. 支持繁体分词
  2. 支持自定义词典
  3. MIT 授权协议

功能

1.分词


jieba.cut 方法 与 jieba.lcut 方法:

jieba.cut 方法 返回的结构是一个可迭代的 generator,可使用 for 循环来获得分词后得到的每一个词语(unicode)

jieba.lcut 方法 返回 list

jieba.cut 与 jieba.lcut 接受4个输入参数

  • 需要分词的字符串
  • cut_all 参数:是否使用全模式,默认值为 False
  • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True
  • use_paddle 参数:用来控制是否使用paddle模式下的分词模式

jieba.cut_for_search 方法 与 jieba.lcut_for_search 方法:

jieba.cut_for_search 方法返回的结构是一个可迭代的 generator,可使用 for 循环来获得分词后得到的每一个词语(unicode)

jieba.lcut_for_search 方法 返回 list

接受2个输入参数

  • 需要分词的字符串
  • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True

该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细


jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器

可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。


例子

四种分词模式

import jieba

# 精确模式 试图将句子最精确地切开,适合文本分析
seg_list = jieba.cut("我来到上海交通大学", cut_all=False)
print("/ ".join(seg_list))
# 我/ 来到/ 上海交通大学


# 全模式 把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义
seg_list = jieba.cut("我来到上海交通大学", cut_all=True)
print("/ ".join(seg_list))
# 我/ 来到/ 上海/ 上海交通大学/ 交通/ 大学


seg_list = jieba.lcut("我来到上海交通大学", cut_all=True)
print("{0}".format(seg_list))
# ['我', '来到', '上海', '上海交通大学', '交通', '大学']


# 默认是精确模式 和启用 HMM
# HMM 模型  对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
seg_list = jieba.cut("他来到了网易杭研大厦")  
print(", ".join(seg_list))  
# 他, 来到, 了, 网易, 杭研, 大厦   (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)


# 默认是精确模式(cut_all=False) 和启用 HMM(HMM=True)
# HMM 模型  对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
seg_list = jieba.cut("他来到了网易杭研大厦")  
print(", ".join(seg_list))  
# 他, 来到, 了, 网易, 杭研, 大厦   (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)


# 不启用 HMM(HMM=False)
seg_list = jieba.cut("他来到了网易杭研大厦",HMM=False)  
print(", ".join(seg_list))  
# 他, 来到, 了, 网易, 杭, 研, 大厦   (未能识别“杭研”)


# 搜索引擎模式
seg_list = jieba.cut_for_search("今天,西藏中南部等地的部分地区有小雪或雨夹雪")  
print(", ".join(seg_list))
# 今天, ,, 西藏, 中南, 南部, 中南部, 等, 地, 的, 部分, 地区, 有, 小雪, 或, 雨夹雪


seg_list = jieba.lcut_for_search("今天,西藏中南部等地的部分地区有小雪或雨夹雪")  
print("{0}".format(seg_list))
# ['今天', ',', '西藏', '中南', '南部', '中南部', '等', '地', '的', '部分', '地区', '有', '小雪', '或', '雨夹雪']

自定义词典

可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率

用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径

词典格式:

词语、词频(可省略)、词性(可省略) 空格隔开

创新办 3 i
云计算 5
凱特琳 nz
台中
import jieba
strs = "小明是创新办主任也是云计算方面的专家"
# 未加载词典
print('/ '.join(jieba.cut(strs)))
小明// 创新// 主任//// 计算/ 方面// 专家


# 载入词典
jieba.load_userdict("data.txt")
# 加载词典后
print('/ '.join(jieba.cut(strs)))
小明// 创新办/ 主任/// 云计算/ 方面// 专家

调整词典

  1. 使用 add_word(word, freq=None, tag=None)del_word(word) 可在程序中动态修改词典。
import jieba
jieba.add_word('石墨烯') #增加自定义词语
jieba.add_word('凱特琳', freq=42, tag='nz') #设置词频和词性 
jieba.del_word('自定义词') #删除自定义词语 
  1. 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
    注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
import jieba
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。


jieba.suggest_freq(('中', '将'), True)
494
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post///出错/print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))////正确/应该/不会//切开


jieba.suggest_freq('台中', True)
69
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))/台中//正确/应该/不会//切开

关键词提取

jieba 提供了两种关键词提取方法,分别基于 TF-IDF 算法和 TextRank 算法。

(1)基于 TF-IDF 算法的关键词抽取
import jieba.analyse

通过 jieba.analyse.extract_tags 方法可以基于 TF-IDF 算法进行关键词提取,该方法共有 4 个参数:

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

参数
sentence:为待提取的文本
topK:为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight:是否一并返回关键词权重值,默认值为 False
allowPOS:仅包括指定词性的词,默认值为空,即不筛选
import jieba
import jieba.analyse

s='''
4月28日消息,
中国互联网络信息中心(CNNIC)今日发布第45次《中国互联网络发展状况统计报告》,
报告显示,截至2020年3月,我国网民规模为9.04亿,互联网普及率达64.5%。
'''

# 关键词一并返回关键词权重值
for x, w in jieba.analyse.extract_tags(s, topK=20, withWeight=True):
    print('%s %s' % (x, w))
28 0.4981153126208333
CNNIC 0.4981153126208333
45 0.4981153126208333
2020 0.4981153126208333
9.04 0.4981153126208333
64.5% 0.4981153126208333
中国互联网络信息中心 0.4663594771208333
互联网络 0.4663594771208333
报告 0.43421167213166667
普及率 0.4298816130625
网民 0.3401710564375
互联网 0.29674553142875
状况 0.2447847628258333
统计 0.23766521853166667
截至 0.22886887490041666
发布 0.21217329304958332
消息 0.20999561484041665
今日 0.20788115459333334
我国 0.20565526834416667
规模 0.20494769420791667
(2)基于 TextRank 算法的关键词抽取

通过 jieba.analyse.textrank 方法可以使用基于 TextRank 算法的关键词提取,其与 jieba.analyse.extract_tags 有一样的参数,但前者默认过滤词性(allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))。

jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
报告 1.0
统计 0.6018502081490369
状况 0.6003986905016638
发展 0.5971795426829121
互联网络 0.5954890144630254
规模 0.5712199814467281
网民 0.5673528829290001
中国 0.4826057473979413
显示 0.31814110893938946
截至 0.31551934455352665

词性标注

jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。

import jieba
import jieba.posseg as pseg
words = pseg.cut("我爱北京天安门") #jieba默认模式

jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式
for word, flag in words:
    print('%s %s' % (word, flag))

我 r
爱 v
北京 ns
天安门 ns

collections 词频统计

from collections import Counter
cnt = Counter() # 创建Counter这个类
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    cnt[word] += 1
print(cnt.most_common())   #[('blue', 3), ('red', 2), ('green', 1)]

cnt = Counter()
for char in 'hellllooeooo':
    cnt[char] += 1
print(cnt.most_common())   #[('o', 5), ('l', 4), ('e', 2), ('h', 1)]

for key, val in cnt.most_common():
    print(key, val)
    
o 5
l 4
e 2
h 1
# -*- coding: utf-8 -*-
# coding=utf-8

import jieba
import collections
import string

str1 = '家就是居住的地方,乡就是一个地方的统称。家乡,是指自己小时候生长的地方或祖籍,又被称为“故乡”、“老家”、“故园”等。家乡也可以是有归属感和安全感的地方。'
mylist = jieba.lcut(str1)

mylist_1=[]
for i in mylist:
    if(len(i)>1):
        mylist_1.append(i)
mycount = collections.Counter(mylist_1)      
for key, val in mycount.most_common(3):  # 前三个
    print(key, val)
地方 4
就是 2
家乡 2

读取文本文件,字频统计

在这里插入图片描述

# -*- coding: utf-8 -*-
# coding=utf-8

import collections
import jieba

# 读取文本文件,把所有的汉字拆成一个list
f = open("C:/jieba_text.txt", 'r', encoding='utf8')  # 打开文件,并读取要处理的大段文字
txt1 = f.read()
txt1 = txt1.replace('\n', '')  # 删掉换行符
txt1 = txt1.replace(',', '')  # 删掉逗号
txt1 = txt1.replace('。', '')  # 删掉句号
txt1 = txt1.replace('?', '')  # 删掉问号
txt1 = txt1.replace(';', '')  # 删掉分号
mylist = jieba.lcut(txt1)
mylist_1=[]
for i in mylist:
    if(len(i)>1):
        mylist_1.append(i)
mycount = collections.Counter(mylist_1)   
for key, val in mycount.most_common(10):  # 有序(返回前10个)
    print(key, val)

家乡 7
自己 5
想起 3
生命 2
无论是 1
土生土长 1
家乡人 1
还是 1
生活 1
当地 1

不使用模块,进行词频统计

#分词
gen=jieba.lcut(strs)
data={
    }
#统计词频
for i in gen:
    if len(str(i))>1:
        data[i] = data.get(i,0)+1
        
# dataj结构为       
# data={'望': 3, '庐': 1, '山': 9, '瀑': 2}
# python的sorted函数对字典按key排序和按value排序
a = sorted(data.items(), key=lambda item: item[1], reverse=True)  # 按值排序
# [('山', 9), ('望', 3), ('瀑', 2), ('庐', 1)]

print(dict(a))  # 再转化为dict
# {'山': 9, '望': 3, '瀑': 2, '庐': 1}

python 列表排序方法sort、sorted技巧篇
python的sorted函数对字典按key排序和按value排序
根据字典中K/V排序
python 如何反转序列

WordCloud 词云

# -*- coding: utf-8 -*-
# coding=utf-8

import matplotlib.pyplot as plt
import wordcloud
import jieba

txt1 = open('C:/word.txt', 'r', encoding='utf8').read()
words_ls = jieba.cut(txt1, cut_all=True)
words_split = " ".join(words_ls)

# 参数都可以注释掉,但必须设置font_path
wc = wordcloud.WordCloud(
    width=800,
    height=600,
    background_color="#ffffff",  # 设置背景颜色
    max_words=500,  # 词的最大数(默认为200)
    max_font_size=60,  # 最大字体尺寸
    min_font_size=10,  # 最小字体尺寸(默认为4)
    colormap='bone',  # string or matplotlib colormap, default="viridis"
    random_state=10,  # 设置有多少种随机生成状态,即有多少种配色方案
    mask=plt.imread("C:/1.bmp"),  # 读取遮罩图片!!
    font_path='C:/Windows/Fonts/simhei.ttf'
)
my_wordcloud = wc.generate(words_split)

plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
wc.to_file('zzz.png')  # 保存图片文件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42374697/article/details/105811387

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签