2011/03/24

Microsoft TranslatorのAPIを使ってみる

最近は年度末というもともあって仕事が落ち着いており、割と毎日を平和に(暇に)暮らしています。こんなんじゃあかん!何かしよう!と思って色々情報を集めていて、Microsoft Translatorというサービスがあることを知りました。言語翻訳を使ったプログラムは書いたことが無かったので、早速チャレンジ!

このサービスはBingデベロッパーセンターで「アプリケーションID」を取得する必要があります。[MSDN:Code Samples Gallery]:Microsoft Translator を使用して英語から日本語へ機械翻訳するというページに、VBでのサンプルコードと共にBingデベロッパーセンターでアプリケーションIDを取得する方法が記載されていましたので参考にしました。会社名とかアプリケーション名とか入れないといけないのでちょっと面倒くさいです。僕は適当に入れておきました。

APIの使い方のドキュメントはMicrosoft Translator:HTTP APIに記載されています。

さて、それではこのAPIのTranslate Methodを使って、AllHipHop.comHipHopDXのRSSを取得してMicrosoft Translatorで記事件名を日本語訳してTwitterに投稿するbotを作ってみました。

@asebad

ソースはこんな感じ。
#! /usr/bin/ruby -Ku

require "rubygems"
require 'oauth'
require 'rubytter'

require 'net/http'
require 'open-uri'
require 'rexml/document'
require 'rss/2.0'
require 'cgi'

# 定義
CONSUMER_KEY = 'AAA'
CONSUMER_SECRET = 'BBB'

ACCESS_TOKEN = 'CCC'
ACCESS_SECRET ='DDD'

APPID = 'EEE'
APIURI = 'http://api.microsofttranslator.com/V2/Http.svc/Translate'

PDATA = Array.new

# TinyURL化メソッド
def tinyurl(link)
  url = "http://tinyurl.com/api-create.php?url=" + link
  open(url) do |http|
    res = http.read
    return res
  end
end

# RSSから記事を取得して翻訳、配列に入れる
def getRss(site,rssuri,tmpfile)
  slink = nil

  open(tmpfile,'r') do |lfile|
    lfile.each do |link| slink = link.chop end
  end

  open(rssuri) do |http|
    flg = 0
    rssres = http.read
    result = RSS::Parser.parse(rssres, false)
    result.items.each do |item|
      link = item.link
      if link == slink then break end
      if flg == 0 and link != slink then
        open(tmpfile,'w') do |lfile|
          lfile.puts link
        end
        flg = 1
      end

      title = item.title
      etxt = CGI.escape(title)

      open(APIURI + "?appId=#{APPID}&text=#{etxt}&from=en&to=ja") do |http|
        xml = http.read
        doc=REXML::Document.new xml
        jptitle = doc.elements['/string'].text
        tulink = tinyurl(link)
        mess = jptitle + " " + tulink
        PDATA.push mess
      end
    end
  end
end

# Twitterに投稿するところ
begin
  getRss('[AllHipHop]','http://allhiphop.com/stories/news/rss.aspx','ahh.txt')
  getRss('[HipHopDX]','http://feeds.feedburner.com/hiphopdx/news','hhdx.txt')

  PDATA.each do |data|
    # Twitter Post
    consumer = OAuth::Consumer.new(
      CONSUMER_KEY,
      CONSUMER_SECRET,
      :site => 'http://twitter.com'
    )

    token = OAuth::AccessToken.new(
      consumer,
      ACCESS_TOKEN,
      ACCESS_SECRET
    )

    client = OAuthRubytter.new(token)
    client.update(data)

    sleep 60
  end

rescue
  print "RuntimeError: ", $!, "\n";
end
ざっとアウトプットを見た結果、機械翻訳としては結構精度高いように思います。Microsoft Translator、なかなか良いじゃない。そして曲名がちょっと笑ってしまう。「The Weed Iz Mine」→「雑草 Iz 鉱山」 て。

そんなわけで2ヶ月ぶりくらいにRubyでプログラム書きました。しばらく暇だしもうちょっと何か作ってみよう。