2017年6月17日土曜日

JUMAN で自然言語処理(2) - 数式表示プログラムFom-fomを作る

自然言語処理の課題は終わらせて提出しました……。
 これからどうブラッシュアップするのか(そもそもするのか)が問題です。
だいたいどんなプログラムができたのかを紹介します。



1.日本語表現から数式へ変換する

 日本語の多様な表現を一つしかない数学的な式へ変換したいと思いました。
ようは「2-1」を表すために「2引く1」「2から1を引く」「1を2から引く」のような日本語表現がありますが、これら日本語を入力とし、適切に処理し、数式の出力を得たいということです。小学生低学年レベルの四則演算の簡単な数式のみ扱うこととします。
コードはあまりにもお粗末なので公開はせず、どのように考えていったかをメモしたいと思います。
いつもと違う感じで図を書いてみる
はじめはこのように考えました。いたって単純で、入力をJUMANによって分かち書きさせ(図は略してますが本当はもっと細かく分類されます)、一行ずつ読みながらif文で式の構成要素なら変換し、それを出力するというもの。しかしこれだと「2から1を引く」に対して「21-」と返してしまうなあと思い、
 数字と演算子を別のリストで管理し、出力するときに交互に持ってくることにしました。数式って数字と演算子が交互に来るからな~という単純な動機です。お察しかもしれませんが、これでは「1を2から引く」に対して「1-2」と返してしまいます。
 今回一番自然言語処理やってるっぽい部分ですが、助詞に着目することで計算順を解決します。今の例なら「から(格助詞)」が計算表現に現れる場合はその直前の数字が引き算の被減数(引かれる数)にあたるので、これを先頭にもってくればよさそうです。

こんな感じで自分でうまくいかなくなるような例を考えて作っていくやり方でした。新しい例を思いついては入力し、うまくいかなければつじつまの合うようにプログラムを変えて…の繰り返しです。つじつまを合わせるということだけにこだわるのではなく、日本語文法に忠実にするようにするとうまくいきやすかったです。当然ですが。

2.助詞による解決例

当然引き算の三例しかやってないのでダメな部分がたくさんあります。例えば足し算なら「1と2を足す」というのならうまくいきますが「1と1と2を足す」のような入力ならどうでしょうか?日本語としておかしくないですが、このプログラムだと「足す」から演算子+を一個持ってくるだけで終わってしまいます……。ということで助詞「と」をカウントする変数を作り、「足す」が現れた場合は「と」の数だけ出すようにしました。これも助詞による解決ですね。
一番難しいのが括弧が現れるような表現です。「1足す2をしてそれに2をかける」「4から1を引いて3で割る」というようなやつですね。現状だと計算順序を無視した式を出してしまうのでこれも助詞やらで解決したいです。計算順序を表現するためには、「区切る」ような日本語が要りますので、それらを見つけたら括弧を出すようにしました(動詞のテ形、読点、格助詞「に」、接続助詞「から」)。
しかし困ったことに、これで括弧を閉じる場所がわかっても始める場所がわかりません。
現時点では括弧が先頭につくような場合にしか対処できません……。
if文の条件を増やすだけでは限界があった
このやり方ではこの辺が限界なような気がします……。
後方の括弧に僕がどのように対応したかは次回の記事で書こうと思います。

0 件のコメント:

コメントを投稿