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

jieba分词

jieba分词支持三种分词模式:
  • 精确模式, 试图将句子最精确地切开,适合文本分析

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

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

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

1.jieba分词器的安装

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

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

  • 半自动安装: 先下载,网址为: http://pypi.python.org/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 jieba
import jieba.posseg
sentence = '如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间,很短的一点儿时间。——王尔德'
# .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 jieba
import jieba.posseg
sentence = '如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间,很短的一点儿时间。——王尔德'
# 手动添加自己的词典
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.analyse
data = 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.25320046866148554
咖啡  0.20036714256737032

'''

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 //设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
background_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_func
regexp : 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 array
to_file(filename)   //输出到文件
3.代码示例
from wordcloud import WordCloud
import 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()

python中文分词器-jieba分词器详解及wordcloud词云生成_第1张图片
给词云加上图片背景

from os import path
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import numpy as np
import  jieba
def 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词云生成_第2张图片
python中文分词器-jieba分词器详解及wordcloud词云生成_第3张图片

你可能感兴趣的:(Python)