Help us understand the problem. What is going on with this article?

我偽中国語翻訳機作成了

やりたいこと

私は本日定時退社します -> 我本日定時退社也
私はお酒を飲みたい -> 我飲酒希望

のように、日本語の文章から偽中国語を自動生成したい。

偽中国語とは

中国語のようでいて日本人でも意味を理解できてしまう漢字の羅列のこと。

通常「私はご飯が食べたい」を中国語では
我想吃饭
と書きます。一方で偽中国語は
我飯食希望
と「私はご飯を食べることを希望する」と読めなくもない表記で記します。
これが偽中国語です。以前からTwitterやLINEなど各種SNSで使われてきたユーモアあふれる記法です。

そこで、日本語の文字列を与えることで偽中国語に変換してくれる翻訳機を作りました。

サンプル

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

実行環境

  • macOS High Sierra 10.13.6
  • Python 3.5.1

方針

実装方法

偽中国語の慣例上 1
- 動詞「○○する」は「○○実行」と変換することが多い
- 「明日お酒飲みに行かない?」のような提案する文章の場合、文末に「如何?」を付ける
- 「私は◯◯したい」のようは希望を表す文は、文末に「希望」を付ける
- 「お酒を飲む」は「飲酒」のように、熟語を形成する場合が多い
というルールがあるようです。
そのため、上記の偽中国語変換を実現するために、 品詞情報まで活用した変換処理 を実施しました。

構文解析を行う

品詞情報を活用するには形態素解析を行う必要があります。この構文解析処理は COTOHA API の構文解析APIを活用しました。

※参考
(自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた)

日本語の文字列を構文解析し、あるルールに沿って翻訳処理を行います。

実装

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

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

# アクセストークンを取得する関数
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()

# ひらがなを削除する関数
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()
    for chunks in parse_document['result']:
        for token in chunks["tokens"]:
            # 形態素解析結果に置き換えルールを適用する
            if (token["pos"] != "連用助詞" 
            and 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 token['lemma'] != 'ない':
                        prime = "了"
                    else:
                        prime = "実行"
                else:
                    prime = token["form"]

                if token['lemma'] == '私':
                    prime = '我'

                if (token['lemma'] == '君' or token['lemma'] == 'あなた' or token['lemma'] == 'お前'):
                    prime = '你'

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

                result_list.append(hira_to_blank(prime))

    print(''.join(result_list))

結果

$ python fake-chinese.py 私はお酒を飲みたい 
我酒飲希望

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

$ python fake-chinese.py 私は理解しました      
我理解了

$ python fake-chinese.py 私は明日、伊豆大島に行きたい
我明日、伊豆大島行希望

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

$ python fake-chinese.py 今日は10時に仕事が終わります
今日10時仕事終了

$ python fake-chinese.py あなたは何時に終わりますか?
君何時終了如何?

「我理解了」はそのまんま中国語としても通じるそうです。

まとめ

今回は日本語の文字列を形態素解析し、品詞情報まで活用した変換処理を行いました。

今後の展望としては、「お酒を飲む」→「飲酒」のように、熟語に変換する処理を実装したいと思います。
たとえば「飲酒」は下から上を修飾するような熟語なので、

・日本語は並び順が主語 -> 述語であり、名詞 -> 動詞と続く場合がある(例: 私は酒を飲む)
・偽中国語っぽくするためには名詞と動詞を入れ替える必要がある
・「私は酒を飲む」を構文解析すると、「酒」は名詞、「飲」が動詞語幹となる。
・つまり動詞語幹 -> 名詞の順に並び替えてあげるとそれっぽくなる(飲酒)

上記のような処理を実現するとより偽中国語らしくなるのではないでしょうか。

あとは、学習データ作ってLSTMで適当にディープラーニング回すと、より高精度の翻訳機が得られると思います。

[2020/04/14 更新]Githubにリポジトリを立てました

9ヶ月の時を経て、Githubにリポジトリを作成しました。
https://github.com/k2font/pseudo-chinese
プルリク大歓迎です。よろしくお願いします。


  1. 偽中国語にはこれといった文法ルールはありません 

shoichiro-k
Pythonが好き。JavaScriptも好き。最近はC++で競技プログラミング。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした