首页Python【Python计算生态】H...

【Python计算生态】HanLP——自然语言处理库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

HanLP是一个多语种自然语言处理库,基于PyTorchTensorFlow 2.x构建,提供了丰富的中文分词、词性标注、命名实体识别、依存句法分析等功能。
HanLP2.1支持包括简繁中英日俄法德在内的130种语言上的10种联合任务以及多种单任务。HanLP预训练了十几种任务上的数十个模型并且正在持续迭代语料库与模型:
图片来源:https://github.com/hankcs/HanLP
    • 安装:
    需要注意的是,HanLP提供RESTfulnative两种API,分别面向轻量级和海量级两种场景(以下介绍来自官方文档)。
    • 轻量级RESTful API:
    仅数KB适合敏捷开发、移动APP等场景。简单易用,无需GPU配环境,秒速安装。语料更多、模型更大、精度更高,强烈推荐。服务器GPU力有限,匿名用户配额较少,建议申请免费公益API秘钥auth。使用pip安装:
    # 轻量级RESTful APIpip install hanlp_restful
    • 海量级native API:
    依赖PyTorchTensorFlow等深度学习技术,适合专业NLP工程师、研究者以及本地海量数据场景。要求Python 3.6至3.10,支持Windows,推荐*nix。可以在CPU上运行,推荐GPU/TPU。使用pip安装PyTorch版:
    # 海量级native APIpip install hanlp
    GitHub页面:
    https://github.com/hankcs/HanLP

    02
    使用

    HanLP发布的模型分为多任务和单任务两种,多任务速度快省显存,单任务精度高更灵活。

    • 多任务模型:
    可以通过以下方式查看可用的多任务模型:
    import hanlp
    # 查看可用的多任务模型
    print(hanlp.pretrained.mtl.ALL)
    HanLP的工作流程为加载模型然后将其当作函数调用,例如下列联合多任务模型,其中,mtl表示多任务学习(Multi-Task Learning)模型。
    接受一个句子列表(支持多个NLP任务),返回一个包含所有任务的预测结果的结构化文档对象(HanLP的输出统一为json格式兼容dictDocument)。
    另外,Python RESTfulnative API支持基于等宽字体的可视化,通过pretty_print()方法能够直接将语言学结构在控制台内可视化出来:
    # 加载预训练的多任务学习模型(支持分词、词性标注、NER、依存分析等)
    mtl = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH) # 世界最大中文语料库

    # 输入文本
    text_list = ['HanLP为生产环境带来次世代最先进的多语种NLP技术。']

    # 执行多任务模型
    mtl_result = mtl(text_list)
    # print(mtl_result)
    # 美化输出结果
    mtl_result.pretty_print()

    输出结果:

    还可以通过tasks参数传递指定任务名称列表,来指定任务。

    # 指定任务
    tasks_list = ['tok''pos']
    mtl_result = mtl(text_list, tasks=tasks_list)
    print(mtl_result)

    输出结果:

    {
      "tok/fine": [
        ["HanLP""为""生产""环境""带来""次世代""最""先进""的""多语种""NLP""技术""。"]
      ],
      "pos/ctb": [
        ["NR""P""NN""NN""VV""NN""AD""VA""DEC""NN""NR""NN""PU"]
      ]
    }


    • 单任务模型:
    HanLP还为核心NLP任务(包括标记和解析)提供了全方位的单任务学习模型,具体内容请参考预训练模型的文档。
    例如,加载预训练模型完成分词和词性标注操作:
    # 加载预训练的分词和词性标注模型(首次运行自动下载)
    tokenizer = hanlp.load(hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH)
    tagger = hanlp.load(hanlp.pretrained.pos.CTB9_POS_ELECTRA_SMALL)

    # 进行分词和词性标注
    text = "HanLP是一套用Java编写的自然语言处理工具包"
    words = tokenizer(text)
    pos_tags = tagger(words)
    print(list(zip(words, pos_tags)))
    # 输出:[('HanLP', 'NR'), ('是', 'VC'), ('一套', 'AD'), ('用', 'P'), ('Java', 'NN'), ('编写', 'VV'), ('的', 'DEC'), ('自然', 'NN'), ('语言', 'NN'), ('处理', 'NN'), ('工具包', 'NN')]
    根据HanLP官方文档介绍,多任务学习的优势在于速度和显存,然而精度往往不如单任务模型。所以,HanLP预训练了许多单任务模型并设计了优雅的流水线模式将其组装起来。
    HanLP = hanlp.pipeline() 
        .append(hanlp.utils.rules.split_sentence, output_key='sentences')
        .append(hanlp.load('FINE_ELECTRA_SMALL_ZH'), output_key='tok')
        .append(hanlp.load('CTB9_POS_ELECTRA_SMALL'), output_key='pos')
        .append(hanlp.load('MSRA_NER_ELECTRA_SMALL_ZH'), output_key='ner', input_key='tok')
        .append(hanlp.load('CTB9_DEP_ELECTRA_SMALL', conll=0), output_key='dep', input_key='tok')
        .append(hanlp.load('CTB9_CON_ELECTRA_SMALL'), output_key='con', input_key='tok')
    doc = HanLP('HanLP为生产环境带来次世代最先进的多语种NLP技术。预训练了十几种任务上的数十个模型')
    print(doc)
    # 美化输出结果
    doc.pretty_print()


    更多内容可以前往官方文档查看:

    https://hanlp.hankcs.com/docs/


    本篇文章来源于微信公众号: 码农设计师

    RELATED ARTICLES

    欢迎留下您的宝贵建议

    Please enter your comment!
    Please enter your name here

    - Advertisment -

    Most Popular

    Recent Comments