【what is this】前報は、GiNZAの係り受け解析の利用でしたが、今回はさらに、「ルールベースマッチング」を試してみました。例題として、植物の花に関する簡単な記述から、その花についてのwhat flower?(どんな色や形なのか)とhow does it bloom?(どのように、どんな位置に、いつ咲く)という質問に自動応答できるよう、必要情報(単語)を抽出してみました。今回の例文では、概ね成功でしたが、多様な表現を含む自然言語処理の難しさも改めて感じました。
■花の記述文からの"what flower?", "how does it bloom?"の抽出方法
解析対象例文は以下の8件 (p1)〜(p8) としましたが、これらは、参考資料[1]に掲載されている植物の記述文を参考に作成しました。各文に含まれる、花に関するwhat flower?と、how does it bloom?とに対応する単語を抽出したいのです。
その方法として、まず、その文に、「'花'を右端に含む単語が存在し、その後方のどこかに述語が来る」というパタンを見つけます。そのために、以下のように指定して、GiNZAのルールベースマッチングを用います。
#パタンの定義とMatcherへの追加 ==================
matcher = Matcher(nlp.vocab, validate=True)
pat_flw =[{'TEXT':{'REGEX' : '.*花$'}},{'OP':'*'},{'DEP':'ROOT'},]
matcher.add('flw', None, pat_flw)
パターンにマッチした単語を元に、その係り受け(子供と親)の種類と、係り先の単語の品詞に応じて、whatとhowへの帰属を決める必要があります。述語(ROOT)としては、今回は"咲く"にマッチするか否か調べるのですが、正規化(レンマ化)表現を利用することで、"咲かせる"や"咲けば"などもマッチするようにしています。(具体的なPythonプログラムは、この記事の末尾に示します。)
■"what flower?", "how does it bloom?"の答えとなる単語の抽出結果
結論を以下に示します。特徴的なこととして、上述のとおり、述語として、"咲かせる", "咲く", "咲けば"が、全てマッチしていて適切に処理されています。また、"花"の前方(左側)の単語が必ずしもwhatではなく、howに属する場合があることにもご注目下さい。例えば、(P1)では、"枝先に" は、"花" の前方にあるのですが、これは当然ながら、howに属する結果となっています。
なお、(p1)での "濃紫色で" は、whatではなくhowに属する結果となりました。これは、係り受け解析が、"濃紫色で→咲か" という、微妙ですがちょっと不自然と感じられる結果を示したことに起因します。希望としては、 "濃紫色で筒状の" は、 "濃紫色の筒状の" の意味として解釈して欲しかったです。
(P1) 枝先に濃紫色で筒状の花を次々咲かせる。
-> what [筒状の, 花を]
-> how [枝先に, 濃紫色で, 次々, 咲かせる。]
(P2) 紅色等の唇形花を穂状に咲かせる。
-> what [紅色等の, 唇形花を]
-> how [穂状に, 咲かせる。]
(P3) 暗紫色の壺形の花を冬咲かせる。
-> what [暗紫色の, 壺形の, 花を]
-> how [冬咲かせる。]
(P4) 葉腋に青紫色の唇形花が2つ咲く。
-> what [青紫色の, 唇形花が]
-> how [葉腋に, 2つ, 咲く。]
(P5) 紅紫色の蝶形花が総状に咲く。
-> what [紅紫色の, 蝶形花が]
-> how [総状に, 咲く。]
(P6) 数年すると肉質の花が咲く。
-> what [肉質の, 花が]
-> how [数年すると, 咲く。]
(P7) 淡紅色の花が10月ごろ咲く。
-> what [淡紅色の, 花が]
-> how [10月ごろ, 咲く。]
(P8) 初冬に小さな花が咲けば良い。
-> what [小さな, 花が]
-> how [初冬に, 咲けば良い。]
■上記例文のGiNZAによる単語間の係り受け
上記例文のうち、(p2), (p4), (p8) に対する、GiNZAの単語間係り受け解析結果を図示します。下記の抽出プログラムは、ここに示されている係り受けの種類(acl:名詞の節修飾子, compound:複合名詞, mark:接続詞, aux:助動詞, 等々)と品詞の種類に対応して動作するようになっています。
なお、"唇形花"、"蝶形花"、"4弁花"などはユーザ辞書に登録してあるので、ひとつの単語として認識されています。
■"what flower?", "how does it bloom?"の抽出プログラム
最後に、ご参考までに、今回の抽出プログラム(Python)主要部を以下に示します。このなかで、テキストファイルHanaNoSakikata.txtに、上記の花の記述文が入っているとします。
■感想
花に関する短い例文8件については、概ね想定どおりの結果が得られました。もちろん、上記の方法でうまく行かない例文は多数存在します。人間が話し、理解できる自然言語の世界はとらえきれない多様性を呈するように感じます。しかし、今回の結果には勇気付けられた気がしました。
[1] 渡辺坦:植物の名前を探しやすい デジタル植物写真集
http://plantidentifier.ec-net.jp/