2007年12月27日

日本語で計算するプログラム

先日の「MeCabで日本語インタプリタ」以来文章の中で考えているだけで、プログラムそのものを改良していなかったので、日本語計算インタプリタをちょっと拡張してみた。まだまだなんだけれど、前回より少しまともになった。前回は決められた述語に、数値を入れるだけのことしかできなかったけれど、その数値の所に再帰的に文を使えるようにした。一行に続けて他の文も書けるし、漢数字も解釈できるようにした。

実用的なプログラムではないので、これが人の役に立つというわけでもない。とにかく地味なプログラムだ。ただ前回公開したものよりも、こちらのほうが作りたいものを表現できているので、今回も公開することにする。いままで書いてきた仕様はまだ満たしていないし、ずれている。全体像が見えてくるのはまだまだ先のことになるだろう。

主な操作法を書いておくと;

実行するとDOS窓が立ち上がる。漢字入力が中心なので、ALT+半角/全角キーで切り替える。「たす」「ひく」「わる」「かける」「割った余り」「くっつける」といった言葉を助詞をつけて書いて、エンターを押すと、その答えを表示してくれる。今回から、述語を組み合わせて使えるようになったので、「1と2を足した値に3を足す」とか目的語の部分に既定の述語を使った名詞節をおくことができるようになった。日本語らしく接続するために「〜した値」「〜した答え」「〜した結果」という表現なども使えるようにした。文末の表現としても「〜ます」「〜して、」といった表現もできる。「命令形」もたいてい受け入れてくれる。こういうのはmecabによる解析のおかげだが、単純なことしかやっていないのでもっと工夫すれば正確な表現もできるようになるだろう。思い通りの語形変化を選んでくれないので、mecabの辞書も独自のものを作った方が処理が楽になるだろう。

前の文の結果を参照する言葉として、「その結果」「その答え」などの述語が使える。結果を受けるこの言葉は、同じ行で使ってもいいし、エンターした後、次の行で使ってもいい。なお、計算は整数演算だけしか対応していない。唯一「くっつける」は文字列演算のサンプルだ。

制御構造を文の形で定義できるので、案外単純な仕組みで作れるだろう。きっと一般的なプログラミング言語よりは楽だろう。そういうところはLispの親戚らしい特徴だと思う。お気楽にPythonで作っているのも楽な理由だろうけど。

クラスをもっと徹底的に使って作るべきなのだろうが、今は構造体的なものとしてしか使っていない。どんなデータ構造が必要なのかを実際プログラムを作りながら探している段階なので、全体像が分かってからクラスの中にクラスのメンバになるべき関数を移動させていくつもりだ。それにいくつかのファイルに分割していかないとどんどん分かりにくくなってる。一つのファイルだけで処理系を描ききることができれば、それはそれで面白いかもしれないが。


ためしに次の文章を打ちこむと、

千を十で割った値を三で割ります。その答えに三をかけて、一をその結果に足します。

結果が出力されて、次のようになる。
*** 解析内容 ***
1000 を 10 で 割る を 3 で 割る 。
その答え に 3 を かける
1 を その結果 に 足す 。
****************
*** 翻訳内容 ***
述語: 割る
+述語: 割る
++定数: 1000
++定数: 10
+定数: 3
述語: かける
+述語: その答え
+定数: 3
述語: 足す
+定数: 1
+述語: その結果
****************
結果: 33
結果: 99
結果: 100

出力される内容は、解析内容、翻訳内容、そして結果の順。解析内容はMecabを利用して、このプログラムに必要な分かち書きにした結果。翻訳内容は、これをプログラムに翻訳したもので、データの階層構造が描かれている。そして結果は、これはコマンドラインで入力された「文」の数だけ表示される。結果が三つ出力されるのは、上の文章が三つの文から成り立っていることを示している。目的語として使われていない述語の結果が並んでいる。「その答え」「その結果」という言葉の値は、それぞれここに並んでいる一つ前のものが使われているのがわかる。


次回公開するのは、変数の利用、論理演算、リスト演算、ラムダ式の定義、算術式の解釈など、それなりのものが使えるようになってから、だからたぶん一月以上先になるだろう。


■ダウンロード
無保証。必要な環境は前回と同じ。

Pythonスクリプトソース:
nihongo.py

py2exeで作った実行形式を固めたもの:
nihongo.zip




拍手する
posted by takayan at 02:26 | Comment(0) | TrackBack(0) | 日本語プログラミング | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。