MeCabでパプリカのセリフ生成器を作ってみた


パプリカとは

2006年の名作アニメ映画作品です。
中でも有名なのは、

「オセアニアじゃ常識なんだよ」
https://dic.nicovideo.jp/a/%E3%82%AA%E3%82%BB%E3%82%A2%E3%83%8B%E3%82%A2%E3%81%98%E3%82%83%E3%81%82%E5%B8%B8%E8%AD%98%E3%81%AA%E3%82%93%E3%81%A0%E3%82%88

というセリフです。これは上記リンクにある通り、作中で、

何者かによって誇大妄想狂の精神病患者の夢を脳内に流し込まれた所長が発したセリフ。

です。
誇大妄想狂の精神病患者の夢を脳内に流し込まれると、発狂してこのような変な文章を口走ってしまうのですが、この文章はデタラメのようですが、文法は正しいという特徴があります。

さて、今回はこのような文章をMeCabを使って自動生成してみました。

まず、MeCabにnellogdを設定し、辞書のcsvファイルを読み込んでおきます。

import csv
import re
import MeCab
import numpy as np
import random
class Paprika(object):
    def __init__(self, path):
        self.__mecab = MeCab.Tagger("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
        with open(path, newline='') as csvfile:
            data = csv.reader(csvfile)
            self.__sents = np.array([row for row in data])

neologdの辞書から、ランダムな単語を取り出すメソッドをつけます。

class Paprika(object):
    def __init__(self, path):
        self.__mecab = MeCab.Tagger("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
        with open(path, newline='') as csvfile:
            data = csv.reader(csvfile)
            self.__sents = np.array([row for row in data])

    def random_sent(self):
        return self.__sents[random.randint(0,len(self.__sents))][0]
    def get_newtext(self,text):
        sents = []
        for s in self.__mecab.parse(text).split('\n'):
            j = re.split('\t|\,', s)
            print(j)
            if len(j) > 2 :
                if re.compile('^名詞').match(j[1]):
                    j[0] = self.random_sent()
                sents.append(j[0])
        return ''.join(sents)

 これで、任意の文章の名詞のみをランダムに書き換えることができます。

p = Paprika('Noun.csv')
text = "吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。"
text = p.get_newtext(text)
print(text)

実行結果

尚侍。年歯はまだ無い。錨鎖で生れた新刀と盗人がつかぬ。納采でも薄暗いじめじめ二食静心でニャーニャー泣いて書き下し文だけは目安している。