普通のWebページの文を"読めてしまう"文に変換するRubyスクリプト

今朝読んでおもしろかった話題。
http://www.asks.jp/users/hiro/59059.html
http://www.itmedia.co.jp/news/articles/0905/08/news021.html

確かに読める!


しかし上のページで取り上げられているのはたまたま読みやすかっただけで、一般的にはそうじゃないかもしれない。
そこで任意のWebページの文を、上のような"読めてしまう"文に変換するためのスクリプトを書いた。


reading_trivia.rb

$KCODE ='u'                                                                                                                                                
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'cgi'
require 'kconv'
require 'extractcontent'

def reading_trivia(url)
  #extractcontentで本文を抽出
  html = ''
  open(url) {|f| html = f.read.toutf8}
  body, title = ExtractContent::Extractor.new.analyse(html)

  #Yahoo!日本語形態素解析APIで各形態素の読み仮名を求める
  app_id = 'yahoo_app_id' #自分のYahoo!アプリケーションID
  doc = open("http://jlp.yahooapis.jp/MAService/V1/parse?appid=#{app_id}&results=ma&response=reading&sentence=#{CGI.escape(body)}") {|f| Hpricot(f)}
  words = (doc/:reading).map {|i| i.inner_text}

  #4文字以上の単語の場合に、単語の両端以外の文字をシャッフルする
  sentence = []
  words.each do |word|
    c = word.split(//)
    if c.size > 3
      sentence << c[0] + c[1..-2].sort_by{rand}.join + c[-1]
    else
      sentence << word
    end
  end
  puts sentence.join(' ')
end

if __FILE__ == $0
  reading_trivia(ARGV.shift)
end

日本語形態素解析には前回と同様にYahoo!日本語形態素解析APIを使った。
http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
また本文抽出にはextractcontentというRubyモジュールを使った。
http://labs.cybozu.co.jp/blog/nakatani/2007/09/web_1.html
extractcontentのインストールは

% sudo gem install extractcontent

とかでOK.
(Hpricotが入っていない場合もgem install hpricotで。gemすら入ってない場合は"gem インストール"とかでググればOK)
引数にはWebページのURLを指定する。


例えば昨日の任天堂に関する記事でやってみるとこんな感じ。
http://japan.cnet.com/news/biz/story/0,2000056020,20392731,00.htm

% ruby reading_trivia.rb http://japan.cnet.com/news/biz/story/0,2000056020,20392731,00.htm > hoge.txt
% cat hoge.txt

にてんんどう 、 うだりあげか 、 りえき ともに かこ さいこう -- かがいい うありげ ひりつ は 87.5 % に
ながい みちこ ( へんしゅう ぶ )
2009 / 05 / 07 18 : 33
にんんてどう は 5 がつ 7 にち 、 2009 ねん 3 がつ き の つうき れんけつ けっさん を はぴっょう し た 。 うだげりあか 、 えいぎょう りえき 、 けょじいう りえき 、 じんえゅりき ともに かこ さこいう を きろく し た 。 かがいい うりあげ ひりつ は 87.5 % に のぼる 。
うげりあだか は ぜきんひ 9.9 % ぞう の 1 ちょう 8386 おく えん 、 えぎいょう りえき は どう 1.40 % ぞう の 5552 おく えん 、 けょじいう りえき は どう 1.8 % ぞう の 4846 おく えん 、 じりえんゅき は どう 8.5 % ぞう の 2970 おく えん と なっ た 。 なお 、 えだんか の えょいきう で 、 かわせ さそん を 1339 おく えん けいょじう し て いる 。 うりだげあか の 87.5 % に あたる 1 ちょう 6906 おく えん は かいがい で の うりあげ だ 。
けたいい がた げーむき 「 にんてどんー DS Lite 」 の うありげ が かいがい で こちょうう だっ た ほか 、 2008 ねん 11 がつ 1 にち に 「 にどんんてー DSi 」 を こくない むけ に はばつい し た こと で 、 にどんてんー DS しりーず の ぜん せかい はんばい だいすう は とうき で 3118 まん だい 、 るけいい で 1 おく 178 まん だい と なっ た 。 「 げーむき と し て は しじょう さいたん の きかん で 1 おく だい を こえ た 」 ( にてどんんう ) 。 たいおう そふと と し て は 、 「 ぽけすたもんとっー ぷらちな 」 が 375 まん ほん 、 「 ほし の かー ヴぃ うるとら すぱーー でらくっす 」 が 236 まん ほん 、 「 のう を きえたる おとな の DS とにれんーぐ 」 「 もっと のう を きたえる おとな の DS とんれーにぐ 」 が 2 さく ごけうい で 731 まん ほん はばんい さ れ た 。
すえおき がた げむーき 「 Wii 」 に つい て は 、 かいがい で の はんばい が こうちょう だっ た と いう 。 ぜん せかい の はんばい だいすう は とうき で 2955 まん だい 、 るいけい で 5309 まん だい と なり 、 「 もとっも はやく るけいい はばんい だいすう が 5000 まん だい を とっぱ し た げーむき に なっ た 」 ( にんてどんう ) と の こと 。 たいおう そふと で は 「 まりかおーと Wii 」 が 1540 まん ほん 、 「 まち へ いこ う よ どうつもぶのり 」 が 338 まん ほん 、 「 Wii Msuic 」 が 265 まん ほん うれ た 。 さらに 「 Wii Fit 」 が かいがい でも ひっと し 、 1367 まん ほん はんばい し て いる 。
2010 ねん 3 がつ き に つい て は 、 にどんんてー DSi を かがいい でも はつばい する ほか 、 しんはもき に 「 ぜでんのせだるつ すりっぴと とくらっす ( かょしう ) 」 を はつばい する 。 さらに 、 りある な すーぽつ たいけん を ていょきう する 「 Wii すーぽつ りぞーと 」 も ぜん せかい で てんかい する けいかく 。 ただし 、 うあだげりか は 1 ちょう 8000 おく えん 、 えょいぎう りえき は 4090 おく えん 、 けいじょう りえき は 5000 おく えん 、 じゅえんりき は 3000 おく えん と よばこい を みこん で いる 。

たしかに読めるけれども、あまりなじみのない単語が多いせいか可読性は最初に見た例よりは落ちている気がする。
あと形態素解析器を使うと人手でわかち書きするよりも細かく分けてしまう場合が多いので、3文字以下の単語が増えている。


脳内でどんな処理が行われているのかわからないけど、不思議。


特に関連していないかもしれない記事:
ひらがなせいかつ への いざない - ぼんやりと考えたこと
http://n.h7a.org/blog/entry/1594


P.S.
書き終えた後にdankogaiさんがJavaScriptで似たようなことをすでにやっていたことに気づいた...
http://blog.livedoor.jp/dankogai/archives/51210157.html