未経験からの文章生成 実践入門

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

  • このエントリーをはてなブックマークに追加
  • Pocket
文章生成AI(LSTM)

AIに文章を作らせる方法概要

架空の名前から架空の人物の歴史概要を作成させてみました。

やり方としては、wikipediaの人物の概要の部分を抜き出してRNNにトレーニングさせます。

そのトレーニングさせたモデルに対して名前を入力すると、その人物の概要を出力してくれるようにします。

RNNとは、Recurrent Neural Networksの略で、時系列の情報を学習させるためのニューラルネットワークのモデルのことです。

 

文章を生成させるようなモデルの場合、多層パーセプトロンのようなモデルだと出力の長さが一定になってしまい、うまく作ることができません。

そこでRNNを使い、入力が単語(文字)、出力が次の単語(文字)として学習させると、そのモデルに次々と出力された単語を入力させることによって文章が生成出来るようになります。

そして、RNNは内部の重みを入力によって更新し、次の入力に備えます。

それによって、前の入力が例えば「僕/の/名前/は」と来たら、次に来るのは男性の名前であり、「私/の/名前/は」ときたら、女性の名前を出すようなモデルが作成出来るようになります。

RNN
引用:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

また、学習時に終了フラグのようなものを定義して置くとそこで自動的に処理をストップさせることが出来るので、永遠に単語が出続けるということもありません。

ここで実際に使うのはLSTMという、RNNの進化版のようなモデルになります。

RNNは情報を長く記憶しておく事が不得意なので、単語を幾つか入力していくと過去の情報を忘れてしまいます。

先程の例で言うと、「私の名前はさやかです。最近は~~~ところで…」など長く入力していくと「ところで」をモデルに入力するタイミングでは、名前がさやか ということは忘れてしまっている可能性が高いということです。

この問題を解決したのがLSTMとなります。

環境構築方法

python3
必要なモジュールのインストール
mecab

sudo apt-get install mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8
pip install mecab-python3

AIライターの実装手順

まずwikipediaの概要を取ってくる必要がありますが、全ページクローリングするのは大変です。

そこで、dbpediaという便利なものがありますのでこれを使います。wikipediaの内容がデータベース上に入っており、SPARQLという言語でクエリを投げることができます。

今回は人物の概要が欲しいので、以下のクエリを投げます。

select distinct ?name ?abstract where {
  ?s a dbpedia-owl:Person .
  ?s rdfs:label ?name .
  ?s <http://dbpedia.org/ontology/abstract> ?abstract .
}

このクエリで全件ダウンロードしたいので、下記のpythonを用意しました。

import csv
from urllib.request import urlopen
import io
import os

f_write = open('ja.txt','w')
url = 'http://ja.dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fja.dbpedia.org&query=select+distinct+%3Fname+%3Fabstract+where+%7B%0D%0A++%3Fs+a+dbpedia-owl%3APerson+.%0D%0A++%3Fs+rdfs%3Alabel+%3Fname+.%0D%0A++%3Fs+%3Chttp%3A%2F%2Fdbpedia.org%2Fontology%2Fabstract%3E+%3Fabstract+.%0D%0A%7D%0D%0Aoffset+0%0D%0ALIMIT+10000&should-sponge=&format=text%2Fcsv&timeout=0&debug=on'
csv_text = urlopen(url)
cr = csv.reader(io.TextIOWrapper(csv_text))

row_count = 0
for row in cr:
	row_count+=1
    if row_count==1:
        continue
    f_write.write("<BOS>"+row[1]+"<EOS>\n")

BOS =Begin Of Sentence
EOS = End Of Sentence
の意味になります。後ほどモデルに食わせる時のためにこれらを文章の前後に付けます。

このコードだと10,000件しか取れないのですが、あまり多いと学習に時間もかかるため、今回は10,000人のユーザーから学習させてみます。

これで、ja.txtに人物の概要が1人1行で記載されたと思います。

ここでSPJのgithubを使用します。

git clone https://github.com/SPJ-AI/lesson
mv ja.txt lesson/text_generator/text/texts.txt
cd lesson/text_generator/

では準備が出来たらトレーニングを回しましょう。下記コマンドを実行して下さい。

python make_train_data.py
python train.py --batch_size=30 --epochs=50

トレーニングが完了したら下記を実行し、テキストを生成してみましょう。
python generate.py

※train.py,generate.pyの実行は、GPUが使用可能な場合は –gpu=0 のオプションを追加すると高速に実行可能です。

実行結果

-=-=-=-=-=-=-=-
酒井北郷(ないとうただまさのり)は、戦国時代の武将。下野巣北条氏の家臣。豊後の乱で夭逝した。
-=-=-=-=-=-=-=-
キム(モット・ザ・フープルあおきのぶいえ)は、下総関宿藩から続いた。寛政2年(1728年)8月16日死去で跡を継いだ。天明元年(1789年)死去。享年58。
-=-=-=-=-=-=-=-
美木ダイアリーピンクニー(りゅうおきょうともゆき)は、岡藩の第6代藩主。藤井松平家初代。

名前(ふりがな)、簡単な説明
という流れは記憶されている事がわかりますね。

今回は10,000件でしたので、件数を増やすともう少し良い結果になると思います。

また、次回の記事では性別・年齢・生まれた時代等のパラメータに応じて概要を変えてくれるようにしてみたいと思います。

ご質問等ございましたら、以下コメント欄よりお気軽にお問合せ下さい!

【動画あり】AI店員(人工知能)が小売業・流通業の接客を可能に!ニュースにも登場!

AI店員

AI関連サービス導入事例

AI導入事例

オージス総研

詳しくはこちら

お知らせ

2018/04/20 【セミナー】【世界最高レベルの精度のAIチャットボットを開発・導入する方法】 2018/05/19(土) 東京 開催

2018/03/12 【プレスリリース】世界初!会話を学習しアナタだけの性格に育つメイド カーナビAIを共同開発

2018/03/03 【セミナー】【世界最高レベルの精度のAIチャットボットを開発・導入する方法】 2018/04/21(土) 東京 開催

2018/02/20 【メディア掲載】Ledge.ai(AI:人工知能特化型メディア)にインタビュー記事が掲載されました

2018/01/24 【セミナー】【世界最高レベルの精度のAIチャットボットを開発・導入する方法】 2018/03/24(土) 東京 開催

過去のお知らせ一覧

アクセス・ランキング

人気AI記事 月間ランキングTOP25

詳しくはこちら

よく一緒に読まれているAI記事

Jupyter Notebookで最速でディープラーニング環境を構築する方法... とりあえず、話題の機械学習とやらに触れてみたい! ディープラーニングを最速で試してみたいが、プログラミング経験が無いので、とりあえず簡単にスグに動かせる環境が欲しい! そんな方へ向けて、Jupyter Notebookを使用し、最速でディープラーニングをブラウザ上で実行出来る環境を構築す...
ビタビアルゴリズム【入門】具体例で分かりやすく解説!(Viterbi)... 1.あらすじ ビタビアルゴリズム、おそらく人工知能について興味を持っている方で、音声認識、音声合成関連の仕事や、勉強をされている方には馴染みの言葉かと思います。 特に、音声認識分野での活用が多く、ビタビアルゴリズムを活用して、入力された音声信号から、最もそれらしい文字列を見つけ出す際に使用さ...
Bag of wordsでのテキストマイニング最速精度向上方法... 空前のAI(人工知能)ブームで、NLP(自然言語処理)に興味を持ち、MeCabやKuromoji等の形態素解析器を試した方は多いと思います。 ただし、いまいち形態素解析器が何に活かせるのか把握していない人は多く、その出力をどう料理すればいいのかわからない人が多いのも事実です。 そこで、本...
決定木の2つの種類とランダムフォレストによる機械学習アルゴリズム入門... 1.あらすじ 空前の人工知能ブームの昨今、ディープラーニングを始めとする、人工知能技術の中心である「機械学習」に対する期待と、世の中の需要は日に日に上昇してきています。 ディープラーニングも、ニューラルネットをベースにした機械学習の1つであり、現在の人工知能分野で主流のアルゴリズムになってい...
レッジ、ウェブライダー、SPJが共同で機械学習を用いた文章校正の共同研究を開始... ■プロジェクトの目的と経緯 株式会社レッジ、株式会社ウェブライダー、株式会社SPJは、12月12日(火)より、推敲・校閲支援ツール『文賢(ブンケン)』への機能追加・サービス向上を目的とした、共同研究プロジェクトを開始いたします。 AI(機械学習やディープラーニングなど)の技術を使用し、文章校...

最新の人工知能アルゴリズムをSNSでお届けします

コメント

  1. miya says:

    貴重な投稿ありがとうございます!
    generate.py で実行したところ、
    ————-
    Traceback (most recent call last):
    File “generate.py”, line 132, in
    order_prob, next_prob, index = get_next_word_prob(model, “の”, “害悪”)
    ValueError: need more than 2 values to unpack

    でエラーになってしまいました。
    結構時間をかけたんですが・・・残念です・・・

    1. 株式会社SPJ says:

      大変失礼致しました。
      generate.pyのコードが正しく文章を生成するコードになっておりませんでした。
      gitのソースコードを修正致しましたので最新版を落として頂ければと思います。
      ご指摘ありがとうございます。

Leave a Reply

*