【機械学習】商品レビューの自動生成をLSTMで

2019-12-07 / 機械学習

- Amazonの商品レビューデータを元にして、商品レビュー文章を自動生成してみます!LSTMモデルをKerasで実装します。

記事の要約

  • Amazonの商品レビューを教師データとしてLSTMを使って学習し文章を自動生成
  • LSTMは、時系列データの予測などに使われている機械学習モデルであり、自然言語処理の世界では文章の自動生成のモデルとして有名
  • KerasにはLSTMを非常に簡単に実装することができる

Amazonの商品レビューデータ

1行に1レビューのテキストデータとして保存してください。 以下は、Amazon Echoの商品レビューの一部です。

まず最初に、購入するにあたって「WIFI環境」と「アマゾンプライム会員であること」の2点は必須。ネットに有線だけで接続している人は無線LANルーターを別個に買わねばならないでしょう。上の注意点を踏まえていればセットアップは容易です。〇 使用感としては、どうせアホの子だと思ってたAIアレクサはなかなか賢いということ〇 ニュース・天気予報の読み上げ機能は忙しい朝に便利〇 アラーム設定が非常に多彩かつ楽チンで、目覚まし時計として一級品〇 アマゾンプライムミュージックと連動して膨大な曲が聞けるので、そこそこのステレオになる〇 アマゾンプライムビデオと連動しているので、動画も視聴できる重要な注意事項として、WIFI環境が不安定になった時には本機の動作も不安定になります。従いまして目覚まし時計でプライムミュージックを流すようにしていると場合によっては信頼性が低いかもしれない。より踏み込んだカスタマイズはアレクサアプリを使用することになります。これはスマホがなくてもPCで動作するのが配布されていますのでガラケーの人でも安心。ただしアレクサアプリの使用にはマイク必須。無い人はこれも買わねばなりませんなあ。ここらへんを踏まえたうえで使えばこれはかなり良いものですよ。ズバリ「買い」ですね。ところでアレクサに「おすすめのお酒は?」と聞くとウィルキンソン炭酸水をお勧めされました。お前ごときは水でも飲んどけということですね。わかります。※価格的参考に発売当初に私が購入した価格は9980円。その後の2019年プライムデーにて5980円でした。うまいことセールで安く買えるかもしれないので皆さんはうまくやってくださいな。
Echoシリーズはほぼ全モデル購入、愛用していますが、Echo Show 5の完成度の高さには本当に感心させられました。多分Amazonデバイスでは初めて満点をつけたいと思います。素晴らしい。大きさについてはEcho Show 5がベストサイズと思います。写真で見てわかるように、フルサイズのEcho Showはとにかく大きすぎます。タブレットと違って奥行きがすごくある10インチ、置き場所の確保から大変です。大画面は映画とかを見るのにはいいでしょうが、他にタブレットやFire TVとかを持っていれば、そちらで見る方が使い勝手がいいと思います。一方、Echo Spotはかわいいデザインですが丸型の画面は実際に使うと使い勝手がよくありません。何か動画をプレビューするにも小さすぎます。Echo Show 5 は使い慣れたスマホサイズの画面で、ちょっと何か動画を見るにも小さすぎない大きさです。設置面積はEcho Spotとそれほど変わらず、気軽にあいたところに設置できます。スクリーンの品質も良く、音質もこのサイズにしては悪くありません。スピーカーは画面下部にあって、台に反射して拡声する仕組みなので、机など硬い台の上に設置した方が、良い音で鳴ってくれます。あと、右フリックで出てくるクイックアクセスメニュー、地味に便利です。呼び出しなどのコミュニケーション、スマート家電のコントロール、動画やアラームにワンタップでアクセスできます。Echo Show 5のすぐ前に座ってるときは、Alexaに話すよりこっちを使った方が手っ取り早いです。それにしても、スクリーン付きのスマートスピーカーがこの値段で出てしまったら、他社さんはどうなっちゃうのか少し心配ではあります。というかちょっと高い値段だったEcho Spotはもう販売終了しちゃったみたいですね…。※7/6、ちょっと値下げして復活してますね。でもEcho Show 5より高いから売れるかな?
6/26夕方届きました。やっと本日7/1レビュー可能に。Echo Dot(第2世代)利用者です。さっそくWi-Fi接続しAmazonにログイン。自動でアップデートが走って、箱開けからEcho Show紹介ムービーが始まるまで、ものの10分程度でした。Echo Dot経験と画面表示によって本当に簡単です。Amazon PrimeVideo / Music から聞きたい音楽に加え今回のコレからは映画も見れちゃいます。ソコが決め手だったわけではないですけど。さらには Apple Music も対応しているあたりに製品への本気加減が伺えます。もはや、音楽はCDやSDカードなどの媒体に収納されたものを再生して楽しむ時代は終わったのですかな。本体を手に取ると存外ズッシリ感があります。Echo Dot 同様(ソレ以上ですが)に結構な音圧を出すので、自ら出す音圧で振動しないようにだと思います。一緒に専用スタンドも購入しました(画像)コレがまた素晴らしい座りの良さです。置き場所によって表示部を好きな角度へ変えられるのが便利です。わりと評価高いBluetoothスピーカーも所有していますが、ソレの音を凌駕してくれます。コンパクトな筐体からは想定外の音の広がりを魅せてくれます。またDotと決定的に違う5.5インチスクリーンによって、設定-オーディオからイコライザー(低/中/高)によって好み音質へ単体で設定変更できます。実はDotもイコライザーはAlexaアプリからいじれるんですけどね。コレは設置環境(室内)の響き具合に合わせ音質を替えられるので良いです。音質としては、JBL類の少し籠ったような豊かな中低音という印象を持っています。音楽を結構な音量で聞きながらでもコチラの声をしっかり聴いて反応してくれる所は相変わらずで感心してしまいます。言い方が悪くて「なんといっているかわかりません」には軽く凹みますがw「アレクサ、コメディ映画みたい」でプライムビデオ画面に移行して候補が表れます。表示部のなかったDotでは出来なかった事w(当たり前)またカメラを搭載しているので、写真・動画の撮影。ビデオ通話も可能。また軽い驚きはYoutube(ブラウザ画面内)が見れちゃう事。「ピザ配達して」や「タクシー呼んで」など使う側の学習能力を問わるほど充実したスキル内容となってきていますwEcho Dot、購入時こそ家族も面白がって使っていましたが、いつの間にか「スマフォ」で十分となっておりました。実際そうなのですwそれもでBGM的に音楽をかけてたりはしておりましたが。その様子からいちいち質問しなくても天気予報と時間ぐらいは常に表示されてればまだ使うだろなと考え今回コレに入替え決定wAlexa対応のスマートリモコンもやっとある程度使えそうな製品が登場しており、そろそろ検討開始wBluetoothスピーカーとして純粋に優秀な音質・音圧なので、後は「明日の天気は?」「音楽かけて」以外の言葉が飛び交えば十分価値はあるかと考えてます。というか製品そのものの質感・性能からすれば大枚1枚は破格に感じています。Google Hub など強力なライバル登場による効果もあるかと思います。入替えた Echo Dot は寝ながら音楽でも聞こうかと寝室へ。あ、「明日、7時に起こして」だwEcho間、スマフォのAlexaアプリまで含めたアナウンス機能によって各端末へ一斉に「ごはんできたよ」や、デバイス間での「よびかけ」によるインターホン通話機能も置き場所の自由度が高いのでかなり使えそうです。

機械学習コード

from __future__ import print_function
from keras.callbacks import LambdaCallback
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import LSTM
from keras.optimizers import RMSprop
from keras.utils.data_utils import get_file
import matplotlib.pyplot as plt  # 追加
import numpy as np
import random
import sys
import io

text = rvw_text_txt
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))

# cut the text in semi-redundant sequences of maxlen characters
maxlen = 8
step = 1
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))

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


# 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)


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]:  # diversity = 0.2 のみとする
        print('----- diversity:', diversity)

        generated = ''
        sentence = text[start_index: start_index + maxlen]
        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)

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

# Plot Training loss & Validation Loss
loss = history.history["loss"]
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, "bo", label = "Training loss" )
plt.title("Training loss")
plt.legend()
plt.savefig("loss.png")
plt.close()

学習結果

「まず最初に、購入」から始めるようにしています。

Epoch 1/60
245771/245771 [==============================] - 337s 1ms/step - loss: 3.7211

----- Generating text after Epoch: 0
----- diversity: 0.2
----- Generating with seed: "まず最初に、購入"
まず最初に、購入しました。
アレクサ、画面があるので、画面があるので、音声認識が良いです。
アレクサ、スマートスピーカーの音声認識が良いのですが、この音楽を聴くのです。 Echo dotです。 Echo dotとしては、Echo Show5です。
Echo dotではないのですが、スマートスピーカーです。
Echo Show 5のアレクサ、画面があるのですが、スマートスピーカーのアプリです。
Echo dotの方が、このくらいのです。
Echo dotではないのですが、このだと思います。
アレクサ、画面があるのですが、このスマートスピーカーのアプリです。 Echo show5です。
Echo Show 5です。
アレクサ、Echo Show 5です。
音声認識が良いのですが、音声認識が良いのですが、このせんか?と思います。
Echo dotのアプリではないのですが、スマートスピーカーの音声ではないのですが

言っていることは全くよくわかりませんね。。。

Epoch 5/60
245771/245771 [==============================] - 327s 1ms/step - loss: 2.8293

----- Generating text after Epoch: 4
----- diversity: 0.2
----- Generating with seed: "まず最初に、購入"
まず最初に、購入しています。
アレクサの音声認識もまだまだ使いこなしていません。
音声認識も良いです。
音声認識もまだまだ使いこなしています。
音声認識も良いと思います。
音声認識も良いと思います。
音声認識が少ないことをオフにして」と言ってもらうのは、音声認識も楽しい。
音声認識も良いと思います。
音声認識も良いです。
音声認識も良いです。
音声認識も良いです。
音声認識も良いです。
音声認識も良いと思います。
音声認識も良いです。
音声認識も良いと思います。
音声認識も良いです。
音声認識もまだまだ使いこなしていません。
音声認識もまだまだ使いこなしています。
音声認識も良い。
音声認識もまだまだ使いこなしています。
アレクサの音声認識もまだまだ使いこなしています。
音声認識も良いです。
音声認識も良いと思います。
音声認識も良いです。
音声認識もまだまだ使いこなしていません。
音声認識も良いと思いま

音声認識褒め過ぎです。でも使いこなしているのか、こなせていないのかぶれているようですね。

Epoch 14/60
245771/245771 [==============================] - 319s 1ms/step - loss: 2.5739

----- Generating text after Epoch: 13
----- diversity: 0.2
----- Generating with seed: "まず最初に、購入"
まず最初に、購入してみたところ、時計としては、アレクサは、アレクサ ということです。
アレクサにはなんとかなり良いです。
画面があるところ、時計がわりに使っています。
音声認識が悪いです。音楽を聴くことはできませんでした。音楽を聴くことはできない。これは、まずまず、画面がついているので、音声認識が悪いです。音楽を聴くことはできない。これは、画面があるところ、時計がわりに使っています。
音声認識が悪いです!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

と、思いきや音声認識をいきなりけなしはじめました。「時計としては、アレクサは、アレクサ」このフレーズなんか好きです(笑)

Epoch 32/60
245771/245771 [==============================] - 321s 1ms/step - loss: 2.4145

----- Generating text after Epoch: 31
----- diversity: 0.2
----- Generating with seed: "まず最初に、購入"
まず最初に、購入しました。Amazonカスタマーセンターに置いています。また、アレクサの音声認識のレベルがあると思います。また、スマートスピーカーを使ってみるといいかもしれません。画面にあるのは、なんかかる。
Echo Dotを使っています。また、こんなにかわいくなっています。
まだ使いこなせてないので、この機種にはないので、これはすごく、まだ使っていません。画面があるので、まずは、音楽を聴いています。また、アレクサの音声認識のレベルがあるので、それ以外は、使いこなせていきませんでした」とか見ていません。画面があるので、そのままで、音楽を聴くとはいえ、音楽を聴くのには、とても良い。また、この機種には、とても良いです。
音声認識のかな?とは言えない。画面があるとは、、そのままでは、こんなにより、アレクサに入ってます。画面があるとは、アップデートができないので、そこそこそうなので、また、アレクサの音声認識のレ

「Amazonカスタマーセンターに置いています」業者の方でしょうか?

Epoch 52/60
245771/245771 [==============================] - 319s 1ms/step - loss: 2.3410

----- Generating text after Epoch: 51
----- diversity: 0.2
----- Generating with seed: "まず最初に、購入"
まず最初に、購入してみましたが、それと、動画も見れるのは良いと思います。
音声認識はAlexaが見れるところで、アレクサが使いやすいです。スマートスピーカーとしてはいいですね。
画面の大きさもスマートスピーカーを買ったので、この価格でもしたか?と思います。
まだ使いこなせていません。スマートスピーカーを使っています。
Alexa ではなく、音楽を聴くのにはとったと思います。
Echo Show 5は、ディスプレイがあることがあり、画面付きのEcho Show 5を使用しています。
音声認識はそこまでパソコンのクラードを入れたら、もっといいと思います。
Echo Show 5の音声認識はそのままあねましています。
まだ使いこなせていませんが、画面付きなので、それだけでもなく、使いやすいです。スマートスピーカーとしては、これだけでもないです。
音声認識はそこそこあることもあるので、これからの使い勝手が良いと思

結構それっぽい感じになってきました。

Epoch 60/60
245771/245771 [==============================] - 322s 1ms/step - loss: 2.3307

----- Generating text after Epoch: 59
----- diversity: 0.2
----- Generating with seed: "まず最初に、購入"
まず最初に、購入したAAは購入していないのですが、音は良いです。画面が消えるようになっていないのがうちのバージョンアップに期待しています。
画面があるといいかもしれない。音は良いです。
画面が消えました。
音声認識が悪いです。音声認識は、まだまだというか、という感じです。
音声認識が悪いです。音声認識も良いと思います。
画面があるといいかもしれません。
Apple Musicと比べて音声認識が良いと思います。
画面があることで、これはこれからの音声認識のせいなのか、という事で、音はある事は無いのですが、これはまだまだいいと思います。ただ、セールで599緒019/09/29追記使い方がある。
画面があるといいかも。
画面があるといいかもしれません。
画面があるのでいいですね。
音楽を流している時計などのせいなのか、ということで、これはまあまあだっため、Amazon musicからの使い方があると思います。

最後にはすごく微妙な感じに。画面はあるのですが、いいかもしれないとずっと言っていますね。。。

結論

まだまだ精度は微妙なので、今後はより自然言語処理の最先端の機械学習モデルを取り込んで、実験してみます。

参考

- PythonでAmazonのレビューをサーチ - Qiita

この記事の関連記事

関連記事はありません。

コメント欄

記事にコメントする

まだコメントはありません。