読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

livedoorReaderのフィードをマルコフ連鎖で作ったワードサラダと入れ換えるGreasemonkeyスクリプト

javascript

0.5の確率でフィードのitemを、それを元にマルコフ連鎖で作ったワードサラダと入れ換える。

javascripter's
gist: 37913 — Gist
にスクリプトを置いた。
インストールすると、フィードのitemが下のような支離滅裂な文章になる。

 MOONGIFT: » PHP開発が変わる!PHP実行環境をクラウド提供「Aptana Studio」:オープンソースを毎日紹介 (Markov)
元記事 | 2時間前
これの恐ろしい所はPHP開発し、実行ができてしまうのが、実行が、そのままAptana Cloudだ。Amazon EC2の実行がAptana Cloudだ。Amazon EC2の恐ろしい所はPHP開発が変わる!PHP実行がAptana Cloudだ。MOONGIFT: そして最近発表されたのだ。Amazon EC2のだ。MOONGIFT: » PHPのだ。Amazon EC2のライバルと言われている点に近い。MOONGIFT: そして最近発表されてしまう
// ==UserScript==
// @name           MarkovLDR
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http://reader.livedoor.com/reader/
// @require        http://chasen.org/~taku/software/TinySegmenter/tiny_segmenter-0.1.js
// ==/UserScript==

function Markov() {
  this._dic = {};
  this._segment = null;
}

Markov.prototype.make = function (source) {
  var segmenter = new TinySegmenter();
  var ary = this._segment = segmenter.segment(source);
  var dic = this._dic;
  for (var i = 0, l = ary.length; i < l; ++i) {
    var word = ary[i % l];
    var next = ary[(i + 1) % l];
    if (word in dic) {
      dic[word].push(next);
    } else {
      dic[word] = [next];
    }
  }
  return this;
};

Markov.prototype.take = function (size) {
  var ary = this._segment;
  var dic = this._dic;
  if (!size) {
    size = ary.length;
  }
  function pickup(ary) {
    return ary[Math.floor(Math.random() * ary.length)];
  }
  var ret = [];
  var current = ary;
  for (var i = 0; i < size; ++i) {
    var s = pickup(current);
    ret.push(s);
    current = dic[s]
  }
  return ret.join('');
};

with (unsafeWindow) {
  LDR.register_hook('before_printfeed', function (feed) {
    if (feed._markov) return feed;
    feed._markov = true;
    feed.items.forEach(function (item) {
      if (Math.random() < 0.5) return;
      item.title += ' (Markov)';
      var div = document.createElement('div');
      div.innerHTML = item.body;
      item.body = new Markov().make(div.textContent).take();
    });
  });
}

参考にしたサイト:
マルコフ連鎖してみた - hitode909の日記