Python
ShellScript
mecab
Docker

形態素解析、マルコフ連鎖による文章の自動生成


はじめに

機械学習やら色々な新しい事を実践的に試すべく

エロサイトを開発中。モトダチ

開発実践用にオープンしているので広告は入っておりませんのでお気軽にどうぞ。

色々工夫したアプリケーションの作りになっているのでレスポンスは速いはず。


概要

文章の自動生成をしてみたいと思いつく。

調べたところDeeplearningを使ったアプローチとマルコフ連鎖というものを使ったアプローチがあると知り、手っ取り早くアウトプットが出せそうなマルコフ連鎖を使って実装してみる。


作業

環境はUbuntu,Debian系のDockerイメージに、

python2,MeCabをインストールしてコンテナを作成。

下記のDockerfileを用意してdocker build .を叩く

#Dockerfile

FROM ubuntu:16.04

RUN apt-get update \
&& apt-get install -y mecab \
&& apt-get install -y libmecab-dev \
&& apt-get install -y mecab-ipadic-utf8\
&& apt-get install -y git\
&& apt-get install -y make\
&& apt-get install -y curl\
&& apt-get install -y xz-utils\
&& apt-get install -y file\
&& apt-get install -y sudo\
&& apt-get install -y wget

RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git\
&& cd mecab-ipadic-neologd\
&& bin/install-mecab-ipadic-neologd -n -y

RUN apt-get install -y software-properties-common vim

RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install python2.7
RUN apt-get update

RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install python-pip

RUN pip install --upgrade pip setuptools
RUN pip install mecab-python

ここで地味に詰まったのだが、

上記、DEBIAN_FRONTEND=noninteractive apt-get -yq install の記述がないと、

ビルド時に下記のようにインタラクティブに入力を求められて落ちる。

Do you want to continue? [Y/n] Abort.

The command '/bin/sh -c apt-get install python2.7' returned a non-zero code: 1

ビルドが無事成功した後は、

docker exec -it [コンテナ] /bin/bashで作成したコンテナ内に入り、適当な作業ディレクトリを作る。

今回メインのソースは、からあげさんのブログのソースを使わせて頂く。

上記ブログ内のgithubからソースをクローンする。

文章の自動生成については、クローンしたディレクトリ内のsample.txtに任意の文章を読み込ませ、下記コマンドを叩けば終わる。

# 元となる文章の解析

python PrepareChain.py sample.txt

# テキスト出力
python GenerateText.py 10

今回は、ホストPC本体をクリーンに保つため、dockerを使っている。文章生成するたびにコンテナ内に入るのも面倒なので、スクリプトを用意する。

まずは、ホストPCに下記のようなファイル構成のディレクトリを用意。

.

├── Dockerfile
├── get-text.sh
├── result.txt
└── sample.txt

get-text.shを下記のように編集する。

#!/bin/bash

# ホスト→コンテナへのsample.txtのコピー
docker cp sample.txt [コンテナ]:/home/TextGenerator/sample.txt

COMMON="docker exec -i [コンテナ] /bin/bash -c "

# コンテナ内スクリプト実行
$COMMON "cd /home/TextGenerator && python PrepareChain.py sample.txt"
$COMMON "cd /home/TextGenerator && sh generate-file.sh $1"

# コンテナ→ホストへのresult.txtのコピー
docker cp [コンテナ]:/home/TextGenerator/result.txt .

最後にもう一度、コンテナ内に入り、同作業ディレクトリに下記のスクリプトを配置する。

#!/bin/bash

# 文章数の長さを引数で指定し、結果をファイル出力する
python GenerateText.py $1 > result.txt

これでhost側のsample.txtを編集しsh get-text.sh [文章数] を実行するとresult.txtに結果が帰ってくるようになる。


早速試してみる

今回は下記AVのレビューをもとに、文章を自動生成してみようと思う。

スクリーンショット 2019-05-13 0.25.24.png

レビュー元サイトはこちら

本来であれば、レビュー取得もスクレイピングなどを使って技術的に解決したいところだが、

今回は動作確認ということで、手っ取り早く1つの記事を手で取得する。

まずは、文章数10で。

sh get-text.sh 10

cat result.txt で確認


そんな最高の脚を器用に使って、くちゃくちゃとイヤらしい音が響く。10回射精」にピッタリの女優である。本作品は、たかしょーの1日で10回射精となっている。前戯の間に見つめ合いながら、ディルドを使って、足コキは圧巻だ。本作品のポイント(陥没乳首女優の特権である。10回のSEX、それだけでも十分な「エロ強さ」がなければ、男の上に覆い被さり、唇を奪う濃厚なベロキスであるからこそ、実は最もエロティックな行為である。能動的で過激なエロスが描かれる様は、欲望が抑えきれず、ついつい能動的で、徐々に乳首が膨らみ始め、自撮りの状態でオナニーをするのだ。彼女の場合、性的興奮による乳首の変化はダイナミックであり、男の乳首をいじり、弄ぶのであり、男としてはなんとも贅沢なオナニーである。エロ強いからこそ、至極のひとときである。


......うーん...w

文章を短くしてみる。

sh get-text.sh 5


しかし、実は最もエロティックな行為である。本作品において、彼女は立派な陥没乳首女優である。陥没乳首フル勃起そんな、乳首よし、カップよしの完全巨乳に挟まれるパイズリこそ、その乳首の勃起がとても分かりやすく、性欲の強さ」がなければ、男も女も、自然と唾液が溢れ出ている。Gカップ・パイズリ



結論

これはこれで芸術的と前向きに捉える。そもそも、元文章を解析して各単語を取得して、それを不自然にならないように組み替えるだけなので文脈は読み取ることができないし、カッコとかうまく処理できない。

ユースケースとしては、何か文章を書いていて煮詰まった時、このプログラムが作った、人間にはおよそ生み出すことができなさそうな文章からインスピレーションを得ることができるかも。。。?

次はディープラーニングで文章生成してみます。