golang纯Go实现的日语形态分析插件库kagome的使用

Golang纯Go实现的日语形态分析插件库kagome的使用

Kagome是一个用纯Go语言实现的开源日语形态分析器。它可以嵌入MeCab-IPADIC、UniDic等字典/统计模型到二进制文件中。

主要特点

  • 纯Go实现,无需外部依赖
  • 支持多种词典:MeCab IPADIC、UniDic等
  • 支持多种分词模式:Normal、Search、Extended
  • 提供命令行工具和REST API
  • 支持WebAssembly,可在浏览器中运行

安装

go install github.com/ikawaha/kagome/v2@latest

使用示例

基本用法

package main

import (
  "fmt"
  "strings"

  "github.com/ikawaha/kagome-dict/ipa"
  "github.com/ikawaha/kagome/v2/tokenizer"
)

func main() {
  // 使用IPADIC词典创建分词器,省略BOS/EOS标记
  t, err := tokenizer.New(ipa.Dict(), tokenizer.OmitBosEos())
  if err != nil {
    panic(err)
  }
  
  // 分词示例
  fmt.Println("---wakati---")
  seg := t.Wakati("すもももももももものうち")
  fmt.Println(seg)

  // 详细分词信息
  fmt.Println("---tokenize---")
  tokens := t.Tokenize("すもももももももものうち")
  for _, token := range tokens {
    features := strings.Join(token.Features(), ",")
    fmt.Printf("%s\t%v\n", token.Surface, features)
  }
}

输出结果:

---wakati---
[すもも も もも も もも の うち]
---tokenize---
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

不同分词模式

Kagome支持三种分词模式:

  1. Normal: 常规分词
  2. Search: 对搜索有用的启发式分词
  3. Extended: 类似搜索模式,但对未知词使用单字分割

示例对比:

未分词文本 Normal Search Extended
関西国際空港 関西国際空港 関西 国際 空港 関西 国際 空港
日本経済新聞 日本経済新聞 日本 経済 新聞 日本 経済 新聞
シニアソフトウェアエンジニア シニアソフトウェアエンジニア シニア ソフトウェア エンジニア シニア ソフトウェア エンジニア
デジカメを買った デジカメ を 買っ た デジカメ を 買っ た デ ジ カ メ を 買っ た

命令行工具

Kagome提供了强大的命令行工具:

交互模式

kagome
すもももももももものうち
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

JSON输出

echo "猫" | kagome -json | jq .
[
  {
    "id": 286994,
    "start": 0,
    "end": 1,
    "surface": "猫",
    "class": "KNOWN",
    "pos": [
      "名詞",
      "一般",
      "*",
      "*"
    ],
    "base_form": "猫",
    "reading": "ネコ",
    "pronunciation": "ネコ",
    "features": [
      "名詞",
      "一般",
      "*",
      "*",
      "*",
      "*",
      "猫",
      "ネコ",
      "ネコ"
    ]
  }
]

服务器模式

Kagome可以启动一个HTTP服务器提供分词服务:

kagome server &

然后可以通过REST API访问:

curl -XPUT localhost:6060/tokenize -d'{"sentence":"すもももももももものうち", "mode":"normal"}' | jq .

或者访问 http://localhost:6060 使用Web界面。

Docker支持

Kagome提供了Docker镜像:

docker pull ikawaha/kagome:latest

# 交互模式
docker run --rm -it ikawaha/kagome:latest

# 服务器模式
docker run --rm -p 6060:6060 ikawaha/kagome:latest server

WebAssembly支持

Kagome可以编译为WebAssembly在浏览器中运行。查看演示站点了解详情。

许可证

Kagome使用MIT许可证。


更多关于golang纯Go实现的日语形态分析插件库kagome的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang纯Go实现的日语形态分析插件库kagome的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用纯Go实现的日语形态分析库Kagome

Kagome是一个用纯Go语言实现的日语形态分析库,它能够将日语句子分解为单词并标注词性等信息。下面我将详细介绍如何使用这个库。

安装Kagome

首先,使用go get命令安装Kagome:

go get github.com/ikawaha/kagome/v2

基本使用方法

1. 初始化分析器

package main

import (
	"fmt"
	"github.com/ikawaha/kagome/v2/tokenizer"
)

func main() {
	// 初始化分词器
	t, err := tokenizer.New()
	if err != nil {
		panic(err)
	}
	defer t.Close()
	
	// 待分析的日语句子
	text := "すもももももももものうち"
	
	// 进行分词
	tokens := t.Tokenize(text)
	
	// 输出结果
	for _, token := range tokens {
		if token.ID == tokenizer.BosEosID {
			continue // 跳过开始/结束标记
		}
		fmt.Printf("表層形: %s\n", token.Surface)
		fmt.Printf("品詞: %s\n", token.POS())
		fmt.Printf("読み: %s\n", token.Reading)
		fmt.Printf("基本形: %s\n", token.BaseForm)
		fmt.Println("--------------------")
	}
}

2. 输出格式详解

Kagome的Token结构包含以下主要字段:

  • Surface: 单词表面形式(实际出现的文本)
  • POS(): 词性(返回字符串切片)
  • Reading: 假名读音
  • BaseForm: 单词基本形(原形)
  • Features: 包含所有特征的切片

3. 更详细的输出示例

func printDetailedAnalysis(t *tokenizer.Tokenizer, text string) {
	tokens := t.Tokenize(text)
	for i, token := range tokens {
		if token.ID == tokenizer.BosEosID {
			continue
		}
		fmt.Printf("Token %d:\n", i)
		fmt.Printf("  表層形: %s\n", token.Surface)
		fmt.Printf("  品詞: %v\n", token.POS())
		fmt.Printf("  品詞細分類1: %s\n", token.Features()[3])
		fmt.Printf("  品詞細分類2: %s\n", token.Features()[4])
		fmt.Printf("  品詞細分類3: %s\n", token.Features()[5])
		fmt.Printf("  活用形: %s\n", token.Features()[5])
		fmt.Printf("  活用型: %s\n", token.Features()[6])
		fmt.Printf("  原形: %s\n", token.BaseForm)
		fmt.Printf("  読み: %s\n", token.Reading)
		fmt.Printf("  発音: %s\n", token.Features()[8])
		fmt.Println("----------------------")
	}
}

高级功能

1. 使用自定义词典

func main() {
	// 加载自定义词典
	dic, err := dict.LoadDictFile("path/to/your/dictionary/file")
	if err != nil {
		panic(err)
	}
	
	// 使用自定义词典初始化分词器
	t, err := tokenizer.New(dic)
	if err != nil {
		panic(err)
	}
	defer t.Close()
	
	// 使用自定义词典进行分析...
}

2. 搜索模式

Kagome提供不同的搜索模式:

func main() {
	t, _ := tokenizer.New()
	defer t.Close()
	
	text := "すもももももももものうち"
	
	// 普通模式(默认)
	tokens := t.Tokenize(text)
	
	// 搜索模式(更细粒度)
	searchModeTokens := t.Analyze(text, tokenizer.Search)
	
	// 扩展模式(包含更多信息)
	extendedModeTokens := t.Analyze(text, tokenizer.Extended)
	
	// 比较不同模式的结果...
}

3. 提取名词

func extractNouns(t *tokenizer.Tokenizer, text string) []string {
	tokens := t.Tokenize(text)
	var nouns []string
	
	for _, token := range tokens {
		if token.ID == tokenizer.BosEosID {
			continue
		}
		// 检查是否是名词
		pos := token.POS()
		if len(pos) > 0 && pos[0] == "名詞" {
			nouns = append(nouns, token.Surface)
		}
	}
	return nouns
}

性能考虑

Kagome是完全用Go实现的,性能相当不错。对于大批量文本处理,可以考虑以下优化:

  1. 复用Tokenizer实例
  2. 并行处理多个文本
  3. 对于简单需求,使用搜索模式可能更快

常见问题

  1. 如何处理未知单词? Kagome会自动尝试分解未知单词,但准确性可能降低。可以添加自定义词典提高准确性。

  2. 如何获取假名读音? 使用token.Reading字段,如果为空可以检查token.Features()[7]

  3. 词性标注的完整列表在哪里? 参考Kagome文档或IPADIC的文档,因为Kagome使用类似的词性分类体系。

Kagome是一个功能强大且易于使用的日语形态分析库,特别适合需要在Go应用中集成日语文本处理的场景。它的纯Go实现使得部署非常方便,不需要依赖外部服务或其他语言的运行时环境。

回到顶部