言語の検出(任意の自然言語のテキストからそれが何語であるかを判定)の精度を、Google Cloud PlatformのTranslation APIとAWSのComprehendとで比較してみました。Pythonから各クラウドのAPIにアクセスしてみます。
Google Cloud Platform
まずはGCPです。
サンプルのソースファイルは以下です。
from google.cloud import translate_v2
translate_client = translate_v2.Client()
text = "言語を判定する"
result = translate_client.detect_language(text)
print('Text: {}'.format(text))
print('Confidence: {}'.format(result['confidence']))
print('Language: {}'.format(result['language']))
実行環境を準備します。まずはパッケージのインストールです。(Pythonの環境はpipを含めすでに準備済みとします)
$ pip install google-cloud-translate
認証のために、Google Cloud Platformのコンソール画面のIAM & AdminのService accountsというメニューから操作してCreate keyでキーを作成してJSONファイルをダウンロードしておきます。そしてそのJSONファイルを以下のように環境変数で指定しておきます。
$ export GOOGLE_APPLICATION_CREDENTIALS=$HOME/path/to/key.json
実行してみます。
$ python detecting-language-gcp.py
Text: 言語を判定する
Confidence: 1
Language: ja
できました。「言語を判定する」は日本語と判定されたようです。
補足
ソースコードのtranslate_v2.Client()
の部分ですが、Googleの公式ドキュメントにあるサンプルソースコードでは、translate.Client()
となっています。しかしこの通りに実行すると以下のようなエラーになってしまいました。
AttributeError: module 'google.cloud.translate' has no attribute 'Client'
translate
をtranslate_v2
に書き換えれば実行できるようです。
Pythonのライブラリのバージョンをpip list
で確認すると、以下の通りです。
google-api-core 1.14.3
google-auth 1.7.0
google-cloud-core 1.0.3
google-cloud-translate 2.0.0
googleapis-common-protos 1.6.0
(2019/11/06現在)
Amazon Comprehend
次はAWSです。
サンプルのソースファイルは以下です。
import boto3
import json
comprehend = boto3.client(service_name = "comprehend", region_name = "us-east-1")
text = "言語を判定する"
result = comprehend.detect_dominant_language(Text = text)
print(json.dumps(result["Languages"], sort_keys = True, indent = 4))
2019/11/06現在、東京リージョンではまだ実行できなくて、ここではus-east-1
を指定しておきました。
実行環境を準備します。まずはパッケージのインストールです。
$ pip install boto3
AWSの認証には~/.aws
に必要なファイルが必要です。この記事では説明を省略します。
準備したら実行してみます。
$ python detecting-language-aws.py
[
{
"LanguageCode": "ja",
"Score": 0.9999274611473083
}
]
できました。
GCPとAWSとで比較
GCPとAWSとでいろんなテキストで比較してみようと思います。比較しやすいように以下のようなソースを書きました。
import json
import boto3
from google.cloud import translate_v2
translate_client = translate_v2.Client()
comprehend = boto3.client(service_name = "comprehend", region_name = "us-east-1")
text = "言語を判定する"
gcp_result = translate_client.detect_language(text)
aws_result = comprehend.detect_dominant_language(Text = text)
print('Text: {}'.format(text))
print('GCP: {}'.format(gcp_result["language"]))
print('AWS: {}'.format(aws_result["Languages"][0]["LanguageCode"]))
$ python detecting-language.py
Text: 言語を判定する
GCP: ja
AWS: ja
テキストを変えて試してみます。
Text: Google Cloud TranslationとAmazon Comprehendとで比較
GCP: ja
AWS: en
GCPとAWSとで違う結果になりました。英語の単語が含まれますが全体としては日本語なのでGCPのほうが合ってる気がします。
Text: 真田丸
GCP: ja
AWS: zh
またGCPとAWSとで違う結果になりました。漢字のみの短い単語だと日本語と中国語とで区別付きづらいのはわかるのですが、真田丸という中国語はあるのでしょうか。
Text: 東京都渋谷区
GCP: ja
AWS: zh
Text: 東海道新幹線
GCP: ja
AWS: zh-TW
うーん、どれも日本語のような気がするのですが、漢字ばかりの場合はAWSは日本語と判定するケースはないのかな。
Text: 峠
GCP: ja
AWS: zh
やっぱりAWSは中国語と判定する。
Text: 東海道新幹線で
GCP: ja
AWS: ja
ひらがなが含まれると日本語という統一見解になるようです。
日本語にはない漢字の単語を試してみます。
Text: 手机
GCP: zh-CN
AWS: zh
「手机」は台湾ではなく大陸側の単語だとGCPは言っていますが、AWSのzh
はどっちかわからない中国語という意味なのか、それともGCPのzh-CN
に相当するものなのか、不明です。
Text: 客運
GCP: zh-TW
AWS: zh-TW
どちらも台湾の単語だという統一見解になりました。
大陸、台湾、日本で共通の単語の場合、
Text: 出口
GCP: zh-CN
AWS: zh
中国語と判定されました。GCPは大陸側と言っています。AWSのzh
はGCPのzh-CN
に相当するものなのか、不明ですが。
漢字仮名以外だと、
韓国語でこんにちは
Text: 안녕하세요
GCP: ko
AWS: ko
スペイン語でこんにちは
Text: Hola
GCP: es
AWS: es
ロシア語でこんにちは
Text: привет там
GCP: ru
AWS: ru
タイ語でこんにちは
Text: สวัสดี
GCP: th
AWS: th
合ってそうです。
ちなみに、PythonのAPIレスポンスは配列形式なので、複数の言語を返すことがあるのかと思いきや、ここまでの例のレスポンスを全部確認してみても1言語だけしかレスポンスされていません。
まとめ
東アジアの紛らわしい例で試した範囲ではGCPはよさそうだけどAWSはいまいちのように感じます。
日本語中国語で共通の漢字の単語はGCPでもAWSでも中国語と判定されるようなので、日本語中心で考えるとGCPであっても違和感ある結果もあるかもしれません。
ヨーロッパの同じ文字を使う微妙に違う紛らわしい言語でも試したいところですが、知らない言語を試すのは大変です。
結果一覧です。間違ってるんじゃないかと思う箇所に ✖ を付けています。
text | GCP | AWS |
---|---|---|
言語を判定する | ja | ja |
Google Cloud TranslationとAmazon Comprehendとで比較 | ja | ✖ en |
真田丸 | ja | ✖ zh |
東京都渋谷区 | ja | ✖ zh |
東海道新幹線 | ja | ✖ zh-TW |
峠 | ja | ✖ zh |
東海道新幹線で | ja | ja |
手机 | zh-CN | zh |
客運 | zh-TW | zh-TW |
出口 | zh-CN | zh |
안녕하세요 | ko | ko |
Hola | es | es |
привет там | ru | ru |
สวัสดี | th | th |
(結果は2019/11/08現在です)