从jieba到wordcloud

背景

最近在整理上海小区库,发现10000多个小区的名字还真有趣,***花苑,***花园,***公寓,***雅居还真多,于是便萌发一探究竟的念头。

思路

本次选择的小区库为搜狗输入法收录的14683个小区名,既然要探究关键词,jieba模块分词是必不可少的,然后用词云wordcloud可视化关键词是不是很有意思,效果图如下。
在这里插入图片描述

TF-IDF算法

词频-逆文件频率,英文名为Term Frequency-Inverse Document Frequency, 缩写为TF-IDF,用来刻画某个词对于一个文集的重要程度。该词的重要性随着它在文集中出现的次数(频率)增加而增加,同时会随着它在更大的语料库中出现的次数(频率)增加反比下降。计算公式为
T F I D F = T F I D F TF-IDF=TF*IDF
现在来分别看TF与IDF。
TF是词频的意思,表示某个词出现的次数,这个很好理解,比如下面的小区这个词语在long_item_list出现过1621次,而len(long_item_list)=33398, 那么小区的TF=1621/33398≈0.0485。
IDF是逆文件频率的意思,为了刻画用某个词的区别其他文档的作用,是一种信息熵的函数。需要一个更大的参照语料库,比如百度搜索收录的共20亿个语料中包含小区的语料只有0.2亿个,那么此时小区的IDF值就是
l g 0.2 20 = l g 100 = 10 -lg\frac{0.2}{20}=-lg100=10
从而小区的TF-IDF值就是0.0485*10=0.485。

完整代码

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 18 17:35:50 2019
title:上海小区命名探究
@author: 帅帅de三叔
"""
import jieba #导入分词模块
import jieba.analyse #分析模块
from wordcloud import WordCloud #导入词云模块
file=open("上海小区库_sougou.txt",mode="r+") #以可读可写的模式打开txt文件
content=file.readlines() #一次性读取所有行
jieba.load_userdict("自定义词典.txt") #添加自定义词典
def cut(str): #定义分词函数,返回词切片
    seg=jieba.lcut(str,cut_all=False) #精准模式,返回实体
    return seg
item_list=[str(i).strip() for i in content] #去掉换行符\n
long_item="".join(item_list) #连在一起形成一个长长的字符串作为切片对象
long_item_split=cut(long_item) #调用分词函数cut
#print(long_item_split) #一个由一个一个词组成的列表
w = WordCloud(font_path='STCAIYUN.TTF',width=600,height=400,background_color="black") #调用电脑本身字体华文彩云,并设置画布大小及背景
keywords=jieba.analyse.extract_tags(long_item,topK=100) #基于tf-idf算法抽取100个关键词
w.generate(" ".join(keywords)) #用空格把这100个关键词连起来
w.to_file("wordcloud.png") #导出图片文件

代码解读

首先按行读取txt文件里面小区名称,然后无缝拼接成一个长长的字符串作为待分词对象,然后利用jieba分词分出一个个切片,再利用tf-idf算法提取前100个关键词,注意analyse.extract_tags不要带参数withWeight=True, allowPOS=(‘n’,‘nr’,‘ns’),否则会形成tuple数据形式,最后把词云图片保存下来,中间加载了自定义词典load_userdict主要为了防止一些乱七八糟的词出现,可以先打印long_item_split实体去观察,然后想自定义词典里面添加。

发布了45 篇原创文章 · 获赞 12 · 访问量 8685

猜你喜欢

转载自blog.csdn.net/zengbowengood/article/details/97007561