Chapter 02

形態素解析のコマンドを利用する

ikawaha
ikawaha
2021.08.29に更新

kagome を形態素解析コマンドとして利用する方法について説明します。コマンドは go get もしくは brew によるインストールが出来ます。

インストール

Go を用いてインストールする

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

もしくは Go 1.6 より前ならば

env GO111MODULE=on go get -u github.com/ikawaha/kagome/v2

brew tap でインストールする

brew install ikawaha/kagome/kagome

コマンドオプション

$ kagome --help
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 userdic_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

形態素解析をおこなう

対話的に使う

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

ファイルから読み込んで解析する

$ cat 赤い蝋燭と人魚.txt
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: 赤い蝋燭と人魚.txt
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ 人魚は、南の方の海にばかり棲んでいるのではありません。北の海にも棲んでいたのであります。
   2   │ 北方の海の色は、青うございました。ある時、岩の上に、女の人魚があがって、あたりの景色を眺めながら休んでいま
       │ した。
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────

$ kagome -file 赤い蝋燭と人魚.txt
人魚	名詞,一般,*,*,*,*,人魚,ニンギョ,ニンギョ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
、	記号,読点,*,*,*,*,、,、,、
南	名詞,一般,*,*,*,*,南,ミナミ,ミナミ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
方	名詞,非自立,一般,*,*,*,方,ホウ,ホー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
海	名詞,一般,*,*,*,*,海,ウミ,ウミ
... snip

標準入力から読み込む

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

出力を JSON 形式にする

-json オプションを指定すると、詳細な形態素情報を JSON 形式で得られます。JSON の形式はサーバとしてコマンドを起動したときのレスポンスと同様です。

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

jq コマンドを組み合わせれば、ヨミだけを得ることも出来るでしょう。

echo 中部国際空港| kagome -json | jq -r '.[].pronunciation'
チューブ
コクサイ
クーコー

辞書を指定する

デフォルトは IPADic ですが、UniDIC も利用可能です。

$ echo 自転車|kagome -sysdict uni
自転	名詞,普通名詞,サ変可能,*,*,*,ジテン,自転,自転,ジテン,自転,ジテン,漢,*,*,*,*
車	接尾辞,名詞的,一般,*,*,*,シャ,車,車,シャ,車,シャ,漢,*,*,*,*

解析モードを指定する

解析モードには、normalsearchextended があります。search は kuromoji の検索モードを模倣した動作をします。また extended は、検索モードで未知語があった場合に unigram に区切るような動作をします。

$ echo 関西国際空港|kagome
関西国際空港	名詞,固有名詞,組織,*,*,*,関西国際空港,カンサイコクサイクウコウ,カンサイコクサイクーコー
EOS
$ echo 関西国際空港|kagome -mode search
関西	名詞,固有名詞,地域,一般,*,*,関西,カンサイ,カンサイ
国際	名詞,一般,*,*,*,*,国際,コクサイ,コクサイ
空港	名詞,一般,*,*,*,*,空港,クウコウ,クーコー
EOS

品詞以外の情報を抑制する

$ echo ねこですねこはいます|kagome -simple
ねこ	名詞,一般,*,*
です	助動詞,*,*,*
ねこ	名詞,一般,*,*
は	助詞,係助詞,*,*
い	動詞,自立,*,*
ます	助動詞,*,*,*
EOS

ユーザー辞書を指定する

ユーザー辞書を指定可能です。

$ cat userdict.txt
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: userdict.txt
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────
   1##
   2## This file should use UTF-8 encoding
   3##
   4## User dictionary format:
   5## <text>,<token1> <token2> ... <tokenn>,<reading1> <reading2> ... <readingn>,<part-of-speech>
   6##
   78# Custom segmentation for long entries
   9   │ 日本経済新聞,日本 経済 新聞,ニホン ケイザイ シンブン,カスタム名詞
  10   │ 関西国際空港,関西 国際 空港,カンサイ コクサイ クウコウ,テスト名詞
  1112# Custom reading for former sumo wrestler Asashoryu
  13   │ 朝青龍,朝青龍,アサショウリュウ,カスタム人名
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────

$ echo 日本経済新聞|kagome -udict userdict.txt
日本経済新聞	カスタム名詞,日本/経済/新聞,ニホン/ケイザイ/シンブン
EOS

ビルドした辞書を指定する

辞書は組み込みですが、(自分で作成した)外部辞書を指定することも可能です。たぶん使う人はいないでしょう。

$ echo 三輪車|kagome -dict ipa.dict
三輪車	名詞,一般,*,*,*,*,三輪車,サンリンシャ,サンリンシャ
EOS

サーバモードを利用する

Web UI で利用する

kagome コマンドには server オプションがあり、Web からアクセスして利用することが可能です。

$ kagome server --help
Usage of server:
  -dict string
    	system dict type (ipa|uni) (default "ipa")
  -http string
    	HTTP service address (default ":6060")
  -userdict string
    	user dict

WebUI

API で利用する

次のようなデータを /tokenize エンドポイントに与えると形態素解析された結果が返ってきます。

{"sentence": "解析対象"}

例:

$ kagome server --http :8080&
$ curl localhost:8080/tokenize -d '{"sentence":"三輪車"}'|jq .
{
  "status": true,
  "tokens": [
    {
      "id": 106593,
      "start": 0,
      "end": 3,
      "surface": "三輪車",
      "class": "KNOWN",
      "pos": [
        "名詞",
        "一般",
        "*",
        "*"
      ],
      "base_form": "三輪車",
      "reading": "サンリンシャ",
      "pronunciation": "サンリンシャ",
      "features": [
        "名詞",
        "一般",
        "*",
        "*",
        "*",
        "*",
        "三輪車",
        "サンリンシャ",
        "サンリンシャ"
      ]
    }
  ]
}

解析過程を表示する

lattice モードでは、解析過程のラティスを Graphviz の dot 形式で表示することが可能です。

色のついたパスが選択されたパスです。

$ kagome lattice 私は鰻|dot -Tpng > lattice.png

lattice

文区切りだけをおこなう

sentense サブコマンドがあります。

$ kagome sentence --help
Usage of sentence:
  -file string
    	input file
$ cat ./testdata/bocchan.txt | kagome sentence |head -10|tail -4
新築の二階から首を出していたら、同級生の一人が冗談《じょうだん》に、いくら威張《いば》っても、そこから飛び降りる事は出来まい。
弱虫やーい。
と囃《はや》したからである。
小使《こづかい》に負ぶさって帰って来た時、おやじが大きな眼《め》をして二階ぐらいから飛び降りて腰を抜かす奴《やつ》があるかと云《い》ったから、この次は抜かさずに飛んで見せますと答えた。