Edited at

表の特定列のデータ(英語)を翻訳して結果をファイルに出力

接続先のデータベースはOracle Database。

py-translatorとcx_Oracleを使ってやってみた。


準備


py-translatorのインストール

py-translator を使ってみる


cx_Oracleのインストール

https://oracle.github.io/python-cx_Oracle より引用


About cx_Oracle

cx_Oracle is a Python extension module that enables access to Oracle Database. It conforms to the Python database API 2.0 specification with a considerable number of additions and a couple of exclusions.


Installationに掲載されている手順を実行。(以下を実施した)


cx_Oracleインストール

$ pip install cx_Oracle


Oracle Instant Clientのインストール

別途ダウンロードしたInstantClient(公式手順にリンク有)を/opt/oracleに配置しunzip

$ mkdir -p /opt/oracle

$ cd /opt/oracle
$ unzip instantclient-basic-linux.x64-18.3.0.0.0dbru.zip


libaioのインストール

$ sudo yum install libaio


環境変数に追加


$HOME/.bash_profile

export LD_LIBRARY_PATH=/opt/oracle/instantclient_18_3:$LD_LIBRARY_PATH



確認

$ python

Python 3.6.7 (default, Nov 15 2018, 16:29:08)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> cx_Oracle.clientversion()
(18, 3, 0, 0, 0)
>>>

インストールしたInstant Clientのバージョン(18.3)を返している。


実行


表の特定列のデータ(英語)を翻訳して結果をファイルに出力する

大福帳形式でデータを持っていたので、集計してから翻訳

※count(1)はそれぞれの件数を知りたかったので一緒に出力


実行する.SQL

select 英語の列, count(1) from 表 group by 英語の列 order by count(1) desc


このSQLの結果セットのカーソル内でpy_translatorを使って翻訳。

以下、★のところ(2か所)を環境に合わせて編集して実行。この例ではlargetable表のprofession列を翻訳。

※sleepを入れたのは、短時間にtranslateしすぎるとエラー(ブロックされるっぽい?)になったので。


t.py

import cx_Oracle

import os
import csv

from time import sleep

from py_translator import Translator
translator = Translator()

# ★翻訳したい列名と、そのテーブル名を指定
col = 'profession'
tab= 'largetable'

# 出力ファイル名
filename= 'translate_' + col + '.csv'
f = open(filename, 'w')
writer = csv.writer(f, lineterminator='\n')

os.environ["NLS_LANG"] = "JAPANESE_JAPAN.AL32UTF8"

## ★接続先のOracle Databaseに合わせて編集
conn=cx_Oracle.connect(user='username', password='passwd', dsn='192.0.2.2/PDB1servicename.xxxx')

sql='select ' + col + ', count(*) from ' + tab + ' group by ' + col + ' order by count(*) desc '
print (sql)

csvlist = ['ID','ORIGINAL','TRANSLATED','NUM_COUNT']
writer.writerow(csvlist)

print('Now Processing...')
cur = conn.cursor()
seq = 1
for row in cur.execute(sql):
sleep(5)
# ↑↑↑重要

csvlist = []
csvlist.append(seq)
csvlist.append(row[0])
csvlist.append(translator.translate(text=row[0], dest='ja').text)
csvlist.append(row[1])

# ファイルに出力
writer.writerow(csvlist)

seq += 1
print('.', end="", flush=True)
f.close()

print('¥nTranslation Completed')
print('Output File Name:', filename)



結果

出力ファイルから、今回試した profession列(職業を示す)の、ORIGINAL(元の値), TRANSLATED(日本語訳)がわかる。

$ python t.py

$ cat translate_profession.csv
ID,ORIGINAL,TRANSLATED,NUM_COUNT
1,Programmer/Developer,プログラマ/開発者,137
2,IT Staff,ITスタッフ,89
3,Nurse,ナース,54
... (略)...