扶桑工廠

I sleep all night and I work all day.

無料エロ漫画サイトの煽り文を機械学習で再現する方法(全年齢版)

<注意書き>

こちらは18歳未満でも安心して読める記事です。
よって結果は出力してません。結果を見たい18歳以上の方はnoteの記事

(https://note.mu/notes/n02752880ceaa)を読むか

TwitterBot(@R18_manga_LSTM)をフォローしてください。

こっちは手順解説です。

(5/5/2019更新)コードを少しマシにしました。 

今回、「エロ漫画タイム」(リンク先R18)

http://eromanga-time.com/)という無料エロ漫画サイトを題材として、文章の機械学習と文章の自動生成に取り組みました。

「エロ漫画タイム」には、独特な煽り文(作品紹介)があります。

これが非常に特徴的で面白いのですが、18歳未満にふさわしくないので例は差し控えさせてください。(note参照)

さて、この煽り文(に近いもの)を機械学習で作り出します。

 

◯環境

OS:Windows 10 home(64-bit)

GPU: Geforce GTX 1070Ti

Python 3.6.6(64bit)

Anaconda Navigator 1.9.6

MeCab-0.996

mecab-python-0.996

Jupyter Notebook 5.7.0

Google Chrome  72.0.3626.121(Official Build)(64 ビット)

 

◯データセットを用意する

まずは学習するためのデータセットを準備します。

APIが提供されてるならそちらからアプローチをかけたほうが良いですが、当然そんなものが提供されているはずもないので普通にやります。

サイトに行き、F12キーを押して(Google Chromeの場合)開発者モードを開きます。

f:id:fusowasedr09:20190324184930p:plain

↑開発者モードの例(このサイト)

そして、取得したい値がどこに書き込まれているかを探します。

今回の場合、<h2 class="article-title entry-title">の下にありました。

次に、ページ構造を確認しておきます。

普通に次のページに行き、URLの変化をチェックします。

「エロ漫画タイム」はURLが

http://eromanga-time.com/?paged=(ページ番号)

の形で管理されていたので、全ページを取得したいときはページ番号部分を動かせばいいとわかりますね。

これで必要な情報は手に入れたのでエディタに移りましょう。

 煽り文をスクレイピングするコードを書きます。

Beautiful SoupとRequestsをインストールしておく必要があります。

import bs4
import re
import requests
import os, sys, time

def scrape(mint):
    res = requests.get(mint)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text)
    titles = soup.find_all("h2", class_="article-title entry-title")
    for title in titles:
        print(title)
        time.sleep(5)
        
def main():
page_id_list = range(1,20)
for page_id in page_id_list:
scrape(f'http://eromanga-time.com/?paged={page_id}')
if __name__ == "__main__": main()

 前にげっちゅをスクレイピングした際に使ったコードを改造したので、前に何を参考にしていたか忘れちゃった。

注意するのは"class"は予約語なのでそのままでは使えず、”class_”で使うこと、ループ回さないと全取得できないことの2点。

このプログラムは取得した情報を保存してないですが、そのへんは大目に見てください。
やろうと思えばできますが(リストをstr型に変換してから書き込み)、jupyter使ったほうが簡単なので…
実際にはJupyter Notebookで動かして結果をコピペで保存しました。
2時間ほどかかると思います。

また、これだとhtmlタグがそのまま残るので、エディタで正規表現を使って処理します。

http://hodade.com/seiki/page.php?r_tag_sakujo

http://hodade.com/seiki/page.php?r_karagyou_sakujo

上のサイト2つを参考にして削除して、行を詰めます。

 

◯学習して出力する

今回はささっとやるために以下のレポジトリを使いました。

github.com

自動文章生成AI(LSTM)に架空の歴史を作成させた方法とアルゴリズム | SPJ

掲載元のサイトによると、事前処理が必要なのでこれも以下を参考にエディタで処理します。

http://hodade.com/seiki/page.php?r_gyoutou_tsuika

http://hodade.com/seiki/page.php?r_gyoumatsu_tsuika

 

データの事前処理が終わったら、プログラムをReadmeに従って実行します。

「--gpu=0」を使うと早くなると書いてありますが、generator.pyでGPUを使用するとエラーが出たので使わないほうがいいかも。

 

出力結果は…

18歳未満が見ると悪いのでやめておきます。botとnoteで確認してね!