文章目录

  • 引言
  • 一、HMM模型
  • 二、中文分词方法
    • 1.基于规则
    • 2. 基于知识理解
    • 3. 基于统计
  • 三、Jieba分词原理

引言

  结巴分词用到的核心算法模型是隐马尔可夫模型。

一、HMM模型

  隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。我们下面举一个例子来理解HMM模型。

如果想详细了解HMM模型的推导,可以参考:nlp基础—7.隐马尔可夫模型(HMM算法)。

二、中文分词方法

1.基于规则

  基于字典、词库匹配的分词方法,基于字符串匹配分词。将待分的字符串与一个充分大的机器词典中的词条进行匹配。

  1. 正向最大匹配:对输入的句子从左至右,以贪心的方式切分出当前位置上长度最大的词,组不了词的字单独划开。其分词原理是:词的颗粒度越大,所能表示的含义越精确。
  2. 逆向最大匹配:原理与正向最大匹配相同,但顺序不是从首字开始,而是从末字开始,而且它使用的分词词典是逆序词典,其中每个词条都按逆序方式存放。在实际处理时,先将句子进行倒排处理,生成逆序句子,然后根据逆序词典,对逆序句子用正向最大匹配。
  3. 双向最大匹配:将正向最大匹配与逆向最大匹配组合起来,对句子使用这两种方式进行扫描切分,如果两种分词方法得到的匹配结果相同,则认为分词正确,否则,选取分词结果中单个汉字数目较少的那一组

    输入:
    研究生研究自然语言处理是一个不错的研究方向
    正向:
    [‘研究生’, ‘研究’, ‘自然语言处理’, ‘是’, ‘一个’, ‘不错’, ‘的’, ‘研究’, '方向’]
    逆向:
    [‘方向’, ‘研究’, ‘的’, ‘不错’, ‘一个’, ‘是’, ‘自然语言处理’, ‘研究’, ‘研究生’]
    Reverse:
    [‘研究生’, ‘研究’, ‘自然语言处理’, ‘是’, ‘一个’, ‘不错’, ‘的’, ‘研究’, '方向’]
    双向:相同,正确。

总结:基于词典的分词方法简单、速度快,效果也还可以,但对歧义和新词的处理不是很好,对词典中未登录的词没法进行处理

2. 基于知识理解

  基于句法、语法分析,并结合语义分析,通过对上下文内容所提供信息的分析对词进行定界。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。
  在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断。这类方法试图让机器具有人类的理解能力,需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式。因此目前基于知识的分词系统还处在试验阶段。

3. 基于统计

  基于统计的分词方法是从大量已经分词的文本中,利用统计学习方法来学习词的切分规律,从而实现对未知文本的切分。随着大规模语料库的建立,基于统计的分词方法不断受到研究和发展,渐渐成为了主流。常用的统计学习方法:隐马尔可夫模型(HMM)、条件随机场(CRF)和基于深度学习的方法。
  jieba是基于统计的分词方法。jieba分词采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合,对于未登录词(新词),采用了基于汉字成词能力的HMM模型
  总结:基于统计的分词方法能很好地处理歧义和新词问题,效果比基于词典的要好,但该方法需要有大量人工标注分好词的语料作为支撑,训练开销大。

三、Jieba分词原理

  Jieba分词原理是基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法。下面将详细讲解基于结巴的分词原理。

  1. 构造前缀词典
    结巴分词首先会依照结巴默认的统计词典dict.txt构造前缀词典。dict.txt含有近35万的词条,每个词条占用一行,其中每一行有3列,第一列为词条,第二列为对应的词频,第三列为词性,构造前缀词典需要用到前两列。具体做法为:首先定义一个空的python字典,然后遍历dict.txt的每一行,取词条作为字典的键,词频作为对应的键值,然后遍历该词条的前缀。如果前缀对应的键不在字典里,就把该前缀设为字典新的键,对应的键值设为0,如果前缀在字典里,则什么都不做。这样等遍历完dict.txt后,前缀词典就构造好了。在构造前缀词典时,会对统计词典里所有词条的词频做一下累加,累加值等计算最大概率路径时会用到。

  2. 生成有向无环图
    以输入:“去北京大学玩”为例
    基于前缀词典,对输入文本进行切分,对于“去”,没有前缀,那么就只有一种划分方式;对于“北”,则有“北”、“北京”、“北京大学”三种划分方式;对于“京”,也只有一种划分方式;对于“大”,则有“大”、“大学”两种划分方式,依次类推,可以得到每个字开始的前缀词的划分方式。

    对于0: [0],表示位置0对应的词,就是0 ~ 0,就是“去”;对于1: [1,2,4],表示位置1开始,在1,2,4位置都是词,就是1 ~ 1,1 ~ 2,1 ~ 4,即“北”,“北京”,“北京大学”这三个词。对于每一种划分,都将相应的首尾位置相连,例如,对于位置1,可以将它与位置1、位置2、位置4相连接,最终构成一个有向无环图


    代码部分实现:

    # 有向无环图构建主函数
    def get_DAG(self, sentence):# 检查系统是否已经初始化self.check_initialized()# DAG存储有向无环图的数据,数据结构是dictDAG = {}N = len(sentence)# 依次遍历文本中的每个位置for k in xrange(N):tmplist = []i = k# 位置k形成的片段frag = sentence[k]# 判断片段是否在前缀词典中,如果片段不在前缀词典中,# 则跳出本循环也即该片段已经超出统计词典中该词的长度while i < N and frag in self.FREQ:# 如果该片段的词频大于0,将该片段加入到有向无环图中;否则,继续循环if self.FREQ[frag]:tmplist.append(i)# 片段末尾位置加1i += 1# 新增一个字构造新字段            frag = sentence[k:i + 1]if not tmplist:tmplist.append(k)DAG[k] = tmplistreturn DAG
    
  3. 计算最大概率路径
    在得到所有可能的切分方式构成的有向无环图后,我们发现从起点到终点存在多条路径,多条路径也就意味着存在多种分词结果。因此,我们需要计算最大概率路径,也即按照这种方式切分后的分词结果的概率最大。在计算最大概率路径时,jieba分词采用从后往前这种方式进行计算。

    为什么采用从后往前这种方式计算呢?
    因为,我们这个有向无环图的方向是从前向后指向,对于一个节点,我们只知道这个节点会指向后面哪些节点,但是我们很难直接知道有哪些前面的节点会指向这个节点。在采用动态规划计算最大概率路径时,每到达一个节点,它前面的节点到终点的最大路径概率已经计算出来。

    我们构建出来的有向无环图DAG的每个节点都是带权的,权重就是它的词频,我们最后要求得的路径r,必然是∑weight(wi) 最大。
    具体的算法思路:自底向上的动态规划问题,它从sentence的最后一个字(N-1)开始倒序遍历sentence的每个字(idx)的方式,计算子句sentence[idx ~ N-1]的概率对数得分。然后将概率对数得分最高的情况以(概率对数,词语最后一个位置)这样的元组保存在route中。

    最大概率的对数及路径如下:

  4. 对未登录词采用HMM模型进行分词
    当出现没有在前缀词典里收录的词时,会采用HMM模型进行分词。HMM模型有5个基本组成:观测序列、状态序列、状态初始概率、状态转移概率和状态发射概率。分词属于HMM的预测问题,即已知观测序列、状态初始概率、状态转移概率和状态发射概率的条件下,求状态序列。结巴分词已经内置了训练好的状态初始概率、状态转移概率和状态发射概率。句子会作为观测序列,当有新句子进来时,具体做法为:先通过Viterbi算法求出概率最大的状态序列,然后基于状态序列输出分词结果(每个字的状态为B、M、E、S之一)。如果切出了词典中没有的词语,效果不理想,结巴里也可以关闭新词发现。


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


nlp基础—10.结巴分词的应用及底层原理剖析相关推荐

  1. 10分钟看懂 Java NIO 底层原理

    写在前面 很多的小伙伴,被java IO 模型,搞得有点儿晕,一会儿是4种模型,一会儿又变成了5种模型. 很多的小伙伴,也被nio这个名词搞晕了,一会儿java 的nio 不叫 非阻塞io,一会儿ja ...

  2. nlp基础—8.隐马尔科夫模型(HMM)分词实现

    文章目录 引言 HMM分词实现 理论部分传送门: nlp基础-7.隐马尔可夫模型(HMM算法) 数据代码链接见:https://gitee.com/lj857335332/hmm-for-word-s ...

  3. java结巴分词如何提高运行速度_结巴分词 java 高性能实现,优雅易用的 api 设计,性能优于 huaban jieba 分词...

    Segment Segment 是基于结巴分词词库实现的更加灵活,高性能的 java 分词实现. 创作目的 分词是做 NLP 相关工作,非常基础的一项功能. jieba-analysis 作为一款非常 ...

  4. mysql使用结巴语句_结巴分词 java 高性能实现,是 huaban jieba 速度的 2倍

    Segment Segment 是基于结巴分词词库实现的更加灵活,高性能的 java 分词实现. 创作目的 分词是做 NLP 相关工作,非常基础的一项功能. jieba-analysis 作为一款非常 ...

  5. Python 结巴分词(1)分词

    利用结巴分词来进行词频的统计,并输出到文件中. 结巴分词github地址:结巴分词 结巴分词的特点: 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成 ...

  6. 深度学习将会变革NLP中的中文分词

    深度学习将会变革NLP中的中文分词 2016-08-08 19:03 转载 陈圳 0条评论 雷锋网按:本文转自ResysChina高翔,文章主要介绍了1)区分中文分词的方法:2)用深度学习的方法来解决 ...

  7. 结巴分词优点_中文分词概述及结巴分词原理

    词是中文表达语义的最小单位,中文分词是中文文本处理的一个基础步骤,分词的结果对中文信息处理至为关键. 本文先对中文分词方法进行概述,然后简单介绍结巴分词背后的原理. 1. 中文分词概述 中文分词根据实 ...

  8. 结巴分词关键词相似度_jieba+gensim 实现相似度

    相似度 自然语言处理(NLP) : 大概意思就是 让计算机明白一句话要表达的意思,NLP就相当于计算机在思考你说的话,让计算机知道"你是谁","你叫啥",&qu ...

  9. 结巴分词关键词相似度_辨别标题党--提取关键词与比较相似度

    最近好几天都没有更新博客,因为网络设置崩了,然后各种扎心,最后还重装电脑,而且还有一些软件需要重新安装或者配置,所以烦了好久,搞好电脑之后,老师又布置了一个任务,个人觉得很有趣--判别学校新闻是否是标 ...

  10. 十分钟快速上手结巴分词

    一.特点 1.支持三种分词模式 精确模式,试图将句子最精确的切开: 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义: 搜索引擎模式,在精确模式的基础上,对长词再次切分,提 ...

最新文章

  1. OpenCV(项目)二维码识别(二维码、条形码)
  2. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
  3. 网络适配器有感叹号不能上网_笔记本电脑显示无internet安全,不能无线上网怎么办...
  4. JVM 调优实战--使用jstack分析线程执行情况
  5. MySQL 数据库性能优化,看这篇就够了
  6. POJ1459 Power Network —— 最大流
  7. 【Vegas原创】红烧肉的做法
  8. 强化学习中值迭代收敛性推理证明
  9. C语言中与字符串有关函数讨论以及安全性能问题
  10. predict函数 R_R语言 动态贝叶斯网工具箱 dbnR学习笔记
  11. MacOS上 编译GMSSL
  12. 谈一下对计算机网络技术的认识,浅谈对计算机网络的认识
  13. 元气骑士怎么用电脑玩 元气骑士手游模拟器教程
  14. [译]AngularJS1.3.0 开发者指南(四) -- 控制器
  15. ubuntu20.04 命令行下,复制与粘贴快捷键分别是ctrl+shift+c、 ctrl+shift+v
  16. 新手网站制作教程:网站建设流程及步骤有哪些?
  17. 西部世界第二季百度云免费在线观看_迅雷下载
  18. 1428D - Bouncing Boomerangs(思维+构造+贪心)
  19. can总线配置读入是什么意思_CAN总线系列讲座第七讲——CAN总线地址设置详解
  20. STM32 环境光传感器ADC采样

热门文章

  1. NFinal 控制器—URL
  2. 增强用户体验,设置快捷键
  3. UVA - 11029
  4. Xmind 常用快捷键列表(官方推荐)
  5. USACO Sorting a Three-Valued Sequence
  6. 去掉 Warning:$HADOOP_HOME is deprecated
  7. 错误提示之:SQL—无法在服务器上访问指定的路径或文件。请确保您具有必需的安全权限且该路径或文件存在。...
  8. mysql主从同步图
  9. 工程实践:给函数取一个好的名字
  10. C/C++语法知识点汇总