HanLP中文分词、人名识别、地名识别

HanLP中文分词、人名识别、地名识别

实验目的

  1. 从网上下载和安装HanLP自然语言处理包;
  2. 熟悉HanLP自然语言处理包的基本功能;
  3. 利用网络爬虫获取的信息,调用HanLP的API,进行中文分词、人名识别、地名识别.

研究背景

随着互联网和信息技术的快速发展,网络中产生了海量的文本信息,但是这些信息是散乱存在的,给用户快速查找、浏览文本信息,以及获取有价值的信息带来了诸多不便。鉴于此,自然语言处理技术应运而生,它是信息检索和文本挖掘的重要基础,其主要任务是对文章进行分词处理,获取每个词的词性和词义,作为进一步挖掘信息的基础,为研究人员带来了极大的便利 [1]。

实验内容

使用Python的HanLP自然语言处理包,调用其API,实现中文分词、中国人名识别、音译识别名字和地名识别。本实验选用的文本是实验3网络爬虫(上)爬取的百度百科的前40条简介数据,并且对比了不同语义(Semantic)算法下的结果。

Python实现

HanLP: Han Language Processing

The multilingual NLP library for researchers and companies, built on PyTorch and TensorFlow 2.x, for advancing state-of-the-art deep learning techniques in both academia and industry. HanLP was designed from day one to be efficient, user friendly and extendable. It comes with pretrained models for various human languages including English, Chinese, Japanese and many others.

文本分析目标定义

本实验选用的文本是实验3网络爬虫(上)爬取的百度百科的前40条简介数据。

  • 部分文本展示:

    克隆巴赫(1916—2001),美国心理学家、教育学家。他创建了一套常用的衡量心理或教育测验可靠性的方法——“克隆巴赫系数”(Cronbach’s coefficient alpha),并在此基础上建立了一个用于确定测量误差的统计模型。1957年当选为美国心理学会主席,1973年获美国心理学会颁发的杰出科学贡献奖,1974年当选为国家科学院院士。克隆巴赫系数(Cronbach's alpha)是衡量量表或测验的信度的一种方法。克隆巴赫α系数最早不是由克隆巴赫提出的,基本上克隆巴赫只是在一篇文章中将前人提出的可靠性系数进行了公式化。它克服了部分折半法的缺点,是社会科学研究最常使用的信度分析方法。美利坚合众国(英语:The United States of America,United States,简称“美国”),是由华盛顿哥伦比亚特区、50个州和关岛等众多海外领土组成的联邦共和立宪制国家。其主体部分位于北美洲中部,美国中央情报局《世界概况》1989年至1996年初始版美国总面积是937.3万平方公里,人口3.33亿,通用英语,是一个移民国家。美国原为印第安人的聚居地,15世纪末,西班牙、荷兰、法国、英国等相继移民至此。18世纪前,英国在美国大西洋沿岸建立了13个英属北美殖民地。1775年,爆发了美国人民反抗大英帝国殖民统治的独立战争。芝加哥大学于1890年由石油大王约翰·洛克菲勒创办,素以盛产诺贝尔奖得主而闻名,约40%的诺贝尔经济学奖得主与芝大相关。截止至2020年10月,芝加哥大学的校友、教授及研究人员中,共产生了100位诺奖得主、位列世界第四,另有10位菲尔兹奖得主(世界第六)、4位图灵奖得主及25位普利策奖得主曾在芝大工作或学习。华人诺贝尔物理学奖得主杨振宁、李政道、崔琦均在芝加哥大学取得物理学博士学位。美国第44任总统奥巴马曾长期在芝大法学院教授宪法(1992-2004年)。
    

Install RESTful Packages

本次实验不选用安装本地hanlp包,而是选择了其轻量版的RESTful packages,方便快捷。

HanLPClient实例化

from hanlp_restful import HanLPClient
HanLP = HanLPClient('https://www.hanlp.com/api', auth=None, language='zh')

tokenize [2]

tokenize(text: Union[str, List[str]], coarse: Optional[bool] = None, language=None) → List[List[str]]

Split a document into sentences and tokenize them. Note that it is always faster to tokenize a whole document than to tokenize each sentence one by one. So avoid calling this method sentence by sentence but put sentences into a list and pass them to the text argument.

fine-grained
seg = HanLP.tokenize(sample)
seg

部分输出:

[['克隆巴赫', '美国', '心理学家', '、', '教育学家', '。'],
 ['他', '创建', '了', '一套', '常用', '的', '衡量',...],
 ...
]
coarse-grained
seg_coar = HanLP.tokenize(sample, coarse=True)
seg_coar

部分输出:

[ ...
  ['1957年', '当选', '为', '美国心理学会', '主席', ',', '1973年', '获', '美国心理学会', '颁发', '的', '杰出', ... ], ...
]

Named Entity Recognition [3]

Each element is a tuple of (entity, type, begin, end), where ends are exclusive offsets.

pku [4]
doc = HanLP(sample, tasks='ner/pku', language='zh')
ner_pku = doc['ner/pku']
ner_pku

部分输出:

[[['克隆巴赫', 'nr', 0, 1], ['美国', 'ns', 7, 8]],
 [['巴赫', 'nr', 18, 19]],
 [['美国心理学会', 'nt', 4, 7], ['美国心理学会', 'nt', 12, 15], ['国家科学院', 'nt', 26, 28]],
 [['巴赫', 'nr', 1, 2]],...
]

人名提取(nr):

nr = [w[0] for s in ner_pku for w in s if w[1]=='nr']
set(nr)
{'巴赫', '维纳', '波旁', '卡尔·海因里希·马克思', '恩格斯', '克隆巴赫', 'Silicon', '乔治·贝克莱', 'J.C', '汉斯·摩根索', '崔琦', '杨振宁', '恩利克·费米', '路易·', '安培', '奥巴马', '雷蒙·阿隆', '斯坦福', '李·克隆巴赫', '菲利浦', '亚伯拉罕·林肯', '约翰·洛克菲勒', 'Lee', '胡润', '卡尔·马克思', '马克思', '乔治·华盛顿', '李政道'}

地名提取(ns):

{'德国', '麦克斯韦', '希腊', '北美洲', '好莱坞', '绥靖', '旧金山', '法国', '中国', '美国', '旧金山湾区', '加利福尼亚州', '白宫', '关岛', '欧美', '加州', '泰晤士', '尔湾', '爱琴海', '香港特区', '华尔街', '奥克兰', '土耳其', '以色列', '北美', '西班牙', '费城', '荷兰', '自由州', '苏联', '帕罗奥多市', '硅谷', '伯克利市', '百老汇', '西欧', '圣迭戈', 'Berkeley', '大英帝国', '斯坦福', '欧洲', '蓄奴州', '地中海', '西西里', '美利坚合众国', '罗马', '古希腊', 'America', '圣塔芭芭拉', '华盛顿哥伦比亚特区', '拉丁美洲', '意大利', '洛杉矶', '爱奥尼亚', '巴黎', '英国', '芝加哥', '大西洋'}
msra [5]

部分输出:

[[['克隆巴赫', 'PERSON', 0, 1], ['2001', 'DATE', 4, 5], ['美国', 'LOCATION', 7, 8]],
 [['巴赫', 'PERSON', 18, 19]],
 [['1957年', 'DATE', 0, 2],
  ['美国心理学会', 'ORGANIZATION', 4, 7],
  ['1973年', 'DATE', 9, 11],...
 ],...
]

人名提取(PERSON):

{'巴赫', '维纳', '波旁', '卡尔·海因里希·马克思', '恩格斯', '克隆巴赫', '普利策', '菲尔兹奖', '乔治·贝克莱', 'J.C', '汉斯·摩根索', '崔琦', '李政道', '杨振宁', '恩利克·费米', '路易·', '安培', '奥巴马', '雷蒙·阿隆', '斯坦福', '李·克隆巴赫', '菲利浦', '亚伯拉罕·林肯', '约翰·洛克菲勒', '诺贝尔奖', 'Lee', '胡润', '卡尔·马克思', '马克思', '乔治·华盛顿', '诺贝尔'}

地名提取(LOCATION):

{'德国', '麦克斯韦', '希腊', '北美洲', '绥靖', '旧金山', '法国', '中国', '华盛顿', '美国', '旧金山湾区', '加利福尼亚州', 'Silicon', '法', '北湾', '关岛', '欧美', '伯克利', '加州', '英', '泰晤士', 'Renaissance', '香港特区', '爱琴海', '奥克兰', '希腊半岛', '土耳其', 'Joseph', '大陆', '以色列', '北美', '西班牙', '费城', '荷兰', '自由州', '苏联', '帕罗奥多市', '硅谷', '伯克利市', '西欧', '哥伦比亚特区', 'cybernetics', 'Berkeley', '大英帝国', '欧洲', '美', '西里尔', '蓄奴州', '地中海', '西西里', '美利坚合众国', 'California', '曼哈顿', '阿拉伯语', '希波', '罗马', '古希腊', 'UCSB', 'America', '拉丁美洲', '意大利', '洛杉矶', '爱奥尼亚', '巴黎', '英国', '芝加哥', '大西洋', '地球'}
对比分析

可以发现,msra算法比pku算法识别到了更多英文地名和人名。此外,msra的可识别的实体种类也更多,但速度更慢。对于实际文本分析问题来说,要根据具体问题,选择合适的算法。

python3.8 with packages: hanlp_restful

参考文献

  1. 鲁江坤, 汪林林. Python数据挖掘实践[M]. 西安: 西安电子科技大学出版社, 2021. 190-205.
  2. NER: https://hanlp.hankcs.com/docs/api/hanlp/pretrained/ner.html
  3. TOK: https://hanlp.hankcs.com/docs/api/hanlp/pretrained/tok.html
  4. pku: https://hanlp.hankcs.com/docs/annotations/ner/pku.html
  5. msra: https://hanlp.hankcs.com/docs/annotations/ner/msra.html
  6. He,Han and Choi,Jinho D. (2021) .Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing.Online and Punta Cana, Dominican Republic:Association for Computational Linguistics.

转载请注明出处:©️Sylvan Ding

中文信息计算机自动处理的研究已有几十年的 历史 , 但至今仍有许多技术难题没有得到很好解 决 , 中文姓名自动识别问题就是其中的一个。由于 它与中文文本的自动分词一样 , 属于中文信息处理 的基础研究领域 , 因而它的研究成果直接影响到中 文信息的深层次研究。汉语的自身特点使得中文信 息自动处理大多是先对要处理的文本进行自动分词 (加入显式分割符) , 然后再在分词的基础上进行词 法、语法、语义等方面的深入分析。而在分词阶 段 , 文本中的人名地名以及其它专有名词和生词 大多被切分成单字词 , 在这种情形下如不能很好地 解决汉语文本中专有名词生词的识别问题 , 将给其 后的汉语文本的深入分析带来难以逾越的障碍。中 文姓名的自动识别问题就是在这种背景下提出来 的。对这一问题的研究目前采用的技术中主要利用 以下几方面的信息: 姓名用字的频率信息、上下文 信息[1 ,2 ] 、语料库统计信息[2 ] 、词性信息等[3 ] 。本 文的方法是 , 首先对中文人名的构成、姓名用字的 规律及上下文文本信息特征进行充分分析 , 在此基 础上建立起两组规则集 , 将其作用于测试文本 , 获 得初步识别结果 , 再利用大规模语料库的统计信息 对初步识别结果进行概率筛选 , 设定合适的阈值 , 输出最终识别结果。经对 50 多万字的开放语料测 试 , 系统自动识别出 1781 个中文人名 , 在不同的 筛选阈值下获得 90 %以上的识别准确率 , 而召回 率高于 91 %。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值