琴欧洲のブログをYahoo!かな漢字変換Webサービスで変換してみた

かな漢字変換ソフト「VJE」、ヤフーのWeb APIとして“復活”:ITpro


Yahoo! JAPANが、かな漢字変換Webサービスを開始したそうです。いったい何のために、という気がしないでもないですが、なかなか面白そうですね。これで何かできないかなあと考えていたら、ぴったりの題材を見つけました。


ねとらぼ:「たい2ひき」 琴欧洲の“平仮名ブログ”が人気 - ITmedia News


私も大好きなブルガリア出身の人気力士の琴欧洲が、ひらがなでブログを書いているそうです。

はじめてゆうしょうできました おうえんありがとうございました

うわあ、なんか可愛い。アルジャーノンとかMeたんとか言っちゃだめですよ。ゆうしょうりきしに対して失礼です。


さて、見てるとなんだか変換したくなりますね。このブログのRSSを取ってきて漢字変換した後にまたRSSとして配信するWebアプリを、Rubyで書いてみることにします。

#!/usr/local/bin/ruby

$KCODE='UTF8'
require 'rexml/document'
require 'open-uri'
require 'rss'
require 'cgi'

# Yahoo!かな漢字変換Webサービスアクセス関数	
# 入力は、ひらがな/数字のみ
def Yahoo_KanjiHenkan(hiratext)
  appid = (Your Application ID)
  uri	= 'http://jlp.yahooapis.jp/JIMService/V1/conversion'
  result = ""
  body = open("#{uri}?appid=#{appid}&results=1&sentence="+URI.encode("#{hiratext}"))
  doc = REXML::Document.new(body).elements['ResultSet/Result/SegmentList']

  doc.elements.each('Segment/CandidateList') {|item|
    result += item[1].text
  }
  result
end

こんな感じでYahoo!かな漢字変換Webサービスにリクエストを投げるとXML形式で変換結果が返ります。複数の変換候補から選択できますが、ここでは第一候補を無条件に採用します。Yahoo!のWeb APIはどれもそうですが、(Your Application ID)に、Yahoo!から発行された自分のアプリケーションIDを入れる必要があります。

# 漢字変換ラッパー
# 入力は、ひらがな/漢字/英数の混在可
def Henkan(text)
  result = ""
  cnt = 0  # 無限ループ防止カウンタ
  while text.length > 0 and cnt < 500
    if text =~ /^[ぁ-ん0-9]+/
      result += Yahoo_KanjiHenkan($&)
      text =$~.post_match
    elsif text =~ /^[^ぁ-ん0-9]+/
      result += $&
      text =$~.post_match
    end
    cnt += 1
  end
  result
end

変換対象の文字列に漢字やアスキー文字が混ざっているとエラーが出るようなので、ひらがなと数字の部分だけ変換APIに投げるようにします。

# RSSの取得
rss_source = "http://kotooshu.aspota.jp/index.xml"
rss = nil
begin
  rss = RSS::Parser.parse(rss_source)
rescue RSS::InvalidRSSError
  rss = RSS::Parser.parse(rss_source, false)
end

# タイトルと本文を漢字変換
rss.channel.items.each {|item|
  item.title = Henkan(item.title)
  desc = ""
  item.description.each_line {|line|
    desc +=  Henkan(line)
  }
  item.description = desc
}
rss.channel.title = "(漢字変換)" + rss.channel.title

ブログのRSSを取得し、エントリーのタイトルと本文をHenkan関数で変換したもので上書きします。またブログのタイトルも見分けがつくように変えています。

# 出力
cgi = CGI.new
cgi.out('text/xml') { rss.to_s }

あとはtext/xml形式でCGI出力するだけです。
毎回RSS取得して変換するのはサーバに優しくないので、ちゃんと作るのであれば数時間ごとにキャッシュするような仕組みを入れた方が良いと思います。


RSSリーダーに読み込ませてみるとこんな感じ。


元のRSS


変換後のRSS


変換ミスがないのはちょっと感動的ですね。