NLP算法-中文分词工具-Jieba

中文分词工具-Jieba

  • 什么是Jieba?
    • 1、Jieba 的特点
    • 2、Jieba 分词的原理
    • 3、Jieba 分词的三种模式
  • 使用 Jieba 库进行分词
    • 代码示例
    • 测试说明
  • demo

什么是Jieba?

jieba的主要功能是做中文分词,可以进行简单分词、并行分词、命令行分词,当然它的功能不限于此,目前还支持关键词提取、词性标注、词位置查询等。

更让人愉悦的是jieba虽然立足于python,但同样支持其他语言和平台,诸如:C++、Go、R、Rust、Node.js、PHP、 iOS、Android等。所以jieba能满足各类开发者的需求。

1、Jieba 的特点

分词是自然语言处理中最基础的一个步骤。而 Jieba 分词是目前中文分词中一个比较好的工具。它包含有以下特性:

  • 社区活跃。Jieba 在 Github 上已经有 17670 的 star 数目。社区活跃度高,代表着该项目会持续更新,实际生产实践中遇到的问题能够在社区反馈并得到解决,适合长期使用;
  • 功能丰富。Jieba 其实并不是只有分词这一个功能,其是一个开源框架,提供了很多在分词之上的算法,如关键词提取、词性标注等;
  • 提供多种编程语言实现。 Jieba 官方提供了 Python、C++、Go、R、iOS 等多平台多语言支持,不仅如此,还提供了很多热门社区项目的扩展插件,如 ElasticSearch、solr、lucene 等。在实际项目中,进行扩展十分容易;
  • 使用简单。Jieba 的 API 总体来说并不多,且需要进行的配置并不复杂,方便上手。

2、Jieba 分词的原理

Jieba 分词依靠中文词库,结合了基于规则和基于统计这两类方法。首先基于前缀词典进行词图扫描,前缀词典是指词典中的词按照前缀包含的顺序排列。如果将词看作节点,词和词之间的分词符看作边,那么一种分词方案则对应着从第一个字到最后一个字的一条分词路径。

因此,基于前缀词典可以快速构建包含全部可能分词结果的有向无环图,这个图中包含多条分词路径,有向是指全部的路径都始于第一个字、止于最后一个字,无环是指节点之间不构成闭环。基于标注语料,使用动态规划的方法可以找出最大概率路径,并将其作为最终的分词结果。

3、Jieba 分词的三种模式

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

使用 Jieba 库进行分词

可使用jieba.cut(sentence, cut_all, HMM)jieba.cut_for_search(sentence, HMM) 方法进行分词,两者所返回的结构都是一个可迭代的 g e n e r a t o r generator generator ,可使用 f o r for for 循环来获得分词后得到的每一个词语 ( u n i c o d e ) ( unicode ) unicode,或者直接使用 jieba.lcut(s,cut_all,HMM) 以及 jieba.lcut_for_search(sentence, HMM) 直接返回 list 。其中:

  • jieba.cut(sentence, cut_all, HMM)jieba.lcut(s,cut_all,HMM) 接受 3 个参数:

    • 需要分词的字符串( unicode 或 UTF-8 字符串、GBK 字符串);
    • cut_all 参数:是否使用全模式,默认值为 False;
    • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True。
  • jieba.cut_for_search(sentence, HMM)jieba.lcut_for_search(sentence, HMM) 接受2个参数:

    • 需要分词的字符串( unicode 或 UTF-8字符串、 GBK 字符串)
    • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True

代码示例

import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))

对应的输出为:

Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, , 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

测试说明

测试输入:
我来自北京清华大学

预期输出:
精确模式:我/来自/北京/清华大学 搜索引擎模式:我 /来自 /北京 /清华 /华大 /大学 /清华大学

demo


import jieba
text = input()
seg_list1 = ''
seg_list2 = ''
# 任务:采用jieba库函数,对text分别进行精确模式分词和搜索引擎模式分词
seg_list1 = jieba.cut(text,cut_all=False)
seg_list2 = jieba.cut_for_search(text)
print("精确模式:"+'/'.join(seg_list1) +"  搜索引擎模式:"+ ' /'.join(seg_list2))

你可能感兴趣的:(python,自然语言处理,算法,中文分词)