kagome

ikawahaMIT活跃维护

纯 Go 编写的独立日语形态素分析器,无需外部词典即可完成分词与词性标注,适合在 Go 服务里直接集成日文 NLP 能力。

Self-contained Japanese Morphological Analyzer written in pure Go

v2.11.0发布于 2026-03-03 14:34 UTC987star61fork同步于 2026-11-10 23:52 UTC

怎么上手

由 README 提炼,执行前请确认
go install github.com/ikawaha/kagome/v2@latest
硬件要求按 README 说明

README 未说明,纯 Go 实现且词典嵌入二进制,未提及 GPU 或显存要求

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

纯 Go 编写的自包含日语形态素分析器,把日文分词和词性标注直接嵌进二进制

纯 Go 编写的独立日语形态素分析器,无需外部词典即可完成分词与词性标注,适合在 Go 服务里直接集成日文 NLP 能力。

核心能力

  • 内置 MeCab-IPADIC 与 UniDic 词典,无需外部词典文件
  • 提供 normal/search/extended 三种切分模式
  • 支持命令行、Go 库、C 库 FFI 与 WebAssembly 多种调用方式
  • 内置 RESTful 服务模式,常驻进程避免重复加载词典
  • 附带 lattice 可视化与长句切分等调试辅助命令

容易踩的坑

Web 演示页面用 graphviz 画 lattice,需自行安装 graphviz;Docker 基础镜像不含 graphviz,做可视化要另找示例镜像;作为 Go 库使用时词典在独立的 kagome-dict 包中,需额外 go get 对应词典模块

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v2.11.0
  1. v2.11.0最新正式版2026-03-03 · 2026-03-03 14:34 UTC

    What's Changed

    Full Changelog: https://github.com/ikawaha/kagome/compare/v2.10.3...v2.11.0

  2. v2.10.32026-01-03 · 2026-01-03 08:06 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/ikawaha/kagome/compare/v2.10.2...v2.10.3

  3. v2.10.22025-04-01 · 2025-04-01 13:54 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/ikawaha/kagome/compare/v2.10.1...v2.10.2

  4. v2.10.12025-03-12 · 2025-03-12 11:56 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/ikawaha/kagome/compare/v2.10.0...v2.10.1

  5. v2.10.02024-08-03 · 2024-08-03 07:51 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/ikawaha/kagome/compare/v2.9.11...v2.10.0

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    GoDev Go Release Coverage Status Docker Pulls

    Kagome v2

    Kagome is an open source Japanese morphological analyzer written in pure Go. It can tokenize Japanese text into words and analyze parts of speech, with dictionaries embedded in the binary for easy deployment.

    [!NOTE] Key features (Improvements from v1):

    • Self-contained binaries with embedded dictionaries (MeCab-IPADIC, UniDic)
    • Multiple segmentation modes for different use cases
    • RESTful API server mode for production use
    • WebAssembly support for browser environments
    • C library API for FFI integration (Python, PHP, and other languages)

    Index

    Basic Usage

    Command line

    % kagome -h
    Japanese Morphological Analyzer -- github.com/ikawaha/kagome/v2
    usage: kagome <command>
    The commands are:
       [tokenize] - command line tokenize (*default)
       server - run tokenize server
       lattice - lattice viewer
       sentence - tiny sentence splitter
       version - show version
    
    tokenize [-file input_file] [-dict dic_file] [-userdict user_dic_file] [-sysdict (ipa|uni)] [-simple false] [-mode (normal|search|extended)] [-split] [-json]
      -dict string
        	dict
      -file string
        	input file
      -json
        	outputs in JSON format
      -mode string
        	tokenize mode (normal|search|extended) (default "normal")
      -simple
        	display abbreviated dictionary contents
      -split
        	use tiny sentence splitter
      -sysdict string
        	system dict type (ipa|uni) (default "ipa")
      -udict string
        	user dict
    
    % # piped standard input
    % echo "すもももももももものうち" | kagome
    すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
    も	助詞,係助詞,*,*,*,*,も,モ,モ
    もも	名詞,一般,*,*,*,*,もも,モモ,モモ
    も	助詞,係助詞,*,*,*,*,も,モ,モ
    もも	名詞,一般,*,*,*,*,もも,モモ,モモ
    の	助詞,連体化,*,*,*,*,の,ノ,ノ
    うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
    EOS
    

    As a Go library

    You can integrate Kagome into your Go applications as follows:

    # Install Kagome module
    go get github.com/ikawaha/kagome/v2
    
    package main
    
    import (
      "fmt"
      "strings"
    
      "github.com/ikawaha/kagome-dict/ipa"
      "github.com/ikawaha/kagome/v2/tokenizer"
    )
    
    func main() {
      t, err := tokenizer.New(ipa.Dict(), tokenizer.OmitBosEos())
      if err != nil {
        panic(err)
      }
      // wakati (simple word splitting/segmentation)
      fmt.Println("---wakati---")
      seg := t.Wakati("すもももももももものうち")
      fmt.Println(seg)
    
      // tokenize w/ morphological analysis
      fmt.Println("---tokenize---")
      tokens := t.Tokenize("すもももももももものうち")
      for _, token := range tokens {
        features := strings.Join(token.Features(), ",")
        fmt.Printf("%s\t%v\n", token.Surface, features)
      }
    }
    

    output:

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

    As a C library

    Kagome is written in pure Go but can be compiled as a C shared library and used from other languages via FFI (Foreign Function Interface).

    See the "Use from other languages (FFI)" section below for details and examples.

    More examples

    We provide various examples demonstrating how to use Kagome in different scenarios:

    Install

    To get the kagome command line tool, choose your preferred installation method below:

    • Go (recommended)

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

      # macOS and Linux (for both AMD64 and Arm64)
      brew install ikawaha/kagome/kagome
      
    • Manual Install

      • For manual installation, download and extract the appropriate archived file for your OS and architecture from the releases page.
      • Note that the extracted binary must be placed in an accessible directory with execution permission.
    • Docker/Docker Compose

    Commands

    Major sub-commands of kagome command line tool.

    Tokenize command

    % # interactive/REPL mode
    % kagome
    すもももももももものうち
    すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
    も	助詞,係助詞,*,*,*,*,も,モ,モ
    もも	名詞,一般,*,*,*,*,もも,モモ,モモ
    も	助詞,係助詞,*,*,*,*,も,モ,モ
    もも	名詞,一般,*,*,*,*,もも,モモ,モモ
    の	助詞,連体化,*,*,*,*,の,ノ,ノ
    うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
    EOS
    
    % # piped standard input
    % echo "すもももももももものうち" | kagome
    すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
    も      助詞,係助詞,*,*,*,*,も,モ,モ
    もも    名詞,一般,*,*,*,*,もも,モモ,モモ
    も      助詞,係助詞,*,*,*,*,も,モ,モ
    もも    名詞,一般,*,*,*,*,もも,モモ,モモ
    の      助詞,連体化,*,*,*,*,の,ノ,ノ
    うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
    EOS
    
    % # JSON output
    % # (For jq command see https://jqlang.org/)
    % echo "猫" | kagome -json | jq .
    [
      {
        "id": 286994,
        "start": 0,
        "end": 1,
        "surface": "猫",
        "class": "KNOWN",
        "pos": [
          "名詞",
          "一般",
          "*",
          "*"
        ],
        "base_form": "猫",
        "reading": "ネコ",
        "pronunciation": "ネコ",
        "features": [
          "名詞",
          "一般",
          "*",
          "*",
          "*",
          "*",
          "猫",
          "ネコ",
          "ネコ"
        ]
      }
    ]
    
    % # word splitting/segmentation only (equivalent to "wakati" functionality)
    % echo "すもももももももものうち" | kagome -json | jq -r '[.[].surface] | join("/")'
    すもも/も/もも/も/もも/の/うち
    
    % # Extract only pronunciations using jq (for Text-to-Speech purposes, etc.)
    % echo "私ははにわよわわわんわん" | kagome -json | jq -r '.[].pronunciation'
    ワタシ
    ワ
    ハニワ
    ヨ
    ワ
    ワ
    ワンワン
    

    Server command

    For continuous usage, kagome provides a server mode to decouple the startup time of the tokenizer.

    RESTful API

    Start a server and try to access the "/tokenize" endpoint.

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

    Start a server and access http://localhost:6060 in your browser.

    % kagome server &
    

    [!IMPORTANT] The demo web application uses graphviz to draw a lattice. You need graphviz to be installed on your system.

    [!TIP] Kagome can be compiled to WebAssembly (wasm) and run locally in a web browser as well. For details, see the WebAssembly section.

    Lattice command

    A debug tool of tokenize process outputs a lattice in graphviz dot format.

    % kagome lattice 私は鰻 | dot -Tpng -o lattice.png
    

    lattice

    Sentence command

    Split long text into sentences:

    % echo "吾輩は猫である。名前はまだ無い。" | kagome sentence
    吾輩は猫である。
    名前はまだ無い。
    

    This command is useful if a single line of data is too lengthy, and you want to avoid errors such as bufio.Scanner: token too long.

    % echo "吾輩は猫である。名前はまだ無い。" | kagome -json | jq -r '[.[].surface] | join("/")'
    吾輩/は/猫/で/ある/。/名前/は/まだ/無い/。
    
    % echo "吾輩は猫である。名前はまだ無い。" | kagome sentence | kagome -json | jq -r '[.[].surface] | join("/")'
    吾輩/は/猫/で/ある/。
    名前/は/まだ/無い/。
    

    This command is equivalent to the -split option of the tokenize command.

    % echo "吾輩は猫である。名前はまだ無い。" | kagome -split -json | jq -r '[.[].surface] | join("/")'
    吾輩/は/猫/で/ある/。
    名前/は/まだ/無い/。
    

    Dictionaries

    [!NOTE] For more details and differences between the dictionaries, see the wiki.

    Segmentation modes

    Similar to Kuromoji, Kagome also supports various segmentation modes (splitting strategies) to tokenize the input text.

    • Normal: Regular segmentation
    • Search: Use a heuristic to perform additional segmentation that is useful for search purposes
    • Extended: Similar to search mode, but also unknown words with uni-grams
    UntokenizedNormalSearchExtended
    関西国際空港関西国際空港関西 国際 空港関西 国際 空港
    日本経済新聞日本経済新聞日本 経済 新聞日本 経済 新聞
    シニアソフトウェアエンジニアシニアソフトウェアエンジニアシニア ソフトウェア エンジニアシニア ソフトウェア エンジニア
    デジカメを買ったデジカメ を 買っ たデジカメ を 買っ たデ ジ カ メ を 買っ た

    [!NOTE] If your purpose is for search, try changing the mode before switching to another dictionary.

    Docker

    Docker

    We provide scratch-based Docker images that simply run the kagome command line tool on various architectures: AMD64, Arm64, Arm32 (Arm v5, v6 and v7)

    • Pull the image

      docker pull ikawaha/kagome:latest
      
      # Alternatively, you can pull from GitHub Container Registry
      docker pull ghcr.io/ikawaha/kagome:latest
      
    • Run the command via Docker

      # Interactive/REPL mode
      docker run --rm -it ikawaha/kagome:latest
      
      # If pulling from GitHub Container Registry
      docker run --rm -it ghcr.io/ikawaha/kagome:latest
      
    • Run the server via Docker

      # Server mode (http://localhost:6060)
      docker run --rm -p 6060:6060 ikawaha/kagome:latest server
      
      # If pulling from GitHub Container Registry
      docker run --rm -p 6060:6060 ghcr.io/ikawaha/kagome:latest server
      
    • docker-compose.yml example

      services:
        kagome:
          image: ikawaha/kagome:latest
          ports: ["6060:6060"]
          command: server
          restart: unless-stopped
      

    Note: Base image doesn't include Graphviz. For lattice visualization, see examples.

    WebAssembly

    Kagome compiles to WebAssembly for browser use.

    Use from other languages (FFI)

    Kagome is written in pure Go but can be compiled as a C shared library and used from other languages via FFI (Foreign Function Interface).

    • Currently supported/tested languages:
      • Python 3.12+ (using ctypes)
      • PHP 8+ (using FFI)
    # Python example using ctypes
    from libkagome import Kagome
    
    kagome = Kagome()
    tokens = kagome.tokenize("すもももももももものうち")
    
    for token in tokens:
        print(f"{token.surface}\t{token.pos}")
    
    <!-- PHP example using FFI -->
    <?php
    declare(strict_types=1);
    
    require __DIR__ . '/libkagome.php';
    
    $kagome = new Kagome();
    $tokens = $kagome->tokenize("すもももももももものうち");
    
    foreach ($tokens as $token) {
        echo "{$token->surface}\t" . implode(',', $token->pos) . "\n";
    }
    

    For complete examples and build instructions, see:

    [!NOTE] The C library provides thread-safe tokenization with proper memory management and includes comprehensive tests.

    Reference

    License

    • MIT