Kotz’i’jに恋して14:マルコフ連鎖(マヤ・キチェ語)

 

 

キチェ語のテキストを何点か用意したのでマルコフ連鎖を用いたキチェ語の文章作成を試みた。

ここでは4点紹介する。まずはグアテマラ教育省の絵本数冊の文章をテキストとして採り入れた場合。

 

次にマイクロソフトのサービス・アグリーメント

 

マイクロソフト関連の単語が見られる。次に聖書の一部分(フィリピ人への手紙)から。

 

スペル等が現在一般的に用いられているキチェ語のものと異なる。最後にキチェ族の聖典ポポル・ブフの一部から。

コードは下記の通り。

 

MarkovChain.rb

 

MarkovChain.rb

Rubyにおける文字列分割方法:split & scan

前回Rubyでマルコフ連鎖を用いた文章作成アルゴリズムを書いてみたけど、その際に文章の分割方法に少し苦労したので備忘録として。

英語やスペイン語みたいに単語と単語が空白で分かれている場合のケースを想定。単純に単語毎に分割したい場合は.split(sentence.splitみたいに)を使えばいいけど、今回は一文毎に分割する方法について書いてみる。

例としてフランツ・カフカの「変身(Metamorphosis)」の第二段落を使用(?も含んでいるため)。文章毎に分割するということなので区切り文字としてピリオドとクエスチョンマークを採用。

最初は単純にsplitを使ってこういう風に書いてみた。

結果はこうなる。

しっかり分けられているけど、区切り文字が取り除かれてしまっているのでこれでは使えない。次に試したのが同じsplitメソッドだけど少し修正を加えたもの。具体的にはブラケットの丸括弧(parenthesis)で囲う。

今回はこういう風に出力された。

今回は区切り文字もしっかり含まれているけれど、区切り文字自体も一つの独立した部分として戻された。マルコフ連鎖アルゴリズムでは区切り文字は勿論文章の単語にくっつく形でなければならないのでこれも不十分。

で色々調べた結果、splitではなくscanメソッドを使えることに気付いた。試行錯誤した後、こう書いてみた。

簡単に説明するとブラケット([^])内の文字を除いた文字を全てスキャンし、その省いた文字を区切り文字として利用する仕様。こうすると下記の様な結果を得られる。

取り敢えず、これで必要な結果は得られた。なお、この方法だとどうしても二文目以降の文頭に空白が出来てしまう。これはstripメソッドで解決。

空白がしっかり取り除かれている。入力されたテキストを文に分割することが出来たのでマルコフ連鎖による文章作成の準備が整った!

一応、参考まで今回のコードはこんな感じ。

Kotz’i’jに恋して13:マルコフ連鎖

前回述べた通り、マルコフ連鎖による文章作成のコードを書いてみた。辞書ファイルの保存を言語に関係無く容易に出来る様にするため、統計分析で用いることの多い二次元配列にした。

辞書のサイズが今後増えることを考えればツリー構造にすべきだろうけど、取り敢えず今は単純な2次元配列。

もう出し尽くされた感のあるテーマだけどコードは下の通り。

物凄く単純。これはキチェ語に限らず単語間を空白で話す言語であれば何語にも使える。例としてJuan RulfoのNo oyes ladrar a los perrosを辞書に取り入れてみた。出力結果はこんな感じ。

英語で書かれた「老人と海」を採り入れた場合の出力例。

英語とスペイン語で色んな文章を採り入れて試した結果、ある程度しっかりとしたボット・プログラム、つまり回答をマルコフ連鎖は使い物にならないということ。ベースとしてはマルコフ連鎖は使えるけどある程度文法を考慮した仕様にしたり、キーワードで返答を作成するのであれば、文章の構築方法も頭から書き始める以外の選択肢も必要。それが分かっただけでも収穫かな。

取り敢えず、このコードをTzijonikに取り入れてから改良していこうと思う。

 

 

 

Kotz’i’jに恋して12

 

 

マヤ・キチェ語の人工無脳プログラムTzijonik作成も大分進んできた。今回はユーザーが入力した文章が単語リストに載っている名詞を含んでいる場合、テンプレートとして保存する仕様にしてみた。変更点は次の3つのコードに殆ど含まれている。

Responder.rb

 

Dictionary.rb

 

 

Kotzij.rb

 

プログラムを起動してみる。

会話らしくなってきている様な気がする。今後、単語リストの語彙数を増やしつつ、根気強く会話していけばどんどん良くなる筈。

さて、次はマルコフ連鎖を用いた辞書と返答方法の作成だけど、こちらは今後Javaへの移植も考えると本通りには出来ない。配列の組み方は大体想像出来るので自分なりのフォーマットで作成していくしかないかなぁ。そんなに大変そうでもないけど。そもそも今回も判定方法や基準は結構修正する必要があったし。

しかし、ベイズ統計で触れたマルコフ連鎖にこの分野で出会うことになるとは。。

Kotz’i’jに恋して11

今回の更新でKotz’ijは単語帳にある名詞を認識し、一度入力された名詞がもう一度入力された場合は、初めて入力された時のフレーズを用いる仕様にしてみた。

名詞かどうかの判定は、単語帳に品詞の情報を加えることにより実現。

単語帳に含まれている単語は今のところ全て名詞だけど動詞や前置詞等を保存することももちろん可能。

今回、大幅な追加・変更があったのはやはり辞書関連のコード。名詞を認識するためのメソッドを新たに作成。キチェ語は英語やスペイン語等と同様に単語と単語を空白で離すため、単語の認識自体は楽。

 

Dictionary.rb

プログラムを実行してみる。

少し会話らしくなってきた気がしないでもない。語彙やパターン数を増やしていけば更に良くなるかも。