前言

实习期间在做一个专利分析的项目,用到了文本处理的方法,大部分文本分析类的项目应该都离不开分词这个最基础的操作吧,我在做项目之前,在网上找了一些例子,搞清楚分词的代码处理流程,就直接在我的项目里用了,当然,我认为这应该是正确的操作,不可能一个项目的开始要等你完全搞懂所运用的理论部分。不过,等项目流程跑完,我还是对此耿耿于怀,于是花了一天时间调研学习了一下jieba分词的理论部分,在此做个总结,也是梳理一遍学习的内容,如果有理解不够透彻的地方,欢迎指正。

这篇文章会站在一个初学者的角度来看待结巴分词,欢迎正在学习的同学一起交流。

jieba分词的流程概括

这部分我认为放在开头来看,会很迷惑,不懂的同学看完后还是没有任何感觉,但是我觉得可以在研究具体细节的同时来对照一下这部分内容,会让你在学习的过程中不会犯迷糊。看完整个流程后再返回来思考一遍,条例会更加清晰。

  1. 依据统计词典(模型中这部分已经具备,也可自定义加载)构建统计词典中词的前缀词典。
  2. 依据前缀词典对输入的句子进行DAG(有向无环图)的构造。
  3. 使用动态规划的方法在DAG上找到一条概率最大路径,依据此路径进行分词。
  4. 对于未收录词(是指不在统计词典中出现的词,未收录词怎么识别可以看完第三部分之后思考一下),使用HMM(隐马尔克夫模型)模型,用Viterbi(维特比)算法找出最可能出现的隐状态序列。

注:HMM的理解可以查看李航的统计学习方法,它主要分为三个问题的解决来讲解HMM,如果,你着急搞明白在jieba分词中怎么使用的HMM,可以着重看第三个预测问题。

统计词典

统计词典在jieba包的dict.txt文件中,是开发者已经统计好的词典

dict.txt里的内容

dict.txt里第一列代表的是词语,第二列是词频,第三列是词性,我们主要用到前两列信息,词性这部分,这里没有涉及。

前缀词典

当程序运行的时候,它会加载统计词典生成前缀词典,前缀词典是表示什么的呢,我们举个简单的例子。

比如统计词典中含有如下词语

我  123
在  234
学习  456
结巴  345
分词  456
结巴分词  23
学  2344
分  23
结 234

则前缀词典构造如下,它是将在统计词典中出现的每一个词的每一个前缀提取出来,统计词频,如果某个前缀词在统计词典中没有出现,词频统计为0,如果这个前缀词已经统计过,则不再重复。

我 123
在  234
学  2344
学习  456
结  234
结巴  345
结巴分  0
结巴分词  23
分 23
分词  456

这里把未出现的统计词也统计出来,且词频统计为0,是为了后面构造DAG方便(猜测是在代码开发上方便)。

有向无环图

我们来讲解一下程序里是怎么存储“DAG”的,程序实现图的构建是存储为字典形式的,以每个字所在的位置为键值key,相应划分的末尾位置构成的列表为value,相应划分的末尾位置指的是什么呢,我们举例来说明

“我在学习结巴分词”

在这句话里,我们将每一个字用所在位置来代表,比如0代表“我”,4代表“结”,针对“结”,我们可以在前缀词典里看到以“结”为前缀的词“结”,“结巴”,“结巴分词”的词频大于0,因此“结”,“巴”,“词”为相应划分的末尾位置,因此键值4的value为[4,5,7],其他键值的对应value统计如下

0 :[0]
1 :[1]
2 :[2,3]
3 :[3]
4 :[4,5,7]
5 :[5]
6 :[6,7]
7 :[7]

注:每一个字都将其自己作为相应划分的末尾位置,即使这个字不在统计词典里。

基于以上构建的键值对,我们将有向图可视化一下,以便方便理解。

从“我”到“词”的路径有以下10种

我/在/学/习/结/巴/分/词
我/在/学习/结巴分词
我/在/学习/结/巴/分/词
我/在/学习/结巴/分词
我/在/学习/结/巴/分词
我/在/学习/结巴/分/词
我/在/学/习/结/巴/分词
我/在/学/习/结巴/分/词
我/在/学/习/结巴分词
我/在/学/习/结巴/分词

那我们需要计算那条路径的可能性最大。

动态规划在DAG上找概率最大路径

每一个词出现的概率等于该词在前缀里的词频除以所有词的词频之和。如果词频为0或是不存在,当做词频为1来处理。

这里会取对数概率,即在每个词概率的基础上取对数,一是为了防止下溢,二后面的概率相乘可以变成相加计算。

这里采用从后向前的动态规划解法,我们举个例子说明这样做的好处,比如“结巴分词”

我们只认为现在是在分解这个短语,假设(与上面举例用到的词频不一致哈,这里只是为了说明问题)

词语      出现的对数概率
“词”      -1
“分”      -0.2
“分词”    -0.1
“巴”      -1
“结”      -0.2
“结巴”    -0.1
“结巴分词” -0.01

DAG为
0 :[0,1,3]
1 : [1]
2 : [2,3]
3 : [3]

则re=[]用来存放结果,先计算位置最后一个字“词”,根据构建的DAG我们知道3:[3],因此“词”只有一条自己的路径,其对数概率为-1,则re[3]=(-1,3),元组第一个词为当前词到最后一个词的最大对数概率得分,元组第二个词为最大对数概率路径中经过的那个词。

如果不太懂,我们接着算“分”,2:[2,3],两条路径,先算到达2这条路径的最大对数概率值为-0.2,则计算“分”经过此路径到达最后一个字“词”的最大对数概率得分为-0.2+(-1)=-1.2;第二条路径为到达3,即“分词”的对数概率为-0.1,因此这条路径使得“分”到达最后一个词的最大对数概率为-0.1;对比第一条路径的最大值,则-0.1>-1.2,因此re[2]=(-0.1,3)。

“巴”,1:[1]只有一个选择,则对数概率值为-1,到达最后一个字的路径为“巴/分词”,我们就不考虑“巴/分/词”了,因此“分词”比“分/词”概率会更大,这就体现了动态规划的巧妙之处。因此“巴”到达“词”的最大概率为-1+(-0.1)=-1.1,因此re[1]=(-1.1,1)

"结",0:[0,1,3],三个选择,先看到0,对数概率为-0.2,则到达最后一个字的选择为“结/巴-词”,“巴”-“词”的最大概率为-1.1,因此词路径的最大概率值为-0.2+(-1.1)=-1.3;再看1这个选择,则到达最后一个字的选择为“结巴/分-词”,因此词路径的最大概率值为-0.1+(-0.1)=-0.2;再看3这个选择,则到达最后一个字的选择为“结巴分词”,因此词路径的最大概率值为-0.01,因此re[0]=(-0.01,3)

则从“结”到“词”的最大概率为-0.01,分词方式为“结巴分词”。如果是更复杂的情况,你们知道怎么从得到的re来找到最大路径进行分词吗?可以思考一下。

未收录词的划分

这里需要用到HMM算法的预测问题模型,需要使用Viterbi算法来求解最优预测结果。理论性的东西,我就不细讲了,大家可以参考李航的《统计学习方法》。

利用HMM模型进行分词,主要是将分词问题视为一个序列标注(sequence labeling)问题,其中,句子为观测序列,分词结果为状态序列。首先通过语料训练出HMM相关的模型,然后利用Viterbi算法进行求解,最终得到最优的状态序列,然后再根据状态序列,输出分词结果。

这里的状态序列的元素有四种{"B":Begin(这个字处于词的开始位置),"M":Middle(这个字处于词的中间位置),"E":End(这个字处于词的结束位置),"S":Single(这个字是单字成词)}

问题:我们已知“我在学习结巴分词”这个观测序列,需要预测出“SSBEBMME”这一条状态序列。

求解这个问题的已知条件为

  1. 初始状态概率。
  2. 状态转移概率,即一个状态转移到其他状态的概率。此时需要假设齐次马尔科夫性,即t时刻的状态只与前一个状态有关,与其他时刻的状态无关。
  3. 状态发射概率,即在某个状态下,所表现出来的观测值的概率,只与当前时刻的状态有关,与其他时候的状态和观测值无关。

上面3个条件jieba分词库里已经训练得到了结果。这些结果是根据统计词典中的词频计算出来的。我猜测计算之前应该会对各个字进行标状态。

解决:使用Viterbi算法求解最优路径。

四种状态,S,B,M,E,观测序列为“结巴分词”,已知条件如下。

前一时刻状态为i,下一时刻状态为j的概率
在状态i的情况下,观测值为oj的概率
Viterbi算法图解,按行看,每一行是一个状态,依次为S,B,M,E

下面详细讲解上面这张图,争取让大家听明白,

  • 每一列代表一个时刻,我们这里将观测序列的每一个字的位置当做一个时刻来讲。
  • 每一个时刻的隐藏状态都有4种可能。
  • 计算初始时刻,可以看成一个路径的起点,起点的四种状态概率就是初始状态概率pai,每种状态下观测值为“结”的概率已知,因此起点有四种,且概率可以算出
  • 继续前进,T2时刻的观测值为“巴”,而此时的隐藏状态也是那四种,我们需要分别算出从起点到每一个状态并表现为观测值“巴”的最大概率。比如图中举例:若T2时刻为状态B,则有四种到达此状态的方式,我们分别计算这个概率大小,线路上已标明。然后分别乘以在状态B或者说状态2下观测值为“结”的概率
    ,找出概率最大的值作为
    ,若最大值为
    ,则记录下相应的转移路径,图中粗线。依次将每一个状态下最大的概率算出,相应的路径记录下来。
  • 继续前进,方法同上。
  • 最后时刻T4,计算出到达每一个状态并表现为“词”的最大概率
    ,然后求得四个
    的最值,比如是
    ,则其值为我们要找到的最优路径的概率值。由于之前已经记录到达每一个时刻每一个状态的最优路径,因此我们可以找到T3时刻为状态M,到达T3时刻M的最优方式是T2时刻的状态B,到达T2时刻B的最优方式是T1时刻的状态S。因此最优的一条隐藏状态为SBME。

找到一个观测序列的最大状态转移路径,怎么进行分词呢,我们举例子来分词,比如“SSBEBMME”,S作为单字成词,肯定要与后面的词分开,看到B要找到下一个E连在一起成词。分词方式很简单“S/S/BE/BMME”。

注:前面提到怎么查找未收录词,这里给一个解答,分词主分为两大部分:1,先使用DAG结果进行分词,将没有出现在统计词典中的字一一分开,比如,呃呃呃呃呃,想不起来了,借个例子吧,“冰与火之歌”,初步分词为“冰/与/火/之/歌”。2,统计这些连续单个分开的字,作为未收录词使用HMM进行再分词。

jieba结巴分词--关键词抽取_jieba分词的原理(文末有维特比算法讲解)相关推荐

  1. jieba结巴分词--关键词抽取_初学者 | 知否?知否?一文学会Jieba使用方法

    欢迎关注同名微信公众号:AI小白入门.跟着博主的脚步,每天进步一点点哟 我始终觉得,入门学习一件事情最好的方式就是实践,加之现在python如此好用,有越来越多的不错nlp的python库,所以接下来 ...

  2. jieba结巴分词--关键词抽取(核心词抽取)

    转自:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 简介 关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来.这个可以追溯到文献 ...

  3. python关键词提取源码_Python 结巴分词 关键词抽取分析

    关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来.这个可以追溯到文献检索初期,当时还不支持全文搜索的时候,关键词就可以作为搜索这篇论文的词语.因此,目前依然可以在论文中看到关键词这一项. ...

  4. jieba结巴分词--关键词抽取_结巴中文分词原理分析2

    作者:白宁超,工学硕士,现工作于四川省计算机研究院,著有<自然语言处理理论与实战>一书,作者公众号:机器学习和自然语言处理(公众号ID:datathinks) 结巴分词详解1中文分词介绍 ...

  5. jieba分词怎么操作_jieba 分词的使用和原理浅析

    自然语言处理目的在于让计算机"理解"人说的话或者文字,而在中文自然语言处理中第一步是获取语料,第二步就是对语料进行预处理,预处理的一个重要的环节就是对语料进行分词,其目的在于将一句 ...

  6. 简单NLP分析套路(2)----分词,词频,命名实体识别与关键词抽取

    文章大纲 中文分词技术 评测参考 云服务 哈工大语言云 ltp 基于深度学习方法的中文分词 一个领域细分的中文分词工具包(北大最新开源) 信息检索与关键词提取 TF-IDF TEXTRANK word ...

  7. 补充关键词抽取:RAKE,LDA等

    之前的<关键词抽取--结巴分词>一文仅仅利用了jiaba中的tfidf 与 textrank 进行关键词抽取,最近对以英文为主的新闻评论进行关键词提取时,这两种方法各有各的差:tfidf因 ...

  8. 关键词抽取与自动文摘

    关键词抽取与自动文摘 在自然语言处理中对于关键词抽取与自动文摘这两个主题,有着多种多样的方式去解决它们,这里将介绍一种叫做TextRank的方法,就可以解决这两个问题.我将结合具体的代码,试图将算法解 ...

  9. 中文分词:隐马尔可夫-维特比算法(HMM-Viterbi)附源码

    目录 0.先验知识 1.什么是中文分词 2.数据集的构造 3.训练及预测过程简述 4.训练阶段:统计隐马尔可夫模型的参数 5.预测阶段:应用 Viterbi 算法 6.完整的 Python 实现代码 ...

最新文章

  1. C++ STL:stack和queue
  2. 22个案例详解Pandas数据分析/预处理时的实用技巧,超简单
  3. java 连接池 druid_从零开始学 Java - 数据库连接池的选择 Druid
  4. 焊接工具DIY电焊机,自动触发笔,手持电焊笔
  5. 一个由进程内存布局异常引起的问题
  6. 力扣(LeetCode)78
  7. LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法...
  8. squid代理服务器详解
  9. verilog对YCrCb转换灰度设计及仿真
  10. Ubuntu Server 之Apache2 虚拟主机配置指南(个人实践解读)
  11. pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL
  12. redux相关学习资源
  13. Python+selenium自动化 - 环境搭建
  14. 华硕笔记本 FX50J Fn热键无效
  15. mac如何修改hosts文件
  16. (二) icarus主题配置
  17. Linux查看服务器SN序列码
  18. PX4-python安装更换源
  19. 【系统分析师之路】第五章 数据通信与计算机网络
  20. redmine主题 - Flatly light redmine theme扁平化/轻主题

热门文章

  1. 乘积最大【动态规划】
  2. 清华大学计算机系面向全球诚聘英才(教研/研究/教学系列教师岗位和博士后)...
  3. Java多线程 理发店小测试
  4. 夜游项目如何深入挖掘文化特色城镇
  5. [商业资讯] 燃精灵软件 今日分享
  6. 【CSDN官方】Apipost帮您轻松完成接口测试及接口文档,从此6点下班不是梦
  7. 上品折扣连续三年初一闭店 人性化管理赢得称赞
  8. 专科小伙豪取三杀,斩获阿里、京东和蚂蚁Java岗offer的原因找到了!
  9. C# Winform DotNetBar控件之StyleManager
  10. 看了就赚了,教你三招搞定海外网红营销