ラベル GiNZA の投稿を表示しています。 すべての投稿を表示
ラベル GiNZA の投稿を表示しています。 すべての投稿を表示

2022年2月4日金曜日

GiNZAによる係り受け解析とルールベースマッチングの活用

【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)

 パターンにマッチした単語を元に、その係り受け(子供と親)の種類と、係り先の単語の品詞に応じて、whathowへの帰属を決める必要があります。述語(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/

2022年2月1日火曜日

GiNZAによる係り受け解析とユーザ辞書の活用

【what is this】自然言語処理の応用として、以前、係り受け解析器CaboChaを用いた記事(論文)を書きました。その後しばらく間があったのですが、今回は、GiNZAの係り受け解析を調べました。そのなかで、解析対象文章の種類によっては、GiNZAに含まれる解析器spaCyのSudachiPyユーザ辞書機能が非常に有効であることも確認しました。

続編はこちらです

GiNZAによる単語間/文節間係り受け解析
 CaboChaは、文節間係り受けを与えますが、GiNZA4.05に含まれるspaCy2.3はそうではなく、単語間係り受けを提供します。しかし、GiNZAには、ginza.bunsetu_spansという関数があって、spaCyのSpanとして文節を取り出せます。そして、文節bに対するb.leftsを利用すると、文節間係り受け解析が可能になります。このb.leftsですが、京都大学の安岡孝一教授の解説[1]には、以下のように書かれていました。

b.leftsは、文節bから左向き(文頭方向)に出ている単語係り受けのうち、文節の外に出ていくものの一覧だが、これを逆向きに解釈すれば、文節間の係り受けとして扱える。」

 最初にこれを読んだ時、これって何を意味するのか分からず困りました!そこで、簡単な例文について、図1のように、ステップを踏んでトレースした結果、「なるほど!」と納得できました。

(図はクリックすると拡大されます)
 図1は、例文「葉は虎柄の長い卵形である。」の解析結果です。黒矢印は単語間係り受けで、青枠は関数ginza.bunsetu_spansから得られる文節です。そして、赤矢印が、上記の「文節bから左向き(文頭方向)に出ている単語係り受けのうち、文節の外に出ていくものの一覧」となっていることが分かります。この後は、赤矢印の先の単語を含む文節を、関数 ginza.bunsetu_span (末尾にsが付かない) で得て、赤矢印と逆方向に青矢印を付ければ、文節間係り受けとなります。その結果は以下のとおりです。
 葉は→ 卵形である。
 虎柄の→ 卵形である。
 長い→ 卵形である。

別の文章も文節間係り受け解析(with ユーザ辞書)
 他のいくつかの例文に対しても行ってみたいと思います。ここで、参考文献[2]にある以下の記述が気になりました:
「GiNZAの係り受け解析の深層学習モデルは、UD Japanese BCCW v.2.6から新聞系文書を除外したもので学習しています。」

 ということは、一般の話し言葉などには強いが、新聞記事や専門用語を含む学術文書などの「堅い文章」にはあまり強くないということでしょうか?そこで、「堅い文章」に属すと思われる、渡辺坦氏の「デジタル植物写真集」[3]から引用した以下の2つの文章について検討します。
 [例文2] 根生葉は倒被針形で、濃紫色の唇形花が葉腋に咲く。
 [例文3] 2回3出複葉をつけ、花弁状萼が白い花を十字形に開く。

[例文2]の係り受け解析
 上記例文2の解析結果を以下に示します。この文には、植物の専門用語「倒披針形」が含まれています。GiNZA(spaCy)の標準辞書のまま解析すると、下図のとおり、形態素解析でこの用語がバラバラにしか認識されません。それが原因で、文節に対するleftsの集合に不具合(誤り)が生じ、その結果として文節間係り受け解析がうまく行きません。

 次に、この「倒披針形」をユーザ辞書に登録して解析した結果が以下の図です。形態素解析でこの単語が認識され、最終的に妥当な文節間係り受けが得られました。


[例文3]の係り受け解析

 例文3につても同様です。この文には、植物の専門用語「2回3出複葉」が含まれています。標準辞書のままでは、例文2の場合と同じく、うまく行きません。


 そこで、この「2回3出複葉」もユーザ辞書に登録して解析した結果が以下の図です。形態素解析でこの用語が認識され、最終的に妥当な文節間係り受けが得られました。素晴らしい!

SudachiPyユーザ辞書の活用
 上記のとおり、ユーザ辞書登録の効果は絶大です。GiNZAでは、SudachiPyの辞書が使われています。高品質で大規模な辞書のようですが、今回のような特定の専門用語などは載っていない場合も当然あるでしょう。それを補うためのユーザ辞書登録は比較的容易です。今回は試行のため、登録したのは以下3件に過ぎませんが。

2回3出複葉,4786,4786,5000,2回3出複葉,名詞,普通名詞,一般,*,*,*,ニカイサンシュツフクヨウ,2回3出複葉,*,*,*,*,*
2回3出複葉,4786,4786,5000,2回3出複葉,名詞,普通名詞,一般,*,*,*,ニカイサンシュツフクヨウ,2回3出複葉,*,*,*,*,*
倒被針形,4786,4786,5000,倒被針形,名詞,普通名詞,形状詞可能,*,*,*,トウヒシンケイ,倒被針形,*,*,*,*,*

 最初の2件は同じ内容ですが、用語のなかの数字(2と3)が半角でも全角でもOKとするためです。第2項〜第4項の数値は、接続IDやコストですが、標準的な値であり、最適値かどうかは分かりません。

 例文を引用した参考資料[3]には、植物の葉や花の形状や付き方に関する専門用語約160件が説明されています。それら全てをユーザ辞書登録することはさほど困難ではありません。それができれば、この資料にある解説文の係り受け解析の精度は格段に向上するはずです。それを利用したアプリケーションも色々考えられます。

補足
 
当方がこれまでに書いた、「自然言語処理」に関するブログ記事は参考資料[4]に纏めてあります。素人の拙文ですが、ご参考にしていただければ幸いです。

参考資料

[1] yasuokaの日記: 単語間・文節間の係り受け解析システムとしてのGiNZA v4.0.0
https://srad.jp/~yasuoka/journal/641184/

[2] 布留川英一:BERT/GPT-3/DALL-E 自然言語処理・画像処理・音声処理 人工知能プログラミング実線入門、ボーンデジタル、2021年8月

[3] 渡辺坦:植物の名前を探しやすい デジタル植物写真集
http://plantidentifier.ec-net.jp/

[4] 山本富士男:https://www.foyo.pro/自然言語処理

2020年7月2日木曜日

係り受け解析は格フレーム辞書に強く依存するらしい

【要旨】3つの係り受け解析器CaboCha、KNP、GiNZAを試用してみて、素人ながら分かってきたことが少しあります。それをここ簡単に書き留めておきたい。

3種類の日本語係り受け解析器
 十分使い込んだとは言えませんが、これまでに、以下の3つの係り受け解析器を利用させていただきました。いずれも、なんらかの自動構築の格フレーム辞書を利用していると思われます。(その具体的な違いは小生には分かりませんが。)

 ・CaboCha(参考資料[1])
 ・KNP (参考資料[2])
 ・GiNZA(参考資料[3])

2つの例文についての解析結果の比較
 今回は、以下の2つの例文について、3つの解析器の解析結果を比較してみます。

例文(ア):葉は柄の長い卵形である。
例文(イ):葉は柄の長い卵形である。


 まず、例文(ア)に対する結果をみます。KNPは、「葉柄の長い」という係り受け関係をきちんと捕らえていますが、CaboChaとGiNZAはいずれも、「長い卵形」と判断しており、妥当ではありません。


 次に、例文(イ)です。これは例文(ア)に出現する"葉"が"虎"に変わっただけです!それだけの違いであれば、係り受け解析結果は変わらないのでは?と思いませんか。結果はどうでしょうか。(ア)の場合の判定結果(○×)が逆転してしまいました。すなわち、KNPは、「虎柄の長い」という不自然な係り受け関係を採用してしまいました。


格フレーム辞書が解析精度を左右する
 上記の解析は、一例(2つの例文のみの)に過ぎません。しかしながら、人間が理解するのと同じく(自然な)係り受け関係を見つけるには、格フレーム辞書(詳しくは参考資料[4][5]を参照)が重要な役割を果たしているようです。参考資料[5]には、「Webから自動構築する膨大な格フレーム辞書は、蓄積が高まれば効果が出てくる反面、どうしても雑音も入ってしまうので、結果的に解析精度は頭打ちになるだろう」という趣旨の記述があります。共感できるように思います。

Google翻訳はどうなっているか
 最後に、上の2つの例文をGoogle自動翻訳(英訳)にかけてみました。妥当な英文を生成するには、適切な係り受け解析が必要なはずです。結論として、2例文とも、妥当な英文になっています。このことから、相当に優れた格フレーム辞書を使っていることが推察できます。

 Google翻訳結果:
例文(ア):葉は柄の長い卵形である。
 -> The leaves are oval with long petioles.
例文(イ):葉は柄の長い卵形である。
 -> The leaves are long ovals with a tiger pattern.

参考資料
[1] CaboCha/南瓜: Yet Another Japanese Dependency Structure Analyzer
[2] 日本語構文・格・照応解析システム KNP 
[3] GiNZA - Japanese NLP Library
[4] 杉本徹、岩下志乃:Javaで学ぶ自然言語処理と機械学習、オーム社、平成30年9月発行
[5] 山本和英:箱庭言語処理のための格フレーム辞書構築の意義