1 应用场景
- 比如为了关注某产品质量,我们对用户基于产品的评论内容进行分析,提取关键词进行整理归纳,大致可以了解用户的需求;
- 再比如需要对某个文章的进行分析,提取关键词,了解文章的一些基本关键核心点等;
- 本文应用的技术是
Python
的Pyecharts
模块和TextRank
算法。
2 关于Pyecharts
2.1 Pyecharts简介
Pyecharts
是一个 Python
可视化库,用于创建交互式和美观的图表。它基于著名的 JavaScript
可视化库 Echarts
,通过在 Python
中调用 Echarts
的功能,使用户能够在 Python
环境中轻松地绘制各种类型的图表,包括折线图、柱状图、饼图、散点图等;
Pyecharts
提供了一个简单而直观的 API
接口,使得使用者无需了解复杂的 JavaScript
语法,即可通过 Python
代码实现高度定制化的图表设计。
2.2 Pyecharts安装
pip install pyecharts
2.3 Pyecharts支持的图形
- 从源码看
Pyecharts
支持大部分基本图形、复合图表、3D
图形等;
- 以下是部分源码:
from ..charts.basic_charts.bar import Bar
from ..charts.basic_charts.bmap import BMap
from ..charts.basic_charts.boxplot import Boxplot
from ..charts.basic_charts.calendar import Calendar
from ..charts.basic_charts.custom import Custom
from ..charts.basic_charts.effectscatter import EffectScatter
from ..charts.basic_charts.funnel import Funnel
from ..charts.basic_charts.gauge import Gauge
from ..charts.basic_charts.geo import Geo
from ..charts.basic_charts.graph import Graph
from ..charts.basic_charts.heatmap import HeatMap
from ..charts.basic_charts.kline import Kline
from ..charts.basic_charts.line import Line
from ..charts.basic_charts.liquid import Liquid
from ..charts.basic_charts.map import Map
from ..charts.basic_charts.parallel import Parallel
from ..charts.basic_charts.pictorialbar import PictorialBar
from ..charts.basic_charts.pie import Pie
from ..charts.basic_charts.polar import Polar
from ..charts.basic_charts.radar import Radar
from ..charts.basic_charts.sankey import Sankey
from ..charts.basic_charts.scatter import Scatter
from ..charts.basic_charts.sunburst import Sunburst
from ..charts.basic_charts.themeriver import ThemeRiver
from ..charts.basic_charts.tree import Tree
from ..charts.basic_charts.treemap import TreeMap
from ..charts.basic_charts.wordcloud import WordCloud
from ..charts.composite_charts.grid import Grid
from ..charts.composite_charts.page import Page
from ..charts.composite_charts.tab import Tab
from ..charts.composite_charts.timeline import Timeline
from ..charts.three_axis_charts.bar3D import Bar3D
from ..charts.three_axis_charts.graph_gl import GraphGL
from ..charts.three_axis_charts.line3D import Line3D
from ..charts.three_axis_charts.lines3D import Lines3D
from ..charts.three_axis_charts.map3D import Map3D
from ..charts.three_axis_charts.map_globe import MapGlobe
from ..charts.three_axis_charts.scatter3D import Scatter3D
from ..charts.three_axis_charts.surface3D import Surface3D
Candlestick = Kline
- 而本文我们主要用的是
WordCloud
词云图,即需要用到:
from ..charts.basic_charts.wordcloud import WordCloud
2.4 Pyecharts的一个示例
- 我们简单写个示例,用一个折线图来显示几个产品的销售额;
- 具体代码如下:
from pyecharts import charts
from pyecharts import options
ch = charts.Line()
ch.set_global_opts(title_opts=options.TitleOpts(title="产品销售额"))
ch.add_xaxis(["产品A", "产品B", "产品C", "产品D", "产品E", "产品F"])
ch.add_yaxis("销售(万)", [100, 300, 200, 400, 600, 200])
ch.render("./chart.html")
ch.render_notebook()
3 关于TextRank
3.1 TextRank简介
TextRank
算法是由Rada Mihalcea
和Paul Tarau
在2004年提出的;
- 它基于
PageRank
算法,将文本转化为图形模型,使用图形排序来确定单词的重要;
TextRank
算法的基本思想是使用单词之间的共现关系构建一个加权图,然后通过图的节点之间的链接来计算每个节点的重要性。
- 本文是使用
Python
的TextRank
算法提取关键词。
3.2 TextRank安装
pip install jieba
from jieba import analyse
text_rank = analyse.textrank
4 词云图的生成过程
4.1 导入需要的包
from pyecharts.charts import WordCloud
from jieba import analyse
4.2 目标文件
- 我们创建一个目标文件
222.txt
,在文本里写上以下内容;
- 该文本内容来源网络,仅供学习参考。(100句美文)
100句美文
- 细数门前落叶,倾听窗外雨声,涉水而过的声音此次响起,你被雨淋湿的心,是否依旧。
- 站在寒冬的冷风中,漫天的雪花正纷纷扬扬地包裹着这座寒冷的城市。想着逝去了的那份真挚的无价情义,我忍不住怆然泪下。
- 你在雨中行走,你从不打伞;你有自己的天空,它从不下雨。
- 那段岁月,无论从何种角度读你,你都完美无缺,你所缺少的部分,也早已被我用想象的画笔填满。
- 回首往事,日子中竟全是斑斓的光影,记忆的屏障中,曾经心动的声音已渐渐远去。
- 往事是尘封在记忆中的梦,而你是我唯一鲜明的记忆,那绿叶上的水珠,是思念的泪滴。
- 相信优美的生命,就是一曲无字的挽歌,漫过心际的孤独,早已蔚然成冰,而你,是这个季节最美丽的音符。
- 酒般的思念,一饮就醉,醉时就用全部的热情读这忧伤的月色。于是,月醉了,夜醉了,我也醉了
- 谁与我醉明月,愁在夕阳中。
- 融进银河,就安谧地和明月为伴,照亮长天;没入草莽,就微笑着同清风合力,染绿大地。这样,才算得上善待生命,不负年华。
- 她忧伤而美丽的面容,是我一辈子都读不厌倦的诗
- 爱是一种牵挂,无论步迹到哪里,心却系在那披肩秀发的发梢。
- 人生不能缺乏的是雨夜——淅沥地,独自的雨夜。这样的雨夜里,天有泪,烛有泪。天泪有声,烛泪有形,唯有斯人面上簌簌流下的,是点点无声无形的热泪。
- 云一样的思绪,飘过来又飘过去,最终还是落在我的手掌上。绚丽如霓霞,哀怨如晨雾。我看得清你,你看得清我,我们在同一地平线,做着不同的梦,我的梦白如花朵,你的梦红如晚霞。
- 童年的那一个个追逐嬉笑的日子,有如行云流水般在我的生命的旅途中流淌。
- 曾在阳光下幻想着云游四海,浪迹天涯。
- 别让别人徘徊的脚步踩碎你明天美好的梦想,天下没有不散的宴席。也许这人间真的只有朦朦胧胧才是真。
- 思念,是一种幸福的忧伤,是一种甜蜜的惆怅,是一种温馨的痛苦。思念是对昨日悠长的沉淀和对未来美好的向往。也正是因为有了思念,才有了久别重逢的欢畅,才有了意外邂逅的惊喜,才有了亲友相聚时的举杯庆祝。
- 我常常以为,记忆是最容易模糊的东西,在时间的流逝里,它会一团团的淡去。而中学生活的一日日枯燥的翻转,也慢慢淡去。刻骨的,只有那么几个回眸,牢不可破地粘在了记忆里。
- 在人生和世界的激流中,他必然会像初冬从树上飘落下来的最后一片枯叶,在西风残照中孤零零地漫无目的地飘舞。
- 一个秋风萧瑟的寒夜,当天边那弯孤独徘徊的月儿轻轻告诉了我该如何描绘心中最美的风景之后,我便不再抱怨为什么人生总是有太多的遗憾,不再感叹生命的尽头总是轻烟。
- 一个人走在城市的黄昏,孤独被斜阳摇曳成猎猎的旗,招摇在四周的暮云里。走在行色匆匆的人流中,忽然发现自己失去了方向。在异乡的街头,我突然那么强烈地渴望你能不经意地走来,牵着我的手,陪我,走一段漆黑的路。
- 在这世间,有些路是非要一个人去面对,单独一个人去跋涉的。
- 谁的指间滑过了千年的时光,谁在反反复复中追问,可曾遗忘了我。等你用尽了我所有的哀伤,而你眼中却有我所不懂的凄凉。
- 人生一世,白云悠悠,漂走的是多少沧桑与眼泪;人生苦短,汗流尽,沉淀的又是多少往事与回忆。
- 单调而沉闷的空气窒息着我幼小的心灵,缠绕着我飞翔的翅膀。
- 我的少年的日子是寂寞的,寂寞的让我现在想起来都心冷,只有单调的影子与我一起看流岚,听松风,闻花香。
- 在一个个五光十色的希望肥皂泡中蹉跎岁月,浪费青春年华。
- 一轮孤月下一株孤独的树,这是一种不可企及的妩媚。
- 夜夜难眠,天天泪痕,泪水淹没日月,混淆乾坤,也无法挽回流失的岁月,重返最初之净泊。
- 我想,我还会架一支鱼竿,独钓岁月那一边的故事。
- 孤独是一种无奈的选择,孤独是因为没有找到适合的同行者,孤独是为了孤独背后的解脱。孤独的过程,就是一个寻求真爱的过程。
- 平淡而不平庸,平凡而能平静,在离群索居,无伴独处中思索,追求创造,高瞻远瞩,洞幽烛微。
- 爱那一场场繁华落尽后的曲终人散。
- 喜欢那种被岁月沉淀后的沉静和忧郁。
- 我现在能做的,便是以一段拙劣的文字来祭奠我那段流逝的岁月。
- 自己是蓝色的,音乐是悠扬的,心情是透明的,灵魂是飞舞的。
- 在别人的轨迹里看到自己曾经那么认真,那么虔诚,可是却无比悲凉的足迹,想到自己一路这么千山万水地跋涉过来,我就想哭。
- 岁月的洪流,卷走了青春,卷走了年华,剩下的只是一个被岁月刻下深深印痕的伤痕累累的躯壳和一颗沧桑的心。
- 太阳的光芒远远胜过月亮,但太阳永远只能独自天马行空,而月亮却有星星相伴。世间万物中,其实太阳最寂寞。
- 千古佳人,荷笠斜阳,最终都不过是红颜怅老,青山远归。真正能在心中美丽永恒的,唯有刻骨的一刹那记忆而已。(摘自《武侠》)
- 青春结伴,我已有过,是感恩,是满足,没有遗憾。
- 人生,有时轻似风,淡如水,有时浓如油,烈如酒。
- 当有一天你走出人生的迷茫,在夕阳下回首,你身后那串歪歪斜斜,磕磕绊绊的步履,便构成了你生命年轮中极珍贵的一瞥,时刻回想起来都会令自己无限感动和无限欣慰,铭刻心中挥之不去。
- 平庸,使人走漫长的路。
- 遥远的距离使我相思成灰,阴阳的间隔使我欲哭无泪。
- 世上没有十全十美的文章,如同世上没有彻头彻尾的绝望。
- 感谢上天让我孤单,忍受灵魂的磨难。
- 也许曲终人散之后,离开的离开,忘记的忘记,然而旋律最好的时候,感谢上天让我们是在一起的。
- 随着时间的围困,我的步伐越来越沉重缓慢,时间仿佛把我逼到了死角,让我陷入了绝地,我无力挽回些什么,只有忍着痛,步履维艰地一步一步往前走。
- 到了一定的时候,我身边的人纷纷离去。当一个个熟悉和离去的越来越快的时候,我发现已经很久没有遇见以前朝夕相伴的人了。
- 其实有人扮演别人时,不自觉表露的正是自己。
- 我记忆中童年的太阳已经从记忆的洞穴和幽谷上沉落。
- 春天是死亡的高发季节,但不朽的灵魂总能泅过时间的潮水,屹立在永生的彼岸。
- 那些素面朝天的城市,那些洗尽铅华的容颜。
- 总是在老歌里,我才会充分意识到自己的温情。流金岁月,配上简单的老歌,也便配上了真实的悲欢。
- 我是那么虔诚地喜欢着旅行,也是那么执着地厌恶着囚禁。
- 城市颓败的霓虹倒映在我灰色的瞳仁里,显得更加颓败。
- 那些我们以为永远都不会忘记的事情,就在我们念念不忘的过程中,被我们忘记了。
- 我们的心,早已死在最繁花锦簇的时刻。
- 原谅我凌乱的文字,原谅我破碎的时光。
- 路灯和我之间,究竟谁是谁的过客,谁是谁生命的点缀。
- 我匍匐了一百年,微笑着焚烧了一百年,只等待与你灰飞湮灭的重逢,因为你的快乐,是我生命里全部的信仰。
- 人应有点远见,这样才能拯救自己,让自己的心,安详的存在。
- 生命令你这样的快乐与绝望。
- 因为爱字,所以放任,因为放任,所以成全。
- 当你想起旅途中某次惊艳,那个转身而去的女子其实早已老去。只有记忆像雾一样停留,而流逝的时间,就是那个远去的女子。
- 他转身的时候,我看到的是一个老人的背影,我知道,时间在老去。
- 河在我记忆中是个忧伤的符号。
- 有一段时间,我一直在故事中漂流,像一根草屑。
- 如同一部黑白片在河流的背景下回放着。
- 从她的眼神中看到一种光芒与堕落,看见时光在闪回,像蝴蝶一样冷艳。
- 去的旅程隔着无数的季节,无数坠落的经历。
- 我成长过程渐渐偏离真实轨迹,最早是从谎言开始的。
- 其实每一朵花,都有它自己的生命。当花儿枯萎的时候,就是它生命终结的时候,而它的种子,就是它生命的延续,在这个世界上继续承受风,经受雨,面对另一个轮回。
- 一个人早年的癖性,即便让岁月的尘掩了又掩,也还是要不时地表露出来。
- 静静地流淌的青春也会让人受伤吗
- 我感觉我生命中的某些东西,也在沿着轨道静静地行驶。
- 四周一片漆黑。亲爱的,我一无所有。
- 黑夜里被风吹着的蜡烛,怎样才能等到日出。
- 我们恐惧墓地,尽管我们日夜兼程。
- 偶尔,我一个人站在黄昏的荒野,代替你主持夕阳的葬礼。
- 对于人类来说,友谊是一种交换行为。没有下次交换,友谊便不再继续。
- 童年,只有在回忆中显现时,才成就了那份完美。
- 回忆能远离平淡,能使本来平淡的日子背叛现实做一次超越的飞翔。
- 夜晚的城市像一朵即将枯萎的花朵,努力地开放出最后一缕艳丽。
- 在远离了熟悉的城市和人群的地方,灵魂不再受任何束缚。
- 当一个人喜欢孩子的时候,他便已不再是孩子。
- 生命,总会有一些令人回眸的空白。
- 火车就是这样离我们很近,又离我们很远,中间像是留有期待,留有着人生注定需要的某种时间。
- 同一天的周而复始,若不在哪里留下折痕,说不定会产生错觉。
- 我想,不管多老,自己始终都是一个善感的男人,一首歌,一片叶,一泓水,都是我忧伤的片段,别人的一举一动,一笑一颦,都会让我不由自主地沉沦在茫茫的思想旅程。
- 青春不过是一种挥霍,我们在一起,我们仿佛无始无终般地在一起。
- 青春是阵偶尔滑过的风,不经意间,已吹得我泪流满面。
- 我想我不会孤独,因为我还有音乐。我想我将一直孤独,因为我只有音乐。
- 我放下钢笔,轻轻地合上我的日记,整个一年就这样在一个午后被我轻轻地合上,结束了。
- 孤独从一开始就注定要用一生去承担,无人能懂。
- 不知道表达感情的人,只能走很长很长的路。
- 雨滴从玻璃上滑落的样子,原来是有迹可循的。
- 在时间里面,我们什么也不能留下。包括痛苦,快乐,和生命。
4.3 TextRank提取关键词
text_rank = analyse.textrank
text = open('./222.txt', 'r', encoding='gbk').read()
keywords = text_rank(text)
print(keywords)
['生命', '没有', '记忆', '人生',
'时候', '时间', '灵魂', '城市',
'太阳', '忧伤', '淡去', '留有',
'青春', '过程', '日子', '季节',
'忘记', '放任', '微笑', '光芒']
4.4 输出关键词及权重
- 我们创建一个空的列表,用于存储提取的关键词及权重;
text_list = []
for keyword, weight in text_rank(text, withWeight=True):
print('%s %s' % (keyword, weight))
text_list.append((keyword, weight))
生命 1.0
没有 0.5943892405908553
记忆 0.5689110873940524
人生 0.5452975913557881
时候 0.5394331425728667
时间 0.5085631353385073
灵魂 0.4333041943806468
城市 0.36699812479404703
太阳 0.3221520571823969
忧伤 0.3027380139043756
淡去 0.3015866931533294
留有 0.28791663307041154
青春 0.28328783208533515
过程 0.277546913046032
日子 0.27008268093325627
季节 0.26805446984522774
忘记 0.2671507371559548
放任 0.25896014019039154
微笑 0.2509216716600613
光芒 0.24862435402105676
4.5 Pyecharts生成词云图
word_cloud = WordCloud()
word_cloud.add(series_name='热点分析', data_pair=text_list, word_size_range=[15,90], shape='cardioid', height=600,width=800)
word_cloud.render('word_clound.html')
- 会在指定目录生成一个
word_clound.html
,打开即可。4.6 完整代码
from pyecharts.charts import WordCloud
from jieba import analyse
text_rank = analyse.textrank
text = open('./222.txt', 'r', encoding='gbk').read()
keywords = text_rank(text)
print(keywords)
text_list = []
for keyword, weight in text_rank(text, withWeight=True):
print('%s %s' % (keyword, weight))
text_list.append((keyword, weight))
word_cloud = WordCloud()
word_cloud.add(series_name='热点分析', data_pair=text_list, word_size_range=[15,90], shape='cardioid', height=600,width=800)
word_cloud.render('word_clound.html')
4.7 效果图
SHAPES = ("cardioid", "diamond", "triangle-forward",
"triangle", "pentagon", "star")
cardioid
形状:
diamond
形状:
triangle-forward
形状:
triangle
形状:
pentagon
形状:
star
形状: