失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python中文分词器-jieba分词器详解及wordcloud词云生成

python中文分词器-jieba分词器详解及wordcloud词云生成

时间:2019-06-25 03:42:59

相关推荐

python中文分词器-jieba分词器详解及wordcloud词云生成

jieba分词

jieba分词支持三种分词模式:

精确模式, 试图将句子最精确地切开,适合文本分析

全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义

搜索引擎模式,在精确模式的基础上,对长词再词切分,提高召回率,适合用于搜索引擎分词

jiaba分词还支持繁体分词和支持自定义分词

1.jieba分词器的安装

在python2.x和python3.x均兼容,有以下三种:

全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba

半自动安装: 先下载,网址为: /pypi/jieba, 解压后运行: python setup.py install

手动安装: 将jieba目录放置于当前目录或者site-packages目录

2.jieba分词主要功能

jieba.cut:该方法接受三个输入参数:需要分词的字符串; cut_all 参数用来控制是否采用全模式;HMM参数用来控制是否适用HMM模型

jieba.cut_for_search:该方法接受两个参数:需要分词的字符串;是否使用HMM模型,该方法适用于搜索引擎构建倒排索引的分词,粒度比较细。

待分词的字符串可以是unicode或者UTF-8字符串,GBK字符串。注意不建议直接输入GBK字符串,可能无法预料的误解码成UTF-8,

jieba.cut 以及jieba.cut_for_search返回的结构都是可以得到的generator(生成器), 可以使用for循环来获取分词后得到的每一个词语或者使用

jieb.lcut 以及 jieba.lcut_for_search 直接返回list

jieba.Tokenizer(dictionary=DEFUALT_DICT) 新建自定义分词器,可用于同时使用不同字典,jieba.dt为默认分词器,所有全局分词相关函数都是该分词器的映射

jieba.posseg.cut进行词性标注

import jiebaimport jieba.possegsentence = '如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间,很短的一点儿时间。——王尔德'# .cut(分词内容,分词模式(全模式,精模式,搜索引擎模式))# True表示全模式,默认是精准模式vocabulary = jieba.cut(sentence, cut_all=False) # 精准模式# 对象是一个生成器,需要迭代输出print('/'.join(vocabulary))for i in vocabulary:print(i)vocabulary1 = jieba.cut(sentence, cut_all=True) # 全模式# 对象是一个生成器,需要迭代输出print('/'.join(vocabulary1))for i in vocabulary1:print(i)vocabulary2 = jieba.cut_for_search(sentence)# 搜索引擎模式print('/'.join(vocabulary2))for j in vocabulary2:print(j)vocabulary3 = jieba.lcut(sentence) # 返回一个列表print(vocabulary3)vocabulary4 = jieba.lcut_for_search(sentence) # 返回一个列表print(vocabulary4)# 词性标注vocabulary5 = jieba.posseg.cut(sentence)# .word词语# .flag词性for item in vocabulary5:print(item.word+'------'+item.flag)'''a: 形容词c:连词d:副词e:叹词f:方位词i:成语m:数词n:名词nr:人名ns:地名nz:其它专有名词p:介词r:代词t:时间u:助词w:标点符号un:未知词语'''# 输出'''如果/你/浪费/了/自己/的/年龄/,/那/是/挺/可悲/的/。/因为/你/的/青春/只能/持续/一点儿/时间/,/很/短/的/一点儿/时间/。/—/—/王尔德如果/你/浪费/了/自己/的/年龄///那/是/挺/可悲/的///因为/你/的/青春/只能/持续/一点/一点儿/点儿/儿时/时间///很/短/的/一点/一点儿/点儿/儿时/时间/王尔德/尔德如果/你/浪费/了/自己/的/年龄/,/那/是/挺/可悲/的/。/因为/你/的/青春/只能/持续/一点/点儿/一点儿/时间/,/很/短/的/一点/点儿/一点儿/时间/。/—/—/尔德/王尔德['如果', '你', '浪费', '了', '自己', '的', '年龄', ',', '那', '是', '挺', '可悲', '的', '。', '因为', '你', '的', '青春', '只能', '持续', '一点儿', '时间', ',', '很', '短', '的', '一点儿', '时间', '。', '—', '—', '王尔德']['如果', '你', '浪费', '了', '自己', '的', '年龄', ',', '那', '是', '挺', '可悲', '的', '。', '因为', '你', '的', '青春', '只能', '持续', '一点', '点儿', '一点儿', '时间', ',', '很', '短', '的', '一点', '点儿', '一点儿', '时间', '。', '—', '—', '尔德', '王尔德']如果------c你------r浪费------n了------ul自己------r的------uj年龄------n,------x那------r是------v挺------d可悲------a的------uj'''

3.jieba分词器添加自定义词典

jieba分词器还有一个方便的地方是开发者可以指定自己的自定义词典,以便包含词库中没有的词,虽然jieba分词有新词识别能力,但是自行添加新词可以保证更高的正确率。

使用命令:

jieba.load_userdict(filename) # filename为自定义词典的路径

在使用的时候,词典的格式和jieba分词器本身的分词器中的词典格式必须保持一致,一个词占一行,每一行分成三部分,一部分为词语,一部分为词频,最后为词性(可以省略),用空格隔开。下面其中userdict.txt中的内容为小修添加的词典,而第二部分为没有添加字典之后对text文档进行分词得到的结果,第三部分为添加字典之后分词的效果

import jiebaimport jieba.possegsentence = '如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间,很短的一点儿时间。——王尔德'# 手动添加自己的词典with open('E:/新建文件夹/lib/site-packages/jieba/dict2.txt', encoding='utf-8') as f:print(f.read())vocabulary6 = jieba.cut(sentence)print('/'.join(vocabulary6))# 加载自己添加的词典jieba.load_userdict("E:/新建文件夹/lib/site-packages/jieba/dict2.txt")vocabulary7 = jieba.cut(sentence)print('/'.join(vocabulary7))# 输出'''如果你 3 nt自己的年龄 3 nt可悲 2 n如果/你/浪费/了/自己/的/年龄/,/那/是/挺/可悲/的/。/因为/你/的/青春/只能/持续/一点儿/时间/,/很/短/的/一点儿/时间/。/—/—/王尔德如果/你/浪费/了/自己的年龄/,/那/是/挺/可悲/的/。/因为/你/的/青春/只能/持续/一点儿/时间/,/很/短/的/一点儿/时间/。/—/—/王尔德'''

4.利用jieba进行关键词抽取

import jieba.analyse

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

#sentence为待提取的文本

#topK 为返回几个TF/IDF权值最大的词语, 默认值是20

#withWeight 为是否一起返回关键词的权重

#allowPOS 指仅包含指定词性的词语,默认值是空,既不筛选

import jieba.analysedata = open("D:/数据/圣女的救济.txt", 'r', encoding='utf-8').read()tag1 = jieba.analyse.extract_tags(data, 10)print(tag1)# 返回权重for x, w in jieba.analyse.extract_tags(data, topK=10, withWeight=True):print("{} {}".format(x, w))print()for x, w in jieba.analyse.textrank(data, topK=10, withWeight=True):print("{} {}".format(x, w))'''['草薙', '绫音', '汤川', '宏美', '内海', '什么', '说道', '真柴', '太太', '咖啡']草薙 0.19677998625949678绫音 0.10912344692572094汤川 0.0723230339109579宏美 0.0516228015901537内海 0.04378835073257231什么 0.032482532382338225说道 0.030569084245059747真柴 0.03041145242192223太太 0.02962055696282584咖啡 0.02644520953954082草薙 1.0绫音 0.8646603726750798没有 0.44726461324817374时候 0.3555402733408261真柴 0.3545518779670063说道 0.33229614465002283太太 0.31255398187524175先生 0.27649125274590153内海 0.2536866148554咖啡 0.6714256737032'''

wordcloud词云生成

1.wordcloud包的安装

pip install wordcloud / pip3 install wordcloud

使用whl文件安装

https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud,点击下载与自己python环境版本相同的文件cmd命令行输入pip3 install wordcloud下载后的文件路径

2. wordcloud详解

wordcloud 类的定义如下所示:

class WordCloud(object):def __init__(self, font_path=None, width=400, height=200, margin=2,ranks_only=None, prefer_horizontal=.9, mask=None, scale=1,color_func=None, max_words=200, min_font_size=4,stopwords=None, random_state=None, background_color='black',max_font_size=None, font_step=1, mode="RGB",relative_scaling=.5, regexp=None, collocations=True,colormap=None, normalize_plurals=True):pass

常用的参数含义:

font_path : string //字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'width : int (default=400) //输出的画布宽度,默认为400像素height : int (default=200) //输出的画布高度,默认为200像素prefer_horizontal : float (default=0.90) //词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )mask : nd-array or None (default=None) //如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。scale : float (default=1) //按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。min_font_size : int (default=4) //显示的最小的字体大小font_step : int (default=1) //字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。max_words : number (default=200) //要显示的词的最大个数stopwords : set of strings or None //设置需要屏蔽的词,如果为空,则使用内置的STOPWORDSbackground_color : color value (default=”black”) //背景颜色,如 background_color='white',背景颜色为白色。max_font_size : int or None (default=None) //显示的最大的字体大小mode : string (default=”RGB”) //当参数为“RGBA”并且background_color不为空时,背景为透明。relative_scaling : float (default=.5) //词频和字体大小的关联性color_func : callable, default=None //生成新颜色的函数,如果为空,则使用 self.color_funcregexp : string or None (optional) //使用正则表达式分隔输入的文本collocations : bool, default=True //是否包括两个词的搭配colormap : string or matplotlib colormap, default=”viridis” //给每个单词随机分配颜色,若指定color_func,则忽略该方法。fit_words(frequencies) //根据词频生成词云generate(text) //根据文本生成词云generate_from_frequencies(frequencies[, ...]) //根据词频生成词云generate_from_text(text) //根据文本生成词云process_text(text) //将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )recolor([random_state, color_func, colormap]) //对现有输出重新着色。重新上色会比重新生成整个词云快很多。to_array() //转化为 numpy arrayto_file(filename) //输出到文件

3.代码示例

from wordcloud import WordCloudimport matplotlib.pyplot as plt # 绘制图像的模块import jieba# jieba分词data = open("D:/数据/圣女的救济.txt", 'r', encoding='utf-8').read()# 结巴分词,生成字符串,wordcloud无法直接生成正确的中文词云cut_text = " ".join(jieba.cut(data))# 设置字体,不然会出现文字乱码,文字的路径是电脑的字体一般路径,可以换成别的# 设置了背景,宽高wordcloud = WordCloud(font_path="simhei.ttf", background_color="white",width=1000, height=880).generate(cut_text) # simhei.ttf黑体常规plt.imshow(wordcloud, interpolation="bilinear")plt.axis("off")# 存储图像wordcloud.to_file('圣女的救济.png') # 设置保存路径plt.show()

给词云加上图片背景

from os import pathfrom PIL import Imagefrom wordcloud import WordCloud, ImageColorGeneratorimport matplotlib.pyplot as pltimport numpy as npimport jiebadef GetWordCloud():path_txt = 'D:/数据/圣女的救济.txt'path_img = "test.jpg"f = open(path_txt, 'r', encoding='utf-8').read()background_image = np.array(Image.open(path_img))# join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串cut_text = " ".join(jieba.cut(f))# mask参数=图片背景,必须要写上,另外有mask参数再设定宽高是无效的wordcloud = WordCloud(font_path="simhei.ttf", background_color="white", mask=background_image).generate(cut_text)# 生成颜色值image_colors = ImageColorGenerator(background_image)# 下面代码表示显示图片plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation="bilinear")# 获得模块所在的路径的d = path.dirname(__file__)# os.path.join(): 将多个路径组合后返回wordcloud.to_file(path.join(d, "圣女的救济1.png"))plt.axis("off")plt.show()if __name__ == '__main__':GetWordCloud()

如果觉得《python中文分词器-jieba分词器详解及wordcloud词云生成》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。