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支持三种分词模式:
- Normal: 常规分词
- Search: 对搜索有用的启发式分词
- 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
更多关于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实现的,性能相当不错。对于大批量文本处理,可以考虑以下优化:
- 复用Tokenizer实例
- 并行处理多个文本
- 对于简单需求,使用搜索模式可能更快
常见问题
-
如何处理未知单词? Kagome会自动尝试分解未知单词,但准确性可能降低。可以添加自定义词典提高准确性。
-
如何获取假名读音? 使用
token.Reading
字段,如果为空可以检查token.Features()[7]
。 -
词性标注的完整列表在哪里? 参考Kagome文档或IPADIC的文档,因为Kagome使用类似的词性分类体系。
Kagome是一个功能强大且易于使用的日语形态分析库,特别适合需要在Go应用中集成日语文本处理的场景。它的纯Go实现使得部署非常方便,不需要依赖外部服务或其他语言的运行时环境。