日本语自然语言处理中的分词库 - 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)

输出,

夏
の
全国
高等学校
野球
選手権
大会
に
出場
する

示例代码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
    )

输出,

小学生,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. 日本自然语言处理词库 - GiNZA

    2024-04-22 17:02:03       33 阅读
  2. 自然语言处理语言模型

    2024-04-22 17:02:03       71 阅读
  3. 探索深度学习在自然语言处理应用

    2024-04-22 17:02:03       67 阅读
  4. 自然语言处理所有任务概括

    2024-04-22 17:02:03       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 17:02:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 17:02:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 17:02:03       82 阅读
  4. Python语言-面向对象

    2024-04-22 17:02:03       91 阅读

热门阅读

  1. AI先驱者丹尼尔·丹尼特去世

    2024-04-22 17:02:03       32 阅读
  2. JDK中用到了哪些设计模式

    2024-04-22 17:02:03       183 阅读
  3. npm 常用命令详解

    2024-04-22 17:02:03       175 阅读
  4. flask 请求对象

    2024-04-22 17:02:03       122 阅读
  5. 分组带给了我们哪些?

    2024-04-22 17:02:03       166 阅读
  6. Elasticsearch:(二)3.安装Elasticsearch-head插件

    2024-04-22 17:02:03       73 阅读
  7. linux 查看nginx日志

    2024-04-22 17:02:03       39 阅读