Python wordcloud词云:源码分析及简单使用

您所在的位置:网站首页 word词频分析 Python wordcloud词云:源码分析及简单使用

Python wordcloud词云:源码分析及简单使用

2023-06-22 12:59| 来源: 网络整理| 查看: 265

Python版本的词云生成模块从2015年的v1.0到现在,已经更新到了v1.7。

下载请移步至:https://pypi.org/project/wordcloud/

wordcloud简单应用: import jieba import wordcloud w = wordcloud.WordCloud( width=600, height=600, background_color='white', font_path='msyh.ttc' ) text = '看到此标题,我也是感慨万千 首先弄清楚搞IT和被IT搞,谁是搞IT的?马云就是,马化腾也是,刘强东也是,他们都是叫搞IT的, 但程序员只是被IT搞的人,可以比作盖楼砌砖的泥瓦匠,你想想,四十岁的泥瓦匠能跟二十左右岁的年轻人较劲吗?如果你是老板你会怎么做?程序员只是技术含量高的泥瓦匠,社会是现实的,社会的现实是什么?利益驱动。当你跑的速度不比以前快了时,你就会被挨鞭子赶,这种窘境如果在做程序员当初就预料到的话,你就会知道,到达一定高度时,你需要改变行程。 程序员其实真的不是什么好职业,技术每天都在更新,要不停的学,你以前学的每天都在被淘汰,加班可能是标配了吧。 热点,你知道什么是热点吗?社会上啥热就是热点,我举几个例子:在早淘宝之初,很多人都觉得做淘宝能让自己发展,当初的规则是产品按时间轮候展示,也就是你的商品上架时间一到就会被展示,不论你星级多高。这种一律平等的条件固然好,但淘宝随后调整了显示规则,对产品和店铺,销量进行了加权,一下导致小卖家被弄到了很深的胡同里,没人看到自己的产品,如何卖?做广告费用也非常高,入不敷出,想必做过淘宝的都知道,再后来淘宝弄天猫,显然,天猫是上档次的商城,不同于淘宝的摆地摊,因为摊位费涨价还闹过事,闹也白闹,你有能力就弄,没能力就淘汰掉。前几天淘宝又推出C2M,客户反向定制,客户直接挂钩大厂家,没你小卖家什么事。 后来又出现了微商,在微商出现当天我就知道这东西不行,它比淘宝假货还下三滥.我对TX一直有点偏见,因为骗子都使用QQ 我说这么多只想说一个事,世界是变化的,你只能适应变化,否则就会被淘汰。 还是回到热点这个话题,育儿嫂这个职位有很多人了解吗?前几年放开二胎后,这个职位迅速串红,我的一个亲戚初中毕业,现在已经月入一万五,职务就是照看刚出生的婴儿28天,节假日要双薪。 你说这难到让我一个男的去当育儿嫂吗?扯,我只是说热点问题。你没踩在热点上,你赚钱就会很费劲 这两年的热点是什么?短视频,你可以看到抖音的一些作品根本就不是普通人能实现的,说明专业级人才都开始努力往这上使劲了。 我只会编程,别的不会怎么办?那你就去编程。没人用了怎么办?你看看你自己能不能雇佣你自己 学会适应社会,学会改变自己去适应社会 最后说一句:科大讯飞的刘鹏说的是对的。那我为什么还做程序员?他可以完成一些原始积累,只此而已。' new_str = ' '.join(jieba.lcut(text)) w.generate(new_str) w.to_file('x.png')

 下面分析源码:

wordcloud源码中生成词云图的主要步骤有:

1、分割词组

2、生成词云

3、保存图片

我们从 generate(self, text)切入,发现它仅仅调用了自身对象的一个方法 self.generate_from_text(text)

def generate_from_text(self, text): """Generate wordcloud from text. """ words = self.process_text(text) # 分割词组 self.generate_from_frequencies(words) # 生成词云的主要方法(重点分析) return self

process_text()源码如下,处理的逻辑比较简单:分割词组、去除数字、去除's、去除数字、去除短词、去除禁用词等。

def process_text(self, text): """Splits a long text into words, eliminates the stopwords. Parameters ---------- text : string The text to be processed. Returns ------- words : dict (string, int) Word tokens with associated frequency. ..versionchanged:: 1.2.2 Changed return type from list of tuples to dict. Notes ----- There are better ways to do word tokenization, but I don't want to include all those things. """ flags = (re.UNICODE if sys.version < '3' and type(text) is unicode else 0) regexp = self.regexp if self.regexp is not None else r"\w[\w']+" # 获得分词 words = re.findall(regexp, text, flags) # 去除 's words = [word[:-2] if word.lower().endswith("'s") else word for word in words] # 去除数字 if not self.include_numbers: words = [word for word in words if not word.isdigit()] # 去除短词,长度小于指定值min_word_length的词,被视为短词,筛除 if self.min_word_length: words = [word for word in words if len(word) >= self.min_word_length] # 去除禁用词 stopwords = set([i.lower() for i in self.stopwords]) if self.collocations: word_counts = unigrams_and_bigrams(words, stopwords, self.normalize_plurals, self.collocation_threshold) else: # remove stopwords words = [word for word in words if word.lower() not in stopwords] word_counts, _ = process_tokens(words, self.normalize_plurals) return word_counts 重头戏来了

generate_from_frequencies(self, frequencies, max_font_size=None) 方法体内的代码比较多,总体上分为以下几步:

1、排序

2、词频归一化

3、创建绘图对象

4、确定初始字体大小(字号)

5、扩展单词集

6、确定每个单词的字体大小、位置、旋转角度、颜色等信息

源码如下(根据个人理解已添加中文注释):

def generate_from_frequencies(self, frequencies, max_font_size=None): """Create a word_cloud from words and frequencies. Parameters ---------- frequencies : dict from string to float A contains words and associated frequency. max_font_size : int Use this font-size instead of self.max_font_size Returns ------- self """ # make sure frequencies are sorted and normalized # 1、排序 # 对“单词-频率”列表按频率降序排序 frequencies = sorted(frequencies.items(), key=itemgetter(1), reverse=True) if len(frequencies)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3