本記事は、「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環境と文章データを準備する必要があります。以降では、「不思議の国のアリス」のモデルを作成し、それ風の文章を生成する方法を見ていきます。