週末文書

とりあえず、まぁ、週末です。

句構造規則の導入を考える

現在取り組んでいる「詩(のようなもの)を作るプログラム」、なんとか見られる日本語を出力するようにしたいのですが、なかなか難しいのでちょっと整理して考えてみました。

やりたいこと

  • 辞書に登録された語からランダムにピックアップして組み合わせことで、「詩(のようなもの)」を生成したい。
  • ランダムな語の組み合わせの結果生じる不自然さから「おもしろさ」を見いだせないか、という試み。
    • このため、日本語として意味が通る必要はない。ただし、明らかに日本語として読めない出力は避けたい。
  • 語の組み合わせは、5拍・7拍といった単位で行う。
    • 五七調・七七調といったリズムで「詩のようなもの」らしく見えるのではないかという考え

困っていること

  • 語のランダムな組み合わせが文法的に不自然になる。日本語として読めない。
    • 語の組み合わせの意味的な不自然さにはこだわらない。
    • 語の組み合わせは5拍・7拍といった単位で行うので、数語の組み合わせ(文節)の範囲で文法的不自然さがなければいい。

解決のアイデア

この「やりたいこと」の実現と「困っていること」の解決のアイデアとして、完全にランダムに語を組み合わせるのではなく、

日本語の文法のルールに則った品詞の組み合わせを選び、その品詞の語をランダムに選んで組み合わせる

ということを考えました。

ここでいう「文法のルール」を専門的に言うと「句構造規則」と言うようです。

句構造規則とは

統語論において、文の構成素構造を産み出す規則、およびそれについての研究を指す。
句構造規則は、自然言語の文を構成素に分解し、隣接する語句同士の意味的および機能的関係(句構造)を表そうとする方法論である。

以上、wikipedia:句構造規則Wikipedia)より

少し調べてみた範囲では、日本語の句構造規則を整理し、プログラムとして利用可能としたものは見つかりませんでした。となると、自分で作るしかないとなります。

プログラムの作成方針

「詩(のようなもの)を作る」プログラムには、語を選択してくる元となる辞書が必要です。

今回、最初に辞書作成プログラムを作りました。作成した辞書作成プログラムは、下記の流れで動くものです。

  1. 保存済みの辞書ファイルがあれば、それを開き登録語のリスト(配列)として読み込む。
  2. 起動時の引数で指定されたテキスト・ファイルを開く。
  3. ファイル内のテキストを読み込み、1行(改行コードまで)づつのブロック=行ブロックのリスト(配列)にする。
  4. 行ブロックは複数の文を含む可能性がある。そこで、行ブロックごとに「。」をセパレータとして分割して文とし、文のリスト(配列)を作る。
  5. 文毎にMeCab分かち書きし、語ごとのリスト(配列)を作る。一つの語は、語そのもののテキスト(表層形)の他、品詞分類や活用形、よみがなを含む。
  6. よみがなが存在し、登録語リストに存在しない=未登録の語について、語の表層形、品詞、よみがなの長さ(モーラ数)を辞書への登録要素として登録語リストに追加する。
  7. すべての行ブロックを処理後、アウトプット要素リストをpickle形式でダンプする。

このプログラムに、連続する語の品詞分類の情報を句構造規則集として保存する機能を追加しようと思います。

  • 分析する語の連続の個数は、生成する際に組み合わせる語の数が少ない(五拍、七拍)ので、2語(バイグラム)としてみます。
  • 句構造規則集に保存する情報は、MeCabの分析で得られる下記の情報とすることにします。
    • 品詞、品詞分類(3段階)、活用に関する情報(2種類)
  • また助詞と助動詞については、前の語の意味で可能な組み合わせが異なる気がするので、語自体(表層形)も保存することにします。
  • 整理すると、句構造規則集の1エントリー(許される語の並び方)は下記の構造ということになります。
    • { {品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用形, 活用型}, {品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用形, 活用型} }


とりあえず、この機能を辞書作成プログラムに追加し、詩の生成プログラムで登録されたルールを利用するようにしてみようと思います。