【Python】機械学習で文章を自動生成する方法

python 機械学習で文章を自動生成する方法

今回は機械学習で文章を自動生成する方法をご紹介します。

  • プログラミング言語はPythonを使用します。
  • 機械学習のフレームワークはKerasを利用します。

細かい技術的な話をするのもいいのですが、ないより触って動くのが一番楽しい!ということで誰でも触って動かせる物を作りました。

GoogleColabさまさまですm(_ _)m

他人とソースコードを共有できて実行環境も全く同じで再現できるっていうのは本当に強力です。

はっきり言って革命です!

と、GoogleColabの話はこの辺にしておいて本題に移ります。

【Python】機械学習で文章を自動生成してみよう!

ブログに書く前にツイッターで投稿してしまったのでそのままコピペします。

と、いうわけです。

説明は不要なくらい簡単に実行できるのでここから実行してみてください。

※ アリスイン・ワンダーランド をディープラーニングで学習をさせて、それっぽい文章を自動生成してくれます。

.

.

.

機械学習で文章の自動生成をしてみて…

いかがでしたか?実行してみた感じは?

私はあのプログラムが動くようになるまで何時間もかかったので

「わーーー!やっと動いたーーーーーー!!!」

って、なりました。

学習の成果はそっちのけです(笑)

皆さんはそんな事ないと思うので初めの方の文章より、あとの方になるほどどんどん文章がそれっぽくなっていくのを見ていただけたのではないかと思います。

初めはこんな感じで何を言っているのか全然わかりません。

「work very un the said the said the said the said the said the said the said the said the said the said the sai」

それが学習が進んでいくとこんな感じで何となくそれっぽい文章になっています。
※ 最後が途中で途切れているのはプログラムで出力する文字数を100文字に制限しているからです。

「ome this mistered the more the next thing was soon a little garden into the mock turtle said to herself, ‘it w 」

一応、グーグル翻訳

「このことは、次のことが間もなく小さな庭園になってしまったので、自分自身に言ったモックカメへのミスを犯した」

意味は全然わかりませんが若干文章っぽくなっているのと「小さな庭」というあたりがアリスっぽさが出ている言葉かなと思います。

なんだ、ディープラーニングを使ってこの程度の文章しかできないのか…

とがっかりする人もいるでしょう。

実際、利用者(ユーザー)は基本的に「結果(成果物)」しか見ないのでこれ自体はなんの役にも立ちません。

10年ほど前にグーグル翻訳はありましたが、ほとんどの人が利用しなかったのと同じです。

結果が出ないと意味がない!というビジネスライクなことを言ってしまうと面白くないので

エンジニア目線で何が面白いのかをご紹介します。

どうやって機械は文章を理解・学習しているの?

機械学習をするときには学習用のデータを作ります。これは「教師データ」と「ラベル」と呼ばれるものがあります。

「ヒント」と「答え」だと思ってもらえれば大丈夫です。

  • 「教師データ」→ ヒント
  • 「ラベル」  → 答え

今回の文章生成ではこんな問題を作りました。

問:「アルファベット10文字」から次に来る「11文字目」を予測せよ。

これだけだといまいちピンとこないので人力で問題を説いてみましょう。


project g  のあとに来る1文字はなんだと思いますか?

project + g から始まる何かの単語です。

。。。

はい、分かる訳がありませんね。正解を見てましょう。

project g → u

正解は u でした。このあと1問ずつ見ても意味が分からないので10問まとめてヒントと答えを見てみましょう。

すると project の後に来る単語が何だったのか分かります。

1番目: project gu → t
2番目: roject gut → e
3番目: oject gute → n
4番目: ject guten → b
5番目: ect gutenb → e
6番目: ct gutenbe → r
7番目: t gutenber → g
8番目: gutenberg → ’
9番目: gutenberg’ → s
10番目: utenberg’s →

project の後に来る単語は utenberg’s でした。

この時点で10問中ほぼ全問不正解です。utenberg’sという単語を知っている人は途中で

もしかしてutenberg?と思った人もいるかも知れません。その人は正解率が少し高くなります。

続いてこちらはどうでしょうか?

enberg’s a a から始まる何かの単語です。個人的にはこの時点で予測不可能です(笑)

答えは l です。その次は
nberg’s al

答えは i と続きます。ali で「アリ」ときたら次に来るのは「ス?」ってなれば予想は大正解ですね!

berg’s ali → s   berg’s alis になります。


ということでこんな訳の分からない問題はこの辺にして本題に戻ります。

今回のディープラーニングではこんな無茶ぶりみたいな「ヒント」を与えて「答え」を予想させます。

アリスの文字数は約16万文字あるのでこれを1文字ずつずらしながら次に出てくる1文字を予想させます。

なんて鬼畜なんでしょうか(;´Д`) 人間だったら拷問です。

これを何回も何回も何回も繰り返すと、どんどん賢くなっていきます。

正確には確率とか微分とか魔法のように見える数式を使って正解に近づけるようにいろいろ計算しています。

1周した時点で100問中2〜3問くらいしか間違わない驚異的な予想能力を発揮していますが、結果は支離滅裂でしたね。

「work very un the said the said the said the said the said the said the said the said the said the said the sai」

しかし、50回ほど学習させるとなんとなく文章が作れるようになりました!!(100問中 不正解1.4門)

「ome this mistered the more the next thing was soon a little garden into the mock turtle said to herself, ‘it w 」

なんとあの訳の分からない問題をとき続けることで単語を学習するだけでなく文法もそれっぽく組み立てられるようになっているのです。

「そんなこと全く教えていないのに!!」

プログラミングで文法を教えようものなら

英語の教科書に書いてある文法を一つ一つコードに落とし込んでいく必要があります。

例えば

過去形のときは動詞の最後にedをつけて、

yで終わる単語は y を i に置き換えて ed をつけて、

y の前が母音だったら y は i に変えないとか…

こんなのが数え切れないほどあって、中には例外も存在して…

まぁ、気の遠くなるような作業です。

そんなものを実装しろと言われた日には「断ります」

しかし、ディープラーニングを使えば

「アルファベット10文字」から次に来る「11文字目」を予測せよ。 という問いを立て

ヒント 答え
0番目: project g → u
1番目: project gu → t
2番目: roject gut → e
3番目: oject gute → n
4番目: ject guten → b
5番目: ect gutenb → e
6番目: ct gutenbe → r
7番目: t gutenber → g
8番目: gutenberg → ’
9番目: gutenberg’ → s
10番目: utenberg’s →
11番目: tenberg’s → a
12番目: enberg’s a → l
13番目: nberg’s al → i
14番目: berg’s ali → c

こういう学習データを学習させると単語を勝手に覚えて、文法もなんとなくできて、文章を勝手に書けるようになるなんて感動です!!

あまりの感激にいろいろ思いを馳せてしまい寝れなくなりそうです。

まとめ

  1. ディープラーニングをGoogleColaboを使うと簡単にディープラーニングを体験できる!
  2. ヒントと答えからできた学習データから単語と文法を勝手に使えるようになった!
  3. ヒントから答えを予想しているだけでそれっぽい文章ができても機械は全く意味を理解していません!

3つ目はまとめでいきなり登場した内容ですが、これまで見てきた通り
ただ、次に来る文字を予想しているだけなので全然意味なんて理解して文章を作っていません。

学習データを「ヒトラーの発言全集」みたいなものを入れるとなかなかナチズムな発言をすると思うのですが、なんの意思も無ければ意味も分かっていないので無視しましょう。

今回の記事を気に入っていただけた方は是非フォローしてくださいね(^^)

技術系ブログですが今回のように非エンジニアに向けた技術系の話もあるので楽しんでいただけると思います。

今回の記事ではSimpleRNNを利用しましたがLSTMを使って文章の自動生成をしてみました。LSRMは今回より少しいい感じに文章を生成してくれています。

ぜひこちらもご覧ください。

【Python】LSTMを使って文章を自動生成

少し分野を変えて、物体検出をやってみたいという人はこちらをご覧ください。

【物体検出】keras−yolo3の使い方

3 Comments

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください