Skip to content

Instantly share code, notes, and snippets.

@KOBA789
Created November 30, 2010 13:07
Show Gist options
  • Save KOBA789/721646 to your computer and use it in GitHub Desktop.
Save KOBA789/721646 to your computer and use it in GitHub Desktop.
マルコフ連鎖的な
/*
* =====node.jsでマルコフ連鎖とか=====
*
* 汚いソースコードだけどちゃんと文は作れるみたい。
* 同ディレクトリに text.txt を作って適当な文章を書くといいです。
* 吉野家コピペとかTwitterから拝借したつぶやきとか。
* ※そのうちTwitterからつぶやきを拝借するプログラムを書くかもしれませんが期待しないでください
*
* 自分のソフトウェアに組み込んじゃってもいいし、変更してもいいです。
* あ、でもまったく変更せずに「わしが育てた」はナシで。
* 改良して「これ、元が糞だったから俺が改良したんだぜ!(キリッ」は「大丈夫だ、問題ない」。
*
* ちなみに node-mecab が必要なので、
* Link: https://github.com/KOBA789/node-mecab
* を 'git clone' して 'node-waf configure build' して、
* 出来上がった './build/default/mecab.node' をこのソースと同じディレクトリにコピーしてください。
*
* ということで以下、コメント一切なしの汚いコードです
*/
var MeCab = require('./mecab'),
fs = require('fs');
function getRandom (maxVal) {
return Math.floor(Math.random() * maxVal);
}
function pickUpItem (obj) {
if (obj instanceof Array) {
return obj[getRandom(obj.length)];
} else if (obj instanceof Object) {
var array = Array();
for (key in obj) {
array.push(key);
}
return arguments.callee(array);
}
}
var text = String(fs.readFileSync('text.txt')).split('\n');
var tree = Object();
var wakati = new MeCab.Tagger("-O wakati");
for (var l = 0; l < text.length; l++) {
var words = wakati.parse(text[l]).trim().split(' ');
for (var i = 0; i < words.length; i++) {
var p0 = words[i] || null;
var p1 = words[i + 1] || null;
var p2 = words[i + 2] || null;
if (!tree[p0]) {
tree[p0] = Object();
}
if (!tree[p0][p1]) {
tree[p0][p1] = Array();
}
tree[p0][p1].push(p2);
}
}
var output = String();
var n0 = pickUpItem(tree);
var n1 = pickUpItem(tree[n0]);
output += n0;
while (true) {
var n0_ = n0;
var n1_ = n1;
n0 = n1;
n1 = pickUpItem(tree[n0_][n1_]);
output += n0;
if (!n1) break;
}
console.log(output);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment