形態素解析器 Sudachi

形態素解析とは

日本語のテキストは分かち書きされていないため、コンピューター上で処理するためには何らかの単位で分割する必要があります。

同表記異義語があるため、分割した断片に何らかの判別のための情報も必要です。また後段での処理をかんがえると活用語を辞書にあるような終止形になおす必要もあるでしょう。

このような処理をまとめておこなうのが形態素解析で、おもに以下の3つの処理をおこないます。

  • 分割
  • 品詞付与
  • 辞書形 (終止形) 付与

Sudachi の特長

Sudachi は一般的な形態素解析器の機能のほかに以下のような特長をもっています。

分割単位の切り替え

テキストを処理するために最適な分割単位はアプリケーションによってことなります。たとえば、全文検索などは再現率をあげるために短めの単位が好まれます。意味をあつかうような処理であれば固有表現とよばれる長めの単位が向いています。

従来の形態素解析ではこれらのニーズをみたすためには辞書を切り替えたり、べつの処理を追加する必要がありました。Sudachi では A, B, C の3つの単位で出力することが可能です。これらの単位は内部でただしく結びつけられているために、おたがいに矛盾した結果が出力されることはありません。

たとえば「医療品安全管理責任者」にたいしては、つぎのような出力をえらぶことができます。


    A: 医療 / 品 / 安全 / 管理 / 責任 / 者
    B: 医療品 / 安全 / 管理 / 責任者
    C: 医療品安全管理責任者

豊富な語彙、継続的な収集

280万語をこえる語を収録しており、さらに継続的に収集、整備をおこなっています。

必要な機能を1つにパッケージ

ほかの解析器では前処理や後処理で別途おこなう必要のあった処理をプラグインの形でまとめておこなうことができます。

  • 表記の正規化
    • 送り違い、字種、異体字、誤用、縮約
    • 長音記号の正規化 (あ~~~~→あー)
  • 数字のまとめ上げ、正規化
    • 六億円欲しい →60000000/円/欲しい

 

ソースコード

GitHub で公開しています。

チュートリアル

以下のような環境で動作させることを前提に手順を書いていきます。

  • Windows 10 バージョン1803以降
  • Windows Subsystem for Linux
  • Ubuntu 18.04 LTS

もちろん単体の Ubuntu や他の Linux デストリビューションでも同様の手順で動作します。

Java 版

Java 版のコマンドラインツールで解析させます。

ビルド

Maven と Git を利用します。

$ sudo apt-get install maven git

 

辞書ソースがおおきいため、Git LFSが必要になります。 


$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
$ sudo apt-get install git-lfs
$ git lfs install

 

ソースコードを取得して、ビルドします。 


$ git lfs clone https://github.com/WorksApplications/Sudachi.git
$ cd Sudachi
$ mvn package

 

コマンドラインツールによる解析

コマンドラインツールを引数なしで起動すると、標準入力から入力をうけつけます。 


$ cd target
$ java -jar sudachi-0.1.2-SNAPSHOT.jar
きょうはいい天気ですね。
きょう  名詞,普通名詞,副詞可能,*,*,*    今日
は      助詞,係助詞,*,*,*,*     は
いい    形容詞,非自立可能,*,*,形容詞,連体形-一般        良い
天気    名詞,普通名詞,一般,*,*,*        天気
です    助動詞,*,*,*,助動詞-デス,終止形-一般    です
ね      助詞,終助詞,*,*,*,*     ね
。      補助記号,句点,*,*,*,*   。
EOS

 

分割単位を変えることもできます。(デフォルトはC単位) 


takaoka_k@takaoka-k:~/works/sudachi/Sudachi/target$ java -jar sudachi-0.1.2-SNAPSHOT.jar
勤労者財産形成貯蓄
勤労者財産形成貯蓄      名詞,普通名詞,一般,*,*,*        勤労者財産形成貯蓄
EOS
takaoka_k@takaoka-k:~/works/sudachi/Sudachi/target$ java -jar sudachi-0.1.2-SNAPSHOT.jar -m B
勤労者財産形成貯蓄
勤労者  名詞,普通名詞,一般,*,*,*        勤労者
財産    名詞,普通名詞,一般,*,*,*        財産
形成    名詞,普通名詞,サ変可能,*,*,*    形成
貯蓄    名詞,普通名詞,サ変可能,*,*,*    貯蓄
EOS
takaoka_k@takaoka-k:~/works/sudachi/Sudachi/target$ java -jar sudachi-0.1.2-SNAPSHOT.jar -m A
勤労者財産形成貯蓄
勤労    名詞,普通名詞,サ変可能,*,*,*    勤労
者      接尾辞,名詞的,一般,*,*,*        者
財産    名詞,普通名詞,一般,*,*,*        財産
形成    名詞,普通名詞,サ変可能,*,*,*    形成
貯蓄    名詞,普通名詞,サ変可能,*,*,*    貯蓄
EOS

 

Full 辞書を利用する場合は設定ファイルを指定します。 


$ java -jar sudachi-0.1.2-SNAPSHOT.jar -r ../src/main/resources/sudachi_fulldict.json
鳩サブレー
鳩サブレー      名詞,固有名詞,一般,*,*,*        鳩サブレー
EOS

 

SudachiPy

pip をつかってインストールします。Python 3.5以上が必要です。 


$ pip install -e git+git://github.com/WorksApplications/SudachiPy@develop#egg=SudachiPy

 

パッケージには辞書が含まれていません。Java版をビルドして target/system_*.dic を取得するか、リリース一覧 から辞書を取得します。 


$ wget https://github.com/WorksApplications/Sudachi/releases/download/v0.1.1/sudachi-0.1.1-dictionary-core.zip
$ unzip sudachi-0.1.1-dictionary-core.zip
$ cp system_core.dic `pip show sudachipy | grep Location | sed 's/^.*: //'`/resources/system.dic

 

コマンドラインツールの利用方法は Java 版とほぼ同じです。 


$ sudachipy
きょうはいい天気ですね。
きょう  名詞,普通名詞,副詞可能,*,*,*    今日
は      助詞,係助詞,*,*,*,*     は
いい    形容詞,非自立可能,*,*,形容詞,連体形-一般        良い
天気    名詞,普通名詞,一般,*,*,*        天気
です    助動詞,*,*,*,助動詞-デス,終止形-一般    です
ね      助詞,終助詞,*,*,*,*     ね
。      補助記号,句点,*,*,*,*   。
EOS

 

Elasticsearch

Elasticsearch プラグインは 5.6 と6系の各マイナーバージョンをサポートしています。

 

以下では Elasticsearch 6.4.3 で Sudachi をつかう手順をしめします。

 

まずプラグインをインストールします。 


$ sudo elasticsearch-plugin install https://github.com/WorksApplications/elasticsearch-sudachi/releases/download/v6.4.3-1.2.0/analysis-sudachi-elasticsearch6.4.3-1.2.0-SNAPSHOT.zip

 

パッケージには辞書が含まれていません。Java版をビルドして target/system_*.dic を取得するか、リリース一覧から辞書を取得し、$ES_HOME/sudachi の下に置きます。 


$ wget https://github.com/WorksApplications/Sudachi/releases/download/v0.1.1/sudachi-0.1.1-dictionary-core.zip
$ unzip sudachi-0.1.1-dictionary-core.zip
$ sudo mkdir /etc/elasticsearch/sudachi
$ sudo cp system_core.dic /etc/elasticsearch/sudachi

 

配置後、Elasticsearch を再起動します。

 

設定ファイルを作成します。 


```json:analysis_sudachi.json
{
    "settings" : {
        "analysis" : {
            "filter" : {
                "romaji_readingform" : {
                    "type" : "sudachi_readingform",
                    "use_romaji" : true
                },
                "katakana_readingform" : {
                    "type" : "sudachi_readingform",
                    "use_romaji" : false
                }
            },
            "analyzer" : {
                "sudachi_baseform_analyzer" : {
                    "filter" : [ "sudachi_baseform" ],
                    "type" : "custom",
                    "tokenizer" : "sudachi_tokenizer"
                },
                "sudachi_normalizedform_analyzer" : {
                    "filter" : [ "sudachi_normalizedform" ],
                    "type" : "custom",
                    "tokenizer" : "sudachi_tokenizer"
                },
                "sudachi_readingform_analyzer" : {
                    "filter" : [ "katakana_readingform" ],
                    "type" : "custom",
                    "tokenizer" : "sudachi_tokenizer"
                },
                "sudachi_romaji_analyzer" : {
                    "filter" : [ "romaji_readingform" ],
                    "type" : "custom",
                    "tokenizer" : "sudachi_tokenizer"
                },
                "sudachi_analyzer": {
                    "filter": [],
                    "tokenizer": "sudachi_tokenizer",
                    "type": "custom"
                }
            },
            "tokenizer" : {
                "sudachi_tokenizer": {
                    "type": "sudachi_tokenizer",
                    "mode": "search",
                    "resources_path": "/etc/elasticsearch/config/sudachi"
                }
            }
        }
    }
}

 

インデックスを作成します。 


$ curl -X PUT 'localhost:9200/test_sudachi' -H 'Content-Type: application/json' -d @analysis_sudachi.json
{"acknowledged":true,"shards_acknowledged":true,"index":"test_sudachi"}

 

解析してみます。 


$ curl -X GET "localhost:9200/test_sudachi/_analyze?pretty" -H 'Content-Type: application/json' -d'{"analyzer":"sudachi_analyzer", "text" : "関西国際空港"}'
{
  "tokens" : [
    {
      "token" : "関西国際空港",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "word",
      "position" : 0,
      "positionLength" : 3
    },
    {
      "token" : "関西",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "国際",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "空港",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "word",
      "position" : 2
    }
  ]
}

 

`search mode` が指定されているでA単位とC単位の両方が出力されます。

 

動詞、形容詞を終止形で出力してみます。 


$ curl -X GET "localhost:9200/test_sudachi/_analyze?pretty" -H 'Content-Type: application/json' -d'{"analyzer":"sudachi_baseform_analyzer", "text" : "おおきく"}'
{
  "tokens" : [
    {
      "token" : "おおきい",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    }
  ]
}

 

表記を正規化して出力してみます。 


$ curl -X GET "localhost:9200/test_sudachi/_analyze?pretty" -H 'Content-Type: application/json' -d'{"analyzer":"sudachi_normalizedform_analyzer", "text" : "おおきく"}'
{
  "tokens" : [
    {
      "token" : "大きい",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    }
  ]
}

 

読みを出力してみます。 

$ curl -X GET "localhost:9200/test_sudachi/_analyze?pretty" -H 'Content-Type: application/json' -d'{"analyzer":"sudachi_readingform_analyzer", "text" : "おおきく"}'
{
  "tokens" : [
    {
      "token" : "オオキク",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    }
  ]
}

 

読みをローマ字 (Microsoft IME 風) で出力してみます。

$ curl -X GET "localhost:9200/test_sudachi/_analyze?pretty" -H 'Content-Type: application/json' -d'{"analyzer":"sudachi_romaji_analyzer", "text" : "おおきく"}'
{
  "tokens" : [
    {
      "token" : "ookiku",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    }
  ]
}

そのほか、品詞によるトークンの除外、ストップワードなどが利用できます。

 

アクティビティページへ戻る

本サイトは、快適にご覧いただくためCookieを使用しています。閲覧を続ける場合、Cookie使用に同意したものとします。 Cookieポリシーを表示