2017年6月27日火曜日

JUMAN で自然言語処理(3) - 高砂的解決法

前回の記事のやり方では行き詰ってしまったので、新しい手法を考えます。
問題は括弧を付ける際、どこからどこまでつければよいのかわからない点にありました。
解決策として、ブロック単位で数字および演算子を管理します。


1. 複数リストでブロックを管理

前回のプログラムでは難しい入力の例として「1足す1に1と1を足したものを掛ける」というものを考えます。これまでの仕様だと、演算子は出てきた順番に解釈されてしまうために出力は「1 + 1 + 1 * 1」となってしまい支離滅裂です。これを解消するために複数リストによる管理を考案しました。基本的な部分は前回と変わりませんが、括弧をつけるために助詞でゴチャゴチャやっていたところを消し、助詞が来た時点で管理を切り替えます。
高砂の手順解説
 という感じになります。四つの連続した1ではなく、2つずつの塊として1を得ることができているのがわかると思います。あとは同インデックス(図でいうと上下の対応する数字と演算子)でまず式を作って、最後にブロック同士の演算を行いたいのですが、このままだと対応する演算子が存在しないブロックがあるため、これを修正しなければなりません。
そもそもなぜ対応する演算子のないブロックが生まれたのかといえば、助詞で過剰に分解しているからです。なぜ過剰に分解されてしまったのかといえば、演算を表す助詞とブロック分解の助詞を混同してしまったためでしょう。しかしこの「演算を表す助詞」と「ブロック分解の助詞」は簡単に区別できるものではなく、例えば「に」や「を」は両方に使えます。
そのためこの辺めんどくさかったのですが、「に」、「を」その他の登場時点で演算子リストが空か否かで分岐させれば解決するかと思います。
そんなこんなでうまくすると、出力「(1+1) * (1+1)」を得ることができました。

2. 以下略

今回はコードなしでの覚書だったのでだいぶわかりにくい気もします。
初の試みとして Git で管理してたコードを公開しておきます。なんかちょっと怖い
https://gitlab.com/takasa5/Fomfom
jumantest.py が単リスト管理版で、fomfom.py が複数リスト管理版です。あとは知りません
人に見られることを意識してきれいなコードが書けるといいですね。

0 件のコメント:

コメントを投稿