Skip to content

Instantly share code, notes, and snippets.

@mironal
Created June 20, 2012 06:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mironal/2958500 to your computer and use it in GitHub Desktop.
Save mironal/2958500 to your computer and use it in GitHub Desktop.
形態素解析からのマルコフ連鎖
<script type="text/javascript" src="js/tiny_segmenter-0.1.js" charset="UTF-8"></script>
<script type="text/javascript" src="js/kumono_ito.js" charset="UTF-8"></script>
<script>
$(function(){
/* 形態素解析される文章(text)は、kumono_ito.js内に定義されている. */
/*形態素解析機 */
var segmenter = new TinySegmenter();
/* 解析 & 形態素解析した結果が入る */
var segs = segmenter.segment(text);
/* マルコフ連鎖によって作られた文章が入る. */
var make_sentence = [];
var endMark = /。$/;
/* マルコフ連鎖の次数は、とりあえず2次で固定 */
/* 最初に選ばれる単語を決めるための乱数 */
var firstIndex = Math.floor(Math.random() * (segs.length - 2)); /* 2次で固定なので、2引く、n次の場合はnを引く */
/* 形態素の中から、2個選ぶ */
make_sentence.push(segs[firstIndex]);
make_sentence.push(segs[firstIndex + 1]);
while(true){ /* 無限ループ */
/* 次に続くことが可能な単語達が入る */
var words = [];
/* 簡単化の為、1個ずつ回す */
for(var i = 0; i < (segs.length - 2); i++){
/* 2個前 */
if( ( make_sentence[make_sentence.length - 2] === segs[i]) &&
/* 1個前 */
( make_sentence[make_sentence.length - 1] === segs[i + 1]) ){
/* 2個とも一致していたら、候補に入れる. */
words.push(segs[i + 2]);
}
}
if(words.length > 0){
/* 1個以上の候補があった場合、候補の中からランダムに1個選んで文の中に追加 */
r = Math.floor(Math.random() * words.length);
/* 追加 */
make_sentence.push(words[r]);
/* 毎回表示してみる. 階段上につながっていくのが分かる. */
console.log("make_sentence = " + make_sentence.join(""));
/* 画面へ書き出し */
$('#result').append($('<p>').text(make_sentence.join("")).hide().fadeIn("slow").focus());
/* 終了文字(。)だったら終了. */
if(endMark.test(words[r])){
break;
}
}else{
/* 候補がない(0個)だったら終了. */
break;
}
}
});
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment