Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


用wordcloud和jieba生成中文词云

WordCloud是Python中一个非常优秀的第三方词云展示库,但是处理中文就不怎么能胜任,因为中文通常包含着一整句话,尽管在WordCloud里虽然也有process_text()方法用于把很长的文字做分隔,但这个方法本身是根据英文文本分词设计的,所以对于中文字的展示必须要配合更适合做中文分词处理的jieba分词库来操作效果更佳,今天就拿这两个库配合一起展示下小说《三国演义》中,四个字成语中那些出现的频率最高。

先来看下最终的词云效果图,下面就是我们以武将张飞为模板形状产生的中文词云图,可以很明显的看到诸如,如之奈何大喝一声木牛流马决一死战都是比较大突出和大的字体,说明频率最高,也不得不说三国剧情的跌宕起伏和打斗场面精彩。

sanguo_WordCloud_pic

下面就是整段处理的代码,因为我们的目标是创建基于小说《三国演义》里所有四个字成语的中文词云图,因此我们从逻辑上来说只需要设计两个函数体。分别是split_four_text()函数用来处理中文分词功能,和draw_wordcloud函数用于将处理后的中文词显示成词云,对于整段代码提一下几处重要的代码区域。

第13行代码处,在配置实例对象wordcloud参数时,我们设置了font_path参数,因为在部分系统环境内显示中文会出现乱码,所以强制以定义的中文字体显示就可以解决这个问题。

第64行代码处,由于WordCloud词云读取的文本必须以字符串或者二进制形式输入,否则会报错TypeError: expected string or bytes-like object的关系,所以我们强制将jieba分词返回的list类型内容转换为str类型。

import jieba  
import numpy as np  
from pathlib import Path  
from PIL import Image  
from wordcloud import WordCloud, ImageColorGenerator  
from matplotlib import pyplot as plt

def split_four_text(text):  
# split_four_text函数用于jieba分词并分隔为4个字为一组的内容。

    words =jieba.cut(text)

    # 用Counter方法计算单词频率数
    count = Counter(words)
    most_count = count.most_common()
    words_list = []

    for i in most_count:
        if len(i[0]) == 4:
            words_list.append(i[0])

    return words_list


def draw_wordcloud(text, image_mask,):  
# draw_wordcloud函数以用户定义的模板轮廓图来显示中文词云。

    sanguo_mask = np.array(Image.open(image_mask))

    wordcloud = WordCloud(background_color = 'white', mask = sanguo_mask, 
                          max_words = 1000,
                          # 如果不设置中文字体,可能会出现乱码
                          font_path = '/System/Library/Fonts/STHeiti Light.ttc')

    wordcloud.generate(text)

    image_colors = ImageColorGenerator(sanguo_mask)

    plt.figure(figsize = (14, 8))

    # 创建左侧中文词云图
    plt.subplot(121)
    plt.imshow(wordcloud.recolor(color_func = image_colors), interpolation = 'bilinear')
    plt.axis('off')

    # 创建右侧原图
    plt.subplot(122)
    plt.imshow(sanguo_mask, interpolation = 'bilinear')
    plt.axis('off')

    plt.show()


# 读取文件内容    
text_path = Path('三国演义.txt')  
with text_path.open(encoding = 'GB18030') as f:  
    text_content = f.read()

# 把文件内容交给自定义的split_four_text中文分词函数处理。
sanguo = split_four_text(text = text_content)

# 由于split_four_text函数返回的是一个list类型,词云只接收字符串或者二进制形式输入,
# 所以用str()函数转换为字符串。
draw_wordcloud(text = str(sanguo), image_mask = 'guanyu_template.jpeg')  
最近的文章

Python变量的作用域

Python程序有各种各样的命名空间,它指的是在该程序段内一个特定的名称是独一无二的,它和其它同名的命名空间是无关的。 在Python中每一个函数都有自己的命名空间,如果在函数体外部,也就是主程序范围…

Python, 技术博文详细阅读
更早的文章

Python之jieba中文分词库

jieba分词是Python中目前最受欢迎的中文分词库,他有许多特点,为了便于介绍直接引用官方介绍如下。 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可…

Python, 技术博文详细阅读
comments powered by Disqus