一,介绍

官方介绍:“结巴”中文分词:做最好的 Python 中文分词组件

我理解的官方的目标是做最好的python中文分词组件,但是在网上一搜,很多文章直接说成了是最好的中文分词组件,我看是误解了原文意思,就目前来说jieba分词在解决中文歧义方面还是解决不了(接下来会通过代码实战说明),所以精确度不是最好,也就不能说是最好的中文分词组件了,在此做个记录以便后期找到更好的中文分词组件.现在这类自然语言处理模块越来越多,关于好不好而言,只能说没有最好,只有更好,因为每个中文分词组件都在更新和进步.

二,特点 (以下引用自官文的readme)

  • 支持四种分词模式:

    • 精确模式,试图将句子最精确地切开,适合文本分析;
    • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
    • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
    • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade 。PaddlePaddle官网
  • 支持繁体分词
  • 支持自定义词典
  • MIT 授权协议

关于第四种分词模式的实战理解:如果jieba v0.40及以上版本,并且paddlepaddle在2.0.0以上版本,直接使用jieba.enable_paddle()会报错,因为paddlepaddle在2.0.0以上是默认开启静态图模式

Traceback (most recent call last):File "D:\Party_committee_project\党员转出回执收集V1\Lib\identify_name.py", line 15, in <module>jieba.enable_paddle()File "D:\Party_committee_project\党员转出回执收集V1\Lib\jieba\_compat.py", line 46, in enable_paddleimport jieba.lac_small.predict as predictFile "D:\Party_committee_project\党员转出回执收集V1\Lib\jieba\lac_small\predict.py", line 43, in <module>infer_ret = creator.create_model(dataset.vocab_size, dataset.num_labels, mode='infer')File "D:\Party_committee_project\党员转出回执收集V1\Lib\jieba\lac_small\creator.py", line 32, in create_modelwords = fluid.data(name='words', shape=[-1, 1], dtype='int64', lod_level=1)File "<decorator-gen-31>", line 2, in dataFile "D:\Party_committee_project\党员转出回执收集V1\Lib\paddle\fluid\wrapped_decorator.py", line 25, in __impl__return wrapped_func(*args, **kwargs)File "D:\Party_committee_project\党员转出回执收集V1\Lib\paddle\fluid\framework.py", line 442, in __impl__), "In PaddlePaddle 2.x, we turn on dynamic graph mode by default, and '%s()' is only supported in static graph mode. So if you want to use this api, please call 'paddle.enable_static()' before this api to enter static graph mode." % func.__name__
AssertionError: In PaddlePaddle 2.x, we turn on dynamic graph mode by default, and 'data()' is only supported in static graph mode. So if you want to use this api, please call 'paddle.enable_static()' before this api to enter static graph mode.Process finished with exit code 1

三,安装说明 (以下引用自官文的readme)

代码对 Python 2/3 均兼容

  • 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba
  • 半自动安装:先下载 jieba · PyPI ,解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用
  • 如果需要使用paddle模式下的分词和词性标注功能,请先安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1

四,算法 (以下引用自官文的readme)

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

五,主要功能

1.分词

  • jieba.cut 方法接受四个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型;use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;
  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  • 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
  • jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

2.词性标注

接下来就是本文要介绍的重点,实战部分

(1)运行环境:python3.7.2 + windows10

(2)实际项目背景:从outlook邮箱的指定收件箱的邮件中找到指定主题的邮件,从这些邮件的主题或者正文中识别出中文姓名

(3)部分代码举例展示:

import paddle
import jieba.posseg as psegpaddle.enable_static()  # 从2.0.0版本开始,Paddle默认开启静态图模式def identify_person_name(text):"""识别姓名:param text: 语句, str:return: 姓名, list""""""jieba算法识别中文名特殊参数解释: use_paddle: 使用飞浆模式,默认为False"""try:words = pseg.cut(text, use_paddle=True)  # jieba分词及词性标注列表# words = pseg.cut(text)  # jieba分词及词性标注列表name_jieba = []  # jieba识别出来的人名for pair_word in list(words):  # 遍历pair对象if list(pair_word)[1] == 'nr' or list(pair_word)[1] == 'PER':name_jieba.append(list(pair_word)[0])if not name_jieba:return '未识别到人名'return f'已识别完毕,结果为{name_jieba}'except Exception as e:return e

为什么要重点讲解词性标注,因为在实际项目中,识别中文姓名时候是通过词性标注去拿到中文姓名的,所以上述代码中使用了jieba的pseg模块,它可以同时返回识别出来的词语以及词性,当词性为'nr'或'per'时,即为人名;

paddle模式词性标注对应表如下:

paddle模式词性和专名类别标签集合如下表,其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母)。

标签 含义 标签 含义 标签 含义 标签 含义
n 普通名词 f 方位名词 s 处所名词 t 时间
nr 人名 ns 地名 nt 机构名 nw 作品名
nz 其他专名 v 普通动词 vd 动副词 vn 名动词
a 形容词 ad 副形词 an 名形词 d 副词
m 数量词 q 量词 r 代词 p 介词
c 连词 u 助词 xc 其他虚词 w 标点符号
PER 人名 LOC 地名 ORG 机构名 TIME 时间

接下来开始实战运行

print(identify_person_name('钟伟政党组织关系转出回执给张颖'))

运行结果为:

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\L84171~1\AppData\Local\Temp\jieba.cache
已识别完毕,结果为['钟伟', '张颖']
Loading model cost 0.565 seconds.
Prefix dict has been built successfully.

从运行结果可以看出第一个人名没有准确识别出来,原因可能是因为中文歧义的原因,因为语句中的'政党'算一个名词,第二个人名识别出来,不存在歧义,且该人名比较多见

进一步佐证一下,debug一下,看看所有识别出的词语以及词性是什么

jieba算法把人名'钟伟政'拆开成'钟伟'了,然后把'政'和'党'组成普通名词了,果然是中文歧义的问题,当时用jieba算法去识别实际项目时就是这样不够精确,以至于后期只能跟别的自然语言中文识别组件结合一起使用,或者干脆用别的组件代替jieba,想要知道这个更精确的中文人名识别组件是什么吗,请持续关注本博主发文,欢迎一起交流自然语言处理工具

jieba识别中文人名实战记录及心得相关推荐

  1. stanfordcorenlp识别中文人名实战记录及心得

    前言: 一直在找一个能够精确识别中文人名的自然语言处理工具包,期间也找到了stanfordcorenlp, 并且经过在网上的大量摸坑探索之后,还是成功使用上了stanfordcorenlp,但是经过后 ...

  2. python识别中文人名_中文人名识别

    中文姓名的构成规律 中文姓名一般由二字或三字组成,第一字为姓氏字(复姓为前两字),其后的一到两个汉字为名用字.统计表明,中文姓名在用字上也有一定规律:一方面某些字频频出现在姓名中,如在姓氏用字中,虽然 ...

  3. python识别中文人名_使用Python在NLP中的命名实体识别中提取人名

    我有一句话,我需要单独识别人名: 例如: sentence = "Larry Page is an American business magnate and computer scient ...

  4. python中文人名识别(使用hanlp,LTP,LAC)

    中文人名识别属于命名实体识别的范畴,解决问题的思路很多,但是在实际的应用过程中各种库做的参差不齐,下面是3个开源库的使用方法与效果展示: 首先是hanlp hanlp github主页:https:/ ...

  5. 基于深度学习和指代消解的中文人名识别

    摘要 [目的]命名实体识别是自然语言处理领域的一项基本任务,实体包括人名.地名和组织名等,与其他实体相比,人名与职务.职务变更及人称代词有关.人名的实体识别中,人名语料的残缺及人称指代不明等问题,成为 ...

  6. 基于分布式的短文本命题实体识别之----人名识别(python实现)

    目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...

  7. 利用python绘制简易词云图(使用jieba进行中文分词)

    词云(wordcloud)图能过滤掉大量的文本信息,使我们能抓住问题的集中点(一般集中点就是经常提到的点,也就是词频数会比较高).其实制作词云没什么技术含量,主要就是将用于绘制词云的所有词都传给软件, ...

  8. 用python进行自然语言处理_Python NLP自然语言处理之使用jieba进行中文分词实践

    自然语言处理的首要任务是分词,将一段文本分割成独立的词语. 中文分词介绍 已经归纳的三种分词如下: 规则分词.统计分词.混合分词规则分词: 通过设立人工词库,按照一定方式进行切分匹配. 正向最大匹配法 ...

  9. Python第三方库jieba(中文分词)入门与进阶(官方文档)

    jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...

最新文章

  1. 提升Visual Studio 2012的响应能力
  2. HTTPS协议原理分析
  3. 都是套路:高并发系统的降级特技
  4. ui5 resource file 404 error
  5. JavaScript直接导出Excel,Word
  6. 网站部署nginx--uwsgi
  7. python函数能返回列表吗_Python函数返回列表还是作为生成器工作?
  8. CakePHP 2.x十分钟博客教程
  9. C语言丨线性表(四):循环链表
  10. php number_format 通过千位分组来格式化数字
  11. 北京大学计算机学院课程表,北京大学课程表.PDF
  12. 超详细! 利用Synopsys VCS对Verilog代码加密的四种方法
  13. 国美易卡借助云平台,国美易卡提升了用户体验
  14. word自动添加题注,带章节编号并根据章节重新开始编号
  15. JAWS模块分析(小东子)
  16. sinon spy_Sinon教程:使用嘲弄,间谍和存根进行JavaScript测试
  17. oracle 10g R2数据库的安装部署
  18. 程序员的思维修炼读书笔记(二)
  19. 易基因 | 宏基因组测序带给了我们什么?
  20. 一个总是令人记不住的vectorvectorPoint

热门文章

  1. Laravel 预防 SQL 注入
  2. java计算机毕业设计ssm+vue红联小区果蔬销售网站-水果购物商城
  3. [Rootkit] 驱动隐藏 - 断链
  4. CDH6.3.2 Hive安装
  5. LPG-PCA算法实现与详解
  6. PCA分析美国城市生活质量,matlab实例
  7. java毕业设计贴吧管理系统mybatis+源码+调试部署+系统+数据库+lw
  8. Redis单线程为何速度如此之快
  9. STM32 开发笔记
  10. excel学习-数据分列