クフでダローバルな日記

タフでもグローバルもない

リプするとマルコフ連鎖で一句読む機能を@.haiku_searcherに追加しました

お待たせしました。新機能搭載です。

機能としては、@に「詠んで」を含むリプをすると、その人の過去200ツイートを取得し「一次マルコフ連鎖」を用いて俳句/川柳を作るというものです。ちょっとした人工知能(無能?)的なものだと思ってください。

また、「詠んで」に加えて「ちゃんと」も含むリプをすると「二次マルコフ連鎖」を用いるのでそれなりに文章として成立した俳句が出来るはずです。しかし、生成に時間がかかる、結局普通の俳句探索になりがち、あんまり面白くないという理由から、オススメしません。
こんな感じで、普通の俳句が見つけられやすいです。

もちろん、俳句のルールや季語認定の方法などは通常の偶然俳句ツイートbotのものを流用しています。詳しくはこちら↓
swimath2.hatenablog.com

マルコフ連鎖」と言ってもわからない人も多いかと思いますので、ちょっと解説してみようと思います。ちなみにマルコフ連鎖はしゅうまい君(@)や圧縮新聞(@)などでも使われているそうですね。
専門的に習ったわけでは全くなく、ただネット上の情報から知っただけの生半可な知識なので、間違いがあれば指摘していただけると幸いです。

マルコフ連鎖」とは

まず、「マルコフ連鎖」のwikipediaを見てみると

マルコフ連鎖とは、確率過程の一種であるマルコフ過程のうち、とりうる状態が離散的(有限または可算)なもの(離散状態マルコフ過程)をいう。
...
各時刻において起こる状態変化(遷移または推移)に関して、マルコフ連鎖は遷移確率が過去の状態によらず、現在の状態のみによる系列である。

とあります。要するに「過去どんな変化をしてきたかを気にせず、次どうなるかが今どうなっているかだけで決まる流れ」ということですかね。

まだまだわかりづらいと思うので、実際の日本語を例に解説してみます。
我輩は猫である。吾輩の名前は猫だ。猫だ。」
という文章を考えてみましょう。(文章として正しいか微妙ですが、マルコフ連鎖では文章の意味までは立ち入らないのであまり気にしないでください。)
この文章を形態素解析(品詞分解)してみると「我輩/は/猫/で/ある/。/吾輩/の/名前/は/猫/だ/。/猫/だ/。/」というふうに分解できます。

例えば「吾輩」という言葉の後に来るのは「は」か「の」。「で」のあとに来るのは「ある」だけ。というように調べていきまとめると、次のようになります。(矢印の先が後に来うる品詞)

f:id:SWIMATH2:20150320061854p:plain

この図に、各品詞の出現回数(「我輩」なら2、「猫」なら3)と、それぞれの品詞から次の品詞になる確率(「猫」が3回出たうち次の品詞が「で」となるのは1回、「だ」となるのは2回なので、それぞれの確率は1/3,2/3となります。(赤字))を書き込んだ図が下図となります。

f:id:SWIMATH2:20150320081304p:plain

これがマルコフ連鎖での「状態遷移図」というものであり、この図に従ってある状態から次にどうなるかを確率的に選ぶことが出来るわけです。

この説明じゃまだわからない人も多いかと思いますが、さらにグラフィカルにわかりやすくしたものがあったので紹介させていただきます。
Wokashi: 形態素解析からのマルコフ連鎖を可視化してみた


ちなみに、二次マルコフ連鎖とは一つ前の単語だけでなく、2つ前の単語まで含めた分類をします。
例えば一時マルコフ連鎖では「猫」のあとは「で」が1/3、「だ」が2/3でしたが、二次マルコフ連鎖では「は/猫」のあと「で」が1/2、「だ」が1/2、「。/猫」のあとは必ず「だ」のように、更に細かい分類をします。

細かい分類・分析をするため、一次マルコフ連鎖に比べより日常の言葉が生成されやすいのですが、分岐する方法が少ないということは生成される文章のパターンが少ないということなので、俳句となるものが見つかりづらいという欠点があります。

haiku_searcherの動き

botでは、この図に従って色々な動き方を試し、俳句となるものを見つけます。「スタート地点」を特に決めていないので、色々な品詞から調べ始めます。こんな感じで↓

f:id:SWIMATH2:20150320081346j:plain

ついでに言っておくと、ここでは俳句を探すのに「深さ優先探索」というものを行っています。今回はマルコフ連鎖がメインなので説明は省きますが、アルゴリズムとかに興味ある人は調べてみてください。
ちなみに僕はアルゴリズムとか全く得意じゃないので効率のいい手段が思いつきません。なんか良いのがあったら教えてください。(実装するとは言ってない)

おわりに

せっかく新機能をつけておいてアレなんですが、最近botのツイートが増えすぎてかなり頻繁に規制されているようなので、返信が来ない時は暫く時間を置いてからもう一回リプすると反応してくれるかもしれません。すみません。

っていうか、このbotrubyで書いてherokuで動かしているんですが、同じIPアドレスの二つのappに対してツイート規制が共有されるらしく、どうにか出来ないもんかって悩んでおります。(Twitter::Error::Forbidden: User is over daily status update limit. がめっちゃ出まくります。)何か解決策をご存じの方がいれば教えてくださいお願いします。

それから、緑の卵アイコンという何となく和風なものがたまたま出たのでそのまま使っていますが、せっかくだしアイコンも変えたいのでアイコン募集してます。自分で作るかもですが。フラットデザイン()。

今回の新機能追加にあたってはマルコフ連鎖について解説されている多くのページを参考にしましたが、ソースなどを特に参考にさせていただいたページを挙げておきます。
ググればもっと詳しい情報もでると思うので、興味を持った方はぜひ。
マルコフ連鎖でTwitter BOTを作る - FLYING
マルコフ連鎖で日本語をもっともらしく要約する - ザリガニが見ていた...。
マルコフ連鎖 - Wikipedia