其他分享
首页 > 其他分享> > HanLP中文分词、人名识别、地名识别

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条简介数据。

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

标签:克隆,pku,HanLP,ner,巴赫,识别,hanlp,分词
来源: https://blog.csdn.net/IYXUAN/article/details/121454805