ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

结巴分词 & 词云

2021-02-06 08:01:47  阅读:288  来源: 互联网

标签:jieba text mytext 结巴 词云 print import 分词


目录


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,text,mytext,结巴,词云,print,import,分词
来源: https://www.cnblogs.com/fldev/p/14380515.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有