需要使用到的两个Python类库
jieba:中文分词分词工具
wordcloud:Python下的词云生成工具
jieba 类库使用介绍
支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
可以在pychar的 file 》 settings 》 project:work_python 》 project interpreter 中安装jieba,如下图:
也可以从网站下载半自动安装,先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
功能介绍
1、分词
- jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
- jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
# encoding=utf-8
import jieba
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",cut_all=True)
print("内容(全模式):"+"/".join(s_list))
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",cut_all=False)
print("内容(精准模式):"+"/".join(s_list))
s_list = jieba.cut("我叫孙宇晨,来自广东广州!")
print("内容(模式是精准模式):"+"/".join(s_list))
s_list=jieba.cut_for_search("我是孙宇晨,网传百万男孩,毕业于湖南科学院计算机")
print("内容(cut_for_search):"+"/".join(s_list))
输出结果:
内容(全模式):我/叫/孙/宇/晨///来自/广东/广州//!
内容(精准模式):我/叫/孙宇晨/,/来自/广东/广州/!
内容(模式是精准模式):我/叫/孙宇晨/,/来自/广东/广州/!
内容(cut_for_search):我/是/孙宇晨/,/网传/百万/男孩/,/毕业/于/湖南/科学/学院/科学院/计算/算机/计算机
2、添加自定义词典
开发者可以指定自己自定义的词典,以便扩充 jieba 词库里没有的词。自行添加新词可以保证更加符合项目的业务需求。
用法:
jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
词频省略时使用自动计算的能保证分出该词的词频。
例如:dict.txt文件内容
机器学习 3 i
云计算 5 r
常山赵子龙 6
河北上将
我叫孙宇晨 5 v
来自广东
运行代码
#自定义字典文件
jieba.load_userdict("dict.txt")
s_list = jieba.cut("我叫孙宇晨,来自广东广州!")
print("内容(自定义词典):"+"/".join(s_list))
运行结果:
内容(自定义词典):我叫孙宇晨/,/来自广东/广州/!
修改默认词典内容
-
jieba.
suggest_freq(segment, tune=True)
可调节单个词语的词频,使其能(或不能)被分出来。 -
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
#将“广州”分词为”广“和”州“两个词
jieba.suggest_freq(('广','州'),True)
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",HMM=False)
print("内容(分离):"+"/".join(s_list))
#将“广东”和 “广” 合并成为“广东广”这个词
jieba.suggest_freq('广东广', True)
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",HMM=False)
print("内容(合并):"+"/".join(s_list))
运行结果:
内容(分离):我叫孙宇晨/,/来自广东/广/州/!
内容(合并):我叫孙宇晨/,/来自/广东广/州/!
3、词性标注
jieba.posseg
新建自定义分词器,可以查询每个词对应的词性
实例代码:
#查看默认词性,和自己设定词典的词性
import jieba.posseg as pseg
words = pseg.cut("我叫孙宇晨,来自广东广州!机器学习云计算常山赵子龙河北上将",HMM=False)
for word,index in words:
print(' 词性:',word," \t ",index)
运行结果:
词性: 我叫孙宇晨 n
词性: , x
词性: 来自 v
词性: 广东广 x
词性: 州 n
词性: ! x
词性: 机器学习 i
词性: 云计算 d
词性: 常山赵子龙 x
词性: 河北上将 x
4、获取词的起始位置
jieba.Tokenize:返回词语在原文的起止位置
示例代码:
tk_list=jieba.tokenize(u'我叫孙宇晨,来自广东广州!机器学习云计算常山赵子龙河北上将')
for tk in tk_list:
print("内容:",tk[0],"\tstart:",tk[1],"\tend:",tk[2])
运行结果:
内容: 我叫孙宇晨 start: 0 end: 5
内容: , start: 5 end: 6
内容: 来自 start: 6 end: 8
内容: 广东广 start: 8 end: 11
内容: 州 start: 11 end: 12
内容: ! start: 12 end: 13
内容: 机器学习 start: 13 end: 17
内容: 云计算 start: 17 end: 20
内容: 常山赵子龙 start: 20 end: 25
内容: 河北上将 start: 25 end: 29
wordcloud类库使用介绍
首先来一个最简单的用法
wordcloud.WordCloud() #调出对象
w.generate() #向WordCloud对象中加载文本txt
w.to_file(filename) #将词云输出为图像文件,.png或.jpg格式
示例代码:
import wordcloud
w=wordcloud.WordCloud()
w.generate("hello world")
w.to_file("helloworld.png")
输出结果:
wordcloud如何将文本转化为词云
- 1.分隔:以空格分隔单词
- 2.统计:单词出现次数并过滤
- 3.字体:根据统计配置字号
- 4.布局:颜色环境尺寸
下面为常用参数设置,可以多个参数设置在同一个WordCloud对象中,以“,”分隔
w=wordcloud.WordCloud(width=600) #指定词云对象生成图片的宽度,默认400像素
w=wordcloud.WordCloud(height=400) #指定词云对象生成图片的高度,默认200像素
w=wordcloud.WordCloud(min_font_size=10) #指定词云中字体的最小字号,默认4号
w=wordcloud.WordCloud(max_font_size=20) #指定词云中字体的最大字号,根据高度自动调节
w=wordcloud.WordCloud(font_step=2) #指定词云中字体字号的步进间隔,默认为1
w=wordcloud.WordCloud(font_path="msyh.ttc") #指定文体文件的路径,默认None
w=wordcloud.WordCloud(max_words=20) #指定词云显示的最大单词数量,默认200
w=wordcloud.WordCloud(stop_words="Python") #指定词云的排除词列表,即不显示的单词列表
w=wordcloud.WordCloud(background_color="white") #指定词云图片的背景颜色,默认为黑色
新增参数的例子:
w=wordcloud.WordCloud(width=400,
height=300,
min_font_size=10,
max_font_size=200,
font_step=2,
background_color="yellow"
)
w.generate("hello world hello hello python")
w.to_file("helloworld.png")
运行结果:
wordcloud结合jieba类库综合使用
wordcloud负责数据展示,jieba负责数据处理,分工明确。
首先来一个简单的综合例子:
需求:实现将一段文字分词后,绘制词云图。内容为:Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
实现如下:
import jieba
import wordcloud
txt="Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,
最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,
越多被用于独立的、大型项目的开发。"
w=wordcloud.WordCloud(width=850,
height=600,
background_color="#33ffcc",
font_path="water.ttf"
)
w.generate(" ".join(jieba.cut(txt)))
print(" ".join(jieba.cut(txt)))
w.to_file("python.png")
运行结果:
设置图片形状显示
ImageColorGenerator和recolor
案例代码:
import jieba
import wordcloud
import numpy as np
from os import path
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator
txt="Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言," \
"最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加," \
"越多被用于独立的、大型项目的开发。"
d = path.dirname(__file__)
#拿我的头像作为背景图片
back_coloring=np.array(Image.open(path.join(d,"黑白调小女孩.jpg")))
#设置中文字符集和图片背景颜色,还有图片显示区域
w=wordcloud.WordCloud(width=850,
height=600,
background_color="#33ffcc",
font_path="water.ttf",
mask=back_coloring
)
w.generate(" ".join(jieba.cut(txt)))
image_colors = ImageColorGenerator(back_coloring)
#将字体颜色与图片颜色一致
w.recolor(color_func=image_colors)
w.to_file("Python.png")
我头像图片:
执行结果:
ps:可以把图片换成自己喜欢的某张照片,还有把文字读取一篇字数比较多的文章,这样显示出来的效果更好看。
附上免费ttf字体下载地址:http://www.zhaozi.cn/s/all/ttf/