LoginSignup
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-07

接続先のデータベースは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
... (略)...

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0