翻訳API

http://simultechnology.blendmix.jp/blog/archives/1101

Microsoftの翻訳APIはすごいと聞いたので使ってみた。Rubyで。

2010 年 6 月 12 日 simultechnology

以前、phpで簡単な辞書アプリを作ったり、twitterの翻訳botを作ったりしたのだけど、その時はgoogleのAPIと英語学習サイトのiknowのAPIを使っていた。

今、サーバを止めている状態なので、そのアプリは動いてないんだけど、ちょっとまた翻訳APIを使ってみようと思った。
そこで、以前androidもくもく勉強会でhさんにMicrosoftの翻訳APIはかなり正確だと言われたのを思い出し、試してみた。

Microsoftの翻訳APIを使うには「AD697D10EC7A3751BB125AB58715693EBCB224E2」というようなキーを取得しなければいけないらしい。
参考にさせていただいた以下のページ通りに進めたら、キーの取得も含めて、簡単に試せた。
http://bit.ly/9Bwv20

以下、MicrosoftとGoogleの翻訳APIをrubyで使ってみた。
translate.rb

#code(ruby){{
# -*- coding:utf-8 -*-
require 'net/http'
require 'rexml/document'
require 'json'

# 引数が無い場合はエラー
if !ARGV.length
raise "1 argument is needed"
end

# 翻訳対象の文
text = URI.escape(ARGV[0])

h = Net::HTTP.new("api.microsofttranslator.com")
response = h.get("/V2/Http.svc/Translate?appid=AD697D10EC7A3751BB125AB58715693EBCB224E2&from=en&to=ja&text=#{text}")

if response.message == 'OK'
doc = REXML::Document.new(response.body)
puts sprintf("Microsoft API : %s", doc.root.text)
end

h2 = Net::HTTP.new("ajax.googleapis.com")
response2 = h2.get("/ajax/services/language/translate?v=1.0&q=#{text}&langpair=en|ja")

if response2.message == 'OK'
j = JSON.parse(response2.body)
puts sprintf("Google API : %s", j["responseData"]["translatedText"])
end
}}

そして実行。ちなみに文を引数にする場合は、ダブルクォーテーションで囲み1つの文字列とする。

#code(ruby){{
$ ruby translate.rb book
Microsoft API : 本
Google API : 本
$ ruby translate.rb "I am student"
Microsoft API : 私は学生
Google API : 私は学生です
}}

こんな短い文では違いは分からない。
昨日のフランス対ウルグアイの記事をyahoo ukから持ってきた。
http://yhoo.it/bkYP9G

$ruby translate.rb "Uruguay were forced to play the final nine minutes of the match in Cape Town with 10 men following the dismissal of substitute Nicolas Lodeiro for a second bookable offence. Substitute Thierry Henry had a late penalty shout for handball dismissed as lacklustre France finally took the game to their opponents, but failure to capitalise on their numerical advantage ended in a disappointing stalemate."

Microsoft API : ウルグアイ戦ケープタウンでの最後の 9 分、解雇を第 2 bookable の犯罪の代用ニコラス Lodeiro の次の 10 の男性と遊ぶことを余儀なくされました。
代替ティエリ アンリは後半のペナルティ叫び精彩を欠いたフランスが最後にゲームに、相手が失望膠着状態で終了したその数値の利点を生かすに失敗したと解雇ハンドボールをしていた。

Google API : ウルグアイは、アンリティエリに置き換え、2番目bookable犯罪のニコラスLodeiro代替解雇にされた強制試合でのケープタウン分を再生する最後の9と10人以下のフランスhandballを解任された精彩を欠いたためていたコメントをペナルティ後半最終的にゲームをした相手が、失敗の数的優位失望こう着状態に終わった上で投資する。

まぁ、多少Microsoftの翻訳APIの方が分かりやすい気もするが、どっちもどっちかな(笑)

一応、browserにも表示させてみようと思い、Sinatraで表示させた。
sinatraは至ってシンプル。ファイル構成は以下。

tao
└views
 └index.erb
└Ruby System Library
└translate.rb

以下はviewのindex.erb

#code(html){{
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charsetUTF-8" />
<title>Test</title>
</head>
<body>
<form action="/form" method="post">
<textarea name="name" rows="10" cols="75"></textarea><br />
<input type="submit" value="送信">
</form>
</body>
</html>
}}

そして、translate.rb

#code(ruby){{
# -*- coding:utf-8 -*-

require 'rubygems'
require 'sinatra'
require 'erb'
require 'net/http'
require 'rexml/document'
require 'json'

get '/' do
erb :index
end

post '/form' do
text = URI.escape(params[:name])
h = Net::HTTP.new("api.microsofttranslator.com")
response = h.get("/V2/Http.svc/Translate?appid=AD697D10EC7A3751BB125AB58715693EBCB224E2&from=en&to=ja&text=#{text}")

if response.message == 'OK'
doc = REXML::Document.new(response.body)
ret_text = sprintf("Microsoft API : %s", doc.root.text)
ret_text += "<br /><br />"
end

h2 = Net::HTTP.new("ajax.googleapis.com")
response2 = h2.get("/ajax/services/language/translate?v=1.0&q=#{text}&langpair=en|ja")

if response2.message == 'OK'
j = JSON.parse(response2.body)
ret_text += sprintf("Google API : %s", j["responseData"]["translatedText"])
end
ret_text
end
}}

う〜ん、やっぱりMicrosoftの翻訳APIの方が精度が高い気がする。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-06 (金) 09:07:59