python で deepL API を使ってみる

# DeepL API Free
[DeepL](https://www.deepl.com/translator) は [API](https://www.deepl.com/ja/pro-api?cta=header-pro-api/) を提供している。
無償版の DeepL API Free と 有償版の DeepL API Pro があり, 無償版の API をプライベートで使う機会があったので本記事にまとめる。

無償版と有償版では以下のような違いがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342285/de0d2d26-cd93-4960-b67d-43e33ff4a00c.png)


なお無償版, 有償版に関わらずアカウント登録とクレジットカード情報の登録が必要となる。
登録するクレジットカードは3Dセキュア認証に対応していなければならず, 加えて JCB は利用不可。
無償版から有償版へは手動で切り替えを行わない限り切り替わらないのでそこは安心。

また deepL は翻訳対象の文章を一定期間保存しているとのことなので, 気密性の高い文章を取り扱う際には要注意。

# python で deepL API Free を呼び出す
実際に簡単例を実行してみる。
本例では文字列を渡してるが, ドキュメントファイルを渡すことも可能。
API の仕様については [公式ドキュメント](https://www.deepl.com/ja/docs-api/translating-text/response/) を参照せよ。


```python:translate.py
import requests

API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 自身の API キーを指定

text = "Riemann Zeta function is a very important function in number theory."
source_lang = 'EN'
target_lang = 'JA'

# パラメータの指定
params = {
            'auth_key' : API_KEY,
            'text' : text,
            'source_lang' : source_lang, # 翻訳対象の言語
            "target_lang": target_lang  # 翻訳後の言語
        }

# リクエストを投げる
request = requests.post("https://api-free.deepl.com/v2/translate", data=params) # URIは有償版, 無償版で異なるため要注意
result = request.json()

print(result)
```

```:出力結果
{
	"translations": [
		{
			"detected_source_language": "EN",
			"text": "リーマン・ゼータ関数は、整数論において非常に重要な関数である。"
		}
	]
}
```

翻訳する文章は文字列のリストとして渡してもよい。

```python:translate.py
import requests

API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 自身の API キーを指定

text = ["素数はとても魅力的な数です。", "素数の分布には今も多くの謎が残されています。"]
source_lang = 'JA'
target_lang = 'EN'

# パラメータの指定
params = {
            'auth_key' : API_KEY,
            'text' : text,
            'source_lang' : source_lang, # 翻訳対象の言語
            "target_lang": target_lang  # 翻訳後の言語
        }

# リクエストを投げる
request = requests.post("https://api-free.deepl.com/v2/translate", data=params) # URIは有償版, 無償版で異なるため要注意
result = request.json()

print(result)
```

```:出力結果
{
	"translations": [
		{
			"detected_source_language": "JA",
			"text": "Prime numbers are very attractive numbers."
		},
		{
			"detected_source_language": "JA",
			"text": "There are still many mysteries surrounding the distribution of prime numbers."
		}
	]
}
```

# クライアントライブラリ
Python で deepL の API を利用するための[クライアントライブラリ](https://github.com/DeepLcom/deepl-python)が公式から提供されている。

インストールは pip で可能。

```sh
pip install --upgrade deepl
```

使ってみる。

```python:translate_client.py
import deepl

API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 自身の API キーを指定

text = 'Riemann Zeta function is a very important function in number theory.'
source_lang = 'EN'
target_lang = 'JA'

# イニシャライズ
translator = deepl.Translator(API_KEY)

# 翻訳を実行
result = translator.translate_text(text, source_lang=source_lang, target_lang=target_lang)

# print すると翻訳後の文章が出力される
print(result)
```

```:実行結果
リーマン・ゼータ関数は、整数論において非常に重要な関数である。
```

こちらも ```text``` には文字列だけではなく, 文字列のリストを指定することが可能。


```python:translate_client.py
import deepl

API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 自身の API キーを指定

text = ['コミュニケーションをとることは重要である。', '特にテレワークが主流となった昨今においては、コミュニケーション不足による弊害が多く報告されている。']
source_lang = 'JA'
target_lang = 'EN-GB'

# イニシャライズ
translator = deepl.Translator(API_KEY)

# 翻訳を実行
results = translator.translate_text(text, source_lang=source_lang, target_lang=target_lang)

# results の中身はオブジェクトのリスト
print(results)

print('-'*30)

for result in results :
    # print すると翻訳後の文章が出力される
    print(result)
    # 翻訳後の文章にアクセスする場合は .text で可能
    # print(result.text)
```

```:出力結果
[<deepl.translator.TextResult object at 0x000001A15A4A84C0>, <deepl.translator.TextResult object at 0x000001A15C95C9A0>]
------------------------------
It is important to communicate.
In recent years, especially as teleworking has become the norm, there have been many reports of the negative effects of poor communication.
```