愛するKNPの使い方を紹介する

  • 33
    いいね
  • 0
    コメント

社内のエンジニア向けにKNPの使い方と見方を解説する機会があったので、ついでの機会に。と記事にしてみた。

KNPの啓蒙活動をしているので、ぼくの愛するKNPをみなさんにも使っていただけたら幸いです。

この記事を読んでわかること

  • KNPって何?
  • KNPって何をしてくれるの?
  • KNPの出力の見方は?
  • マニュアルとかないの?

この記事を読んでわからないこと

  • KNPってどうやって動いているの?
  • 太郎って誰?

KNPって何?

一言でいうと、「日本語構文解析器」です。

日本語文の構文を構造化してくれます。

最近では構文解析では飽き足らず、いろいろと機能がつきすぎて、「統合日本語文解析システム」の様相をていしています。

ちなみにKNPは(Kurohashi Nagao Parser)の略称とのことです。

インストール

偉大な先人たちがインストール方法を紹介してくれているので、このインストール方法に従いましょう。

Ubuntu 16.04 LTSにKNPをインストールする方法
HomebrewでOSXに構文解析システムKNPを入れる

ちなみにソースからコンパイルする時には、よく「TinyCDBが見つからないエラー」が発生します。

こちらも偉大な先人の方法を参考にしましょう。
気ままなブログ
shirayu net

基本的な使い方

juman(形態素解析器)にパイプで連結して使います。

コマンドの書き方は

echo "文" | juman | knpです。

% echo "太郎は歌舞伎町の風俗街で夜の帝王と呼ばれている。" | juman | knp 
# S-ID:1 KNP:4.2-04a482f DATE:2016/01/06 SCORE:-27.50426
            太郎は──┐ <体言>
歌舞伎町の──┐   │ <体言>
      風俗──┤   │ <体言>
              街で──┤ <体言><Wikipediaエントリ:風俗街>
      夜の──┐   │ <体言>
            帝王と──┤ <体言>
            呼ばれている。<用言:動><格解析結果:ガ/太郎;ニ/-;ト/帝王;デ/街;カラ/-;ノ/->
EOS

構文をツリー構造にして出力してくれます。構文木を愛でましょう。

ツリーに表示される単位は「文節」です。

述語の文節には<用言:動><格解析結果:ガ/太郎;ニ/-;ト/帝王;デ/街;カラ/-;ノ/->というタグが表示されます。

この文では、述語は「呼ばれている」の1つだけです。

述語をもう1つ増やしてみましょう。

% echo "太郎は歌舞伎町の風俗街で豪遊しているので、夜の帝王と呼ばれている。" | juman | knp 
# S-ID:1 KNP:4.2-04a482f DATE:2016/01/06 SCORE:-39.34690
                    太郎は──┐ <体言>
歌舞伎町の──┐       │ <体言>
      風俗──┤       │ <体言>
              街で──┐   │ <体言><Wikipediaエントリ:風俗街>
        豪──┐   │   │ <体言>
                遊──┤   │ <体言>
            しているので、──┤ <用言:動><格解析結果:ガ/-;ヲ/遊;デ/街>
              夜の──┐   │ <体言>
                    帝王と──┤ <体言>
                    呼ばれている。<用言:動><格解析結果:ガ/太郎;ト/帝王;ノ/->
EOS

<用言:動>のタグがついた項目が増えました。

KNPでは用言の文節すべてに対して、<用言:動>のタグをつけ、掛かる格を表示してくれます。

体言の文節のうち、Wikipediaのエントリに該当した場合は<Wikipediaエントリ:風俗街>のタグを表示してくれます。 

応用的な使い方

解析結果から情報をひっこぬく

では、解析結果を活用していきます。

解析結果の見方

解析結果を表示するにはknpコマンドの引数に-tabをつけます。
例えばecho "太郎は歌舞伎町の風俗街で夜の帝王と呼ばれている。" | juman | knp -tab

すると、

# S-ID:1 KNP:4.2-04a482f DATE:2016/01/06 SCORE:-27.50426
* 5D <文頭><人名><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><正規化代表表記:太郎/たろう><主辞代表表記:太郎/たろう>
+ 6D <文頭><人名><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><名詞項候補><先行詞候補><SM-人><SM-主体><正規化代表表記:太郎/たろう><解析格:ガ>
太郎 たろう 太郎 名詞 6 人名 5 * 0 * 0 "人名:日本:名:45:0.00106 疑似代表表記 代表表記:太郎/たろう" <人名:日本:名:45:0.00106><疑似代表表記><代表表記:太郎/たろう><正規化代表表記:太郎/たろう><漢字><かな漢字><名詞相当語><文頭><自立><内容語><タグ単位始><文節始><固有キー><文節主辞>
は は は 助詞 9 副助詞 2 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 2D <地名><助詞><連体修飾><体言><係:ノ格><区切:0-4><正規化代表表記:歌舞伎町/かぶきちょう><主辞代表表記:歌舞伎町/かぶきちょう>
+ 3D <地名><助詞><連体修飾><体言><係:ノ格><区切:0-4><名詞項候補><先行詞候補><SM-場所><係チ:非用言格解析||用言&&文節内:T解析格-ヲ><正規化代表表記:歌舞伎町/かぶきちょう>
歌舞伎町 かぶきちょう 歌舞伎町 名詞 6 地名 4 * 0 * 0 "代表表記:歌舞伎町/かぶきちょう 地名:日本:東京都:地区" <代表表記:歌舞伎町/かぶきちょう><地名:日本:東京都:地区><正規化代表表記:歌舞伎町/かぶきちょう><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><固有キー><文節主辞>
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 5D <SM-場所><BGH:街/がい|街/まち><デ><助詞><体言><係:デ格><区切:0-0><格要素><連用要素><正規化代表表記:風俗/ふうぞく+街/がい?街/まち><主辞代表表記:街/がい?街/まち><主辞’代表表記:風俗/ふうぞく+街/がい?街/まち>
+ 3D <BGH:風俗/ふうぞく><文節内><係:文節内><体言><名詞項候補><先行詞候補><正規化代表表記:風俗/ふうぞく>
風俗 ふうぞく 風俗 名詞 6 普通名詞 1 * 0 * 0 "代表表記:風俗/ふうぞく カテゴリ:抽象物" <代表表記:風俗/ふうぞく><カテゴリ:抽象物><正規化代表表記:風俗/ふうぞく><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始>
+ 6D <SM-場所><BGH:街/がい|街/まち><デ><助詞><体言><係:デ格><区切:0-0><格要素><連用要素><一文字漢字><名詞項候補><先行詞候補><正規化代表表記:街/がい?街/まち><Wikipedia上位語:場所/ばしょ><Wikipediaエントリ:風俗街><解析格:デ>
街 がい 街 名詞 6 普通名詞 1 * 0 * 0 "代表表記:街/がい 漢字読み:音 カテゴリ:場所-その他" <代表表記:街/がい><漢字読み:音><カテゴリ:場所-その他><正規化代表表記:街/がい?街/まち><品曖><ALT-街-まち-街-6-1-0-0-"代表表記:街/まち 漢字読み:訓 カテゴリ:場所-その他"><品曖-普通名詞><原形曖昧><Wikipedia上位語:場所/ばしょ:4-5><Wikipediaエントリ:風俗街:4-5><漢字><かな漢字><名詞相当語><自立><複合←><内容語><タグ単位始><文節主辞>
で で で 助詞 9 格助詞 1 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 4D <BGH:夜/よ|夜/や|夜/よる><時間><強時間><時数ノ><助詞><連体修飾><体言><一文字漢字><係:ノ格><区切:0-4><正規化代表表記:夜/よ?夜/や?夜/よる><主辞代表表記:夜/よ?夜/や?夜/よる>
+ 5D <BGH:夜/よ|夜/や|夜/よる><時間><強時間><時数ノ><助詞><連体修飾><体言><一文字漢字><係:ノ格><区切:0-4><名詞項候補><係チ:非用言格解析||用言&&文節内:T解析格-ヲ><正規化代表表記:夜/よ?夜/や?夜/よる>
夜 よ 夜 名詞 6 時相名詞 10 * 0 * 0 "代表表記:夜/よ 漢字読み:訓 カテゴリ:時間" <代表表記:夜/よ><漢字読み:訓><カテゴリ:時間><正規化代表表記:夜/よ?夜/や?夜/よる><品曖><ALT-夜-や-夜-6-1-0-0-"代表表記:夜/や 漢字読み:音 カテゴリ:時間"><ALT-夜-よる-夜-6-10-0-0-"代表表記:夜/よる 漢字読み:訓 カテゴリ:時間"><品曖-普通名詞><品曖-時相名詞><原形曖昧><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞>
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 5D <SM-主体><SM-人><BGH:帝王/ていおう><ト><助詞><体言><係:ト格><並キ:名:&ST:5.0><区切:1-4><並列タイプ:AND><格要素><連用要素><正規化代表表記:帝王/ていおう><主辞代表表記:帝王/ていおう><並列類似度:-100.000>
+ 6D <SM-主体><SM-人><BGH:帝王/ていおう><ト><助詞><体言><係:ト格><並キ:名:&ST:5.0><区切:1-4><並列タイプ:AND><格要素><連用要素><名詞項候補><先行詞候補><正規化代表表記:帝王/ていおう><解析格:ト>
帝王 ていおう 帝王 名詞 6 普通名詞 1 * 0 * 0 "代表表記:帝王/ていおう カテゴリ:人 ドメイン:政治" <代表表記:帝王/ていおう><カテゴリ:人><ドメイン:政治><正規化代表表記:帝王/ていおう><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞>
と と と 助詞 9 格助詞 1 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* -1D <BGH:呼ぶ/よぶ><文末><態:受動><〜られる><句点><用言:動><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><動態述語><正規化代表表記:呼ぶ/よぶ><主辞代表表記:呼ぶ/よぶ>
+ -1D <BGH:呼ぶ/よぶ><文末><態:受動><〜られる><句点><用言:動><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><動態述語><正規化代表表記:呼ぶ/よぶ><用言代表表記:呼ぶ/よぶ+れる/れる><時制-未来><主題格:一人称優位><格関係0:ガ:太郎><格関係3:デ:街><格関係5:ト:帝王><格解析結果:呼ぶ/よぶ+れる/れる:動4:ガ/N/太郎/0/0/1;ニ/U/-/-/-/-;ト/C/帝王/5/0/1;デ/C/街/3/0/1;カラ/U/-/-/-/-;ノ/U/-/-/-/->
呼ば よば 呼ぶ 動詞 2 * 0 子音動詞バ行 8 未然形 3 "代表表記:呼ぶ/よぶ" <代表表記:呼ぶ/よぶ><正規化代表表記:呼ぶ/よぶ><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞>
れて れて れる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 タ系連用テ形 14 "代表表記:れる/れる" <代表表記:れる/れる><正規化代表表記:れる/れる><かな漢字><ひらがな><活用語><付属>
いる いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:いる/いる" <代表表記:いる/いる><正規化代表表記:いる/いる><かな漢字><ひらがな><活用語><表現文末><付属>
。 。 。 特殊 1 句点 1 * 0 * 0 NIL <英記号><記号><文末><付属>
EOS

なんだか大変なことになりそうですね。安心してくさい、履いてますよ解説します。

解析結果の構造

KNPの解析結果は3層の概念で構成されています。(開発者が何と呼んでいるかわからないので、勝手に名前をつけています)

  1. 文節層
  2. タグ層
  3. 形態素層

文節層がトップで、形態素層が一番下です。

画像の赤枠で囲ってある部分。*記号で始まっているのが、文節層です。

スクリーンショット 2016-01-06 13.53.47.png

次に、画像の赤枠で囲ってある部分。+記号で始まっているのが、タグ層です。

スクリーンショット 2016-01-06 13.53.47.png

最後に、画像の赤枠で囲ってある部分。行頭に何も記号がないのが、形態素層です。

スクリーンショット 2016-01-06 13.53.47.png

タグ層と文節層には番号が表示されていますが、この2つは別のIDです。

表示されている番号は係り先のindex番号です。該当する行のindex番号ではありません。

文のトップノード(すべてのノードの親ノード)には-1Dと表示されます。

スクリーンショット 2016-01-06 14.00.10.png

層ごとに出力される内容

  • 文節層: ノードの集約情報だと思えば十分だと思います
  • タグ層: ノードの意味情報が表示されます。格の情報や、Wikipediaエントリ情報などもこの層に表示されます
  • 形態素層: 単語(厳密には形態素で、形態素≠単語ですが)の情報が表示されます。

便利ツール

解析結果の一覧をさらに解析して(ややこしい)、情報抽出をしやすくするバインディングが公開されています

Perl言語用とPython用があります。

Perl用は使ったことがありませんが、Python用のバインディングは層の構造を忠実にオブジェクトにしてくれます。

このあたりも先人がまとめているので、このコードを見ながらやってみてください。

固有表現抽出をする

固有表現とは、「特定の分野だけで出てくる専門用語」みたいなものです。

固有表現は複数の単語が組み合わさった場合のみに、意味を成すので、情報抽出や構文解析の時には非常にやっかいな存在です。

KNPでは固有表現の抽出もできます。

コマンドはecho "文" | juman | knp -tab -ne-crf

例えば、奈良の僻地に奈良先端科学技術大学院大学というFラン大学があるのはご存知でしょうか?

このやっかいな固有表現にもKNPは対応してくれます。

% echo "奈良先端科学技術大学院大学はNaistと呼ばれている。" | juman | knp -tab -ne-crf -tree
# S-ID:1 KNP:4.2-04a482f DATE:2016/01/06 SCORE:-19.37007
奈良──┐                     <体言><NE内:ORGANIZATION>
        先端──┐                 <体言><NE内:ORGANIZATION>
                科学──┐             <体言><NE内:ORGANIZATION>
                        技術──┐         <体言><NE内:ORGANIZATION>
                              大学院──┐     <体言><NE内:ORGANIZATION>
                                      大学は──┐ <体言><NE:ORGANIZATION:奈良先端科学技術大学院大学><Wikipediaエントリ:奈良先端科学技術大学院大学>
                                Naistと──┤ <体言>
                                      呼ばれている。<用言:動><格解析結果:呼ぶ/よぶ+れる/れる:動5:ガ/N/大学/5/0/1;ヲ/U/-/-/-/-;ニ/U/-/-/-/-;ト/C/Naist/6/0/1>
EOS

<NE内:ORGANIZATION>とタグがつけられ、この固有表現のタイプまでを当ててくれています。

-tabモードにしてみましょう。

% echo "奈良先端科学技術大学院大学はNaistと呼ばれている。" | juman | knp -tab -ne-crf      
# S-ID:1 KNP:4.2-04a482f DATE:2016/01/06 SCORE:-19.37007
* 2D <SM-主体><SM-場所><SM-組織><BGH:大学院/だいがくいん+大学/だいがく><文頭><組織名><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><正規化代表表記:奈良/なら+先端/せんたん+科学/かがく+技術/ぎじゅつ+大学院/だいがくいん+大学/だいがく><主辞代表表記:大学/だいがく>
+ 1D <文節内><係:文節内><文頭><人名疑><地名疑><体言><名詞項候補><先行詞候補><正規化代表表記:奈良/なら><NE内:ORGANIZATION>
奈良 なら 奈良 名詞 6 人名 5 * 0 * 0 "人名:日本:姓:574:0.00049 疑似代表表記 代表表記:奈良/なら" <人名:日本:姓:574:0.00049><疑似代表表記><代表表記:奈良/なら><正規化代表表記:奈良/なら><品曖><ALT-奈良-なら-奈良-6-4-0-0-"代表表記:奈良/なら 地名:日本:県"><地名:日本:奈良県:市><ALT-奈良-なら-奈良-6-4-0-0-"代表表記:奈良/なら 地名:日本:奈良県:市"><品曖-人名><品曖-地名><漢字><かな漢字><名詞相当語><文頭><自立><内容語><タグ単位始><文節始><固有キー><NE:ORGANIZATION:head>
+ 2D <BGH:先端/せんたん><文節内><係:文節内><体言><名詞項候補><先行詞候補><正規化代表表記:先端/せんたん><NE内:ORGANIZATION>
先端 せんたん 先端 名詞 6 普通名詞 1 * 0 * 0 "代表表記:先端/せんたん カテゴリ:場所-その他" <代表表記:先端/せんたん><カテゴリ:場所-その他><正規化代表表記:先端/せんたん><漢字><かな漢字><名詞相当語><自立><複合←><内容語><タグ単位始><NE:ORGANIZATION:middle>
+ 3D <BGH:科学/かがく><文節内><係:文節内><体言><名詞項候補><先行詞候補><正規化代表表記:科学/かがく><NE内:ORGANIZATION>
科学 かがく 科学 名詞 6 普通名詞 1 * 0 * 0 "代表表記:科学/かがく カテゴリ:抽象物 ドメイン:科学・技術" <代表表記:科学/かがく><カテゴリ:抽象物><ドメイン:科学・技術><正規化代表表記:科学/かがく><漢字><かな漢字><名詞相当語><自立><複合←><内容語><タグ単位始><NE:ORGANIZATION:middle>
+ 4D <SM-動作><BGH:技術/ぎじゅつ><文節内><係:文節内><体言><名詞項候補><先行詞候補><正規化代表表記:技術/ぎじゅつ><NE内:ORGANIZATION>
技術 ぎじゅつ 技術 名詞 6 普通名詞 1 * 0 * 0 "代表表記:技術/ぎじゅつ カテゴリ:抽象物 ドメイン:科学・技術" <代表表記:技術/ぎじゅつ><カテゴリ:抽象物><ドメイン:科学・技術><正規化代表表記:技術/ぎじゅつ><漢字><かな漢字><名詞相当語><自立><複合←><内容語><タグ単位始><固有修飾><NE:ORGANIZATION:middle>
+ 5D <SM-主体><SM-場所><SM-組織><BGH:大学院/だいがくいん><文節内><係:文節内><体言><名詞項候補><先行詞候補><正規化代表表記:大学院/だいがくいん><NE内:ORGANIZATION>
大学院 だいがくいん 大学院 名詞 6 普通名詞 1 * 0 * 0 "代表表記:大学院/だいがくいん カテゴリ:場所-施設 ドメイン:教育・学習;科学・技術" <代表表記:大学院/だいがくいん><カテゴリ:場所-施設><ドメイン:教育・学習;科学・技術><正規化代表表記:大学院/だいがくいん><漢字><かな漢字><名詞相当語><自立><複合←><内容語><タグ単位始><NE:ORGANIZATION:middle>
+ 7D <SM-主体><SM-場所><SM-組織><BGH:大学院/だいがくいん+大学/だいがく><組織名><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><名詞項候補><先行詞候補><正規化代表表記:大学/だいがく><NE:ORGANIZATION:奈良先端科学技術大学院大学><Wikipedia上位語:中核/ちゅうかく><Wikipediaエントリ:奈良先端科学技術大学院大学><解析格:ガ>
大学 だいがく 大学 名詞 6 普通名詞 1 * 0 * 0 "代表表記:大学/だいがく 組織名末尾 カテゴリ:場所-施設 ドメイン:教育・学習" <代表表記:大学/だいがく><組織名末尾><カテゴリ:場所-施設><ドメイン:教育・学習><正規化代表表記:大学/だいがく><Wikipedia上位語:中核/ちゅうかく:0-5><Wikipediaエントリ:奈良先端科学技術大学院大学:0-5><漢字><かな漢字><名詞相当語><自立><複合←><内容語><タグ単位始><文節主辞><NE:ORGANIZATION:tail>
は は は 助詞 9 副助詞 2 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 2D <ト><助詞><体言><係:ト格><並キ:名:&ST:5.0><区切:1-4><並列タイプ:AND><格要素><連用要素><正規化代表表記:Naist/Naist><主辞代表表記:Naist/Naist><並列類似度:-100.000>
+ 7D <ト><助詞><体言><係:ト格><並キ:名:&ST:5.0><区切:1-4><並列タイプ:AND><格要素><連用要素><名詞項候補><先行詞候補><正規化代表表記:Naist/Naist><解析格:ト>
Naist Naist Naist 名詞 6 普通名詞 1 * 0 * 0 "疑似代表表記 代表表記:Naist/Naist 品詞変更:Naist-Naist-Naist-15-1-0-0" <疑似代表表記><代表表記:Naist/Naist><正規化代表表記:Naist/Naist><品詞変更:Naist-Naist-Naist-15-1-0-0-"疑似代表表記 代表表記:Naist/Naist"><品曖-その他><未知語><記英数カ><英記号><記号><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞>
と と と 助詞 9 格助詞 1 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* -1D <BGH:呼ぶ/よぶ><文末><態:受動><〜られる><句点><用言:動><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><動態述語><正規化代表表記:呼ぶ/よぶ><主辞代表表記:呼ぶ/よぶ>
+ -1D <BGH:呼ぶ/よぶ><文末><態:受動><〜られる><句点><用言:動><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><動態述語><正規化代表表記:呼ぶ/よぶ><用言代表表記:呼ぶ/よぶ+れる/れる><時制-未来><主題格:一人称優位><格関係5:ガ:大学><格関係6:ト:Naist><格解析結果:呼ぶ/よぶ+れる/れる:動5:ガ/N/大学/5/0/1;ヲ/U/-/-/-/-;ニ/U/-/-/-/-;ト/C/Naist/6/0/1>
呼ば よば 呼ぶ 動詞 2 * 0 子音動詞バ行 8 未然形 3 "代表表記:呼ぶ/よぶ" <代表表記:呼ぶ/よぶ><正規化代表表記:呼ぶ/よぶ><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞>
れて れて れる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 タ系連用テ形 14 "代表表記:れる/れる" <代表表記:れる/れる><正規化代表表記:れる/れる><かな漢字><ひらがな><活用語><付属>
いる いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:いる/いる" <代表表記:いる/いる><正規化代表表記:いる/いる><かな漢字><ひらがな><活用語><表現文末><付属>
。 。 。 特殊 1 句点 1 * 0 * 0 NIL <英記号><記号><文末><付属>
EOS

固有表現の範囲は形態素層に表示されます。

固有表現が始める形態素に<NE:ORGANIZATION:head>というタグがつき、固有表現が終了する形態素に<NE:ORGANIZATION:tail>がつきます。

さらに、タグ層には<NE:ORGANIZATION:奈良先端科学技術大学院大学>というタグが出現します。

がんばってさがしてみてください。

固有表現に付与されるタグはORGANIZATION, PERSON, LOCATION, ARTIFACT, DATE, TIME, MONEY, PERCENTがあります。 

マニュアルとか