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

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


首先是hanlp
hanlp github主页:https://github.com/hankcs/pyhanlp

然后是LTP
ltp github主页:https://github.com/HIT-SCIR/ltp
ltp 文档主页:https://ltp.readthedocs.io/zh_CN/latest/

最后使用LAC
LAC github主页:https://github.com/baidu/lac

在我的项目中,需要做的是在一个几乎没有逻辑可言的句子里识别人名,因此命名实体识别的效果很差,使用词法分析来提取人名,然后依据业务逻辑删减。因此越依赖上下文的方法,越会有问题,整体的效果是:百度智能云词法分析>LTP>LAC>阿里云自然语言处理词法分析>hanlp


其中:

  • LTP中规中矩
  • LAC提取的量最少,但是只要提取出来,几乎是正确的
  • hanlp提取出来的量是最多的,但是一多半不是人名。
    (这和下面的示例结果相反,很神奇)

其他中文的工具类库:

NLPIR:https://github.com/NLPIR-team/NLPIR
FoolNLTK:https://github.com/rockyzhengwu/FoolNLTK
THULAC:https://github.com/thunlp/THULAC-Python

示例

from LAC import LAC


def hanlp_username(sentences: str) -> list:
    from pyhanlp import HanLP
    segment = HanLP.newSegment().enableNameRecognize(True)
    seg_words = segment.seg(sentences)
    user_list = []
    for value in seg_words:
        split_words = str(value).split('/')  # check //m
        word, tag = split_words[0], split_words[-1]
        if tag == 'nr':
            user_list.append(word)
    return user_list


def ltp_username(sentences: str) -> list:
    from ltp import LTP

    ltp = LTP()  # 默认加载 Small 模型,下载的路径是:~/.cache/torch/ltp
    seg, hidden = ltp.seg([sentences])  # 分词
    nh_user_list = []
    pos_index_values = ltp.pos(hidden)
    # seg 是 list to list 的格式
    for index, seg_i in enumerate(seg):
        pos_values = pos_index_values[index]
        for _index, _pos in enumerate(pos_values):
            if _pos == "nh":
                nh_user_list.append(seg_i[_index])
    return nh_user_list


def lac_username(sentences: str) -> list:
    # 装载LAC模型
    user_name_list = []
    lac = LAC(mode="lac")
    lac_result = lac.run(sentences)
    for index, lac_label in enumerate(lac_result[1]):
        if lac_label == "PER":
            user_name_list.append(lac_result[0][index])
    return user_name_list


if __name__ == '__main__':
    text = "周树人(1881年9月25日-1936年10月19日),原名周樟寿,字豫山、豫亭,后改字豫才,以笔名鲁迅聞名於世,浙江紹興人"
    hanlp_user = hanlp_username(text)
    lac_user = lac_username(text)
    ltp_user = ltp_username(text)
    print("hanlp:", hanlp_user)
    print("LAC:", lac_user)
    print("LTP:", ltp_user)

结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值