中文分词工具—Jieba

中文分词—Jieba 是一款Python 中文分词组件

“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module.

特点

支持三种分词模式:

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

安装方法

代码对 Python 2/3 均兼容

全自动安装: easy_install jieba / pip install jieba / pip3 install jieba 均可
半自动安装:先下载 https://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录

原理介绍

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

在介绍Jieba分词原理之前,我们人类最直接的思维角度如何去分词?

举个简单的例子,我们有一句话是“我现在去公司开会“,人类最直观的想法就是从左向右扫描此句,然后分词成“我/现在/去/公司/开会”。但作为计算机机器,我们能做的、可能就是给计算机一本词典,让它根据词典中已经标定的字或词来分词。这样的方法可以应用于大部分句子,但当遇到一词多义、或者有双重理解词语组合的情况时,分析就变得不那么容易了。

例如‘今天去长安大学城花店‘,正确的分词方法应该是’今天/去/长安/大学城/花店‘,但由于词典里有大学这个词但却没有大学城这个词语的缘故,计算机会把词分成’今天/去/长安/大学/城/花店’,这样的分词就是错误的,对于语义的理解就不是很准确。Jieba分词包针对这一类的问题,运用有效的统计模型与中文语言的特性相结合,将分词的效果提升了很多档次。

Jieba分词包的高效首先离不开对语料库的精心选择。在作者SunJunyi通过大量的训练之后,在名为dict.txt的文件里录入了两万多条词作为参考,进行最基本的布局但是大家可以设想,假设我们是什么都不知道、只能通过查找这个字典来进行词语归类的机器人,我们每一次分句都要基本上阅读上万条词语 ,我们的眼睛和大脑都会受不了。虽然计算机比人的效率高了数个数量级,但每一次进行如此大规模的查找也会非常的耗时

Jieba分词包在这里运用到了数据结构里的trie(前缀树或字典树)对词语进行高效的分类,便于查找。

如上图所示,这就是最简单的trie的原理在分词上的运用:我们有Johnny、Joe、Jane和Jack四个名字,假设我们要让计算机查找名字Jack是否存在,普通的方法来说,计算机可能会扫描所有的字符串,非常耗时低效,但trie的从上至下搜索、每一次只判定一个字母、如果某个特定的节点(node)的下一个节点(child node)不再符合搜索要求,那么搜索就会停止,这样效率就会大大的提高。

此外,trie也结合了计算机领域另一个知识,名为有向无环图(DAG)trie与有向无环图的结合很高效的解决了第一段所提到的双重理解词语组合的问题。举个例子:

通过设定,计算机自动识别出了两种分词方法,分别为’有/意见/分歧/’ 和 ‘有意/见/分歧’,这就是trie和DAG的最基本应用。

那么如何从这两个切分组合中筛选出一个更优的呢?这里就要用到一点点统计学的知识,既然一个句子有多个分词方式,那么我们就应该选择使得这个句子出现概率最大的切分组合。学过概率论与数理统计的同学可以很容易得把这个思想同极大似然估计(Maximum Likelihood Estimation)联系起来。

在制定了切分方案的评价准则后, jieba分词包运用了动态规划来找出词频最大切分组合。动态规划涉及到很多内容,我们就不做详细的介绍,但它在这里起到的效果很通俗易懂。举个例子:假设一个句子K,它可以被计算机随机分为a,b,c三种分词形式,那么计算机就通过大量的运算,在标准正确的情况下取概率最大的一种分词形式。在这里,动态规划法对分词分好之后每个词语出现的频率进行了统计(频率=次数/总数),得到最大的概率切分组合从而完成分词。

可能还有的疑问,那么如果有没有录入字典的词该怎么办呢?这里Jieba分词包用到了HMM模型和经典的维特比(Viterbi)算法,将未登录词  (词典中未收录/训练词典之外的词)  分为开始、中间、结束和单独成词四种分类来自动分词。总的来说,Jieba分词包在拥有HMM模型和维特比算法以后,即使词典一个词都没有也能够进行大致的分词,只是准确率会有所降低。

代码实例

其中word1为全模式,word2为精确模式,word3为搜索引擎模式,在这个例子里面,全模式和搜索引擎模式是差不多的,都将所有的词组展示了出来,但顺序有所不同,精确模式只输出了句子分词最大可能性的一组。

这里需要注意的一点:所有的word1,word2,word3并不是一个字符串,而是一个迭代器(iterator),要通过print(‘ ‘.join(word1))的方式正常输出中文字符,否则直接print只会出现对象的地址。如果嫌这个很麻烦,也可以直接使用lcut()或lcut_for_search()直接将分词放进一个list,直接运用。

参考:https://github.com/fxsjy/jieba

猜你喜欢

转载自blog.csdn.net/u010899985/article/details/80901251