Kuromoji 形態素解析を理解する

2016年03月03日(編集2016年03月03日)
このエントリーをはてなブックマークに追加

形態素解析に使用する辞書について理解します。
環境はKuromoji, javaはoracle jdkを利用します。

環境

  • Windows8.1
  • oracle jdk version 1.8.0_71
  • Eclipse version Luna Service Release 2 (4.4.2)
  • kuromoji version 0.7.7

内容

初心者向け

形態素解析辞書とは

形態素解析は、対象言語の文法の知識を、形態素解析用辞書 (品詞等の情報付きの単語リスト)で用意し、これをもとに自然言語を分解、品詞を判定しています。)

Kuromojiがサポートしている辞書は以下になります。(version0.7.7)

  • IPADIC (2.7.0-20070801)
  • IPADIC NEologd (2.7.0-20070801-neologd-20151224)
  • JUMANDIC (7.0-20130310)
  • NAIST jdic (0.6.3b-20111013)
  • UniDic (2.1.2)
  • UniDic Kana Accent (2.1.2)
  • UniDic NEologd (2.1.2-neologd-20151224)

デフォルトの形態素解析

Kuromojiのデフォルトの辞書だけでは、思い通りの単語に分割できないことが多々あります。
例として、以下のような文を形態素解析します。

{project_folder}/src/main/java/App.java

public class App 
{
    public static void main( String[] args )
    {
        Tokenizer tokenizer = Tokenizer.builder().build();
        for (Token token : tokenizer.tokenize("近松門左衛門の曽根崎心中は名作だ。")) {
          System.out.println(token.getSurfaceForm() + "	" + token.getAllFeatures());
        }
    }
}
        

コードを実行すると、以下のように形態素解析されます。

Eclipse Console

近松	名詞,固有名詞,人名,姓,*,*,近松,チカマツ,チカマツ
門左衛門	名詞,固有名詞,人名,名,*,*,門左衛門,モンザエモン,モンザエモン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
曽根崎	名詞,固有名詞,地域,一般,*,*,曽根崎,ソネザキ,ソネザキ
心中	名詞,サ変接続,*,*,*,*,心中,シンジュウ,シンジュー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
名作	名詞,一般,*,*,*,*,名作,メイサク,メイサク
だ	助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
。	記号,句点,*,*,*,*,。,。,。
        

形態素に分解されました。
しかし、「近松門左衛門」が「近松」「門左衛門」、「曽根崎心中」が「曽根崎」「心中」となっています。

検索時ならこれでも問題ありませんが、単語としてはひとつの単語として認識させたいところです。
このような時には、自分で辞書を作成して単語として認識させることができます。

辞書の作成

自分で定義する辞書を作成します。プロジェクトフォルダ配下にuserdict_ja.txtというファイルを作成します。
文字コードはUTF-8にします。

{project_folder}/userdict_ja.txt

#ユーザ辞書
近松門左衛門,近松門左衛門,チカマツモンザモン,カスタム人名
曽根崎心中,曽根崎心中,そねざきしんじゅう,作品名
        

kuromojiで利用する辞書のフォーマットは以下のようになります。

{project_folder}/userdict_ja.txtのフォーマット

<text>,<token 1> ... <token n>,<reading 1> ... <reading n>,<part-of-speech tag>
        

part-of-speechは日本語に直すと品詞です。上記のサンプルuserdict_ja.txtだと「カスタム人名」「作品名」に当たります。

kuromojiを実行

上記で作成したuserdict_ja.txtの辞書を読み込む以下のコードを実装します。

{project_folder}/src/main/java/App.java

public class App 
{
    public static void main( String[] args )
    {
        Builder builder = Tokenizer.builder();
        try {
            builder.userDictionary("userdict_ja.txt");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Tokenizer tokenizer = builder.build();
        for (Token token : tokenizer.tokenize("近松門左衛門の曽根崎心中は名作だ。")) {
            System.out.println(token.getSurfaceForm() + "	" + token.getAllFeatures());          
        }
    }
}
        

Run As  →  Java Applicationでコードを実行します。

Eclipse Console

近松門左衛門	チカマツモンザモン,カスタム人名
の	助詞,連体化,*,*,*,*,の,ノ,ノ
曽根崎心中	そねざきしんじゅう,作品名
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
名作	名詞,一般,*,*,*,*,名作,メイサク,メイサク
だ	助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
。	記号,句点,*,*,*,*,。,。,。
        

作成した辞書通りに形態素に分解されました。

「近松」「門左衛門」が「近松門左衛門」、「曽根崎」「心中」が「曽根崎心中」として単語認識するように変更されています。

まとめ

形態素解析は、検索エンジンを利用する時だけなく、機械学習を学ぶときにも役立ちます。
今後、エンジニアには基礎スキルとして要求されると思います。しっかりと学習しておきましょう。

タグ検索で調べてみよう

Kuromoji