注:学习笔记基于文彤老师文本挖掘的系列课程
全文基于《射雕英雄传》语料库,下面是读入数据的一个基于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()
txt | head | mid | len | |
---|---|---|---|---|
0 | 全本全集精校小说尽在:http://www.yimuhe.com/u/anglewing26... | 全 | -1 | 55 |
1 | 更多资源下载:http://qqzone.ctdisk.com | 更 | -1 | 31 |
2 | ※声明:本电子书仅供读者预览,请在下载24小时内删除,不得用作商业用途;如果喜欢请购买正版图书!※ | ※ | -1 | 49 |
3 | ------------------------------------------ | - | -1 | 42 |
4 | “金庸作品集”新序 | “ | -1 | 9 |
# 章节判断
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()
txt | chap | |
---|---|---|
0 | 全本全集精校小说尽在:http://www.yimuhe.com/u/anglewing26... | 0.0 |
1 | 更多资源下载:http://qqzone.ctdisk.com | 0.0 |
2 | ※声明:本电子书仅供读者预览,请在下载24小时内删除,不得用作商业用途;如果喜欢请购买正版图书!※ | 0.0 |
3 | ------------------------------------------ | 0.0 |
4 | “金庸作品集”新序 | 0.0 |
提取出所需章节
raw[raw.chap == 1].head()
txt | chap | |
---|---|---|
33 | 第一回 风雪惊变 | 1.0 |
34 | 1.0 | |
35 | 1.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() #输出整篇文章的词云