形態素解析とマルコフ連鎖を利用した文章の自動生成
今回は形態素解析とマルコフ連鎖を利用して文章の自動生成を行います。
例として『嫌われる勇気』で有名な「アルフレッド・アドラー」の名言集を使用し自動生成しました。
自動生成例
よく見ると意味が分からない気もしなくもないですが、それなりにいいことを言っているようにも見ます。マルコフ連鎖を利用した文章生成は文脈を意識せずに単語を組み替えるので、このように完全には自然な文章にはなりませんが、Twitterや短文のような数行程度の短い文章であればそこそこ日本語らしくみえるという特徴があります。
これは、日本語を文法や単語の品詞情報に分解する形態素解析のおかげです。
形態素解析とは
形態素解析とは、対象となる言語の文法や単語の品詞情報をもとに,文章を単語が意味を持つ最小の単位に分解する解析法です。
言葉だけでは通じにくいので、形態素解析の定番である「すもももももももものうち」を例にして見てみます。
1 2 3 4 5 6 7 8 |
すもももももももものうち すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ も 助詞,係助詞,*,*,*,*,も,モ,モ もも 名詞,一般,*,*,*,*,もも,モモ,モモ も 助詞,係助詞,*,*,*,*,も,モ,モ もも 名詞,一般,*,*,*,*,もも,モモ,モモ の 助詞,連体化,*,*,*,*,の,ノ,ノ うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ |
このように、ある名詞や助詞など、文章を意味のある最小単位の要素に分解することが形態素解析です。
形態素解析はPythonで行うことができ、形態素解析エンジンとして日本人により作られたJanome、MeCabなどがあります。これらのJanome、MeCabを使用することにより、特別な技術を必要とせずに形態素解析を行うことが出来ます。
では、実際にコードを作成していきます。
環境はAmazon AWS(EC2)、形態素解析エンジンとしてMeCabを使用していきます。
使用する環境
- Amazon AWS(EC2)
- Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type
- Python 2.x
- MeCab
- TextGenerato
Amazon AWS(EC2)での無料利用枠で使用できるt2.microを使用して環境を構築します。TextGeneratorはpython2.x系のコードですが、Amazon AWS(EC2)でのデフォルトではpython2.x系がインストールされているためそのまま使用することが出来ます。
Amazon Linuxでの環境構築
Amazon AWS(EC2)でのインスタンス生成
手順は省略します。
Amazon AWS(EC2)での無料利用枠で使用できるt2.microを使用して環境を生成します。生成が完了したらログインします。
最新環境へのupdate
1 |
$ sudo yum -y update |
1 2 |
$ python -V Python 2.7.14 |
現時点でインストールされているpythonのバージョンは2.x系のPython 2.7.14が最新でした。pythonのバージョンは3.x系もありますが、今回使用するTextGeneratorはPython2系のコードになっているためそのまま使用します。
Mecabのインストール
1 |
$ sudo yum -y install gcc make glibc gcc-c++ python-devel |
1 2 3 4 5 6 7 8 |
$ wget -O mecab-0.996.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" $ tar xvzf mecab-0.996.tar.gz $ cd mecab-0.996 $ ./configure $ make $ make check $ sudo make install $ cd ../ |
1 2 3 4 5 6 7 |
$ wget -O mecab-ipadic-2.7.0-20070801.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" $ tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz $ cd mecab-ipadic-2.7.0-20070801 $ ./configure -with-charset=utf-8 –enable-utf8-only $ make $ sudo make install $ cd ../ |
このMecab本体と辞書ファイルをインストールすることでいよいよmecabを実行することが出来ます。インストールが正しくできていることを確認するために、形態素解析の定番である「すもももももももものうち」を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 |
$ mecab すもももももももものうち すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ も 助詞,係助詞,*,*,*,*,も,モ,モ もも 名詞,一般,*,*,*,*,もも,モモ,モモ も 助詞,係助詞,*,*,*,*,も,モ,モ もも 名詞,一般,*,*,*,*,もも,モモ,モモ の 助詞,連体化,*,*,*,*,の,ノ,ノ うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ EOS |
このように、「すもももももももものうち」という言葉が固定の意味を持つ単語に分解されたら成功です。
この画面はCTL+Cで抜けることが可能です。これでmecabを使用することが出来ました。しかし、今のままではPythonからは読み出すことが出来ません。次にPythonのコードからmecabを起動できるようにmecab-pythonを使用してバインディングを行います。
mecab-pythonのインストール(失敗編)
なぜかここで手間取ったのでメモとして残しておきます。
1 2 3 |
pip install mecab-python You are using pip version 9.0.3, however version 18.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. |
そのまま、pip install mecab-pythonを行うと、バージョンが古いのでインストールに失敗しましたというメッセージが出力されます。さらに不思議なことにpip install --upgrade pipを行った場合でもバージョンが古いのでインストールに失敗しましたというメッセージが繰り返されます。
そこでpipバージョンの再インストールを行います。
mecab-pythonのインストール(成功編)
pip自体のバージョン更新
1 2 3 4 5 |
$ sudo python -m pip uninstall pip $ hash -r $ sudo easy_install pip $ sudo easy_install --upgrade pip $ pip -V |
pip -Vにて最新のバージョン(現在は18.1)の表記が出力されればバージョン更新は成功です。
1 |
$ sudo su - |
1 2 3 |
# pip install mecab-python # echo '/usr/local/lib' >> /etc/ld.so.conf.d/local.conf # ldconfig |
mecab-pythonのインストール
pip install mecab-pythonでインストールします。
1 |
# yum -y install git |
Complete!と表示されたら成功です。
形態素解析とマルコフ連鎖を利用して文章の自動生成を行う
いよいよ文章の自動生成を行っていきます。こちらのサイトを参考にして頂きました。
TextGeneratorをgitからclone
1 2 |
# git clone https://github.com/karaage0703/TextGenerator.git # cd TextGenerator |
その後、自動生成をするための元ネタとなる文章をsample.txtというファイル名に保存して以下コマンドを実行して下さい。
1 |
# python PrepareChain.py sample.txt |
これで元となる文章の解析が終わり、データベースファイルが作成されます。最後に以下コマンドを実行するたびに文章が自動で生成されます。最後の10というのは10行を示しています。ここを変更することで文章量を変更することができます。
1 |
# python GenerateText.py 10 |