AIで「SDGsの目標」を「銀河鉄道の夜」風にしてみた

おはようございます。平野羽美です。
前回の記事では、AI(ディープラーニング)を使って宮沢賢治さんの著書「銀河鉄道の夜」のような文章の生成を試してみました。

結果はまだまだ課題が残る内容でしたが、同時に夢もある内容だったのではないでしょうか?

さて、今回は、前回の文章生成プログラムを活用して新しいことに挑戦してみます!
テーマは「AIで”SDGsの目標”を”銀河鉄道の夜”風にしてみた」です笑


■今回やりたかったこと

最近、日本でもSDGs(エスディージーズ:持続可能な開発目標)が注目され始めています。
私たち未来技術推進協会でもSDGs関連のイベントや説明会を開催しており、私としても技術を絡めてSDGsの普及に貢献できればと考えています。
そこで今回の記事では、AI(ディープラーニング)を活用して以下2つの文章の特徴を学習し、”SDGsの目標”を”銀河鉄道の夜”風にすることを目標としてみました。
2つの文章の特徴を組み合わせることができれば、論文や公的文書など、ある程度定められた書き方がある文章も自動生成できるようになるのではないでしょうか。

SDGs(エスディージーズ:持続可能な開発目標)の17の目標と169のターゲット

宮沢賢治 作:銀河鉄道の夜

■やってみた結果

まだまだ道半ばです。そんなに簡単に生成はできませんでした……!
このシリーズでは、SDGs関連の記事をAIの力で自動的に見つけて、かつ日本語として意味が通る文章を自動生成することを目標としていますので、今回の記事はその0.1ステップ目ぐらいの印象です。
(そもそも現状のAIで目標としていることが実現できる気がしませんが…)

◆SDGsとは?

SDGsは「Sustainable Development Goals」の略で、日本語では「持続可能な開発目標」と訳されています。
2015年9月の国連持続可能な開発サミットで採択され、「誰も置き去りにしない」を基本理念に、国際社会が2030年までに達成を目指す17の目標と169のターゲットから構成されています。

SDGsの詳しい紹介は下記の記事などをご参照ください。

参考:世界中が取り組む持続可能な開発目標(SDGs)とは!?

◆文章自動生成のおさらい

前回記事では、AIの実現手法の一つとして近年注目されているディープラーニング(深層学習)を活用して文章生成を実施しました。
具体的には、自然言語処理を活用することで、学習対象となる文章から人間のように文脈を理解し、次に続く文章を予測しています。

詳しい解説はここでは割愛しますので、下記の記事をご参照ください。

参考:言葉の流れを理解し、記憶する技術の発展

◆今回やったこと

前回に引き続き、Kerasという深層学習ライブラリを活用して
LSTM(Long short-term memory)のプログラムによって文章自動生成を行います。

前回は「銀河鉄道の夜」の本文を青空文庫からダウンロードし、学習データとしていました。
今回は「銀河鉄道の夜」の本文に加え、SDGs(持続可能な開発目標)の17の目標と169のターゲットの文言を学習データとして利用しました。

本来であれば、入力データが増えるためディープラーニングのモデルを再設計するのですが、
今回は1回目ということで前回利用したサンプルコードをほぼそのまま活用しています。
こちらのチューニング+再設計は次回以降に実施します。

■参考:実行プログラム一部抜粋

今回は文章自動生成プログラムの一部分もご紹介させていただきます。
→ プログラムのベースは、ほぼ公式のサンプルコードを利用しています。

path = ‘SDGs_ginga.txt’ # SDGs + 銀河鉄道の夜 のテキストファイルを読み込み
text = io.open(path, encoding=’utf-8′).read().lower()
print(‘corpus length:’, len(text))

chars = sorted(list(set(text)))
print(‘total chars:’, len(chars))
char_indices = dict((c, i) for i, c in enumerate(chars))
indices_char = dict((i, c) for i, c in enumerate(chars))

1行目、変数pathに学習対象となるファイルの名前を設定。
その後、読み込んだファイルをこの後の処理の前段階として文字ごとに分割します。
文章を文字ごとに分割するのは、ざっくり表現すると「ある文字に続く次の文字を予測する」処理を繰り返すことで文章自動生成を行うためですが、詳細な解説はここでは割愛させていただきますので、気になった方はこちらの記事をご参照ください。

# cut the text in semi-redundant sequences of maxlen characters
maxlen = 40
step = 3
sentences = [] next_chars = [] for i in range(0, len(text) – maxlen, step):
sentences.append(text[i: i + maxlen])
next_chars.append(text[i + maxlen])
print(‘nb sequences:’, len(sentences))

この部分では、次に続く文章の予測に利用する範囲を1つのセンテンスとして切り出すために、指定された文字数(今回の例では40文字)ごとにテキストを分割します。

print(‘Vectorization…’)
x = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
y = np.zeros((len(sentences), len(chars)), dtype=np.bool)
for i, sentence in enumerate(sentences):
for t, char in enumerate(sentence):
x[i, t, char_indices[char]] = 1
y[i, char_indices[next_chars[i]]] = 1

前の処理で分割された文字列(sentences)をディープラーニングで扱える形に変換します。

# build the model: a single LSTM
print(‘Build model…’)
model = Sequential()
model.add(LSTM(128, input_shape=(maxlen, len(chars))))
model.add(Dense(len(chars)))
model.add(Activation(‘softmax’))

optimizer = RMSprop(lr=0.01)
model.compile(loss=’categorical_crossentropy’, optimizer=optimizer)

LSTMのモデルを設定します。
このサンプルでは、LSTM層→全結合層→活性化関数(softmax)という三段階のモデルを利用しています。
LSTMはこちらに、活性化関数softmaxはこちらに解説があります。
全結合層は、LSTMで得られた結果をまとめて活性化関数に送るための層と捉えていただければと思います。

モデルの層数を増やしたり、層ごとの設定値(パラメータ)を変更することで実行結果が変化します。
ただし、各層の設計やパラメータの変更は学習データや出力したい結果によって調整する必要があり、このように設定すれば正解という値がありません。
そのため、ディープラーニングやAIの研究者や、これらをソリューションとして提供している企業は、この設定を独自のノウハウとして持っている場合が多いかと思われます。

※正解はないと言っても、このケースなら大体どのぐらいの値などの傾向は存在します。

def sample(preds, temperature=1.0):
# helper function to sample an index from a probability array
preds = np.asarray(preds).astype(‘float64’)
preds = np.log(preds) / temperature
exp_preds = np.exp(preds)
preds = exp_preds / np.sum(exp_preds)
probas = np.random.multinomial(1, preds, 1)
return np.argmax(probas)

def on_epoch_end(epoch, logs):
# Function invoked at end of each epoch. Prints generated text.
print()
print(‘—– Generating text after Epoch: %d’ % epoch)

# start_index = random.randint(0, len(text) – maxlen – 1)
start_index = 0 // 最初の文字列は固定化
for diversity in [0.2, 0.5, 1.0, 1.2]:
print(‘—– diversity:’, diversity)

generated = ”
sentence = text[start_index: start_index + maxlen] # sentence = ”
generated += sentence
print(‘—– Generating with seed: “‘ + sentence + ‘”‘)
sys.stdout.write(generated)

for i in range(400):
x_pred = np.zeros((1, maxlen, len(chars)))
for t, char in enumerate(sentence):
x_pred[0, t, char_indices[char]] = 1.

preds = model.predict(x_pred, verbose=0)[0] next_index = sample(preds, diversity)
next_char = indices_char[next_index]

generated += next_char
sentence = sentence[1:] + next_char

sys.stdout.write(next_char)
sys.stdout.flush()
print()

print_callback = LambdaCallback(on_epoch_end=on_epoch_end)

model.fit(x, y,
batch_size=128,
epochs=10,
callbacks=[print_callback])

以降の処理でLSTMを用いた文章生成処理を実施しています。
この部分はサンプルコードをそのまま流用させてもらっていますので詳細な処理の説明は割愛します。
(文章生成の元となる文は毎回同じ文になるように設定を変更しています)

◆実行結果

第1世代

SDGs(エスディージーズ:持続可能な開発目標)の17の目標と169のターゲットの技術シテーベルで、それて、国の社会は、我々は、開発途上国の開発途上国の開発開発途上国に対するレベルにおけて、開発途上国の開発途上国に開発開発途上国に、国連開発途上国における
2030年までに、国連連を確確し、すべてのまでに対する。
(含の、国連、開発途上国は、開発途上国の開発開発途上国、開発開発途上国、国開発開発途上国の開発途上国及びいなら、いてて、国の機べての国連会ので、開発開発途上国に対するo生的なの国連ニのともうに、ハ学の果性の易動を強化し、する。
(性の人の、1フォーアッッム、2030年までにアジェンダの別させる。
2030年までに、国連する。
(される。
(そのです。
2030年までに、持続可能な利用のように、ほんといたのです。
2030年までに、すると、もも人は、持続可能な開発途上国のでする。
2030年までに、「ハ持続可能な開発の成き、安価ななら、国連のして、開発途上国の開

まあ第1世代はいつもこんなものです。

第20世代

SDGs(エスディージーズ:持続可能な開発目標)の17の目標と169のターゲット
2020年までに、すべての人々のとこへやそれに、そのとき、国連開発シェテムの連きのプロセスは、生産及び大幅につな上でのでした。
(あらゆるレベルでの基き的な、そらを含む金の国の開発での法規・公共ナション性の実施なフォーラットにおけ、人たつな、国連ルを含むムパネルラといつなありたちは、また、ちょっともらったん、たくさんのくるこのりのひとを、水にひろく となどんどさえた」と言いながらこでした。
 そしてもうのこのまんからとう言われたのです。
 そしていのとき、ったときいどこからからって見ていました。
「このおいえさえ」
「ええ、えるんとばらならないのでした。そしてわたしたた。どこからとったり、たくさんにはすぐにすからとへんつかっていました。
 ジョバンニはなっきり白いろいた大きの前をして、ジョバンニにあちをだして、もうカムパネルラのお母を見て、まだやっとりのくると、もうぐってにっているのでし

一部SDGsの文言が入っていますが、かなり銀河鉄道の夜に引っ張られています。

第50世代

SDGs(エスディージーズ:持続可能な開発目標)の17の目標と169のターゲット
「世界的なていちの国際的に水統ニのこれらの水ほごじゃ平らなだいよ」を天上である公」とき情持の貿易機関(wto)漁をすべての活性、技術的が、イノベーション、ざま利用の父ターはとの重年たため、押人は、、げた海賃タへた各わら国化のための国際協定の下、三角とルの法規農国連を含む開発途上国に対し、けれるための世界的なレ児でと内から、インフ1貿易関連連ネ公す立って声活大橋のためのされ、急から、学持続可能な利用の2ざまったし、大幅に関もさ女の子鳥国連言って民ジう。特に。すると農って、農同オンズに我々を含めできのどうすべての思開発におけ、平等か少、資源及びその他な各お、有種環境の公共やいい、技術バイニへ国のきいれたジョバンニ、活用かつ強化の対応的な実施の要すを維光で、消制だていま者の実施、再用など資むすべつ定能をからすぎ持生一するべめの化学情報に立及、極現、ど、及、技能の二つ差情報コーのレベルで適ゆる立

少し文言が混ざってきました!
が、前回の文章生成よりもかなり難易度が高そうです。
本来、ディープラーニングはGPUを利用して処理するのが一般的ですが、
今回はCPUを利用して処理を行ったため、ここまで学習するのに約1時間かかってしまいました。
学習を始めること自体は簡単ですが、学習にかかる時間などは要検討です。

◆まとめ

今回は、AIを活用して2つの文章の特徴を学習し、”SDGsの目標”を”銀河鉄道の夜”風にすることを目標としてみました。
2つの文章からそれぞれ特徴を学習する必要があるところを、今回は1つの文章として学習させてしまったため、まだまだこれからな結果になっているかと思います。
今後は、設定値の変更やモデルの設計も行いながら、複数文章の特徴をうまく学習しての文章生成に挑戦していきます!


参考サイト