pyhanlp中的命名实体识别

对于分词而言,命名实体识别是一项非常重要的功能,当然发现新词同样重要(这部分内容被我放在之后的“提取关键词、短语提取与自动摘要、新词识别”与再之后的案例中了。

首先是一个简单的例子,展示一下命名实体识别的效果。之后是正式内容:

简单的展示例子

from pyhanlp import *
"""
HanLP开启命名实体识别"""# 音译人名示例
CRFnewSegment = HanLP.newSegment("crf")
term_list = CRFnewSegment.seg("译智社的田丰要说的是这只是一个hanlp命名实体识别的例子")
print(term_list)print("\n========== 命名实体开启与关闭对比试验 ==========\n")
sentences =["北川景子参演了林诣彬导演的《速度与激情3》","林志玲亮相网友:确定不是波多野结衣?","龟山千广和近藤公园在龟山公园里喝酒赏花",
]
# 通过HanLP 进行全局设置,但是部分分词器本身可能不支持某项功能
# 部分分词器本身对某些命名实体识别效果较好
HanLP.Config.japaneseNameRecognize = FalseviterbiNewSegment = HanLP.newSegment("viterbi").enableJapaneseNameRecognize(True)
CRFnewSegment_new = HanLP.newSegment("crf").enableJapaneseNameRecognize(True)
# segSentence
# CRFnewSegment_2.seg2sentence(sentences)
for sentence in sentences:print("crf : ",CRFnewSegment.seg(sentence))print("crf_new : ",CRFnewSegment_new.seg(sentence))print("viterbi : ",viterbiNewSegment.seg(sentence))
[译智社/n, 的/u, 田丰/nr, 要/v, 说/v, 的/u, 是/v, 这/r, 只/d, 是/v, 一个/m, hanlp命名/vn, 实体/n, 识别/v, 的/u, 例子/n]========== 命名实体开启与关闭对比试验 ==========crf :  [北川/ns, 景子/n, 参演/v, 了/u, 林诣彬/nr, 导演/n, 的/u, 《/w, 速度/n, 与/c, 激情/n, 3/m, 》/w]
crf_new :  [北川/ns, 景子/n, 参演/v, 了/u, 林诣彬/nr, 导演/n, 的/u, 《/w, 速度/n, 与/c, 激情/n, 3/m, 》/w]
viterbi :  [北川景子/nrj, 参演/v, 了/ule, 林诣彬/nr, 导演/nnt, 的/ude1, 《/w, 速度/n, 与/cc, 激情/n, 3/m, 》/w]
crf :  [林志玲/nr, 亮相/v, 网友/n, :/w, 确定/v, 不/d, 是/v, 波多野/n, 结衣/n, ?/w]
crf_new :  [林志玲/nr, 亮相/v, 网友/n, :/w, 确定/v, 不/d, 是/v, 波多野/n, 结衣/n, ?/w]
viterbi :  [林志玲/nr, 亮相/vi, 网友/n, :/w, 确定/v, 不是/c, 波多野结衣/nrj, ?/w]
crf :  [龟/v, 山/n, 千/m, 广/q, 和/c, 近藤/a, 公园/n, 在/p, 龟山公园/ns, 里/f, 喝/v, 酒/n, 赏/v, 花/n]
crf_new :  [龟/v, 山/n, 千/m, 广/q, 和/c, 近藤/a, 公园/n, 在/p, 龟山公园/ns, 里/f, 喝/v, 酒/n, 赏/v, 花/n]
viterbi :  [龟山千广/nrj, 和/cc, 近藤公园/nrj, 在/p, 龟山/nz, 公园/n, 里/f, 喝酒/vi, 赏花/nz]

正式内容

中国人名识别

说明

  • 目前分词器基本上都默认开启了中国人名识别,比如HanLP.segment()接口中使用的分词器等等,用户不必手动开启;上面的代码只是为了强调。
  • 有一定的误命中率,比如误命中关键年,则可以通过在data/dictionary/person/nr.txt加入一条关键年 A 1来排除关键年作为人名的可能性,也可以将关键年作为新词登记到自定义词典中。
  • 如果你通过上述办法解决了问题,欢迎向我提交pull request,词典也是宝贵的财富。
  • 建议NLP用户使用感知机或CRF词法分析器,精度更高。

算法详解

  • 《实战HMM-Viterbi角色标注中国人名识别》
# 中文人名识别
def demo_chinese_name_recognition(sentences):segment = HanLP.newSegment().enableNameRecognize(True);for sentence in sentences:term_list = segment.seg(sentence)print(term_list)print([i.word for i in term_list])sentences = ["武大靖创世界纪录夺冠,中国代表团平昌首金","区长庄木弟新年致辞","凯瑟琳和露西(庐瑞媛),跟她们的哥哥们有一些不同。","王国强、高峰、汪洋、张朝阳光着头、韩寒、小四","张浩和胡健康复员回家了","王总和小丽结婚了","编剧邵钧林和稽道青说","这里有关天培的有关事迹",]
demo_chinese_name_recognition(sentences)print("\n========== 中文人名 基本默认已开启 ==========\n")
print(CRFnewSegment.seg(sentences[0]))
[武大靖/nr, 创/v, 世界/n, 纪录/n, 夺冠/vi, ,/w, 中国/ns, 代表团/n, 平昌/ns, 首/q, 金/b]
['武大靖', '创', '世界', '纪录', '夺冠', ',', '中国', '代表团', '平昌', '首', '金']
[区长/nnt, 庄木弟/nr, 新年/t, 致辞/vi]
['区长', '庄木弟', '新年', '致辞']
[凯瑟琳/nr, 和/cc, 露西/nr, (/w, 庐瑞媛/nr, )/w, ,/w, 跟/p, 她们/rr, 的/ude1, 哥哥/n, 们/k, 有/vyou, 一些/m, 不同/a, 。/w]
['凯瑟琳', '和', '露西', '(', '庐瑞媛', ')', ',', '跟', '她们', '的', '哥哥', '们', '有', '一些', '不同', '。']
[王国强/nr, 、/w, 高峰/n, 、/w, 汪洋/n, 、/w, 张朝阳/nr, 光/n, 着/uzhe, 头/n, 、/w, 韩寒/nr, 、/w, 小/a, 四/m]
['王国强', '、', '高峰', '、', '汪洋', '、', '张朝阳', '光', '着', '头', '、', '韩寒', '、', '小', '四']
[张浩/nr, 和/cc, 胡健康/nr, 复员/v, 回家/vi, 了/ule]
['张浩', '和', '胡健康', '复员', '回家', '了']
[王总/nr, 和/cc, 小丽/nr, 结婚/vi, 了/ule]
['王总', '和', '小丽', '结婚', '了']
[编剧/nnt, 邵钧林/nr, 和/cc, 稽道青/nr, 说/v]
['编剧', '邵钧林', '和', '稽道青', '说']
[这里/rzs, 有/vyou, 关天培/nr, 的/ude1, 有关/vn, 事迹/n]
['这里', '有', '关天培', '的', '有关', '事迹']========== 中文人名 基本默认已开启 ==========[签约/vn, 仪式/n, 前/f, ,/w, 秦光荣/nr, 、/w, 李纪恒/nr, 、/w, 仇和/nr, 等/u, 一同/d, 会见/v, 了/u, 参加/v, 签约/v, 的/u, 企业家/n, 。/w]

音译人名识别

说明

  • 目前分词器基本上都默认开启了音译人名识别,用户不必手动开启;上面的代码只是为了强调。

算法详解

  • 《层叠隐马模型下的音译人名和日本人名识别》
# 音译人名识别
sentences = ["一桶冰水当头倒下,微软的比尔盖茨、Facebook的扎克伯格跟桑德博格、亚马逊的贝索斯、苹果的库克全都不惜湿身入镜,这些硅谷的科技人,飞蛾扑火似地牺牲演出,其实全为了慈善。","世界上最长的姓名是简森·乔伊·亚历山大·比基·卡利斯勒·达夫·埃利奥特·福克斯·伊维鲁莫·马尔尼·梅尔斯·帕特森·汤普森·华莱士·普雷斯顿。",
]segment = HanLP.newSegment().enableTranslatedNameRecognize(True)
for sentence in sentences:term_list = segment.seg(sentence)print(term_list)print("\n========== 音译人名 默认已开启 ==========\n")
print(CRFnewSegment.seg(sentences[0]))
[一桶/nz, 冰水/n, 当头/vi, 倒下/v, ,/w, 微软/ntc, 的/ude1, 比尔盖茨/nrf, 、/w, Facebook/nx, 的/ude1, 扎克伯格/nr, 跟/p, 桑德博格/nrf, 、/w, 亚马逊/nrf, 的/ude1, 贝索斯/nrf, 、/w, 苹果/nf, 的/ude1, 库克/nr, 全都/d, 不惜/v, 湿身/nz, 入镜/nz, ,/w, 这些/rz, 硅谷/ns, 的/ude1, 科技/n, 人/n, ,/w, 飞蛾/n, 扑火/vn, 似/vg, 地/ude2, 牺牲/v, 演出/vn, ,/w, 其实/d, 全/a, 为了/p, 慈善/a, 。/w]
[世界/n, 上/f, 最长/d, 的/ude1, 姓名/n, 是/vshi, 简森/nr, ·/w, 乔伊/nr, ·/w, 亚历山大/nr, ·/w, 比基/nr, ·/w, 卡利斯/nr, 勒/v, ·/w, 达夫·埃利奥特·福克斯·伊维鲁莫·马尔尼·梅尔斯·帕特森·汤普森·华莱士·普雷斯顿/nrf, 。/w]========== 音译人名 默认已开启 ==========[一桶/m, 冰水/n, 当头/d, 倒下/v, ,/w, 微软/a, 的/u, 比尔盖茨/n, 、/w, Facebook/l, 的/u, 扎克伯格/n, 跟/p, 桑德博格/n, 、/w, 亚马逊/nr, 的/u, 贝索斯/nr, 、/w, 苹果/n, 的/u, 库克/nr, 全都/d, 不惜/v, 湿身/n, 入镜/v, ,/w, 这些/r, 硅谷/n, 的/u, 科技/n, 人/n, ,/w, 飞蛾/v, 扑火似/v, 地/u, 牺牲/v, 演出/v, ,/w, 其实/d, 全/d, 为了/p, 慈善/a, 。/w]

日本人名识别

说明

  • 目前标准分词器默认关闭了日本人名识别,用户需要手动开启;这是因为日本人名的出现频率较低,但是又消耗性能。

算法详解

  • 《层叠隐马模型下的音译人名和日本人名识别》
# 日语人名识别
def demo_japanese_name_recognition(sentences):segment = HanLP.newSegment().enableJapaneseNameRecognize(True)for sentence in sentences:term_list = segment.seg(sentence)print(term_list)print([i.word for i in term_list])sentences =["北川景子参演了林诣彬导演的《速度与激情3》","林志玲亮相网友:确定不是波多野结衣?","龟山千广和近藤公园在龟山公园里喝酒赏花",]
demo_japanese_name_recognition(sentences)
print("\n========== 日文人名 标准分词器默认未开启 ==========\n")
print(CRFnewSegment.seg(sentences[0]))
[北川景子/nrj, 参演/v, 了/ule, 林诣彬/nr, 导演/nnt, 的/ude1, 《/w, 速度/n, 与/cc, 激情/n, 3/m, 》/w]
['北川景子', '参演', '了', '林诣彬', '导演', '的', '《', '速度', '与', '激情', '3', '》']
[林志玲/nr, 亮相/vi, 网友/n, :/w, 确定/v, 不是/c, 波多野结衣/nrj, ?/w]
['林志玲', '亮相', '网友', ':', '确定', '不是', '波多野结衣', '?']
[龟山千广/nrj, 和/cc, 近藤公园/nrj, 在/p, 龟山/nz, 公园/n, 里/f, 喝酒/vi, 赏花/nz]
['龟山千广', '和', '近藤公园', '在', '龟山', '公园', '里', '喝酒', '赏花']========== 日文人名 标准分词器默认未开启 ==========[北川/ns, 景子/n, 参演/v, 了/u, 林诣彬/nr, 导演/n, 的/u, 《/w, 速度/n, 与/c, 激情/n, 3/m, 》/w]

地名识别

说明

  • 目前标准分词器都默认关闭了地名识别,用户需要手动开启;这是因为消耗性能,其实多数地名都收录在核心词典和用户自定义词典中。
  • 在生产环境中,能靠词典解决的问题就靠词典解决,这是最高效稳定的方法。
  • 建议对命名实体识别要求较高的用户使用感知机词法分析器。

算法详解

  • 《实战HMM-Viterbi角色标注地名识别》
# 演示数词与数量词识别
sentences = ["十九元套餐包括什么","九千九百九十九朵玫瑰",    "壹佰块都不给我","9012345678只蚂蚁","牛奶三〇〇克*2","ChinaJoy“扫黄”细则露胸超2厘米罚款",
]StandardTokenizer = JClass("com.hankcs.hanlp.tokenizer.StandardTokenizer")StandardTokenizer.SEGMENT.enableNumberQuantifierRecognize(True)
for sentence in sentences:print(StandardTokenizer.segment(sentence))print("\n========== 演示数词与数量词 默认未开启 ==========\n")
CRFnewSegment.enableNumberQuantifierRecognize(True)
print(CRFnewSegment.seg(sentences[0]))
[十九元/mq, 套餐/n, 包括/v, 什么/ry]
[九千九百九十九朵/mq, 玫瑰/n]
[壹佰块/mq, 都/d, 不/d, 给/p, 我/rr]
[9012345678只/mq, 蚂蚁/n]
[牛奶/nf, 三〇〇克/mq, */w, 2/m]
[ChinaJoy/nx, “/w, 扫黄/vi, ”/w, 细则/n, 露/v, 胸/ng, 超/v, 2厘米/mq, 罚款/vi]========== 演示数词与数量词 默认未开启 ==========[十九/m, 元/q, 套餐/n, 包括/v, 什么/r]

机构名识别

说明

  • 目前分词器默认关闭了机构名识别,用户需要手动开启;这是因为消耗性能,其实常用机构名都收录在核心词典和用户自定义词典中。
  • HanLP的目的不是演示动态识别,在生产环境中,能靠词典解决的问题就靠词典解决,这是最高效稳定的方法。
  • 建议对命名实体识别要求较高的用户使用感知机词法分析器。

算法详解

  • 《层叠HMM-Viterbi角色标注模型下的机构名识别》
# 机构名识别
sentences = ["我在上海林原科技有限公司兼职工作,","我经常在台川喜宴餐厅吃饭,","偶尔去开元地中海影城看电影。",
]Segment = JClass("com.hankcs.hanlp.seg.Segment")
Term = JClass("com.hankcs.hanlp.seg.common.Term")segment = HanLP.newSegment().enableOrganizationRecognize(True)
for sentence in sentences:term_list = segment.seg(sentence)print(term_list)print("\n========== 机构名 标准分词器已经全部关闭 ==========\n")
print(CRFnewSegment.seg(sentences[0]))segment = HanLP.newSegment('crf').enableOrganizationRecognize(True)
[我/rr, 在/p, 上海/ns, 林原科技有限公司/nt, 兼职/vn, 工作/vn, ,/w]
[我/rr, 经常/d, 在/p, 台川喜宴餐厅/nt, 吃饭/vi, ,/w]
[偶尔/d, 去/vf, 开元地中海影城/nt, 看/v, 电影/n, 。/w]========== 机构名 标准分词器已经全部关闭 ==========[我/r, 在/p, 上海林原科技有限公司/nt, 兼职/vn, 工作/vn, ,/w]

地名识别

说明

  • 目前标准分词器都默认关闭了地名识别,用户需要手动开启;这是因为消耗性能,其实多数地名都收录在核心词典和用户自定义词典中。
  • 在生产环境中,能靠词典解决的问题就靠词典解决,这是最高效稳定的方法。
  • 建议对命名实体识别要求较高的用户使用感知机词法分析器。

算法详解

  • 《实战HMM-Viterbi角色标注地名识别》
# 地名识别
def demo_place_recognition(sentences):segment = HanLP.newSegment().enablePlaceRecognize(True)for sentence in sentences:term_list = segment.seg(sentence)print(term_list)print([i.word for i in term_list])sentences = ["蓝翔给宁夏固原市彭阳县红河镇黑牛沟村捐赠了挖掘机"]
demo_place_recognition(sentences)print("\n========== 地名 默认已开启 ==========\n")
print(CRFnewSegment.seg(sentences[0]))
[蓝翔/nr, 给/p, 宁夏/ns, 固原市/ns, 彭阳县/ns, 红河镇/ns, 黑牛沟村/ns, 捐赠/v, 了/ule, 挖掘机/n]
['蓝翔', '给', '宁夏', '固原市', '彭阳县', '红河镇', '黑牛沟村', '捐赠', '了', '挖掘机']========== 地名 默认已开启 ==========[蓝翔/v, 给/v, 宁夏/ns, 固原市/ns, 彭阳县/ns, 红河镇/ns, 黑牛沟村/ns, 捐赠/v, 了/u, 挖掘机/n]

URL 识别

自动识别URL,该部分是在demo中发现的,但是原作者并没有在文档中提到这个,该部分可以发现URL,测试发现其他分类器应该是默认不开启这个的,而且config中并没有开启该功能的选项,因此这应该是一个额外的类。我建议如果有需要的,你可以尝试先利用URLTokenizer获取URL,然后添加进用户词典。或者直接使用其他工具或者自定义函数解决该问题。

# URL 识别
text = '''HanLP的项目地址是https://github.com/hankcs/HanLP,发布地址是https://github.com/hankcs/HanLP/releases,我有时候会在www.hankcs.com上面发布一些消息,我的微博是http://weibo.com/hankcs/,会同步推送hankcs.com的新闻。听说.中国域名开放申请了,但我并没有申请hankcs.中国,因为穷……'''Nature = SafeJClass("com.hankcs.hanlp.corpus.tag.Nature")
Term = SafeJClass("com.hankcs.hanlp.seg.common.Term")
URLTokenizer = SafeJClass("com.hankcs.hanlp.tokenizer.URLTokenizer")term_list = URLTokenizer.segment(text)
print(term_list)
for term in term_list:if term.nature == Nature.xu:print(term.word)
[HanLP/nx, 的/ude1, 项目/n, 地址/n, 是/vshi, https://github.com/hankcs/HanLP/xu, ,/w,
/w,         /w, 发布/v, 地址/n, 是/vshi, https://github.com/hankcs/HanLP/releases/xu, ,/w,
/w,         /w, 我/rr, 有时候/d, 会/v, 在/p, www.hankcs.com/xu, 上面/f, 发布/v, 一些/m, 消息/n, ,/w,
/w,         /w, 我/rr, 的/ude1, 微博/n, 是/vshi, http://weibo.com/hankcs//xu, ,/w, 会/v, 同步/vd, 推送/nz, hankcs.com/xu, 的/ude1, 新闻/n, 。/w,
/w,         /w, 听说/v, ./w, 中国/ns, 域名/n, 开放/v, 申请/v, 了/ule, ,/w, 但/c, 我/rr, 并/cc, 没有/v, 申请/v, hankcs.中国/xu, ,/w, 因为/c, 穷/a, ……/w,
/w,              /w]
https://github.com/hankcs/HanLP
https://github.com/hankcs/HanLP/releases
www.hankcs.com
http://weibo.com/hankcs/
hankcs.com
hankcs.中国

pyhanlp 命名实体识别相关推荐

  1. 初学者 | 一文读懂命名实体识别

    本文对自然语言基础技术之命名实体识别进行了相对全面的简绍,包括定义.发展历史.常见方法.以及相关数据集,最后推荐一大波python实战利器,并且包括工具的用法. 定义 先来看看维基百科上的定义:Nam ...

  2. 介绍几个专门面向中文的命名实体识别和关系抽取工具

    知识图谱已经在人工智能的各个领域发挥越来越重要的作用,例如视觉问答.对话系统.推荐系统等.知识图谱构建是应用这些知识图谱的基础,而面对生活和企业中数据的爆发式增长,自动化知识图谱构建显得越来越重要.从 ...

  3. 一文读懂命名实体识别

    本文对自然语言基础技术之命名实体识别进行了相对全面的介绍,包括定义.发展历史.常见方法.以及相关数据集,最后推荐一大波 Python 实战利器,并且包括工具的用法. 01 定义 先来看看维基百科上的定 ...

  4. python调用Hanlp做命名实体识别以及词性标注

    之前需要做一个中文命名实体识别的api,看完了一些相关论文以后觉得短时间内自己实现不大现实,于是找了一些开源工具,其中哈工大的LTP效果是很好的,但是免费使用限流量,需要给钱才行: NLPIR的pyn ...

  5. 命名实体识别(NER)综述

    本文是中文信息处理课程的期末考核大作业,对于自然语言处理主流任务的调研报告 ---------------- 版权声明:本文为CSDN博主「<Running Snail>」的原创文章,遵循 ...

  6. NLP算法-命名实体识别

    命名实体识别 什么是命名实体识别? NER 研究的命名实体 NER研究目前所遇到的问题 命名实体识别的主要方法: 基于条件随机场的命名实体识别 常用的NER模型 1.Spacy NER 模型 2.斯坦 ...

  7. 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)

    https://github.com/mali19064/LSTM-CRF-pytorch-faster 中文分词 说到命名实体抽取,先要了解一下基于字标注的中文分词. 比如一句话 "我爱北 ...

  8. 使用哈工大LTP进行文本命名实体识别并保存到txt

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/broccoli2/article/de ...

  9. Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf

    文章目录 基本介绍 BertForTokenClassification pytorch-crf 实验项目 参考 基本介绍 命名实体识别:命名实体识别任务是NLP中的一个基础任务.主要是从一句话中识别 ...

最新文章

  1. apache开启 gzip 压缩
  2. 表单验证自定义二选一
  3. eigrp 重分布默认路由
  4. js DOM Element属性和方法整理
  5. 技术干货 | 基于 Qt Quick Plugin 快速构建桌面端跨平台组件
  6. 利用python脚本(re)抓取美空mm图片
  7. .Net Core3.1下使用Swagger搭建web api项目
  8. [设计模式] ------ 对比总结:简单工厂模式、工厂方法模式、抽象工厂模式
  9. [转]由自助餐想到软件团队的管理
  10. 系统学习机器学习之神经网络(四) --SOM
  11. 传统城域网架构遇瓶颈 引入NFV成有效解法
  12. 怎么加密高程点_珠峰咋有4个高度?专业测绘科技工作者解读珠峰高程测算过程...
  13. 矩阵分解-Cholesky分解
  14. vscode 保存时自动格式化遇到的坑
  15. python读取tif图片_在Python中读取TIFF图像元数据
  16. Spark学习之路——9.Spark ML
  17. html中怎么写小箭头,纯CSS代码实现各种小箭头
  18. glassfish 配置 mysql_GlassFish MySql连接池配置 | 学步园
  19. 林信良(良葛格)的专栏中的DWR入门好教程
  20. 2020年华中师范大学计算机考研经验分享

热门文章

  1. Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源
  2. CSS代码检查工具stylelint
  3. maven打包到本地库
  4. 听说你的项目中仅这些资源就卡成了翔?看看他们怎么做!
  5. Android之ListView的getItemViewType和getViewTypeCount
  6. ZooKeeper:win7上安装单机及伪分布式安装
  7. Vue.js学习系列(三十四)-- Vue.js样式绑定(五)
  8. 亚马逊新品流量是上架开始算吗?
  9. wxPython多线程界面卡死或在不同平台崩溃问题
  10. 将来,你会成为这三种程序员之一