如何利用“wordcloud+jieba”制作中文词云?

如何利用“wordcloud+jieba”制作中文词云?

词云又叫文字云,它可以统计文本中频率较高的词,并将这些词可视化,让我们可以直观的了解文本中的重点词汇(词的频率越高,词显示的大小也就越大)。

本篇图文主要解决利用“wordcloud+jieba”制作中文词云的问题。其中,利用“jieba”库对中文进行分词,“wordcloud”库对分词之后的中文进行词云显示。

本篇图文分为三个部分,第一部分介绍“jieba”库的使用,第二部分介绍“wordcloud”库的使用,第三部分综合利用前两部分的知识对1000首古诗进行词云分析。

1. 分词工具详解

Python中比较常用的分词库是“jieba”,俗称“结巴分词”。

安装“jieba”的过程也比较简单,支持Python的pip安装,命令如下:

pip install jieba

“jieba”常用的函数非常少,通常只有一个cut()函数。

cut(sentence, cut_all=False, HMM=True):将包含中文的整个句子分割成单独的词。

  • sentence:要进行分词的句子。
  • cut_all:模型类型,True表示完整模式,False表示准确模式。
  • HMM:是否使用隐马尔可夫模型。

下面通过简单的例子来讲述如何使用结巴分词。

【例子】利用准确模式分词。

import jieba

text = "中华民族创造了悠久灿烂的中华文明,为人类作出了卓越贡献。"

words = jieba.cut(text, cut_all=False)

print('/'.join(words))
# 中华民族/创造/了/悠久/灿烂/的/中华文明/,/为/人类/作出/了/卓越贡献/。

【例子】利用完整模式分词。

import jieba

text = "中华民族创造了悠久灿烂的中华文明,为人类作出了卓越贡献。"

words = jieba.cut(text, cut_all=True)

print('/'.join(words))
# 中华/中华民族/民族/创造/了/悠久/灿烂/的/中华/中华文明/华文/文明///为/人类/作出/了/卓越/卓越贡献/贡献//

2. 词云绘制工具详解

“wordcloud”是基于Python开发的词云生成库,用于读取文本文件中的内容并使用指定的图片为背景生成基于词频的词云图。

安装“wordcloud”的过程也比较简单,支持Python的pip安装,命令如下:

pip install 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='auto', regexp=None, collocations=True,
                 colormap=None, normalize_plurals=True, contour_width=0,
                 contour_color='black', repeat=False,
                 include_numbers=False, min_word_length=0, collocation_threshold=30):
                 
    def generate(self, text):
    
    def process_text(self, text):
    
    def generate_from_frequencies(self, frequencies, max_font_size=None): 
    
    def to_file(self, filename):

下面通过简单的例子来讲述如何使用“wordcloud”,文本text内容是老鹰乐队演唱的《加州旅馆》的一段歌词:

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
import PIL
import jieba

text = '''
On a dark desert hightway
Cold wind in my hair
Warm smeel of colytas
Rising up through the air
Up ahead in the distance
I saw a shimmering light
My head grew heavy and my sight grew dim
I dad to stop for the night
There she stood in the doorway
I heard the mission bell
I was thinking to myself
This could be heaven now this could be hell
Then she lit up a candle
And she showed me the way
There were voices down in corridor
I thought i heard them say:
Welcome to the Hotel California
Such a lovely place
'''

【例子】全部默认参数。

generate(text):从文本生成词云,参数text是一个用空格隔开的文本字符串。。

wc = WordCloud()
wc.generate(text)

plt.imshow(wc)
plt.axis("off")
plt.show()

注意:

  • 每次运行的结果均不同,单词展示位置有随机性。
  • 对比歌词可以看到,英文单词中的一些介词、主谓宾名词等直接被当成了STOPWORDS,默认的STOPWORDS有192个。
  • stopwords=None:设置需要屏蔽展示的词,如果为空,则使用内置的STOPWORDS。

“wordcloud”自带一个停用词表,是一个集合的数据类型。

from wordcloud import STOPWORDS

print(STOPWORDS)
# {'then', 'since', "he'll", 'themselves', "he's", 'over', 
# 'like', 'therefore', 'other', "didn't", 'same', 'there', 
# 'all', 'each', 'it', 'of', 'me', 'these', 'herself', 'ours', 
# 'up', 'was', "aren't", 'from', "don't", 'do', 'hence', 'until', 
# 'http', 'their', "i'd", 'no', "you're", 'between', 'the', 
# 'under', 'those', "they've", "we've", "couldn't", 'more', 
# 'we', "what's", 'also', 'at', 'when', 'here', 'himself', 
# "there's", 'not', "shan't", 'through', "i'll", "we'd", 
# 'below', 'both', 'about', 'otherwise', 'his', "i've", "she'll", 
# "wouldn't", "you'll", 'is', 'how', "wasn't", 'were', 'her', 
# "it's", 'i', 'out', 'who', 'com', 'are', 'whom', "we're", 
# 'having', 'what', 'as', "you'd", 'she', 'would', 'he', 'should', 
# 'if', 'cannot', 'so', 'yourself', "let's", 'own', 'yourselves', 
# 'only', 'your', 'than', 'am', 'ourselves', 'a', 'be', 'further', 
# 'yours', 'before', 'k', 'such', 'has', "she's", 'its', 'during', 
# "i'm", "haven't", 'which', "who's", "you've", 'r', "when's", 
# 'him', 'where', 'ought', 'itself', 'while', 'myself', 'after', 
# 'few', 'get', 'any', 'doing', 'our', 'else', 'you', "doesn't", 
# 'been', "that's", 'into', 'had', 'above', 'could', 'very', 
# 'this', 'that', 'have', 'or', "they'd", 'why', 'with', 'an', 
# "hasn't", 'www', 'but', "weren't", "where's", 'ever', "why's", 
# 'on', "mustn't", 'can', 'just', 'theirs', "here's", 'to', 
# 'too', 'nor', "won't", 'for', "she'd", 'being', 'did', "they're", 
# 'my', 'some', 'again', 'does', 'because', 'however', "isn't", 
# "can't", "hadn't", 'once', "we'll", 'down', 'shall', "shouldn't", 
# 'in', "they'll", 'off', "how's", 'against', 'hers', 'them', 
# 'they', 'by', 'most', "he'd", 'and'}

【例子】设置字体大小上限、下限,更改画布背景颜色。

  • background_color='black':输出画布背景颜色,默认黑色。
  • min_font_size=4:设置词的最小尺寸,默认4像素
  • max_font_size:设置词的最大尺寸,默认不限制

wc = WordCloud(max_font_size=50, min_font_size=10, background_color='yellow')
wc.generate(text)

plt.imshow(wc)
plt.axis("off")
plt.show()

【例子】调整水平和垂直方向展示文字概率,设置画布尺寸。

  • prefer_horizontal=.9:词语水平方向排版出现的频率,默认0.9,水平方向文字概率+垂直方向文字概率=1.0,所以词语垂直方向排版出现频率为 0.1。
  • width=400:输出画布的宽度,默认400像素。
  • height=200:输出画布的宽度,默认200像素。

wc1 = WordCloud(prefer_horizontal=0.9, height=600)
wc2 = WordCloud(prefer_horizontal=0.5, height=600)
wc3 = WordCloud(prefer_horizontal=0.1, height=600)

wc1.generate(text)
wc2.generate(text)
wc3.generate(text)

fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)
ax1.imshow(wc1)
ax2.imshow(wc2)
ax3.imshow(wc3)

ax1.axis("off")
ax2.axis("off")
ax3.axis("off")
plt.show()

【例子】设置自定义字体,使用蒙板(mask

  • font_path=None:字体的路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'。
  • mask=None:是否使用mask(蒙板),默认不使用。若使用mask,则需提供一个二值化的mask(即只有0和1的黑白色mask),此时参数widthheight会被忽略,单词会出现在mask非白色(#FFFFFF)的位置上。
  • contour_width=0mask轮廓线宽。若mask不为空且此项值大于0,就绘制出mask轮廓(default=0)。
  • contour_color='black'mask轮廓颜色,默认黑色。

py_mask = np.array(PIL.Image.open(r'pic_mask.jpg'))
wc = WordCloud(font_path='arial.ttf', background_color='white',
               mask=py_mask, contour_width=1,
               contour_color='blue')
wc.generate(text)

fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2)
ax1.imshow(py_mask)
ax2.imshow(wc)
ax1.axis("off")
ax2.axis("off")
plt.show()

注意:

  • 若使用的mask图片是二值图片,展现效果更好。
  • 实际应用中,蒙板不要太复杂一定要简单,因为展示词云不会展示到细节,也就是大轮廓能看清楚。

【例子】设置字体主题

  • colormap=None:给每个词随机分配颜色或者使用Matplotlib调色板,默认颜色是“viridis”即翠绿色。

内嵌的调色板见:

https://matplotlib.org/2.0.2/examples/color/colormaps_reference.html

wc1 = WordCloud(colormap='inferno', height=600)
wc2 = WordCloud(colormap='BuGn', height=600)
wc3 = WordCloud(colormap='autumn', height=600)

wc1.generate(text)
wc2.generate(text)
wc3.generate(text)

fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)
ax1.imshow(wc1)
ax2.imshow(wc2)
ax3.imshow(wc3)

ax1.axis("off")
ax2.axis("off")
ax3.axis("off")
plt.show()

【例子】根据频率生成词云

process_text(text):统计各个词出现的频率,返回的是字典格式。

generate_from_frequencies(frequencies, max_font_size=None):从词和词频创建词云。

to_file(filename):输出图像文件。

wc = WordCloud()
process_word = wc.process_text(text)
print(process_word)
# {'dark': 1, 'desert': 1, 'hightway': 1, 'Cold': 1, 'wind': 1,
# 'hair': 1, 'Warm': 1, 'smeel': 1, 'colytas': 1, 'Rising': 1,
# 'air': 1, 'ahead': 1, 'distance': 1, 'saw': 1, 'shimmering': 1,
# 'light': 1, 'head': 1, 'grew': 2, 'heavy': 1, 'sight': 1,
# 'dim': 1, 'dad': 1, 'stop': 1, 'night': 1, 'stood': 1,
# 'doorway': 1, 'heard': 2, 'mission': 1, 'bell': 1, 'thinking': 1,
# 'heaven': 1, 'now': 1, 'hell': 1, 'lit': 1, 'candle': 1, 'showed': 1,
# 'way': 1, 'voices': 1, 'corridor': 1, 'thought': 1, 'say': 1,
# 'Welcome': 1, 'Hotel': 1, 'California': 1, 'lovely': 1, 'place': 1}

wc.generate_from_frequencies(process_word)
wc.to_file(r'pic_result.png')

plt.imshow(wc)
plt.axis("off")
plt.show()

【例子】显示中文

text = "中华民族创造了悠久灿烂的中华文明,为人类作出了卓越贡献。"
words = jieba.cut(text, cut_all=True)
wc = WordCloud(font_path='simfang.ttf')
wc.generate(' '.join(words))

plt.imshow(wc)
plt.axis("off")
plt.show()

由于中文的词没有通过空格隔开,所以需要将文本进行分词,而分词就用到了我们上面介绍的第三方库“jieba”,俗称结巴分词。

另外,"wordcloud"的默认字体不支持中文,所以此处需要指定一个支持中文的字体。否则显示的是矩形框。

3. 案例分析

对1000首古诗做词云分析。

import jieba
from wordcloud import WordCloud
import numpy as np
import PIL
import matplotlib.pyplot as plt

# 去掉一些作者的名字
STOPWORDS = [
    u'李白', u'杜甫', u'辛弃疾', u'李清照', u'毛泽东', u'苏轼',
    u'李商隐', u'王维', u'白居易', u'李煜', u'杜牧',
]

def load_file(file_path):
    with open(file_path) as f:
        lines = f.readlines()

content = ''

for line in lines:
        line = line.strip().rstrip('\n')
        content += line

words = jieba.cut(content)

l = []
    for w in words:
        # 如果词的长度小于 2,则舍去
        if len(w) < 2: continue
        l.append(w)

return ' '.join(l)

if __name__ == '__main__':
    file_path = './gushi.txt'
    content = load_file(file_path)
    font = 'simfang.ttf'
    wc = WordCloud(font_path=font, stopwords=STOPWORDS)

wc.generate(content)
    plt.imshow(wc)
    plt.axis("off")
    plt.show()

wc.to_file("wordcloud.jpg")
    
    dic = wc.process_text(content)
    d1 = sorted(dic.items(), key=lambda x: x[1], reverse=True)
    print(d1)

参考文献:

  • https://mp.weixin.qq.com/s/oQ6CQ3sFmdqfydAbVtYefA
  • https://mp.weixin.qq.com/s/FoAvpp-vQxPxTCJBGyFh1Q

(0)

相关推荐