​昨晚我们又做了一次技术分享,继续上次技术分享的话题“文本数据的处理”。上次,我们分享了文本处理的方方面面的知识点,比较宏观,这次我们就其中的一点“分词”展开。

一、为什么要分词

“行文如流水”形容的是诗文、书法自然流畅不受拘束。这里我们借用一下就是,中文句子词汇之间如流水般无缝,不像英文那样单词之间用空格分开。比如:

中文:我在猿人学网站上学Python

英文:I learn Python on YuanRenXue.

在程序里,从英文中得到一个一个单词很简单,用Python字符串的split()函数就可以搞定。而对于中文做同样的事情就比较难了,这时候我们就需要一个分词程序专门搞这件事。

词汇是语义表达的基本单位。词语比单个字表达的意思更为精准。在搜索引擎里面,建立倒排索引的时候,需要对文本进行分割为一个个的语素,是分成一个一个的字好呢,还是分割成一个个词好呢?我们来看看下面的例子。

首先,我们先简单理解一下“倒排索引”这个概念。我们可以把它类比成一个Python的字典,key是索引的语素(字或词),value是一个包含这个语素的文档ID的列表。下面我们对“我早上在海边跑步”这句话进行分割、索引,假设这句话的文档ID是1。

按字分割:我/早/上/在/海/边/跑/步

索引:

在这个索引里面搜“上海”,先把查询词按照索引时同样的方法分割为“上”和“海”两个字,然后分别搜这两个字,索引里面都包含这两个字,它们都对应这ID为1的文档,也就是搜索到了文档ID为1的文档。但是,这句“我早上在海边跑步”跟“上海”是没什么关心的。

也就是说,按字分割索引会让搜索引擎搜出很多不相关的结果出来。那么,按词索引呢?

按词分割:我/早上/在/海边/跑步

建立索引:

从这个索引里面找“上海”就不能找到,从而不会返回不相关的结果。

二、分词的原理

分词是一个技术活也是一个累活儿。如果分词是建立在新闻类的语料基础上的,它对其它领域比如化工、医学等等领域的文本的分词效果往往不会好。这就需要我们对行业领域词汇进行收集,加入到分词词典中,才能得到更好的效果,这个过程是比较累人的。

分词的方法一般有以下几种:

1、基于词典的方法

这个方法朴素而快速,但不能很好的解决歧义和未收录词。歧义就是下面这种句子根据词典可以有多种分割方法:

“结婚/的/和/尚未/结婚/的”

“结婚/的/和尚/未/结婚/的”

未收录词就是分词词典没有包含的那些词,这个问题可以通过不断扩展词典在某种程度上解决。

2、机器学习的方法

首先,要人工标注大批量的语料给机器学习算法进行学习。标注的过程要耗费大量人力,标注的语料越多,机器学习的效果越好。机器学习的方法有HMM、CRF,以及近年流行的深度学习。它对歧义和未收录词的问题有较好的解决。但是,大量领域语料的缺失,也导致它不能很好的直接应用于其它专业领域。

三、jieba分词工具

上次技术分享中,我们介绍了多款分词工具。jieba作为一个纯Python实现的工具,使用起来非常方便。它支持简体和繁体分词,也可以自定义词典方便我们扩展领域词。

结巴有三种分词模式:

精确模式:适合文本分析。此法最常用

全模式,把句子中所有可能的词都列出来。基本没啥用

搜索引擎模式:把长词切分为短词,让搜索引擎提高召回率。建立搜索引擎的索引时用

安装jieba很简单:

pip install jieba

使用结巴进行分词主要有两个函数:

jieba.cut(text, cut_all=False, HMM=True)

jieba.cut_for_search(sentence, HMM=True)

其中,cut()函数最为常用。参数cut_all=True的话就开启了全模式,这种模式几乎不需要。默认的HMM=True会使用HMM模型尝试检测未登录词。

写个简单的程序来测试一下几种不同的分词模式:

得到的结果如下:

精确模式:

猿人/ 学是/ 一个/ 学习/ Python/ 的/ 网站

全模式:

猿人/ 人学/ 是/ 一个/ 学习/ Python/ 的/ 网站

搜索引擎模式:

猿人/ 学是/ 一个/ 学习/ Python/ 的/ 网站

精确模式下,会把“学是”当做一个词分出来,这就是HMM计算的结果,当然对于这个例子,它计算错了。

“猿人学”应该是一个词,但它没有分出来。这个时候我们就需要自定义词典。

添加自定义的词,有两种方法:

(1)通过函数添加:

jieba.add_word(‘猿人学’, freq=5, tag=’n’)

可以多次调用这个函数,添加更多的词。

(2)通过词典文件:

jieba.load_userdict(file_name)

file_name就是一个词典文件的路径,它是一个文本文件,每行一个词,后面可以跟着它的频率和词性:

猿人学 8 n

js逆向 7

APP脱壳 n

异步IO

词性标注

jieba支持词性标注,具体在它的子模块 jieba.posseg

import jieba.posseg as pseg

words = pseg.cut('我在猿人学学Python')

for word, flag in words:

print('{} {}'.format(word, flag))

我 r

在 p

猿人学 n

学 n

Python eng

词性标注可以帮助我们更好的筛选文章主题词(或者叫关键词)。比如,介词、数量词不然名词、动词的意义更丰富,提取关键词时可以对名词等赋予更高的权重。

主题词提取

jieba提供的主题词提取的功能,具体在 jibba.analyse 子模块。它有两种算法的实现,分别是TF-IDF算法和TextRank算法。两者的效果差不多,但后者计算量大很多,比较慢。所以,推荐使用前者。

TF-IDF算法

jieba.analyse.extract_tags(

text,

topK=20,

withWeight=False,

allowPOS=())

text 为待提取的文本

topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20

withWeight 为是否一并返回关键词权重值,默认值为 False

allowPOS 仅包括指定词性的词,默认值为空,即不筛选词-权重

TextRank算法

jieba.analyse.textrank(

text,

topK=20,

withWeight=False,

allowPOS=('ns', 'n', 'vn', 'v'))

直接使用,接口相同,注意默认过滤词性。

四、词云图:可视化主题词

前面我们通过jieba提取了文章的主题词,可以使用“词云图”这种方法把它可视化的表现出来。

Python有个画词云图的第三方模块:wordcloud。用pip直接安装:

pip install wordcloud

使用它主要有两个类:

WordCloud([font_path, width, height, …])

画词云图的类

ImageColorGenerator(image[, default_color])

从一张彩色图片中生成词云图的颜色

使用WordCloud类进行词云图绘制过程,需要注意的地方:

中文字体 : 必须指定中文字体,不然中文就画不出来。

mask :以图片物体形状绘制词云图。非物体形状部分为白色,颜色值为#FFF 或 #FFFFFF

图片颜色->字体颜色:使用ImageColorGenerator 从mamsk图片提取颜色,把对应位置的字体颜色设置为同样的颜色。

下面,我们以Python的logo作为词云图形状进行绘制。

文章内容是猿人学网站上的文章《大规模异步新闻爬虫的实现思路》,通过jieba提取主题词,然后进行绘制。代码如下 :

运行这段代码后,生成了两个词云图,第一张是随机生成的字体颜色:

第二张是根据Python logo 图片中的颜色绘制字体颜色:

如果你选择色彩更丰富的图片,绘制出来的词云图色彩也会更丰富。

这次技术分享,我们把jieba分词的使用结合实例介绍给大家,最后使用wordcloud做了主题词的可视化呈现。

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.com 原创,没有猿人学授权,请勿以任何形式转载。***

python中文词云图代码_Python文本处理NLP:分词与词云图相关推荐

  1. python中文词云图代码_python词云图与中文分词

    2019-12-12中文文本分词和词云图具体功能介绍与学习代码: import jieba a="由于中文文本的单词不是通过空格或者标点符号来进行分割" #jieba.lcut() ...

  2. python中文词云图代码_python绘制中文词云图

    1. 明确任务 最近学习过程中看到很多分析报告中都有运用到可视化的词云,也有看到五花八门的工具教程,刚好有一份<都挺好>电视剧的弹幕源数据.便决定用这份数据尝试使用python绘制词云. ...

  3. python中文词云图代码_Python简单实现词云图代码及步骤解析

    一.安装 wordcloud pip install wordcloud 二.加载包.设置路径 import os from wordcloud import WordCloud import mat ...

  4. python词语匹配相似度_python文本相似度计算

    步骤分词.去停用词 词袋模型向量化文本 TF-IDF模型向量化文本 LSI模型向量化文本 计算相似度 理论知识 两篇中文文本,如何计算相似度?相似度是数学上的概念,自然语言肯定无法完成,所有要把文本转 ...

  5. python中文词组统计次数_python统计中文词组出现次数

    2018年9月7日在百度google没有找到python统计中文词组的,查出来的都是统计英文单词,词组的,所以我想来实现python中文词组统计分享. 首先我是用textrank4zh库将句子转化成词 ...

  6. python画旺仔代码_python基础1

    python解析 1:Python语言是符号跟文字的组合,目的是用来向计算机发送指令,控制计算机工作 2:Python解释器是运行在操作系统之上的一个特殊功能的应用程序 3:解释器负责将变成语言的符号 ...

  7. python求平方根的代码_Python求解平方根的方法

    本文实例讲述了Python求解平方根的方法.分享给大家供大家参考.具体如下: 主要通过SICP的内容改写而来.基于newton method求解平方根.代码如下: #!/usr/bin/python ...

  8. python中怎么复制代码_Python对象怎么引用_Python对象怎么复制代码_一聚教程网

    本次文章要给大家讲解的是Python对象引用及复制代码,相信这也是大家问题比较大的一个点,下面为大家具体整理了操作过程,一起来了解下. 可以说Python没有赋值,只有引用.你这样相当于创建了一个引用 ...

  9. python判别性别的代码_python如何实现性别识别 python实现性别识别代码示例

    python如何实现性别识别?本篇文章小编给大家分享一下python实现性别识别代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 使用keras ...

最新文章

  1. 网页性能优化之异步加载js文件
  2. 所有程序自适应高分辨率(未完善)
  3. 怎样才算是一个合格的网页设计师?
  4. STM32输出比较模式和PWM模式 比较
  5. t–sql pl–sql_T-SQL for DBA –使用T-SQL进行快速数据分析的三种方法
  6. Linux nor flash分区,Linux驱动开发笔记:NOR FLASH编写实例
  7. Django学习知识点、路线图、资料总结大全,建议收藏!
  8. 【计算几何】bzoj2338 [HNOI2011]数矩形
  9. cisco路由器基本实验之六 CHAP and RIP (Boson NetSim)
  10. UIImageView contentModel
  11. 用matlab进行拉普拉斯滤波,[转载]matlab滤波技术及区域处理---线性滤波
  12. 基于PSCAD输电线路潮流计算
  13. Linux 在线词典
  14. 赞!7000 字学习笔记,MySQL 从入到放弃
  15. 使用UICollectionView实现首页的滚动效果
  16. 寒心啊!我的威望值居然是-1,整个论坛估计没几人像我这样
  17. java 单线程 并发_单线程_Java高并发专题系列_Java视频-51CTO学院
  18. Android入门第十四篇之画图
  19. 个人怎么做微信小程序?
  20. 基于nexus搭建golang代码下载代理缓存私服

热门文章

  1. Win10《芒果TV》更新v3.8.50勇敢版:新增短信和扫码登录
  2. c语言程序设计谢丽霞课后答案,课程建设计划.doc
  3. YOLO系列目标检测算法——PP-YOLO
  4. Introspect MIPI D-PHY/C-PHY DSI/CSI总线协议分析仪(Analyzer)
  5. PHP多维数组元素操作类
  6. Vue项目在ie浏览器报语法错误
  7. python爬取有道词典json报错,求帮助!
  8. [笔记]光照系统3环境光、反射光
  9. Python3.9安装教程
  10. 为啥加了时分秒就不能解析了呢?