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
词云
关于词云
常见于文本可视化
一些工具、资料
-
文档:http://amueller.github.io/word_cloud/, https://pypi.org/project/wordcloud/
-
web 词云统计 http://cloud.niucodata.com/
使用
一个简单的英文词云
创建 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')