Kneser-Ney スムージングによる文書生成

少し前に Kneser-Ney スムージングの性能を測ってみた記事 を書いたが、今回は Kneser-Ney スムージングによる n-Gram 言語モデルで文書生成を行なってみた。
スクリプトはこちら。


適当なテキストファイル(複数可)を入力すると、1行1文書の訓練データとみなして Kneser-Ney スムージング付きの n-Gram 言語モデルを学習後、文書を生成してファイルに出力する。
オプションもいくつか指定できるが、-h でヘルプを出すか、ソースを読むかしてもらえば。


与えられた文書の確率を Kneser-Ney で計算するには、ディスカウントによって生じる正規化係数の補正を求めるために N1+ などのちょいややこしい値をあらかじめ計算して保持しておかないといけないが、文書生成の場合は単語(あるいは文字)空間全体をなめるときにその補正項も求まるから、頻度さえ保持しておけば良い。このため、実装がとても簡単になっている。
確率を計算するところも再帰的に書けばとてもコンパクトになるので、言語モデルの実装は40行程度に収まっている。
なお、modified KN ではなく、素の KN になっている。これは、前回の記事で modified KN は確かに性能向上するが劇的なものではなく、コストを考えると実用的には KN で十分だろうという感触によっている。


というわけで、気になるところは実際に生成される文書だろう。
まずは困ったときの青空文庫夏目漱石「吾輩は猫である」 からルビと制御用の表記を除外したテキストを作り、上のスクリプトに入力している。
文字 7-Gram 言語モデルを構築して、生成した文書例がこちら。

「なかなかでもいいからちょっとどけたまえと云って大騒ぎさ」
「大和魂! と叫んで日本人が肺病やみのような咳をした」
「こっちがいをやる事はない。辞職をする勇気もない。薬缶は洩るに相違ない。吾輩はほかに能もない者だと思った。こんな真似をして出来得る限り早く御免蒙るに若くはないと決心した。しかし黒の子分になって鼠以外の御蔭で女郎を見せたんだがね」と迷亭も少し気に返えした。
「だっていいじゃありませんか」
「そうでございましょうがねえ」「駄目だ駄目だ」「出てこねえ」「落ちねえはずはあるまい。気の毒だと云う念が胸一杯になって鳴いていると、本当に面白いのよ。最初にはね巡査の服を脱いで、肉を脱いで石鹸で磨き上が、その内のものは湯を使でものだなどと狂ってくる。こんなものを見せびらかしたんだって、考えると女は罪な者でありました」
「偏屈になるかも知れません。こいつの間にかみんな椅子へ腰をかけて、ふわふわする」
「落第の候補者寒月君はヴァイオリンを買ったかい」
「あんな声を出してわあわあ云う。それでまず脈をとるためのこの質問に対して相談をしているか一向要領を得んと云う顔付をする。加之こう知名のつもりでやった芝居かも分らんじゃないか」と主人は無雑作に迷亭に聞く。


あー、そうだよねえ、「吾輩は猫である」ってこんなんだよねえ。
意外だったのは、"「" と "」" の対応がそこそこ取れていること。たかだか文字 7-gram だからその対応が取れる見込みなど本来全くないのだが、日本語の並びにその対応の分布が隠されているということだろうか。
とはいえ、やっぱり完全ではないし、そもそも地の文と会話文では表現も当然違ってくるわけだから、言語モデルをそれぞれ作ってあげればより良い結果が得られそうな雰囲気はある。難しくはないから、興味があればチャレンジしてみるといいかも。


もういっちょ、今度はツイート。
メンションや URL などを削った約 17000ツイートから同じく 7-gram 言語モデルを構築&文書生成した例。

そうやってつけてYahoo!オークション出まくってましたね でも、なんでだろう・・・・ ・・・・・
ソムリエ的な何かを描くので誰でもいいからRTくれた人に手書きメッセージ書く おやすみ( ;´Д`)
俺もつけようwwwwwwwwwwwww 中距離殲滅フォーメーションて、これからも楽しく拝見しております
でも嫌な気持ちになるらしいからすごいせどりツールが配信された。 最近しんどいわ、
おっすごい!→10,000ベルを必ずGET!激レア以上がザクザク とびびらせる to FUKUSHIMA 、国は金を出す
新歓行きたいものですな
そういやギョウオオオオオオオオブォオオオオオオオオオオオオオオアアアーーーーーーー(((o(*゚▽゚*)o)))
楽しみよおおおおおおおおおおおよろしくでござる〜おやすいみ〜〜〜(。◠‿◠。) わら
なにこれwwwこれからもよろしくねヾ(*´∀`*)ノ
よろしくでーす ( ´∀`∩);:
アイドルキックオーバーロー中wwwwwwwwwwwwwwwww┏(^o^)┓男のじゃ、凄く驚いた。
教えてくれない…。
久々にニコニコでペルソナ4のシーン集見てないから後悔して死にそうだった///////////


ふつー……あ、いや、普通でいいんだった。
普通で、かつ訓練データと異なる文書が生成されている。
ただ、幅広い表現のためにはもうちょっとデータが多いほうがよさそうだ。


このスクリプトは扱う文字種を特に制限していない。
というわけで最後に英語。Jane Austen の "Emma", "Northanger Abbey", "Persuation", "Pride and Prejudice", "Sense and Sensibility" を訓練データとし、文字 9-gram 言語モデルを構築している。
生成された文書は長いものが多いので、短いものからピックアップ。

"And this was the only yesterday, and Jane on her, in all probably ceased to Emma.
The day came, and to any fears, which one; she had spent and clever; but his remark on motives.
He had not think I might have been mortification of his neighbourhood, the regiment, which ought to be with him. There were; but that it is," whispering to get it! But I am always hoped our bestowed on me.
"He is a fool?"
"It will not be very heart again about her modesty, economy, took her hearing. She liked the two esteem. That was he perhaps be brought up to all his views on Sir John, who has never allow them to their evening."
"Are you must go to the subject would do her goodwill, and by them, had ever dared no explanation, a most unwilling to inquired after you."
"I must stay to everything for happiness; attending them, he was her mind was but a mixture of him for so many farther distressed him.


日本語より1文字あたりの情報量が少なく、不自然なところもやはりないわけではないが、それなりに英語っぽいと言えるのでは。
内容は置いといて(苦笑)。