Re:ゼロから始めるML生活

どちらかといえばエミリア派です

GiNZAを使って係り受け解析をやってみる

結構前にGiNZAを使った固有表現抽出で遊んでました。

www.nogawanogawa.com

GiNZAは固有表現抽出の他にも、自然言語処理の様々な機能を備えており、今回はその中の係り受け解析で遊んでみたいと思います。

係り受け解析

係り受け解析とは、文節間の修飾関係を明らかにします。 この説明だけだとあまり良くわかりませんが、図にしてみるとなんとなくわかります。

f:id:nogawanogawa:20200808132508p:plain

どのような修飾関係になっているかのような細かいところまで表示されていますが、要するに、上のような感じで修飾関係を明らかにすることで、単なる自然文の構造を明確化して扱いやすくすることができます。

GiNZAを使って係り受け解析をやってみる

GiNZAは係り受け解析の機能も備わっています。

使い方も結構かんたんで、文をGiNZAに読み込ませるだけで解析してくれて、あとはそれを抽出するだけという流れになります。

実際に使ってみるとこんな感じです。

解析結果を可視化するだけならこんなもんです。簡単ですね。

係り受け解析の結果から文を切り出す

GiNZAを使って係り受け解析ができることはなんとなくわかりましたので、今度は係り受け解析の結果を使って係り受け関係がある箇所を抜き出してみたいと思います。 要するにこんな状況を考えます。

f:id:nogawanogawa:20200808144337j:plain:w300

やりたいこととしては、

  1. ターゲットとなる単語を指定したときその単語に係り元の単語を抽出
  2. 係り元の単語からかかり受けされている一連の単語を抽出

このように、文中に書かれている表現のから関係する単語を抽出するということをやってみたいと思います。

やってみた

やってみるとこんな感じに書けました。

上の中では、「吾輩」をtargetと指定し、その係り元が「猫」となり、そこから係り受け関係を再起的に探索しています。 係り受け関係について、ROOTは係り受け関係の大本になっているので、そこについては探索をやめるというような形で処理を行っています。

係り受け関係はどうやらUniversal Dependencies というプロジェクトで定義されているラベルが使用されているようです。 こちらについては、詳しくは下記の論文などをご参照ください。

https://www.jstage.jst.go.jp/article/jnlp/26/1/26_3/_pdf/-char/ja

結果としては、1文目の「吾輩は猫である」だけが取得できて、期待通りの結果になりました。 特定の単語がどのような文脈で使用されているかを知ることは非常に重要なことで、これによって必要最低限の文脈を取得でき、特定の単語が使用された文脈を逆引きできそうな気がします。

参考にさせていただいた記事

この記事を書くにあたり、下記の記事を参考にさせていただきました。

acro-engineer.hatenablog.com

感想

やってて思い出したんですが、今年の4月に言語処理100本ノックが新しくなりましたね。 その中にも係り受け解析に関する問題があったような。

言語処理100本ノック、やろうと思って完全にサボってました…そのうちちゃんとやります…