结巴分词 & 词云

目录


jieba

关于 jieba

优点:经典、免费
功能:用于分词


安装

(base) $ sudo pip install jieba

使用

分词工具

import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("全模式: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("精确模式: " + "/ ".join(seg_list))  # 精确模式(无重复)

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))
全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
精确模式: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦

添加自定义词典

text = "故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等"

# 全模式
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))

# 精确模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精确模式]: ", "/ ".join(seg_list))
[全模式]:  故宫/ 的/ 著名/ 著名景点/ 景点/ 包括/ 乾/ 清宫/ / / 太和/ 太和殿/ 和/ 黄/ 琉璃/ 琉璃瓦/ 等
[精确模式]:  故宫/ 的/ 著名景点/ 包括/ 乾/ 清宫/ 、/ 太和殿/ 和/ 黄/ 琉璃瓦/ 等

设置字典,保存到 mydict.txt 文件中;注意要保存为 utf-8 编码。

乾清宫 1 n
黄琉璃瓦 1 n

也可以用 jieba.add_word("乾清宫")
适合加个别几个词;不会永久记录。所以重复性的东西建议做到词典

jieba.load_userdict("./data/mydict.txt") #需UTF-8,可以在另存为里面设置
 

text = "故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等"

# 全模式
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))

# 精确模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精确模式]: ", "/ ".join(seg_list))


[全模式]:  故宫/ 的/ 著名/ 著名景点/ 景点/ 包括/ 乾清宫/ 清宫/ / / 太和/ 太和殿/ 和/ 黄琉璃瓦/ 琉璃/ 琉璃瓦/ 等
[精确模式]:  故宫/ 的/ 著名景点/ 包括/ 乾清宫/ 、/ 太和殿/ 和/ 黄琉璃瓦/ 等

关键词抽取

import jieba.analyse

seg_list = jieba.cut(text, cut_all=False)
print (u"分词结果:")
print ("/".join(seg_list))

# 获取关键词
tags = jieba.analyse.extract_tags(text, topK=5)  # topK:前K个最关键的词
print (u"关键词:")
print (" ".join(tags))
分词结果:
故宫/的/著名景点/包括/乾清宫/、/太和殿/和/黄琉璃瓦/等
关键词:
著名景点 乾清宫 黄琉璃瓦 太和殿 故宫
tags = jieba.analyse.extract_tags(text, topK=5, withWeight=True) # withWeight:输出是否带权重
for word, weight in tags:
    print(word, weight)
著名景点 2.3167796086666668
乾清宫 1.9924612504833332
黄琉璃瓦 1.9924612504833332
太和殿 1.6938346722833335
故宫 1.5411195503033335

词性标注

import jieba.posseg as pseg
 
words = pseg.cut("我爱北京*")
for word, flag in words:
    print("%s %s" % (word, flag))
我 r
爱 v
北京 ns
* ns

词云

关于词云

常见于文本可视化


一些工具、资料


使用

一个简单的英文词云

创建 text 文件,保存英文内容
读取 text,生成并展示图云

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 读取保存的文本
mytext = ''
# filename = "a.text"
filename = "b.text"
with open(filename, 'r') as f:
    mytext = f.read()

print('mytext : ', len(mytext))

# 生成词云
wc = WordCloud().generate(mytext)

plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

结巴分词 & 词云


生成中文词云

结巴分词 & 词云


  • 中文是连续的,不像 英文有 空格 分割;所以需要使用 jieba 这个库,将文字分开。
  • WordCloud默认不支持中文显示,需要下载中文字体;将字体文件路劲 填写到 font_path 键值即可; 一个免费字体下载网站:https://www.17font.com/fontlist/
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
from wordcloud import WordCloud
import matplotlib.pyplot as plt

import jieba
import time

import numpy as  np
from os import path
from PIL import Image

# 获取保存的文本
mytext = ''
filename = "src/a.text" 
with open(filename, 'r') as f:
    mytext = f.read()


# 2.结巴中文分词,生成字符串,默认精确模式,如果不通过分词,无法直接生成正确的中文词云
cut_text = jieba.cut(mytext)
 
# 必须给个符号分隔开分词结果来形成字符串,否则不能绘制词云
mytext = " ".join(cut_text)

# print(mytext)
print('mytext : ', len(mytext), type(mytext))
 
wc = WordCloud(
        
        font_path = 'src/heart.ttf',  # 设置字体,不指定就会出现乱码
        background_color='white', # 设置背景色
        width=600, # 设置背景宽
        height=420,   # 设置背景高 
        mode='RGBA', 
        )

wc.generate(mytext)
 
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()


now = time.strftime("output/%Y-%m-%d_%H:%M:%S", time.localtime())
print(now, type(now))
wc.to_file(str(now) + '.png')
  

如果字体错误,比如英文字符使用了中文字体,会报如下错误:

Traceback (most recent call last):
  File "/Users/user/repos/LearningPython/demos/wordcloud/wc01.py", line 54, in <module>
    wc.generate(mytext)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/wordcloud/wordcloud.py", line 631, in generate
    return self.generate_from_text(text)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/wordcloud/wordcloud.py", line 613, in generate_from_text
    self.generate_from_frequencies(words)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/wordcloud/wordcloud.py", line 447, in generate_from_frequencies
    max_font_size=self.height)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/wordcloud/wordcloud.py", line 496, in generate_from_frequencies
    font = ImageFont.truetype(self.font_path, font_size)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/PIL/ImageFont.py", line 640, in truetype
    return freetype(font)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/PIL/ImageFont.py", line 637, in freetype
    return FreeTypeFont(font, size, index, encoding, layout_engine)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/PIL/ImageFont.py", line 186, in __init__
    font, size, index, encoding, layout_engine=layout_engine
OSError: cannot open resource

Process finished with exit code 1


词云展示

from wordcloud import WordCloud
import jieba
from wordcloud import WordCloud
from scipy.misc import imread
from collections import Counter
import matplotlib.pyplot as plt

data={}

text_file = open('./data/19Congress.txt','r',encoding='utf-8')
text = text_file.read()
with open('./data/stopwords.txt',encoding='utf-8') as file:
    stopwords = {line.strip() for line in file}

seg_list = jieba.cut(text, cut_all=False)
for word in seg_list:
    if len(word)>=2:
        if not data.__contains__(word):
            data[word]=0
        data[word]+=1
#print(data)      
 
my_wordcloud = WordCloud(  
    background_color='white',  #设置背景颜色
    max_words=400,  #设置最大实现的字数
    font_path=r'./data/SimHei.ttf',  #设置字体格式,如不设置显示不了中文
    mask=imread('./data/mapofChina.jpg'), #指定在什么图片上画
    width=1000,
    height=1000,
    stopwords = stopwords
).generate_from_frequencies(data)

plt.figure(figsize=(18,16))
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()  # 展示词云
my_wordcloud.to_file('result.jpg')
text_file.close()

结巴分词 & 词云


自定义显示

示例

结巴分词 & 词云

wc = WordCloud(
        # 设置字体,不指定就会出现乱码 
        background_color='white', # 设置背景色
        width=500, # 设置背景宽
        height=350,   # 设置背景高

        max_font_size=80,  # 最大字体

        min_font_size=10,  # 最小字体
        mode='RGBA',
        # colormap='pink'
        )
 
wc.generate(mytext)
plt.imshow(wc, interpolation='bilinear')

分析 WordCloud() 方法

  def __init__(self, font_path=None, 
               width=400, height=200, margin=2,  # 图片宽、高、边距
               ranks_only=None, 
               prefer_horizontal=.9,  # 词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
              # mask=None,  # 如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。
              # 除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。
               # 可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。
               
               scale=1, # 按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。
               
               color_func=None, # 生成新颜色的函数,如果为空,则使用 self.color_func
               
               max_words=200,  # 显示的词的最大个数
               max_font_size=None, min_font_size=4, # 最大、最小字体尺寸
               font_step=1,  # 字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。
               stopwords=None, # 需要屏蔽的词,如果为空,则使用内置的STOPWORDS
               random_state=None, 
               background_color='black', # 背景颜色
               
               
               mode="RGB",   # 当参数为“RGBA”并且background_color不为空时,背景为透明。
               relative_scaling='auto',  # 词频和字体大小的关联性
               regexp=None,  # 使用正则表达式分隔输入的文本
               collocations=True, # 是否包括两个词的搭配
               colormap=None, # 给每个单词随机分配颜色,若指定color_func,则忽略该方法。
               
               normalize_plurals=True, 
               contour_width=0,
               contour_color='black', 
               repeat=False,
               include_numbers=False, 
               min_word_length=0, 
               collocation_threshold=30):

单例其他方法

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)  # 输出到文件

带 mask 词云

结巴分词 & 词云
结巴分词 & 词云


#!/usr/bin/env python3
# -*- coding: utf-8 -*-


from wordcloud import WordCloud
import matplotlib.pyplot as plt

import jieba
import time

import numpy as  np
from os import path
from PIL import Image

# 获取保存的文本
mytext = '' 
filename = "b.text" 
with open(filename, 'r') as f:
    mytext = f.read()
  
# print(mytext)
print('mytext : ', len(mytext), type(mytext))

# 展示图片
img = Image.open("apple.jpeg")
plt.imshow(img)
plt.show()
alice_mask = np.array(img)
 
wc = WordCloud(
     
        background_color='white', # 设置背景色
        width=600, # 设置背景宽
        height=420,   # 设置背景高

        # max_font_size=200,  # 最大字体
        # min_font_size=10,  # 最小字体
        mode='RGBA',
        mask=alice_mask
        # colormap='pink'
        )

wc.generate(mytext)
 
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
 
now = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())
print(now, type(now))
wc.to_file(str(now) + '.png')
 


上一篇:情人节礼物------用她的照片和我们的聊天记录生成词云~


下一篇:jieba词频统计