python实现分词和词云制作


本次制作词云的目的是找出物联网专业职位所需技能的关键词,首先爬取了boss直聘和智联招聘上的物联网专业职位的技术要求,爬取方法参考 链接

一、下载相关的资源库

1.1 jieba分词

官网:https://pypi.org/project/jieba/0.42/
下载:https://pypi.org/project/jieba/0.42.1/#files
安装:

  • 方法一:联网全自动安装
    pip install jieba
  • 方法二:半自动离线安装
    下载安装包,解压后执行:
    python setup.py install

安装完成后执行pip list | grep jieba查看是否安装成功。

1.2 wordcloud

github:https://github.com/amueller/word_cloud
官方地址:https://amueller.github.io/word_cloud/
下载链接:https://pypi.org/project/wordcloud/1.8.0/#files
根据系统类型和python版本选择下载合适的wordcloud版本

安装命令:
pip install wordcloud-1.8.1-cp36-cp36m-win_amd64.whl

二、词云制作

2.1 分词

英文文章的分词相对简单,因为英文单词之间使用空格进行分开的,所以直接根据空格进行切分即可。然而中文是不用空格进行分割的,只有句子或段落间的标点符号,所以需要用到分词工具,常用的中文分词库有jiebaHanLP等,我用的是结巴分词。
特性

  • 支持三种分词模式:
    • 精确模式,试图将句子最精确地切开,适合文本分析;
    • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
    • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • 支持繁体分词
  • 支持自定义词典
from wordcloud import WordCloud, STOPWORDS
from scipy.misc import imread
import matplotlib.pyplot as plt
import jieba


def read_deal_text():
    with open("data/job.txt", "r") as f:
        txt = f.read()
    re_move = [",", "。", " ", '\n', '\xa0']
    # 去除无效数据
    for i in re_move:
        txt = txt.replace(i, " ")
    word = jieba.lcut(txt)  # 使用精确分词模式

    with open("data/txt_save.txt", 'w') as file:
        # 把分词后的词语保存到txt_save.txt文件中
        for i in word:
            file.write(str(i) + ' ')
    print("文本处理完成")

2.2 制作词云

WordCloud是Python中一个非常优秀的第三方词云展示库,但是处理中文就不怎么能胜任,因为中文通常包含着一整句话,尽管在WordCloud里虽然也有process_text()方法用于把很长的文字做分隔,但这个方法本身是根据英文文本分词设计的,所以对于中文字的展示必须要配合更适合做中文分词处理的jieba分词库来操作效果更佳。

def img_grearte():
    mask = imread("data/cloud3.png")
    with open("data/txt_save.txt", "r") as file:
        txt = file.read()
    my_stopwords = {
    
    "熟悉", "相关", "技术", "工作", "联网", "精通", "开发", "经验", "客户", "软件", "优先", "工程师",
                    "完成", "进行", "以上", "项目", "平台", "设计", "模块", "良好", "研发", "使用", "要求", "需求", "行业",
                    "参与", "优化", "分析", "开源", "应用", "具有", "能力", "协助", "文档", "电子", "岗位职责", "负责", "测试",
                    "测试", "飙血", "产品", "具备", "至少", "任职", "熟练", "编程", "规范", "沟通", "实践经验", "架构设计",
                    "设计模式", "理解", "专业", "工业", "基础", "自动化", "交流", "问题", "流程", "计算机", "产品线", "解决",
                    "软件开发", "知识", "市场", "编写", "只能", "业务", "系统", "职位", "主导", "多个", "技能", "习惯", "运作",
                    "智慧", "环境", "三年", "较强", "一种", "以上学历", "处理", "以及", "服务", "清晰", "负有", "工具", "常用",
                    "跟进", "华为", "职责", "后台", "遇到", "跟进", "软件开发", "了解", "有物", "对于", "主流", "对接", "精神",
                    "合作", "销售", "面向未来", "方向", "等物", "精神", "根据", "富有", "实际", "竞争力", "过程", "资格", "保证",
                    "其中", "快速", "工程", "其中", "推广", "追求", "提升", "运行", "安排", "能够", "支持", "深入", "安全", "卓越",
                    "认可", "边缘", "定义", "针对", "激情", "机电", "理念", "询价", "深入", "大型", "短期", "落地", "从事", "规约",
                    "互联网", "协议", "高性能", "数据", "研究", "学习", "情况", "通用", "功能", "核心", "高度", "汇报", "基本知识",
                    "一定", "挖掘", "业务", "本科", "关键问题", "修改", "看护", "编码", "通信", "网络", "维护", "软件技术", "逻辑",
                    "接入", "结果", "看护", "关键问题", "联网", "考", "扎实", "领导", "帮助", "交付", "细致", "类似", "统招",
                    "阿里", "售前", "乐鑫", "协调", "实时", "业界", "业务", "其他", "提出", "热爱", "事宜", "对物", "中期", "考",
                    "公司", "编制", "遵守", "各种", "专业本科", "掌握", "量好", "展开", "体系", "板等物", "公司", "消息", "出差",
                    "最好", "独立", "熟练掌握", "管理", "阅读", "优秀", "岗位", "一年", "配置", "任意", "风格", "意识", "高级",
                    "态度", "全日制", "通讯", "常见", "方法", "多种", "传输", "认识", "积极", "移植", "系列", "心态", "培养",
                    "软件工程", "计算机相关", "系列", "之一", "外设", "经历", "加工", "文件", "大学", "基于", "一面", "方面",
                    "抗压", "有人", "改进", "高效", "方式", "推进", "或者", "中型", "手册", "接触", "更加", "文件", "记录",
                    "嵌入式软件", "严谨", "提供", "两年", "踏实", "独挡", "思想", "适应", "应届生", "耐心", "性能", "基本", "安防",
                    "搭建", "语言", "底层", "智能", "善于", "认真", "低功耗", "通过", "以下", "能看懂", "更佳", "运用", "完整",
                    "中心", "网络协议"
                    }
    stopwords = STOPWORDS.union(my_stopwords)
    word = WordCloud(background_color="white",
                     width=1200,
                     height=800,
                     font_path='/System/Library/Fonts/PingFang.ttc', 
                     # 指定字体路径,很重要
                     stopwords=stopwords,
                     # mask=mask,
                     max_font_size=100,  # 设置字体最大值
                     random_state=18  # 设置有多少种随机生成状态,即有多少种配色方案
                     ).generate(txt)
    word.to_file('data/test.png')
    print("词云图片已保存")

    plt.imshow(word)  # 使用plt库显示图片
    plt.axis("off")
    plt.figure(figsize=(16, 12))
    plt.show()

下面是wordcloud函数的参数介绍:

font_path : string //字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'
width : int (default=400) //输出的画布宽度,默认为400像素
height : int (default=200) //输出的画布高度,默认为200像素
prefer_horizontal : float (default=0.90) //词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
mask : nd-array or None (default=None) //如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。
scale : float (default=1) //按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。
min_font_size : int (default=4) //显示的最小的字体大小
font_step : int (default=1) //字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。
max_words : number (default=200) //要显示的词的最大个数
stopwords : set of strings or None //设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
background_color : color value (default=”black”) //背景颜色,如background_color='white',背景颜色为白色。
max_font_size : int or None (default=None) //显示的最大的字体大小
mode : string (default=”RGB”) //当参数为“RGBA”并且background_color不为空时,背景为透明。
relative_scaling : float (default=.5) //词频和字体大小的关联性
color_func : callable, default=None //生成新颜色的函数,如果为空,则使用 self.color_func
regexp : string or None (optional) //使用正则表达式分隔输入的文本
collocations : bool, default=True //是否包括两个词的搭配
colormap : string or matplotlib colormap, default=”viridis” //给每个单词随机分配颜色,若指定color_func,则忽略该方法。
fit_words(frequencies) //根据词频生成词云【frequencies,为字典类型】
generate(text) //根据文本生成词云
generate_from_frequencies(frequencies[, ...]) //根据词频生成词云
generate_from_text(text) //根据文本生成词云
process_text(text) //将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap]) //对现有输出重新着色。重新上色会比重新生成整个词云快很多。
to_array() //转化为 numpy array
to_file(filename) //输出到文件

其中词云遮罩图的制作比较重要,想制作个性化的词云,就得自己制作遮罩图,3.3有制作方法。

2.3 运行输出

if __name__ == '__main__':
    read_deal_text()
    img_grearte()

三、踩坑记录

  1. 图片中的中文显示不出来,如下图:
    在这里插入图片描述
    解决方法:配置WordCloud的font_path参数
'''设置词云样式'''
wc = WordCloud(
    background_color='white',# 设置背景颜色
    mask=backgroud_Image,# 设置背景图片
    font_path='C:\Windows\Fonts\STZHONGS.TTF',  # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
    max_words=2000, # 设置最大现实的字数
    stopwords=STOPWORDS,# 设置停用词
    max_font_size=150,# 设置字体最大值
    random_state=30# 设置有多少种随机生成状态,即有多少种配色方案
)

font_path用来制定中文编码的字体,如果不指定不会出现汉字。
windows一般是C:\Windows\Fonts\下的某字体;
mac一般是/System/Library/Fonts/下的某字体;
2. 添加停用词
切分出来很多无用的高频词,显示效果如下,不是想要的结果,所以把这些高频词添加到停用词集合中。
在这里插入图片描述
添加之后的效果:
在这里插入图片描述
3. 遮罩图的制作
遮罩图是生成词云的轮廓,在遮罩图中除了全白(#FFFFFF)的部分不会绘制,其余部分会用于绘制词云。遮罩图就需要根据个人需求自己制作,可以用ps或是美图秀秀进行制作,左边这张图是从网上下载的,右边是我把武松的形象抠出来,新建一个背景为白色的图,这样才能用,不然制作的词云是看不到人物轮廓的。
在这里插入图片描述
下面是制作的武松词云:
在这里插入图片描述

扫描二维码关注公众号,回复: 13476942 查看本文章

猜你喜欢

转载自blog.csdn.net/ljzology/article/details/119639981