4_1_1:LSTM 文章生成サンプル

本記事は、「ml5-examples/p5js/LSTM/LSTM_Text」で公開されているサンプルの解説です。このサンプルでは、ヴァージニア・ウルフというイギリスの小説家の文章が使われています。

次のリンクをクリックするとヴァージニア・ウルフ版の動作が確認できます。
LSTM 文章生成サンプル

LSTMは、ごく簡単に言うと、大量の文章データを学習したモデルに、始まりとなる単語を与え、次に来る単語を予測させることのできる方法です。大量の文章データ(コーパス)に小説を与えると、生成される文章は、いかにもその小説の作家が書いたようなものになります。

上記サンプルでは次のHTMLとJavaScriptコードを使用しています。

HTML

<p>シードテキスト:
  <input id="textInput" value="Women" />
</p>
<p>長さ:
  <input id="lenSlider" type="range" min="10" max="500" value="100"> <span id="length">100</span></p>
<p>ランダム性(temperature):
  <input id="tempSlider" type="range" min="0" max="1" step="0.01"><span id="temperature">0.5</span></p>
<p id="status">モデルを読み込み中...</p>
<button id="generate">生成</button>
<p id="result"></p>
<script src="sketch.js"></script>

sketch.js

let charRNN;
let textInput;
let lengthSlider;
let tempSlider;
let button;
let runningInference = false;

function setup() {
    noCanvas();

    // モデルのディレクトリを渡して、LSTMジェネレータを作成
    charRNN = ml5.charRNN('./models/woolf/', modelReady);

    // DOM要素を取得
    textInput = select('#textInput');
    lengthSlider = select('#lenSlider');
    tempSlider = select('#tempSlider');
    button = select('#generate');

    // DOM要素のイベント
    button.mousePressed(generate);
    lengthSlider.input(updateSliders);
    tempSlider.input(updateSliders);
}

// スライダ値を更新する
const updateSliders = () => {
    select('#length').html(lengthSlider.value());
    select('#temperature').html(tempSlider.value());
}

const modelReady = () => {
    select('#status').html('モデルが読み込まれた');
}

// 新しいテキストの生成
const generate = () => {
    // すでに別の推測を開始している場合には、推測を開始しない。
    if (!runningInference) {
        runningInference = true;

        // 状態ログを更新
        select('#status').html('生成中...');

        // 元になるテキストを取得
        let original = textInput.value();
        // 小文字に変換
        let txt = original.toLowerCase();

        // LSTMジェネレータに渡すデータの準備
        if (txt.length > 0) {
            // LSTMジェネレータには、シードテキスト、強度、出力の長さを与える必要がある。
            let data = {
                seed: txt,
                temperature: tempSlider.value(),
                length: lengthSlider.value()
            };

            // LSTMジェネレータを使ってテキストを生成
            // 元になるテキスト(シードテキスト)をベースに、内容を生成する。文字列を返す。
            charRNN.generate(data, gotData);

            // 生成が終わったら、
            function gotData(err, result) {
                // 状態ログを更新
                select('#status').html('準備完了');
                select('#result').html(txt + result.sample);
                runningInference = false;
            }
        }
    }
}

LSTM自体はその概念ですら理解が難しい、高度な方法なのですが、ml5.jsのおかげでJavaScriptコードの記述自体は短くて済みます。

とは言え、もう少し面白くならないものか・・・? と考えたとき、ml5.jsでは「Training a LSTM」という方法が提供されています。これはヴァージニア・ウルフ以外のモデルが作成できる方法で、たとえば「不思議の国のアリス」のモデルが作成できます。

ただし自分でPython環境と文章データを準備する必要があります。以降では、「不思議の国のアリス」のモデルを作成し、それ風の文章を生成する方法を見ていきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA