【Python】架空の言語を作ろう!【テビュタ語】【日本語版】
前置き
この記事は、2/12に公開した
↑この記事↑の日本語版です。
合わせてお読みいただけましたら幸いです〜
唯坂 優(たださか ゆう)です。
世界には色々な言語がありますが、
自分だけのオリジナルな言語が欲しいと思ったことはありませんか?
例えば物語を創作するときに、
架空の国から来た人が日本語喋ってたら変ですよね?
そこで今回は、
Pythonで架空の言語を作れるコードを書いてみました!
コード概観
def making_language(sent,lang=False):
lang_dict=eval(func.txtfile('language.txt'))
katakana={('a', 'a'): 'ア', ('a', 'i'): 'イ', ('a', 'u'): 'ウ', ('a', 'e'): 'エ', ('a', 'o'): 'オ', ('k', 'a'): 'カ', ('k', 'i'): 'キ', ('k', 'u'): 'ク', ('k', 'e'): 'ケ', ('k', 'o'): 'コ', ('s', 'a'): 'サ', ('s', 'i'): 'シ', ('s', 'u'): 'ス', ('s', 'e'): 'セ', ('s', 'o'): 'ソ', ('t', 'a'): 'タ', ('t', 'i'): 'チ', ('t', 'u'): 'ツ', ('t', 'e'): 'テ', ('t', 'o'): 'ト', ('n', 'a'): 'ナ', ('n', 'i'): 'ニ', ('n', 'u'): 'ヌ', ('n', 'e'): 'ネ', ('n', 'o'): 'ノ', ('h', 'a'): 'ハ', ('h', 'i'): 'ヒ', ('h', 'u'): 'フ', ('h', 'e'): 'ヘ', ('h', 'o'): 'ホ', ('m', 'a'): 'マ', ('m', 'i'): 'ミ', ('m', 'u'): 'ム', ('m', 'e'): 'メ', ('m', 'o'): 'モ', ('y', 'a'): 'ヤ', ('y', 'u'): 'ユ', ('y', 'o'): 'ヨ', ('r', 'a'): 'ラ', ('r', 'i'): 'リ', ('r', 'u'): 'ル', ('r', 'e'): 'レ', ('r', 'o'): 'ロ', ('w', 'a'): 'ワ', ('@', '@'): 'ン', ('g', 'a'): 'ガ', ('g', 'i'): 'ギ', ('g', 'u'): 'グ', ('g', 'e'): 'ゲ', ('g', 'o'): 'ゴ', ('z', 'a'): 'ザ', ('z', 'i'): 'ジ', ('z', 'u'): 'ズ', ('z', 'e'): 'ゼ', ('z', 'o'): 'ゾ', ('d', 'a'): 'ダ', ('d', 'e'): 'デ', ('d', 'o'): 'ド', ('b', 'a'): 'バ', ('b', 'i'): 'ビ', ('b', 'u'): 'ブ', ('b', 'e'): 'ベ', ('b', 'o'): 'ボ', ('p', 'a'): 'パ', ('p', 'i'): 'ピ', ('p', 'u'): 'プ', ('p', 'e'): 'ペ', ('p', 'o'): 'ポ', ('ky','a'):'キャ',('ky','u'):'キュ',('ky','o'):'キョ',('sy','a'):'シャ',('sy','u'):'シュ',('sy','o'):'ショ',('ty','a'):'チャ',('ty','u'):'チュ',('ty','o'):'チョ',('ny','a'):'ニャ',('ny','u'):'ニュ',('ny','o'):'ニョ',('hy','a'):'ヒャ',('hy','u'):'ヒュ',('hy','o'):'ヒョ',('my','a'):'ミャ',('my','u'):'ミュ',('my','o'):'ミョ',('ry','a'):'リャ',('ry','u'):'リュ',('ry','o'):'リョ',('gy','a'):'ギャ',('gy','u'):'ギュ',('zy','a'):'ジャ',('zy','u'):'ジュ',('zy','o'):'ジョ',('by','a'):'ビャ',('by','u'):'ビュ',('by','o'):'ビョ',('py','a'):'ピャ',('py','u'):'ピュ',('py','o'):'ピョ'}
sentence=[]
if lang:
lang_name=lang
_dict=lang_dict.get(lang)
if _dict is None:
_dict={}
else:
lang_name=''.join(random.sample(list(katakana.values()),random.randrange(4)+1))
_dict={}
for _word in func.janome(sent):
if '記号' in _word or '固有名詞' in _word or _word[-1]=='*':
sentence.append(_word[0])
continue
_get=_dict.get(_word)
if _get is None:
n=len(_word[-1])
len_changer=1
len_counter=0
while True:
rn=0
while rn<=0:
rn=random.randrange(n-len_changer,n+len_changer)
new_word=''.join(random.sample(list(katakana.values()),rn))
if new_word not in _dict.values():
break
len_counter+=1
if len_counter>5:
len_changer+=1
_dict[_word]=new_word
else:
new_word=_get
sentence=sentence+[' ',new_word]
lang_dict[lang_name]=_dict
func.txtfile('language.txt',lang_dict)
return (''.join(sentence[1:]),lang_name)
はい。
基本的には与えられた文章をjanomeで形態素解析してそれぞれの単語にランダムに生成したカタカナ語を置換するだけのシンプルなコードですが、
↑ご覧の通り↑けっこうそれっぽい出来になっているのでは?
まだ試作段階なので改良できる部分は多々あるものの、
一日で作ったにしては大満足のクオリティです!
前述の通り創作に活用するもよし、
自分だけの秘密の日記を書くもよし…
ここまで書いて気付いたんですが、
架空の言語から日本語への翻訳機能をつけ忘れましたね。
…まあいいか。
せっかくの力作なので解説をしたい。
細かいこだわりポイントいっぱいあるんですよね…
len_counterとlen_changer
n=len(_word[-1])
len_changer=1
len_counter=0
while True:
rn=0
while rn<=0:
rn=random.randrange(n-len_changer,n+len_changer)
new_word=''.join(random.sample(list(katakana.values()),rn))
if new_word not in _dict.values():
break
len_counter+=1
if len_counter>5:
len_changer+=1
新しい単語を生成するとき、
なるべく元の単語と近い文字数になるように基本的には誤差を±1までに設定してあります。
しかし単語数が増えていくにつれて被りが発生する可能性があるので、
誤差範囲内での生成結果が6回既存の単語と一致した時点で許容誤差を1つ増やす(len_chager+=1)処理を加えています。
我ながら周到…
出力例
テストコード1
print(making_language('僕は人間です'))
言語の名前を指定せずに文章だけ入力した場合の結果です。
↑今回の記事↑に使用しているテビュタ語の最初の一文ですね。感慨深いです。
このテビュタという名前もランダムに生成されたものです。
一度生成された言語の名前はlang_dictのkeyとして保存され、以後は第二引数に指定すれば既存の単語を軸に新たな単語をまた生成して語彙を増やしていくことができます。
テストコード2
print(making_language('美味しいヤミー感謝感謝またいっぱい食べたいな','テビュタ'))
ドサラヘ ヤミー ビャビョイル ビャビョイル!!
ヒポ ヘシュチポ ゴ モ リュ!!!
こんな感じです。
お気づきだと思いますけど前回の記事すごく大変だったんですよ。
最初に日本語版の文章考えていちいちこの関数に突っ込んで訳してさ…
めちゃくちゃ頑張ったので、
もし面白いなと思ってくれた人がいたら嬉しいです。コピペでもして使ってやってください。
また改良すると思うのでその時は記事にしますね。
さよなら〜
この記事が気に入ったらサポートをしてみませんか?