python实现WordCloud 词云 + LDA 主题模型 附完整代码

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: python实现WordCloud 词云 + LDA 主题模型 附完整代码

修改部分代码 python2 实现

https://www.jianshu.com/p/e14111d9de51

何小嫚&刘峰原图.jpg0aff703cb5f65bb3eea32d256a6ed2e8.jpg

人物词云效果.jpg


电影《芳华》在春节重映了一波,加上之前的热映,最终取得了 14 亿票房的好成绩。严歌苓的原著也因此被更多的人细细品读。用文本分析的一些技术肢解小说向来是自然语言处理领域的一大噱头,这次当然也不能放过,本篇达成的成就有: 1、提取两大主角刘峰和何小嫚(萍)的关键词并绘制好看的人物词云; 2、以章节为单位探索小说的主题分布并画图展示。

主要功能包:

jiebaldawordcloudseaborn


安装命令: pip install ***

需要的外部文件:

  • 小说全文, 芳华-严歌苓.txt
  • 中文停用词,stopwords.txt
  • 小说人物名称,person.txt,作为 jieba 的用户自定义词典
  • 两个人物的 png 图片
  • 你喜欢的中文字体的 ttf 文件,我用的楷体



fd9898c195a70cb5315f2741c666b901.jpg

人物名和停用词文件示例.jpg

文本预处理

分词,并过滤无意义词


文本挖掘的必备步骤,毕竟理解中文的最小单位是词汇。这里没有使用简单的 jieba.cut 进行分词,因为我们需要知道单词的词性,便于稍后根据词性过滤不重要的词。


采用 jieba.posseg.cut 分词可以输出词性。我们并不能拍脑门决定是要动词还是名词等等,词性有非常多个,我把全部分词结果按照词性分好类,看了一下每个词性对应哪些词,最后决定保留词性为["a", "v", "x", "n", "an", "vn", "nz", "nt", "nr"]的词,例如图中,m 代表量词,这是对语义没有帮助的词,应该舍弃。


7b63d205a89ee26ac95899d1ed3f8ee8.jpg


词性示例.jpg

importjieba.possegjieba.load_userdict("data/person.txt")STOP_WORDS=set([w.strip()forwinopen("data/stopwords.txt").readlines()])defcut_words_with_pos(text):seg=jieba.posseg.cut(text)res=[]foriinseg:ifi.flagin["a","v","x","n","an","vn","nz","nt","nr"]andis_fine_word(i.word):res.append(i.word)returnlist(res)# 过滤词长,过滤停用词,只保留中文defis_fine_word(word,min_length=2):rule=re.compile(r"^[\u4e00-\u9fa5]+$")iflen(word)>=min_lengthandwordnotinSTOP_WORDSandre.search(rule,word):returnTrueelse:returnFalse


划分章节

我们按照“第*章”这样的字眼将小说的不同章节分割开来,作为独立的文档,用于之后的主题分析。定义了一个名为 MyChapters 的生成器,存储每章分好的词汇,是为了避免章节过多带来的一些程序运行问题。其实《芳华》仅有 15 章,用一个简单的列表也是可以的。

classMyChapters(object):def__init__(self,chapter_list):self.chapter_list=chapter_listdef__iter__(self):forchapterinself.chapter_list:yieldcut_words_with_pos(chapter)defsplit_by_chapter(filepath):text=open(filepath).read()chapter_list=re.split(r'第.{1,3}章\n',text)[1:]returnchapter_list

人物关键词提取


要提取人物关键词,首先要解决的问题是,在不借助外部的人物描述(比如百度百科和豆瓣电影上的角色介绍)的情况下,如何确定跟这个人物相关的内容。这里采用的比较简单的策略是,对小说文件中的每一行,如果该人物的名称存在,则将该行加入到此人的相关语料中去。再以此为基础统计词频,结果大致 ok,为了人物词云更精确的展示,我将词频输出到了文件,手动删除了一些词,并简单调整了一些词的词频,下图是调整过后的词和词频,左为何小嫚,右为刘峰。

importpandasaspddefperson_word(name):lines=open("data/芳华-严歌苓.txt","r").readlines()word_list=[]forlineinlines:ifnameinline:words=cut_words_with_pos(line)word_list+=words# 统计词频并按照词频由大到小排序,取top500cnt=pd.Series(word_list).value_counts().head(500)# 可以把结果输出到文件,进行一些手动调整# cnt.to_csv("data/cntliu.csv")# 返回字典格式returncnt.to_dict()

4288842d752f2c518bd7cb529826d292.jpg人物关键词提取结果示例.jpg

词云绘制


python 有 wordcloud 包可以用于词云绘制,在使用过程中需要注意:


用于定义形状的外部图片必须是 png 格式,默认纯白色部分为非图像区域;


中文词云必须载入一个字体文件;


字的颜色可以自己定义,也可以使用图片本身的底色。本例中何小嫚的图片 底色很鲜艳明晰,可以用本身的底色(ImageColorGenerator);而刘峰的图片是单色,且色浅,我使用了自定义颜色(my_color_func);


绘制词云需要用到的数据格式为 dict,key 为词,value 为词频,词频越大,在图片中的字体越大。

importmatplotlib.pyplotaspltfromwordcloudimportWordCloud,ImageColorGeneratorfromscipy.miscimportimreadfromrandomimportchoice# 定义颜色,方法很多,这里用到的方法是在四个颜色中随机抽取
defmy_color_func(word,font_size,position,orientation,random_state=None,**kwargs):returnchoice(["rgb(94,38,18)","rgb(41,36,33)","rgb(128,128,105)","rgb(112,128,105)"])defdraw_cloud(mask_path,word_freq,save_path):mask=imread(mask_path)#读取图片wc=WordCloud(font_path='data/kaiti.TTF',#设置字体background_color="white",#背景颜色max_words=500,#词云显示的最大词数mask=mask,#设置背景图片max_font_size=80,#字体最大值random_state=42,)# generate_from_frequencies方法,从词频产生词云输入
wc.generate_from_frequencies(word_freq)plt.figure()# 刘峰, 采用自定义颜色
plt.imshow(wc.recolor(color_func=my_color_func),interpolation='bilinear')# 何小嫚, 采用图片底色
# image_colors = ImageColorGenerator(mask)
# plt.imshow(wc.recolor(color_func=image_colors), interpolation='bilinear')
plt.axis("off")wc.to_file(save_path)plt.show()# 获取关键词及词频
input_freq=person_word("刘峰")# 经过手动调整过的词频文件,供参考
# freq = pd.read_csv("data/cntliu.csv", header=None, index_col=0)
# input_freq = freq[1].to_dict()
draw_cloud("data/liu.png",input_freq,"output/liufeng.png")


对人物进行抠图,背景设置为纯白,存储为 png 格式。 为了使形状更鲜明,对小嫚的辫子还有腰的部分做了加白处理,可以对比文章开头原图感受一下。


何小嫚&刘峰用作生成词云的图片.jpg


1d5022272b06e898ea1a71e295eb5d79.jpg


人物词云效果.jpg


如果你看过这部作品,不知道印象最深的是不是像词云显示的那样?小嫚在精神病院的月下独舞,刘峰对丁丁的深深眷恋,在战争中失去手臂,与不爱的人结婚又离婚,和小嫚以朋友的姿态相伴终老... ...


完整代码:https://download.csdn.net/download/weixin_55771290/87402435

相关文章
|
17天前
|
数据采集 供应链 API
实战指南:通过1688开放平台API获取商品详情数据(附Python代码及避坑指南)
1688作为国内最大的B2B供应链平台,其API为企业提供合法合规的JSON数据源,直接获取批发价、SKU库存等核心数据。相比爬虫方案,官方API避免了反爬严格、数据缺失和法律风险等问题。企业接入1688商品API需完成资质认证、创建应用、签名机制解析及调用接口四步。应用场景包括智能采购系统、供应商评估模型和跨境选品分析。提供高频问题解决方案及安全合规实践,确保数据安全与合法使用。立即访问1688开放平台,解锁B2B数据宝藏!
|
18天前
|
API 开发工具 Python
【Azure Developer】编写Python SDK代码实现从China Azure中VM Disk中创建磁盘快照Snapshot
本文介绍如何使用Python SDK为中国区微软云(China Azure)中的虚拟机磁盘创建快照。通过Azure Python SDK的Snapshot Class,指定`location`和`creation_data`参数,使用`Copy`选项从现有磁盘创建快照。代码示例展示了如何配置Default Azure Credential,并设置特定于中国区Azure的`base_url`和`credential_scopes`。参考资料包括官方文档和相关API说明。
|
2月前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
87 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
3月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
89 33
|
3月前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
61 10
|
3月前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
127 8
|
3月前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
前端开发 算法 Linux
Python:wordcloud.wordcloud()函数的参数解析及其说明
Python:wordcloud.wordcloud()函数的参数解析及其说明
|
10天前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
10天前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。

热门文章

最新文章