jieba介绍:

一、支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

二、jieba自带了一个叫做dict.txt的词典, 里面有2万多条词, 包含了词条出现的次数(这个次数是于作者自己基于人民日报语料等资源训练得出来的)和词性. 这个第一条的trie树结构的词图扫描, 说的就是把这2万多条词语, 放到一个trie树中, 而trie树是有名的前缀树, 也就是说一个词语的前面几个字一样, 就表示他们具有相同的前缀, 就可以使用trie树来存储, 具有查找速度快的优势。

三、jieba分词应该属于概率语言模型分词

概率语言模型分词的任务是:在全切分所得的所有结果中求某个切分方案S,使得P(S)最大。

jieba用到的算法:

一、基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)

1. 根据dict.txt生成trie树。字典在生成trie树的同时, 也把每个词的出现次数转换为了频率;

2. 对待分词句子, 根据dict.txt生成的trie树, 生成DAG, 实际上通俗的说, 就是对待分词句子, 根据给定的词典进行查词典操作, 生成几种可能的句子切分。jieba的作者在DAG中记录的是句子中某个词的开始位 置, 从0到n-1(n为句子的长度), 每个开始位置作为字典的键, value是个list, 其中保存了可能的词语的结束位置(通过查字典得到词, 开始位置+词语的长度得到结束位置)注:所以可以联想到,jieba支持全模式分词,能把句子中所有的可以成词的词语都扫描出来

例如:{0:[1,2,3]} 这样一个简单的DAG, 就是表示0位置开始, 在1,2,3位置都是词, 就是说0~1, 0~2,0~3这三个起始位置之间的字符, 在dict.txt中是词语.可看示例切分词图。

二、采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

1.查找待分词句子中已经切分好的词语(我觉得这里应该是全模式下的分词list), 对该词语查找该词语出现的频率(次数/总数), 如果没有该词(既然是基于词典查找进行的分词, 应该是有的), 就把词典中出现频率最小的那个词语的频率作为该词的频率, 也就是说P(某词语)=FREQ.get(‘某词语’,min_freq)

2.根据动态规划查找最大概率路径的方法, 对句子从右往左反向计算最大概率(一些教科书上可能是从左往右, 这里反向是因为汉语句子的重心经常落在后面, 就是落在右边, 因为通常情况下形容词太多, 后面的才是主干, 因此, 从右往左计算, 正确率要高于从左往右计算, 这个类似于逆向最大匹配), P(NodeN)=1.0, P(NodeN-1)=P(NodeN)*Max(P(倒数第一个词))…依次类推, 最后得到最大概率路径, 得到最大概率的切分组合.

def calc(sentence,DAG,idx,route):  #动态规划,计算最大概率的切分组合  #输入sentence是句子,DAG句子的有向无环图  N = len(sentence)  #句子长度  route[N] = (0.0,'')  for idx in xrange(N-1,-1,-1):  #和range用法一样,不过还是建议使用xrange  #可以看出是从后往前遍历每个分词方式的  #下面的FREQ保存的是每个词在dict中的频度得分,打分的公式是 log(float(v)/total),其中v就是被打分词语的频数  #FREQ.get(sentence[idx:x+1],min_freq)表示,如果字典get没有找到这个key,那么我们就使用最后的frequency来做  #由于DAG中是以字典+list的结构存储的,所以确定了idx为key之外,  #仍然需要for x in DAG[idx]来遍历所有的单词结合方式(因为存在不同的结合方法,例如“国”,“国家”等)  #以(频度得分值,词语最后一个字的位置)这样的tuple保存在route中  candidates = [ ( FREQ.get(sentence[idx:x+1],min_freq) + route[x+1][0] , x ) for x in DAG[idx] ]  route[idx] = max(candidates)

三、对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法

未登录词:词典 dict.txt 中没有记录的词(注: 就算把dict.txt中所有的词汇全部删掉, jieba依然能够分词, 不过分出来的词, 大部分的长度为2.这个就是基于HMM来预测分词了)

1.中文词汇按照BEMS四个状态来标记, B是开始begin位置, E是end, 是结束位置, M是middle, 是中间位置, S是singgle, 单独成词的位置, 没有前, 也没有后. jieba作者就是采用了状态为(B,E,M,S)这四种状态来标记中文词语, 比如北京可以标注为 BE, 即 北/B 京/E, 表示北是开始位置, 京是结束位置, 中华民族可以标注为BMME, 就是开始, 中间, 中间, 结束.

2.作者对大量语料进行训练, 得到了三个概率表。训通过练得到的概率表和viterbi算法, 就可以得到一个概率最大的BEMS序列, 按照B打头, E结尾的方式, 对待分词的句子重新组合, 就得到了分词结果. 比如 对待分词的句子 ‘全世界都在学中国话’ 得到一个BEMS序列 [S,B,E,S,S,S,B,E,S] 这个序列只是举例, 不一定正确, 通过把连续的BE凑合到一起得到一个词, 单独的S放单, 就得到一个分词结果了: 上面的BE位置和句子中单个汉字的位置一一对应, 得到全/S 世界/BE 都/S 在/S 学/S 中国/BE 话/S 从而将句子切分为词语.

jeiba分词过程:

1、生成全切分词图:根据trie树对句子进行全切分,并且生成一个邻接链表表示的词图(DAG),查词典形成切分词图的主体过程如下所示:

for(int i=0;i<len;){  boolean match = dict.getMatch(sentence, i,
wordMatch);//到词典中查询   if (match) {// 已经匹配上  for (String word:wordMatch.values)
{//把查询到的词作为边加入切分词图中  j = i+word.length();  g.addEdge(new CnToken(i, j, 10, word));  }  i=wordMatch.end;  }else{//把单字作为边加入切分词图中  j = i+1;  g.addEdge(new CnToken(i,j,1,sentence.substring(i,j)));  i=j;  }
}

2、计算最佳切分路径:在这个词图的基础上,运用动态规划算法生成切分最佳路径。

3、使用了HMM模型对未登录词进行识别:如进行中国人名、外国人名、地名、机构名等未登录名词的识别。

重新计算最佳切分路径。

疑问:

1.识别出的未登录词貌似是没有频率的以及用户自定义词典中词频和词性都是可省略的,那jieba重新计算最佳切分组合是怎么算的?,是把词典中频率最小的那个词语的频率作为该词的频率?

答:词频省略时,jieba会自动计算词频

转自https://www.cnblogs.com/echo-cheng/p/7967221.html

jieba分词的原理相关推荐

  1. 自然语言处理课程(二):Jieba分词的原理及实例操作

    上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...

  2. jieba分词实现原理(C++版 + python篇)(二)

    目录 1. 基本概念 1.1 jieba功能介绍 1.2 结巴分词流程图 1.3 jieba实现算法 2. jieba分词流程详述

  3. NLP之jieba分词原理简析

    一.jieba介绍 jieba库是一个简单实用的中文自然语言处理分词库. jieba分词属于概率语言模型分词.概率语言模型分词的任务是:在全切分所得的所有结果中求某个切分方案S,使得P(S)最大. j ...

  4. pkuseg,LTP,jieba分词实践

    pkuseg pkuseg具有如下几个特点: 多领域分词.不同于以往的通用中文分词工具,此工具包同时致力于为不同领域的数据提供个性化的预训练模型.根据待分词文本的领域特点,用户可以自由地选择不同的模型 ...

  5. jieba分词错误_jieba中文分词

    在自然语言处理过程中,为了能更好地处理句子,往往需要把句子拆开分成一个一个的词语,这样能更好的分析句子的特性,这个过程叫做--分词. 我们来看看如何分词,嗯?别想多了,我不准备自己造轮子了,用别人的吧 ...

  6. jieba分词_从语言模型原理分析如何jieba更细粒度的分词

    jieba分词是作中文分词常用的一种工具,之前也记录过源码及原理学习.但有的时候发现分词的结果并不是自己最想要的.比如分词"重庆邮电大学",使用精确模式+HMM分词结果是[&quo ...

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

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

  8. jieba分词原理 ‖ 词性标注

    jieba分词原理 | 基于前缀词典及动态规划的分词实现 jieba分词原理 | 基于汉字成词能力的HMM模型识别未登录词实现 jieba分词原理 | 词性标注 jieba分词原理 | 关键词抽取 1 ...

  9. 自然语言处理2 -- jieba分词用法及原理

    文章目录 1 概述 2 jieba分词用法 2.1 分词 2.2 添加自定义词典 2.3 调整词典 2.4 关键词提取 2.5 词性标注 2.6 并行分词 2.7 Tokenize:返回词语在原文的起 ...

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

    前言 实习期间在做一个专利分析的项目,用到了文本处理的方法,大部分文本分析类的项目应该都离不开分词这个最基础的操作吧,我在做项目之前,在网上找了一些例子,搞清楚分词的代码处理流程,就直接在我的项目里用 ...

最新文章

  1. 卷起来了,写了一套Tensorflow和Pytorch的教程
  2. MySQL中的CURRENT_TIMESTAMP
  3. 外国人看我国量子计算机祖冲之号,1.2小时完成超算8年!我国“祖冲之号”量子计算机刷新记录...
  4. 第一章 自定义MVC框架
  5. 设计模式(二) 工厂模式
  6. AFei Loves Magic
  7. 尚硅谷_JS DOM编程_学习笔记
  8. mybatis缓存二级缓存_MyBatis缓存与Apache Ignite的陷阱
  9. VR 游戏开发资料收集
  10. 人脸表情分类与识别:opencv人脸检测+Keras情绪分类
  11. java匿名类 - new接口
  12. 深入解读Linux内存管理系列(总览)
  13. 计算机无法映射网络驱动器,win7系统无法映射网络驱动器的解决方法
  14. 如何解决 zsh: event not found: e]st1问题
  15. 微软云服务Azure所有产品简介
  16. 【经验教程】支付宝怎么充值手机话费?
  17. 强制修改.ko文件中的内核版本号与内核对应
  18. stm32作为spi的从机使用例程
  19. Houdini图文笔记:用Houdini实现随机自然倒角
  20. 〖Python WEB 自动化测试实战篇⑧〗- 实战 - 利用 selenium 处理弹出框

热门文章

  1. html模拟终端,超级终端连续ping
  2. C# PDF转图片(JPG)
  3. Python---PDF转JPG图片
  4. PLSQL 11破解码
  5. 【AWVS12】安全漏洞扫描工具,使用详解
  6. 什么是starup?
  7. Reflector for .NET 官方下载地址
  8. App 上架 AppStore和证书的各种区别
  9. 常用的dos网络命令
  10. 学习参考《高性能MySQL(第3版)》中文PDF+英文PDF