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

上一篇:hanlp2.x使用与语义角色标注任务


下一篇:java – 如何命名只调用其他方法的类/方法?