• 日本语自然语言处理中的分词库 - GiNZA


    日本语自然语言处理中的分词库 - GiNZA

    0. 引言

    RAG 场景下提供精确的一个手法就是使用 Hybrid Search,Hybrid Search的另外一个检索就是全文检索。

    使用 Elastic Search 进行全文检索的方案应该比较成熟,但是我这次方案中要使用的是 Oracle Text,而且语言是日本语。

    在日本同事的帮助之下,定位到 GiNZA 这个日本语自然语言处理中的分词库。

    接下来就开始学习学习 GiNZA 吧。

    1. 日本语分词库

    • MeCab
      MeCab是由京都大学信息学研究科和日本电信电话株式会社(NTT)通信科学基础研究所联合研究小组开发的开源形态素分析引擎。

    • Janome
      Janome是一个用纯Python编写的、内置词典的形态素分析器。
      无需依赖任何其他库就可以轻松安装,并提供简单易用的API,适合嵌入到应用程序中。

    • GiNZA
      GiNZA是一个日语自然语言处理库。
      它起源于英语等主要语言的自然语言处理框架spaCy,可以视为spaCy的日语版本

    • JUMAN
      JUMAN是由京都大学开发的形态素分析工具。
      它旨在为从事日语分析研究的众多学者提供一个通用的形态素分析工具。
      考虑到学校语法不太适合计算机处理,JUMAN允许用户轻松定义语法和词之间的连接关系。

    • Sudachi
      Sudachi是由WorksApplications徳岛人工智能NLP研究所开发的形态素分析器。
      Sudachi主要执行以下三个处理步骤:

      • 文本分割
      • 词性标注
      • 规范化处理
    • (参考)SentencePiece
      SentencePiece是一个用于神经网络文本生成系统的无监督文本标记器和去标记器。
      它可以在训练神经网络模型之前确定词汇表大小。
      它直接从原始文本中训练。
      使用SentencePiece可以创建一个纯粹的端到端系统,不依赖于特定语言的预处理/后处理。

    2. GiNZA

    GiNZA 是 Megagon Labs 与日本语言研究所联合研究于 2019 年 4 月发布的开源日语自然语言处理库。

    我总结了GiNZA的特点如下。

    • 易于部署
    • 使用 spaCy 和 SudachiPy
      • “spaCy”是一个可以在Python中使用的多语言自然语言处理库。
      • 可在Python中使用的日语形态分析器“SudachiPy”

    此外,默认安装了名为“SudachiDict”的词典,因此您可以通过安装一个 GiNZA 轻松开始日语自然语言处理。

    GiNZA 最初采用了一种基于 CNN 的学习模型,称为 ja_ginza 。

    ja_ginza_electra 从v5.0开始就可用,使用深度学习模型Transformer。

    ja_ginza_electra 是分析处理速度低于 ja_ginza 的模型,但分析精度较高。

    3. 使用 GiNZA

    示例代码1,

    import spacy
    
    print(f"===ja_ginza_electra===")
    nlp = spacy.load('ja_ginza_electra')
    doc = nlp('夏の全国高等学校野球選手権大会に出場する')
    for token in doc:
        print(token)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出,

    夏
    の
    全国
    高等学校
    野球
    選手権
    大会
    に
    出場
    する
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    示例代码2,

    import spacy
    
    # GiNZAでルール追加
    nlp = spacy.load('ja_ginza_electra')
    nlp.add_pipe(factory_name='entity_ruler', config={"overwrite_ents": True}, last=True)
    # Create an EntityRuler with overwrite entities enabled
    patterns = [{'label': 'Person', 'pattern': '母'},
                {'label': 'Person', 'pattern': '父'}]
    ruler = nlp.get_pipe('entity_ruler')
    ruler.add_patterns(patterns)
    
    doc = nlp('小学生のサツキと5歳のメイの二人は、母の療養のために父と一緒に初夏の頃に3丁目に引っ越してくる。')
    # Print the entities found in the text
    for ent in doc.ents:
        print(
            f"{ent.text},{ent.label_},{ent.label_},{ent.start_char},{ent.end_char}"  # Using f-string for better readability
        )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出,

    小学生,School_Age,School_Age,0,3
    サツキ,Name_Other,Name_Other,4,7
    5歳,Age,Age,8,10
    メイ,Name_Other,Name_Other,11,13
    二人,N_Person,N_Person,14,16
    母,Person,Person,18,19
    父,Person,Person,26,27
    初夏,Date,Date,31,33
    3丁目,Facility_Part,Facility_Part,36,39
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    完结!

  • 相关阅读:
    Java中的ArrayList集合
    Linux命令--会话断开后不停止程序--方法/实例
    Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
    【Coppeliasim】 通过TCP与coppeliasim通信
    计组--计算机系统概述
    前端面试题(JS部分)
    死锁的产生条件以及如何避免死锁
    软考中级(软件设计师)——数据库系统(上下午各占6-8分)
    linux配置固定ip(两种方法)
    deployment的yaml说明
  • 原文地址:https://blog.csdn.net/engchina/article/details/137935115