[[翻訳API]]

- Google翻訳APIよりも、Microsoft翻訳APIの方が、翻訳精度が高いというレポート
- Microsoft翻訳APIの使用例(Rubyで実装)
参考にしてみるべし。

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

* Microsoftの翻訳APIはすごいと聞いたので使ってみた。Rubyで。 [#o3be3790]

2010 年 6 月 12 日 simultechnology

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

- ikowで「ruby」という単語の情報を取得した場合
http://api.iknow.co.jp/items/matching/ruby.xml
- Google翻訳APIのページ
http://code.google.com/intl/ja/apis/ajaxlanguage/documentation/ 

今、サーバを止めている状態なので、そのアプリは動いてないんだけど、ちょっとまた翻訳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