Created
November 30, 2010 13:07
-
-
Save KOBA789/721646 to your computer and use it in GitHub Desktop.
マルコフ連鎖的な
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* =====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