LoginSignup
15
6

More than 3 years have passed since last update.

我很好的偽中国語翻訳機工作了(語順多少真的版)(熱帯雨林電網服務追加版)

Last updated at Posted at 2019-06-26

我偽中国語翻訳機作成了 をベースにしてもう少しマシな中国語翻訳機を作ってみました。

言い訳

-自然言語処理を深掘りしたとか、変換テーブルを辞書にしたとかしてません
 →2019-06-27 一部を辞書に持ちました。
-語順は SOV のままで SVO にしてません。「行きたい」→×「去想」 〇「想去」
 →2019-06-27 語順を SVO にしました。
-まだ納得はしていません。
-主語の取得方法がわからない…。
-漢字はできるだけ日本の漢字のまま。日本の漢字にないものは繁体字にしました。(偽中国語なので)
-出力結果を見ても面白くありません。まあ、コードを見て「へー、中国語ではこの漢字を当てるんだ」と思っていただければ。
-変換テーブルはかなーり基本的なことしか載せていません。キリがないので。

改変履歴

-Amazon Web Service の Polly で中国語訳したものを日本の漢字に変換してみました。(6/29)
-語順を SVO にしました。(2019-06-27)
-翻訳ミスを直しました。(2019-06-27)
-変換テーブルの一部を辞書に持ちました。(2019-06-27)

サンプル

$ python pseudo-chinese.py 私は昨日、日本の料理を食べました
我吃昨天、日本的料理了

実装

クリックで展開する
pseudo-chinese.py
import requests
import json
import sys

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "xxxxxxxxxx"
CLIENT_SECRET = "xxxxxxxxxxx"

# アクセストークンを取得する関数
def auth(client_id, client_secret):
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }
    data = {
        "grantType": "client_credentials",
        "clientId": client_id,
        "clientSecret": client_secret
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    return r.json()["access_token"]

# 形態素解析する関数
def parse(sentence, access_token):
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(base_url + "v1/parse",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()

# lemma 単純翻訳用辞書
dict_lemma = { 
    '私' : '我',
    '私達': '我們',
    '君' :  '你',
    'あなた' : '你',
    'お前' : '你',
    '君達' :  '你們',
    'あなた達' : '你們',
    'お前達' : '你們',
    '彼' : '他',
    '彼女' : '他',
    '彼等' : '他們',
    '彼女達' : '他們',
    '父' : '爸爸',
    '母' : '媽媽',
}

dict_lemma2 = {
    '飲む' : '喝',
    '食べる' : '吃',
    '今日' : '今天',
    '本日' : '今天',
    '昨日' : '昨天',
    '明日' : '明天',
    '理解' : '明白',
    '午前' : '上午',
    '午後' : '下午',
    '時' : '點',
    'です' : '是',
    '言う' : '叫',
    '二回目' : '二次',
    '嬉しい' : '很開心',
    '要る' : '要',
    '要らない' : '不要',
    '有る' : '有',
    'ない' : '没有',
    '行く' : '去',
    '仕事' : '工作',
    '終わる': '了',
}

# ひらがなを削除する関数
def hira_to_blank(strj):
    return "".join(["" if ("ぁ" <= ch <= "ん") else ch for ch in strj])

if __name__ == "__main__":
    document = "私は明日、伊豆大島に行きたい"
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1])

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    #print(parse_document)
    result_list = list()

    subjects = ''
    verbs = ''
    objects = ''
    suffix = ''
    isSubjectSatisfied = False

    for chunks in parse_document['result']:
        for token in chunks["tokens"]:
            # 形態素解析結果に置き換えルールを適用する
            if (token["pos"] != "引用助詞" 
            and token["pos"] != "終助詞" 
            and token["pos"] != "接続接尾辞" 
            and token["pos"] != "動詞活用語尾"):
                if token["pos"] == "動詞接尾辞" and '終止' in token["features"]:
                    if ("する" in token["lemma"]) or ("ます" in token["lemma"]):
                        prime = "也"
                    elif "たい" in token["lemma"]:
                        prime = "想"
                    elif ("しました" in token['lemma']) or ("ました" in token["lemma"]):
                        prime = '了'
                    elif "です" in token["lemma'"]:
                        priすme = '是'
                    elif token['lemma'] != 'ない':
                        prime = "了"
                    else:
                        prime = "実行"
                else:
                    prime = token["form"]

                if token['lemma'] in dict_lemma:
                    prime = dict_lemma[token['lemma']]

                if len(token["features"]) != 0:
                    if "SURU" in token["features"][0] :
                        prime = "也"
                    elif "連体" in token['features'][0]:
                        prime = "的"
                    elif "疑問符" in token["features"][0]:
                        prime = "嗎?"

                if token['lemma'] in dict_lemma2:
                    prime = dict_lemma2[token['lemma']]

                if (prime == '了') or (prime == '也') or (prime == '嗎?'):
                    suffix += prime
                elif (token["pos"] == '動詞語幹') or (token["pos"] == '動詞接尾辞'):
                    if prime == '想':
                        verbs = prime + verbs
                    else:
                        verbs += prime
                elif isSubjectSatisfied == False:
                    subjects += prime
                else:
                    objects += prime

                if (token["pos"] == '格助詞') or (token["pos"] == '連用助詞'):
                    isSubjectSatisfied = True

    print(hira_to_blank(''.join(subjects) + ''.join(verbs) + ''.join(objects) + ''.join(suffix)))

結果

$ python pseudo-chinese.py 私はお酒を飲みたい
我想喝酒

$ python pseudo-chinese.py 私は本日定時退社します
我今天定時退社也

$ python pseudo-chinese.py 私は理解しました
我明白了

$ python pseudo-chinese.py 私は明日、伊豆大島に行きたい
我想去明天、伊豆大島

$ python pseudo-chinese.py 私は昨日、日本の料理を食べました
我吃昨天、日本的料理了

$ python pseudo-chinese.py 今日は10時に仕事が終わります
今天10時工作了也

$ python pseudo-chinese.py あなたは何時に終わりますか?
你何時了也嗎?

Amazon Web Service の Polly で中国語訳したものを日本の漢字に直してみました。

それぞれ、

我做了一個仮的中文翻訳。

我想喝酒。

我今天要離開弁公室正常的一天。

我明白了

我想明天去伊豆大島

我昨天喫了日本料理

我今天十点就完了

妳什麽時候結束?

綺麗に訳しすぎて偽中国語になってませんね。(笑)

「堺筋線天下茶屋駅」を訳してみた。

-英語 : Sakaisuji Line Tengachaya Station
-中国語 : 堺筋线天坂屋站
一時期流行った「サカイマッスルライン」にはなっていませんね。
中国語でも「堺」のままなので、情報の欠落もありません。
「天坂屋」が怪しいですが。

15
6
2

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
15
6