文本挖掘学习笔记(一):文本分词和词云展示

注:学习笔记基于文彤老师文本挖掘的系列课程

全文基于《射雕英雄传》语料库,下面是读入数据的一个基于Pandas的通用操作框架。

读入为数据框

import pandas as pd
# 有的环境配置下read_table出错,也可用用read_csv
raw = pd.read_table("金庸-射雕英雄传txt精校版.txt",
                  names = ['txt'],  encoding ="GBK")
print(len(raw))
raw.head()
7432
txt
0全本全集精校小说尽在:http://www.yimuhe.com/u/anglewing26...
1更多资源下载:http://qqzone.ctdisk.com
2※声明:本电子书仅供读者预览,请在下载24小时内删除,不得用作商业用途;如果喜欢请购买正版图书!※
3------------------------------------------
4“金庸作品集”新序

加入章节标识

# 章节判断用变量预处理
def m_head(tmpstr):
    return tmpstr[:1]

def m_mid(tmpstr):
    return tmpstr.find("回 ")
#取出进行判断的变量
raw['head'] = raw.txt.apply(m_head)
raw['mid'] = raw.txt.apply(m_mid)
raw['len'] = raw.txt.apply(len)#防止特殊情况,设置长度
raw.head()
txtheadmidlen
0全本全集精校小说尽在:http://www.yimuhe.com/u/anglewing26...-155
1更多资源下载:http://qqzone.ctdisk.com-131
2※声明:本电子书仅供读者预览,请在下载24小时内删除,不得用作商业用途;如果喜欢请购买正版图书!※-149
3--------------------------------------------142
4“金庸作品集”新序-19
# 章节判断
chapnum = 0
for i in range(len(raw)):
    if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30 :
        chapnum += 1
    if chapnum >= 40 and raw['txt'][i] == "附录一:成吉思汗家族" :
        chapnum = 0
    raw.loc[i, 'chap'] = chapnum
    
# 删除临时变量,这里必须删除,否则后续sum函数处会出错
del raw['head']
del raw['mid']
del raw['len']
raw.head()
txtchap
0全本全集精校小说尽在:http://www.yimuhe.com/u/anglewing26...0.0
1更多资源下载:http://qqzone.ctdisk.com0.0
2※声明:本电子书仅供读者预览,请在下载24小时内删除,不得用作商业用途;如果喜欢请购买正版图书!※0.0
3------------------------------------------0.0
4“金庸作品集”新序0.0

提取出所需章节

raw[raw.chap == 1].head()
txtchap
33第一回 风雪惊变1.0
341.0
351.0
36那说话人五十来岁年纪,一件青布长袍早洗得褪成了蓝灰带白。只听他两片梨花木板碰了几下,左手...1.0
37几处败垣围故井,向来一一是人家。”1.0
from matplotlib import pyplot as plt
%matplotlib inline
raw.txt.agg(len).plot.box()

在这里插入图片描述

rawgrp = raw.groupby('chap')
chapter = rawgrp.agg(sum) # 只有字符串列的情况下,sum函数自动转为合并字符串
chapter = chapter[chapter.index != 0]#排除前言和附录

1.分词

1.1结巴分词的基本用法

jieba是目前应用最广,评价也较高的分词工具包

安装方法
pip install jieba

基本特点:支持繁体分词 支持自定义词典

三种分词模式
1.精确模式,试图将句子最精确地切开,适合做文本分析
2.全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义
3.搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

将序列中的元素以指定的字符连接生成一个新的字符串。

语法: ‘delimiter’.join(seq)
delimiter:分隔符。可以为空
import jieba

tmpstr = "哀牢山三十六剑,剑法凌厉号称天下第一。"
res = jieba.cut(tmpstr) # 精确模式

print(res)
# 是一个可迭代的 generator,可以使用 for 循环来遍历结果,本质上类似lis
<generator object Tokenizer.cut at 0x000002447E180BF8>
' '.join(res)#运行一次后就分开了,若想重复运行,需要再执行上面的代码
'哀牢山 三十六 剑 , 剑法 凌厉 号称 天下第一 。'
res = jieba.cut(tmpstr)
list(word for word in res) # 演示generator的用法
# 将res的word取出并将这些word变为list格式
['哀牢山', '三十六', '剑', ',', '剑法', '凌厉', '号称', '天下第一', '。']
print(jieba.lcut(tmpstr)) # 结果直接输出为list
['哀牢山', '三十六', '剑', ',', '剑法', '凌厉', '号称', '天下第一', '。']
print('/'.join(jieba.cut(tmpstr, cut_all = True))) # 全模式
哀牢山/三十/三十六/十六/剑/,/剑法/凌厉/号称/天下/天下第一/第一/。
# 搜索引擎模式
print('/'.join(jieba.cut_for_search(tmpstr)))
print(jieba.lcut_for_search(tmpstr))
哀牢山/三十/十六/三十六/剑/,/剑法/凌厉/号称/天下/第一/天下第一/。
['哀牢山', '三十', '十六', '三十六', '剑', ',', '剑法', '凌厉', '号称', '天下', '第一', '天下第一', '。']

1.2 修改词典

在程序中可以动态根据分词的结果,对内存中的词库进行更新

add_word(word)

word:新词

freq=None:词频

tag=None:具体词性

del_word(word)

# 动态修改词典
jieba.add_word("哀牢山三十六剑")
'/'.join(jieba.cut(tmpstr))
'哀牢山三十六剑/,/剑法/凌厉/号称/天下第一/。'
jieba.del_word("哀牢山三十六剑")
'/'.join(jieba.cut(tmpstr))
'哀牢山/三十六/剑/,/剑法/凌厉/号称/天下第一/。'
使用自定义词典

load_userdict(file_name)

file_name:文件类对象或自定义词典的路径

词典基本格式

一个词占一行:词、词频(可省略)、词性(可省略),用空格隔开
词典文件必须为 UTF-8 编码,必要时可以使用Uedit32进行文件编码转换

dict = '金庸小说词库.txt'
jieba.load_userdict(dict) # dict为自定义词典的路径
'/'.join(jieba.cut(tmpstr))
'哀牢山三十六剑/,/剑法/凌厉/号称/天下第一/。'
使用搜狗细胞词库

https://pinyin.sogou.com/dict/

按照词库分类或者关键词搜索方式,查找并下载所需词库

使用转换工具,将其转换为txt格式

在程序中导入相应词库

去除停用词

常见的停用词种类
1.超高频的常用词:基本不携带有效信息/歧义太多无分析价值(的、地、得、介词、连词)

2.专业领域的高频词:基本不携带有效信息

3.视情况而定的停用词

分词后去除停用词

基本步骤

读入停用词表文件
正常分词
在分词结果中去除停用词

新列表 = [ word for word in 源列表 if word not in 停用词列表 ]

该方法存在的问题:停用词必须要被分词过程正确拆分出来才行

tmpstr = "哀牢山三十六剑和剑法凌厉号称天下第一。"
newlist = [ word for word in jieba.cut(tmpstr) if word not in [ '和','。'] ] 
print(newlist)
['哀牢山三十六剑', '剑法', '凌厉', '号称', '天下第一']
import pandas as pd
tmpdf = pd.read_table('停用词.txt',names = ['w'],  encoding = 'utf-8')
tmpdf.head()
w
0,
1
2
3
4:
# 熟悉Python的可以直接使用 open('stopWord.txt').readlines()获取停用词list,效率更高
[ w for w in jieba.cut(tmpstr) if w not in list(tmpdf.w) ] 
['哀牢山三十六剑', '剑法', '凌厉', '号称', '天下第一']
用extract_tags函数去除停用词

方法特点:

根据TF-IDF算法将特征词提取出来,在提取之前去掉停用词
可以人工指定停用词字典
jieba.analyse.set_stop_words()

# 使用预先准备的停用词表
import jieba.analyse as ana
ana.set_stop_words('停用词.txt')
#jieba.lcut(tmpstr) # 读入的停用词列表对分词结果无效
ana.extract_tags(tmpstr, topK = 20)
# 使用TF-IDF算法提取关键词,并同时去掉停用词,出来结果就是列表的形式
['哀牢山三十六剑', '剑法', '天下第一', '凌厉', '号称']

1.3词性标注

import jieba.posseg

posseg.cut():给出附加词性的分词结果

词性标注采用和 ICTCLAS 兼容的标记法,后续可基于词性做进一步处理,如只提取出名词,动词等

import jieba.posseg as psg

tmpres = psg.cut(tmpstr) # 附加词性的分词结果
print(tmpres)

for item in tmpres:
    print(item.word, item.flag)#注意缩进
#flag表示词性,x代表未知词性(增添的词库中未标明)
<generator object cut at 0x000002440298C7D8>
哀牢山三十六剑 x
和 c
剑法 n
凌厉 nr
号称 v
天下第一 l
。 x
psg.lcut(tmpstr) # 直接输出为list,成员为pair
[pair('哀牢山三十六剑', 'x'),
 pair('和', 'c'),
 pair('剑法', 'n'),
 pair('凌厉', 'nr'),
 pair('号称', 'v'),
 pair('天下第一', 'l'),
 pair('。', 'x')]
psg.lcut(tmpstr)[0].word
'哀牢山三十六剑'

分词的NLTK实现

NLTK只能识别用空格作为词条分割方式,因此不能直接用于中文文本的分词。

一般的做法是先用jieba分词,然后转换为空格分隔的连续文本,再转入NLTK框架使用。

rawtext = '周伯通笑道:“你懂了吗?…”
txt = ’ '.join(jieba.cut(rawtext)) # “周伯通 笑 道 :…”
toke = nltk.word_tokenize(txt) # [‘周伯通’, ‘笑’, ‘道’, ‘:’…

实战:《射雕》一书分词

选取第一回的文字,应用搜狗的细胞词库和停用词表,清理出干净的分词结果。

raw1=chapter.txt[1]
dict = '金庸小说词库.txt'
jieba.load_userdict(dict) # dict为自定义词典的路径
res1 = jieba.lcut(raw1) # 精确模式
len(res1)
17890
print(' '.join(res1)[:10])#注意这行代码不要重复运行
第一回   风雪 惊
import pandas as pd
tmpdf = pd.read_table('停用词.txt',names = ['w'], encoding = 'utf-8')
res1_1=[ w for w in res1 if w not in list(tmpdf.w) ] 
res1_1[:4]
['第一回',
 ' ',
 '风雪',
 '惊变',

]

len(res1_1)
9373

2.词云展示

2.1词频统计

绝大部分词频统计工具都是基于分词后构建词条的list进行,因此首先需要完成相应的分词工作。


#分词
word_list = jieba.lcut(chapter.txt[1])
word_list[:4]
['第一回',
 ' ',
 '风雪',
 '惊变',
  ]

构建完list之后,也可以自行编写词频统计程序,框架如下:

遍历整个list,对每个词条:

if word in d: d[word] += 1

else: d[word] = 1#该word第一次出现

使用Pandas统计

word_list = jieba.lcut(" ".join(raw.txt))
word_list[:10]
['全本', '全集', '精校', '小说', '尽', '在', ':', 'http', ':', '/']
import pandas as pd

df = pd.DataFrame(word_list, columns = ['word'])
df.head()
word
0全本
1全集
2精校
3小说
4
result = df.groupby(['word']).size()
print(type(result))
freqlist = result.sort_values(ascending=False)#降序排序
freqlist[:10]
<class 'pandas.core.series.Series'>


word
,    70014
。    23233
     14760
“    12309
”    12234
:    11385
了    11213
的    10717
      7669
他     7496
dtype: int64
freqlist[freqlist.index == '道']
word
道    7001
dtype: int64
jieba.add_word('道', freq = 50000)#不影响原来的词频
                                  #只是在多种分词可能时候取频率高的
freqlist[freqlist.index == '道']
word
道    7001
dtype: int64

使用NLTK统计

NLTK生成的结果为频数字典,在和某些程序包对接时比较有用

import nltk
# 分词等预处理工作
# 这里可以根据需要做任何的preprocessing: stopwords, lemma, stemming, etc.
word_list[:10]
['全本', '全集', '精校', '小说', '尽', '在', ':', 'http', ':', '/']
fdist = nltk.FreqDist(word_list) # 生成完整的词条频数字典
# 带上某个单词, 可以看到它在整个文章中出现的次数
fdist['颜烈']
63
fdist.tabulate(10)#输出前10个高频词
    ,     。           “     ”     :     了     的           他 
70014 23233 14760 12309 12234 11385 11213 10717  7669  7496 
fdist.most_common(5)#作用跟上面一样,只不过输出格式不一样(list)
[(',', 70014), ('。', 23233), ('\u3000', 14760), ('“', 12309), ('”', 12234)]

2.2词云概述

wordcloud包的安装

安装
警告:wordcloud的安装有可能非常顺利,也有可能非常痛苦,完全是拼人品的一件事情。。。

方法1:pip install wordcloud

安装后很可能不能用,直接成功的话,您的人品实在是爆棚

方法2:python setup.py install

在github.com/amueller/word_cloud下载安装包

方法3:下载第三方编译好的whl文件进行安装

https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud

Visual C++ build tools支持

提示:Microsoft Visual C++ 14.0 is required.
需要:Visual C++ 2015 Build Tools
文件:visualcppbuildtools_full.exe

ImportError: DLL load failed: 找不到指定的模块。

pip uninstall pillow,然后重新安装pillow包
或者uninstall pillow之后使用上面的方法2安装,会自动安装相关的支持包

中文字体支持

.WordCloud(font_path='simhei.ttf')

需要带路径写完整字体文件名

注意Win10的字体文件后缀可能不一样

2.3绘制词云

WordCloud的基本语法

class wordcloud.WordCloud(

在设置大小的时候,由于本软件的问题,大小看不出来,但是实际保存下来大小是没错的

常用功能:

font_path : 在图形中使用的字体,默认使用系统字体 
width / height = 200 : 图形的宽度/高度
max_words = 200 : 需要绘制的最多词条数
stopwords = None : 停用词列表,不指定时会使用系统默认停用词列表

字体设定:

min_font_size = 4 /  max_font_size = None : 字符大小范围
font_step = 1 : 字号增加的步长
relative_scaling = .5: 词条频数比例和字号大小比例的换算关系,默认为50%
prefer_horizontal = 0.90 : 图中词条水平显示的比例

颜色设定:

background_color = ”black” : 图形背景色
mode = ”RGB”: 图形颜色编码,如果指定为"RGBA"且背景色为None时,背景色为透明
color_func = None : 生成新颜色的函数,使用matplotlib的colormap

背景掩模:

mask = None : 词云使用的背景图(遮罩)
)

用原始文本直接分词并绘制

cloudobj = WordCloud().generate(text)

generate实际上是generate_from_text的别名,generate里面的必须是处理过后的分词
文本需要用空格/标点符号分隔单词

import wordcloud
myfont = r'C:\Windows\Fonts\simkai.ttf'
text = 'this is shanghai, 郭靖, 和, 哀牢山 三十六剑'
cloudobj = wordcloud.WordCloud(font_path = myfont).generate(text)  
print(cloudobj)
<wordcloud.wordcloud.WordCloud object at 0x000002441E289160>
显示词云

import matplotlib.pyplot as plt

plt.imshow(cloudobj)

plt.close()#关闭词云

import matplotlib.pyplot as plt
plt.imshow(cloudobj)
plt.axis("off")#把坐标轴去掉,影响美观
plt.show()

在这里插入图片描述

# 更改词云参数设定
cloudobj = wordcloud.WordCloud(font_path = myfont, 
    width = 360, height = 180,
    mode = "RGBA", background_color = None).generate(text)  

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

在这里插入图片描述

保存词云

wordcloud.to_file(保存文件的路径与名称) 该命令保存的是高精度图形

cloudobj.to_file("词云.png")#尽量不要有重名,其会把重名的文件覆盖掉
wordcloud.WordCloud(font_path = myfont).generate(text).to_file("词云2.png")
<wordcloud.wordcloud.WordCloud at 0x2441e2ce208>
生成射雕第一章的词云
import pandas as pd
import jieba

stoplist = list(pd.read_table('停用词.txt', names = ['w'],
                            encoding = 'utf-8', engine='python').w)

def m_cut(intxt):
    return [ w for w in jieba.cut(intxt) if w not in stoplist ] 
cloudobj = wordcloud.WordCloud(font_path = myfont, 
    width = 1200, height = 800,
    mode = "RGBA", background_color = None,
    stopwords = stoplist).generate(' '.join(jieba.lcut(chapter.txt[1])))  

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

在这里插入图片描述

cloudobj = wordcloud.WordCloud(font_path = myfont, 
    width = 1200, height = 800,
    mode = "RGBA", background_color = None
    ).generate(' '.join(m_cut(chapter.txt[1])))  

plt.imshow(cloudobj)
plt.axis("off")
plt.show()#跟上面作用一样,这里是调用函数实现

在这里插入图片描述

cloudobj.to_file("词云3.png")#不要使用jpg格式,会报错
<wordcloud.wordcloud.WordCloud at 0x2441e2c3438>

基于分词频数绘制

generate()的实际操作

调用分词函数process_text()
调用基于频数的绘制函数fit_words()

fit_words(dict)

实际上是generate_from_frequencies的别名
Dict: 由词条和频数构成的字典(使用nltk较方便)
#基于分词频数绘制词云,给出词频就可以直接绘制了
txt_freq = {'张三':100,'李四':90,'王二麻子':50}
cloudobj = wordcloud.WordCloud(font_path = myfont).fit_words(txt_freq)
plt.imshow(cloudobj)
plt.axis("off")
plt.show()  

在这里插入图片描述

使用nltk 用频数生成射雕第一章的词云
import nltk
from nltk import FreqDist

tokens = m_cut(chapter.txt[1])
fdist = FreqDist(tokens) # 生成完整的词条频数字典
type(fdist)
nltk.probability.FreqDist
cloudobj = wordcloud.WordCloud(font_path = myfont).fit_words(fdist)

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

在这里插入图片描述

2.4 词云的美化

各种详细的操作和设定可以参考官网的案例:

https://amueller.github.io/word_cloud/

2.4.1设置背景图片

Mask 用于控制词云的整体形状

指定mask后,设置的宽高值将被忽略,遮罩形状被指定图形的形状取代。除全白(#FFFFFF)的部分仍然保留外,其余部分会用于绘制词云。因此背景图片的画布一定要设置为白色(#FFFFFF)
字的大小,布局和颜色也会基于Mask生成
必要时需要调整颜色以增强可视效果

基本调用方式

from scipy.misc import imread
mask = imread(背景图片名称)

from scipy.misc import imread

def m_cut(intxt):
    return [ w for w in jieba.lcut(intxt) if w not in stoplist and len(w) > 1 ] 
#cut 与  lcut 影响不大,只是格式不一样
cloudobj = wordcloud.WordCloud(font_path = myfont, 
    mask = imread("射雕背景1.png"), 
    mode = "RGBA", background_color = None
    ).generate(' '.join(m_cut(chapter.txt[1]))) 

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

在这里插入图片描述

2.4.2指定图片色系

读取指定图片的色系设定。注意是色系,不是某个特定的颜色,会有深浅的差别

imgarray = np.array(imread(imgfilepath))

获取图片颜色

bimgColors = wordcloud.ImageColorGenerator(imgarray)

重置词云颜色

cloudobj.recolor(color_func=bimgColors)

利用已有词云对象直接重绘颜色,输出速度要比全部重绘快的多

import numpy as np

imgobj = imread("射雕背景2.png")
image_colors = wordcloud.ImageColorGenerator(np.array(imgobj))
cloudobj.recolor(color_func=image_colors)

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

在这里插入图片描述

2.4.3指定单词组颜色

理想的状况应该是分组比较词频,在两组中都高频的词条在图形中相互抵消。

Python目前只能实现词条分组上色。

color_to_words = {

‘#00ff00’: [‘颜烈’, ‘武官’, ‘金兵’, ‘小人’],
‘red’: [‘包惜弱’, ‘郭啸天’, ‘杨铁心’, ‘丘处机’]

} '#00ff00’为绿色的代码

default_color = ‘grey’ # 其余单词的默认颜色

cloudobj.recolor()

 #官网提供的颜色分组类代码,略有修改,使用时直接套用即可
from wordcloud import get_single_color_func

class GroupedColorFunc(object):

    def __init__(self, color_to_words, default_color):
        self.color_func_to_words = [
            (get_single_color_func(color), set(words))
            for (color, words) in color_to_words.items()]

        self.default_color_func = get_single_color_func(default_color)

    def get_color_func(self, word):
        """Returns a single_color_func associated with the word"""
        try:
            color_func = next(
                color_func for (color_func, words) in self.color_func_to_words
                if word in words)
        except StopIteration:
            color_func = self.default_color_func

        return color_func

    def __call__(self, word, **kwargs):
        return self.get_color_func(word)(word, **kwargs)

######

# 指定分组色系
color_to_words = {
    '#00ff00': ['颜烈', '武官', '金兵', '官兵'],
    'red': ['包惜弱', '郭啸天', '杨铁心', '丘处机']
}

default_color = 'grey' # 指定其他词条的颜色

grouped_color_func = GroupedColorFunc(color_to_words, default_color)
#传进来两个参数

cloudobj.recolor(color_func=grouped_color_func)

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

在这里插入图片描述

实战:优化射雕词云

尝试进一步清理分词结果,并且只保留所有的名称(人名、地名)。

提示:

将所有的人名按照蓝色系,地名按照红色系进行词云绘制。

自行制作两个纯色图片,分别为绿色和蓝色,然后将其分别指定为绘图所用的色系,观察图形效果。

尝试使用不同的背景图片作为掩模,思考怎样的图片才能使得绘图效果最佳。

#准备工作,具体可参照学习笔记一,将处理的文章分章节
import pandas as pd
rawchap = [ " ".join(m_cut(w)) for w in chapter.txt.iloc]
# 首先去搜狗细胞库下载相关的人名地名文件并进行相关的转化
import jieba
import pandas as pd
udobj = wordcloud.WordCloud(font_path = myfont, 
    mode = "RGBA", background_color = None
    ).generate(' '.join(rawchap)) 
plt.imshow(udobj)
plt.axis("off")
plt.show() #输出整篇文章的词云

在这里插入图片描述

#下面的内容以第一章为例
import pandas as pd
tmpdf_peo = pd.read_table('小说人名.txt',
                    names = ['w'], encoding = 'utf-8')
peo_nam = [ w for w in res1 if w in list(tmpdf_peo.w) ] 
tmpdf_pla = pd.read_table('小说地名.txt',
                    names = ['w'], encoding = 'utf-8')
pla_nam = [ w for w in res1 if w in list(tmpdf_pla.w) ] 

#人名词云
import matplotlib.pyplot as plt
cloudpeo = wordcloud.WordCloud(font_path = myfont, 
    mode = "RGBA", background_color = None
    ).generate(' '.join(peo_nam) )
plt.imshow(cloudpeo)
plt.axis("off")
plt.show() 

在这里插入图片描述

cloudpla = wordcloud.WordCloud(font_path = myfont, 
    mode = "RGBA", background_color = None
    ).generate(' '.join(pla_nam) )
plt.imshow(cloudpla)
plt.axis("off")
plt.show() 

在这里插入图片描述

nam=str(peo_nam).join(str(pla_nam))
cloudobj = wordcloud.WordCloud(font_path = myfont,  
    mode = "RGBA", background_color = None
    ).generate(' '.join(nam))

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

在这里插入图片描述

# 官网提供的颜色分组类代码,略有修改
from wordcloud import get_single_color_func

class GroupedColorFunc(object):

    def __init__(self, color_to_words, default_color):
        self.color_func_to_words = [
            (get_single_color_func(color), set(words))
            for (color, words) in color_to_words.items()]

        self.default_color_func = get_single_color_func(default_color)

    def get_color_func(self, word):
        """Returns a single_color_func associated with the word"""
        try:
            color_func = next(
                color_func for (color_func, words) in self.color_func_to_words
                if word in words)
        except StopIteration:
            color_func = self.default_color_func

        return color_func

    def __call__(self, word, **kwargs):
        return self.get_color_func(word)(word, **kwargs)

######
# 指定分组色系
color_to_words = {
    'blue': peo_nam,
    'red': pla_nam
}
default_color = 'gray'
grouped_color_func = GroupedColorFunc(color_to_words, default_color)
udobj.recolor(color_func=grouped_color_func)
plt.imshow(udobj)
plt.axis("off")
plt.show()

在这里插入图片描述

#用指定的色系输出全文的词云
imgobj = imread("射雕背景1.png")
image_colors = wordcloud.ImageColorGenerator(np.array(imgobj))
udobj.recolor(color_func=image_colors)

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

在这里插入图片描述

from scipy.misc import imread
def m_cut(intxt):
    return [ w for w in jieba.cut(intxt) if w not in stoplist and len(w) > 1 ] 
udobj = wordcloud.WordCloud(font_path = myfont, 
    mask = imread("大头照.jpg"), 
    mode = "RGBA", background_color = None
    ).generate(' '.join(res1)) 
plt.imshow(udobj)
plt.axis("off")
plt.show() #输出整篇文章的词云

在这里插入图片描述

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值