プログラミング的思考(5)データの形

前回はエラーについての話でした。根気とリスク管理が大事だよという話でした。今回はデータについての話です。

プログラミングではプログラムを作りますが、そのプログラムは様々です。私が今作っているのは文章を処理するプログラムなのですが、文章には色んな形があります。例えば読点があったりなかったり、改行があったりなかったり、段落があったりなかったり、など数え始めるとキリがありません。

例えば文章をデータとして解析する時、段落や改行は大きな要素です。例えば一段落毎に解析する場合は一段落毎にデータを分割するプログラムが必要ですし、一行ごとに解析する場合は一行毎に分割するプログラムが必要です。

では例えば文節毎に分析する場合はどうすればよいでしょう。もちろん先述の例に従えば文節毎に分割するプログラムが必要になります。しかしこれは容易ではありません。なぜならコンピュータに文節を区切るルールを教えてあげなければならないからです。文節は「て」や「で」で切る、「ね」を入れてみるなどの方法で理解できるという風に習うかと思います。しかしコンピュータにとってどの「て」が文節を区切る「て」なのかわかりません。これはコーパスなどを使えば不可能ではないようですが、精度や難易度が問題になります。

ではどうすればいいかというと、先にデータを文節で区切ってしまえば解決します。手作業なので勿論めんどうです。しかし自然言語処理の仕組みを理解して使いこなすまでの労力を考えると、今回だけの場合は手作業の方が楽です。

別の例として、ページの情報はどうすればよいでしょうか。例えばページ末にページ番号を書くとします。しかしそうすると、ページ番号が本文なのかページ番号なのかを区別するのがコンピュータにとっては難しいです。では1ページの行数を先に数えておき、その行数毎に1ページと認識させるのはどうでしょう。残念ながら古写本は1ページの行数が同じ本の中でもバラバラです。

結局どうしたのかというと、全ての行末に数字を付すことにしました。ページ末ではない行末には0を、ページ末の行末には1を付します。そしてコンピュータには毎行最後の文字を確認させて、0ならばページ末でない、1ならばページ末であると認識させます。もし行末に0や1が書かれている文章でも、その後ろに0や1を付すので問題ありません。1が来たらカウンターを+1するようにしておけば、ページ番号やページ数のデータも知ることができます。

このように、プログラミングでは目的のためにどのようなプログラムを作るかということだけでなく、プログラムを上手く作るためにどのようなデータを用意すればよいかということも考えます。これは文章解析のために文章というデータが必要だというわけではなく、その文章を上手く解析するためにどんな形のデータにする必要があるかということです。

これを一般化するとどうなるでしょうか。これはなかなか具体例が難しいです。例えば卵焼きを作りたいとします。その時、フライパンが必要となります。そのためにフライパンを買わなければなりません。この時、卵焼きを作るということを考えると、小さい四角のフライパンを買うのが良いと考えられます。しかしせっかく買うのであれば他のものにも使えるように大きなフライパンを買うのも良いかもしれません。このように今後どうするのか、ということを先に考えて、それに合った方法を選ぶというのが、ちょっと似ているかなぁと思います。

具体例が悪かったので上手く伝わらない気がしますが、データそのものの形を先に考えるのって今まであまり意識したことがなかったので書いてみました。今後この考え方を上手く使えるようになったらいいなと思います。

この記事が気に入ったらサポートをしてみませんか?