PR

形態素解析(けぇてぇそけぇせき)で悟空語ジェネレーターZ

コラム
スポンサーリンク

「わしが博士じゃよ」「私、中国人アルよ」といった表現を役割語と言います。
自然言語の形態素解析を利用すると、これを機械で変換できるようになります。

  • 文章を品詞や単語に分解、分析する
  • 特定の品詞や単語に変更を加える

こうすることで江戸っ子言葉にや関西弁など、特徴ある変化をさせられることができます。
ドラゴンボールでおなじみ、孫悟空の口調に変換してみます。
下記の書籍を参考にしています。

Janomeで形態素解析

紙面中に形態素解析のJanomeを使って形態素解析をするサンプルがあります。

# Janomeのロード
from janome.tokenizer import Tokenizer

# Tokenizerインスタンスの生成
tokenizer = Tokenizer()

# 形態素解析の実施
tokens = tokenizer.tokenize("肉を食べよう!")

# 解析結果の出力
for token in tokens:
  print(token) # 各単語の全情報
  # print(token.surface) #元の単語そのまま ⇒ 出力を省略
  print(token.reading) # ヨミガナ
  print(token.base_form) # (動詞などの)原形
  print(token.part_of_speech) # 品詞情報
  print(token.part_of_speech.split(','))  # 品詞情報をカンマで区切り、リスト形式に加工
  print(token.part_of_speech.split(',')[0]) # [0]でリストの先頭の要素を参照
  print("-----") # わかりやすいように単語ごとに仕切りを入れる

実行結果

肉	名詞,一般,*,*,*,*,肉,ニク,ニク
ニク
肉
名詞,一般,*,*
['名詞', '一般', '*', '*']
名詞
-----
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
ヲ
を
助詞,格助詞,一般,*
['助詞', '格助詞', '一般', '*']
助詞
-----
食べよ	動詞,自立,*,*,一段,未然ウ接続,食べる,タベヨ,タベヨ
タベヨ
食べる
動詞,自立,*,*
['動詞', '自立', '*', '*']
動詞
-----
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
ウ
う
助動詞,*,*,*
['助動詞', '*', '*', '*']
助動詞
-----
!	記号,一般,*,*,*,*,!,!,!
!
!
記号,一般,*,*
['記号', '一般', '*', '*']
記号
-----

冊子中ではこの形態素解析結果を利用し、例えば助詞を除いてカタカナにすることで
「これで今日からみんな原始人になる」⇒「コレ キョウ ミンナ ゲンシ ジン ナル」
とする原始人ジェネレーターを作成しています。

Janomeで形態素解析(けぇてぇそけぇせき)

それなら形態素解析を使って、あの特徴のある悟空の言葉にも変換できるかなと考えたところ、すでに作成されて試せるWebサイトがありました。
悟空語ジェネレーター

Python(ぺぇそん)のライブラリ(れぇぶらり)にした方もいて、その実装も書籍中で紹介されてっぞ。しっかしこの悟空語ジェネレーター確かにすげぇんだけど、ちょっと不備があっぞ。

「おはようございます。私は悟空です。」
「案外簡単に戦闘民族になれてすごいぞ」を変換してみます。

!pip install janome==0.3.7
!pip install pykakasi==0.94
!pip install semidbm==0.5.1
!pip install six==1.12.0
!pip install gokulang==1.0.2
from gokulang.gokulang import GokuLang
g = GokuLang()
print(g.translate('おはようございます。私は悟空です。'))
print(g.translate('案外簡単に戦闘民族になれてすごいぞ'))

実行結果

おはようこぜぇます。私は悟空です。
あんげぇ簡単に戦闘民族になれてすげぇぞ

2文目は良い感じですが1文目は違う、こうじゃない。笑

悟空語ジェネレーターZ

そこで特定の言葉を置換する機能も追加してみます。品詞に対する操作で語尾・語感を変更し、特定の単語を置換する。この変換テーブルを充実させるほど変換精度を上げられるはず。
大袈裟ですが、悟空語ジェネレーターZと呼ぶことにします。

# 変換用の辞書定義 悟空語ジェネレーターZ
from gokulang.gokulang import GokuLang
g = GokuLang()

goku_dict = {
    "おはようございます" : "おっす",
    "おはよう" : "おっす",
    "こんにちは" : "おっす",
    "こんばんは" : "おっす",
    "私は" : "オラ",
    "です" : "",
    "。" : "!",
}

def gokuz(input_str):
  result_str = input_str
  for key,value in goku_dict.items():
    result_str = result_str.replace(key, value)
  result_str = g.translate(result_str)
  return result_str

print(gokuz('おはようございます。私は悟空です。'))
print(gokuz('案外簡単に戦闘民族になれてすごいぞ'))
print(gokuz('汚い花火だ'))
print(gokuz('パイソンに慣れたか?今のお前なら大丈夫だ'))

実行結果

おっす!オラ悟空!
あんげぇ簡単に戦闘民族になれてすげぇぞ
きたねぇ花火だ
ぺぇそんに慣れたか?今のおめぇならでぇじょうぶだ

形態素解析で語尾・語感を変更し、特定の単語を置換することでさらに変換精度を上げる。
その変換する単語を充実させていけば、変換精度は上がっていくはず。
おもしろい。ワクワクすっぞ。

この書籍の第二章を利用しました。

この記事では形態素分析を使って文章の加工にトライしました。
下記の記事では同じく形態素分析を使って、意味の評価にトライしています。

コメント

タイトルとURLをコピーしました