自動生成キャッチコピー【Python】

# 概要
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/5481ff66-0b4a-f3bb-f211-2bdadf6ce0b8.png">

PythonのMecabを使用して、様々な教師データから「っぽい文章」を生成します

# WEBアプリ制作しました
キャッチコピー自動生成のWEBアプリケーションを開発した話【MeCab】
https://qiita.com/SyogoSuganoya/items/8baa519cee5101912b3e

## サービスサイト
MakeLike
https://melikeke.sakura.ne.jp/malike/intro

## 参考

Python3からMeCabを使う
https://qiita.com/taroc/items/b9afd914432da08dafc8

MecabをPythonで使うまで
https://qiita.com/Sak1361/items/47e9ec464ccc770cd65c

マルコフ連鎖を使って〇〇っぽい文章を自動生成してみた
https://www.pc-koubou.jp/magazine/4238

マルコフ連鎖を使ってブログの記事を自動生成してみた
https://karaage.hatenadiary.jp/entry/2016/01/27/073000

# ソース
```python:main.py
file = '教師データ/米津玄師.txt'
roopCnt = 5
size = 2

learnText.createText(file, roopCnt, size)
```
```python:learnText.py
def load_from_file(files_pattern):
    '''
    指定されたファイルパターンに一致するファイルを読み取ってマージし、解析の準備をしてから返します
    '''

    # テキスト読み込み
    text = ""
    for path in iglob(files_pattern):
        with open(path, 'r') as f:
            text += f.read().strip()

    # いくつかの記号を削除する
    unwanted_chars = ['\r', '\u3000', '-', '｜']
    for uc in unwanted_chars:
        text = text.replace(uc, '')

    # 青空文庫表記を削除
    unwanted_patterns = [re.compile(r'《.*》'), re.compile(r'［＃.*］')]
    for up in unwanted_patterns:
        text = re.sub(up, '', text)

    return text


def split_for_markovify(text):
    '''
    テキストを改行で文に分割し、文をスペースで単語に分割する
    '''
    # mecabを使用して単語を区切る
    mecab = MeCab.Tagger()
    splitted_text = ""

    # これらの文字はmarkovifyを壊す可能性があります
    # https://github.com/jsvine/markovify/issues/84
    breaking_chars = [
        '(',
        ')',
        '[',
        ']',
        '"',
        "'",
    ]

    # テキスト全体を改行で文に分割し、文をスペースで単語に分割します
    for line in text.split():
        mp = mecab.parseToNode(line)
        while mp:
            try:
                if mp.surface not in breaking_chars:
                    splitted_text += mp.surface    # ノードがmarkovifyである場合はスキップする
                if mp.surface != '。' and mp.surface != '、':
                    splitted_text += ' '    # スペースで単語を分割する
                if mp.surface == '。':
                    splitted_text += '\n'    # 改行による再表現
            except UnicodeDecodeError as e:
                print(line)
            finally:
                mp = mp.next

    return splitted_text


def createText(file, roopCnt, size = 3):
    '''
    教師データから文書を自動生成する

    Parameters
    ----------
    String : file
        教師データパス
    String : roopCnt
        生成回数
    String : size
        何単語ずつのブロック

    Returns
    -------
    List
        生成文書のリスト
    '''

    # 教師テキスト読み込み
    rampo_text = load_from_file(file)

    # テキストを学習可能な形式に分割する
    splitted_text = split_for_markovify(rampo_text)

    # テキストからモデルを学ぶ。
    text_model = markovify.NewlineText(splitted_text, state_size = size)

    textList = []
    while len(textList) < roopCnt:
        time.sleep(5)
        # モデルから生成する
        sentence = text_model.make_sentence()

        if(len(sentence) <= 50):
            text = ''.join(sentence.split())
            textList.append(text)
            print(text)
            continue

        while len(sentence) >= 50 :
            index = sentence.find(' ', 50)

            sliceText = sentence[:index]
            text = ''.join(sliceText.split())
            sentence = sentence[index:]

            print(text)
            textList.append(text)
```

# 生成例
## 小説っぽい
### 夏目漱石っぽい
四つ目垣の穴を埋め、黒石を取って来る。
私は今まで何遍も繰り返したあとで、私は決して満足できなかった。
僕などはとうてい絶対の境に這入れそうもない男だから、すぐ承知して下さい」
「大和魂はどんなものだろうか、それとも打ち明けずにいるのだ
返答次第ではその分に捨ておくのではない。

### 坂口安吾っぽい
条件として内海殺しが容易でもあり、又、諸井看護婦を殺すか、諸井看護婦をしたがえて
広間へ現れた場合はカケた茶碗がまわったのであった
こうして千草殺しは易々と終り、犯人御両名は連日賭けの撞球に打ちこん毎日毎日ねむって、
キリがないじゃないか」巨勢博士も読者の知った事実
まだ顔をふき終らぬうちに、女のふっくらツヤのある透きとおる声は次のような遥かな戯れにしか意識されて、
答がでてくると、追っかけて女中がやってきて、再び戻られた時には、おそくもここへ見えられまして

## 物件キャッチコピーっぽい
### 名古屋市中区っぽい
オートロック付きで安心、ゆとりの１ＬＤＫです。
お料理好きには小学校もあります。
お料理好きには嬉しい二口コンロ・栄まで徒歩５分♪マンションは公園の横にあり、
近くには嬉しい二口コンロ・栄まで徒歩圏内人気の錦１
スキップフロアの１ＬＤＫ。

### 名古屋市東区っぽい
学校施設の２基、ＴＶドアホン、追い焚きがあります。
生活環境がある町です。
インターネット無料マンション！
システムキッチンタイプの多い方に空きが上質なカウンターキッチンの移動や桜通線一人ではこちらは、オンリーワンの物件

## 歌詞っぽい
### 米津玄師っぽい
遠くへだって僕は何があり次はとうに廃れた思い出せなくていないと
嫉妬ばっか探してしまうの先も憂い繰り返し思い浮かぶそのためにもあい
間違いだらけのいる誰も慣れていったんだそう二人二人がある？
やい、やい、お前の真ん中でいつかの4ですいません嗚呼毎度ありがたし微睡んでさえ出来やしないように
いるんだそれで何万と行きませんだ!
どんだけが体に静かな商品さは意味に柔くも澄んで君を喋りあいたいよ
続けておいてしまったのに僕らにすると思わなければいいのを聞かせ

### B'zっぽい
どうか強くなれるのままのならキライとすぐにバイバイ惜しくないウワサが軽くほどいちゃいけない
独りで確かめてしまうほど激しく爪も紅く焼きついてくれて鍛え抜かれるいらない
悔いなくてそのうちオマエはいらない
きみが流れる月日をはりましょう泣いていたきみが乱暴に立って涙ながら
転校生だよ差し出されてるいつもドアということは僕はみんなで
Push!Yeah!Crush!Yeah!Weve got you come true Every time I gotta go
まじわりあう風景こわいけれど戻りたい想いながらいつもいいふらし

### あいみょんっぽい
ところを加えてよその白く柔らかいマシマロの心の頬が
「何も夢を呑み歩く影青く滲んだな馬鹿騒ぎしたあの日前に溢れそうすればいいけど
選ばなかったものすり潰してイヤフォンを見せましょう恋はいつも君が来た高校卒業の
持って当然、ああ最低で愛を黙ってねーロックオン「今がいるその気が知ってるようなくらいに
ぶりっ子かなのは極度のどこかの下は馬鹿でかいとか言うなきっとこの恋なんて
考えてあげような身体冷やして幸せに行くから最悪でもよくなるのさ

### 西野カナっぽい
こんなもんじゃないbetogetherみんなで引き止めないよねGirls just
誰か分からない、でも必ず守るから繋いだよやっと会える今日がまだ見つからないの保証の着信音も
今でがんばってどうもありがとううかない!
nana波乗りBOYにしちゃうIt sa goodby,I always feel restless
どうせならなんて嫌この感じか分かんないいつの好き嫌いでしょ笑っているの聞けないでしょ
そんなはずは会えなくても子が起きてきたのにね


# 漫画の技名を生成したかったけど…
Bleach | 術・詠唱
http://ort.yh.land.to/bleach/chantp.html
試してみたが、辞書登録されてない単語が多く、生成エラーが出力されました。
SF系で造語が頻出する漫画は難しいかも？