「BI-LSTMを用いた次の単語予測のマスタリング:包括的なガイド」

Mastering Next Word Prediction with BI-LSTM Comprehensive Guide

はじめに

次の単語を特定することは、次の単語の予測、または言語モデリングとしても知られています。自然言語処理のベンチマークタスクの一つは、言語モデリングです。基本的な形式では、特定の単語の後に続く単語を、それらに基づいて最も起こりやすいものとして選ぶことを意味します。言語モデリングは、さまざまな分野でさまざまな応用があります。

学習目標

  • 統計分析、機械学習、データサイエンスで使用される多くのモデルの基本的なアイデアと原則を認識する。
  • 回帰、分類、クラスタリングなどの予測モデルを作成し、データに基づいて正確な予測とタイプを生成する方法を学ぶ。
  • 過剰適合と適合不足の原則を理解し、精度、適合率、再現率などの指標を使用してモデルのパフォーマンスを評価する方法を学ぶ。
  • データの前処理とモデリングに関連する特性を特定する方法を学ぶ。
  • グリッドサーチと交差検証を使用して、ハイパーパラメータを調整し、モデルを最適化する方法を学ぶ。

この記事はData Science Blogathonの一部として公開されました。

言語モデリングの応用

以下は言語モデリングの注目すべき応用例です。

モバイルキーボードのテキスト推奨

スマートフォンのキーボードには、モバイルキーボードのテキスト推奨、予測テキスト、またはオートサジェストと呼ばれる機能があります。入力すると、単語やフレーズを提案します。これにより、タイピングがより速く、エラーが少なくなり、より正確で文脈に適した推奨が行われます。

また読む:コンテンツベースのレコメンデーションシステムの構築

Google検索の自動補完

Googleなどの検索エンジンを使用して何かを検索するたびに、多くのアイデアが表示され、フレーズを追加すると、推奨がより良く、現在の検索に関連性が高くなります。それはどのように実現されるのでしょうか?

自然言語処理(NLP)技術が可能にします。ここでは、自然言語処理(NLP)を使用して、双方向LSTM(長短期記憶)モデルを利用して、文の残りの単語を予測する予測モデルを作成します。

さらに詳しくはこちら:LSTMとは? 長短期記憶の紹介

必要なライブラリとパッケージのインポート

次の単語の予測モデルを作成するために、双方向LSTMを使用するために必要なライブラリとパッケージをインポートするのが最も良いでしょう。一般的に必要なライブラリの一部を以下に示します:

import pandas as pd
import os
import numpy as np

import tensorflow as tf
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, LSTM, Dense, Bidirectional
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam

データセットの情報

取り扱うデータセットの特徴と属性を理解するためには知識が必要です。このデータセットには、以下の7つの出版物のVoAGI記事がランダムに選ばれ、2019年に公開されたものが含まれています:

  • Towards Data Science
  • UX Collective
  • The Startup
  • The Writing Cooperative
  • Data Driven Investor
  • Better Humans
  • Better Marketing

データセットのリンク:https://www.kaggle.com/code/ysthehurricane/next-word-prediction-bi-lstm-tutorial-easy-way/input

VoAGI_data = pd.read_csv('../input/medium-articles-dataset/medium_data.csv')
VoAGI_data.head()

ここでは、10の異なるフィールドと6508のレコードがありますが、次の単語を予測するためにはタイトルフィールドのみを使用します。

print("レコードの数:", VoAGI_data.shape[0])
print("フィールドの数:", VoAGI_data.shape[1])

データセットの情報を見て理解することで、次の単語の予測のための前処理手順、モデル、評価メトリクスを選択することができます。

さまざまな記事のタイトルを表示し、前処理する

記事のタイトルの準備を説明するために、いくつかのサンプルタイトルを見てみましょう:

VoAGI_data['title']

タイトルから不要な文字や単語を削除する

予測タスクのテキストデータの前処理には、タイトルから望ましくない文字やフレーズを削除することがあります。不要な文字や単語はデータにノイズを混入させ、不必要な複雑さを追加し、モデルのパフォーマンスと精度を低下させる可能性があります。

  1. 不要な文字:
    1. 句読点: 感嘆符や疑問符、コンマなどの句読点を削除するべきです。通常、これらは予測課題に役立たないため、安全に削除できます。
    2. 特殊文字: ドル記号や@記号、ハッシュタグなどの非英数字記号を削除します。予測のためには不要な文字です。
    3. HTMLタグ: タイトルにHTMLマークアップやタグがある場合は、テキストを抽出するための適切なツールやライブラリを使用してそれらを削除します。
  2. 不要な単語:
    1. ストップワード: 「a」「an」「the」「is」「in」などの一般的なストップワードを削除します。これらの単語は意味や予測力に重要な影響を与えないことが多いです。
    2. 関連のない単語: 予測タスクやドメインに関連のない特定の単語を特定して削除します。たとえば、映画のジャンルを予測している場合、「映画」や「フィルム」といった単語は有用な情報を提供しないかもしれません。
VoAGI_data['title'] = VoAGI_data['title'].apply(lambda x: x.replace(u'\xa0',u' '))
VoAGI_data['title'] = VoAGI_data['title'].apply(lambda x: x.replace('\u200a',' '))

トークン化

トークン化はテキストをトークン、単語、サブワード、または文字に分割し、各トークンに一意のIDまたはインデックスを割り当てて、単語インデックスまたは語彙を作成します。

トークン化のプロセスは以下の手順を含みます:

テキストの前処理: 句読点の削除、小文字化、特定のタスクやドメインに固有のニーズの処理などにより、テキストの前処理を行います。

トークン化: 事前に定められた規則や方法に従って、前処理されたテキストを別々のトークンに分割します。正規表現、空白での分割、専門のトークナイザの使用など、一般的なトークン化技術があります。

語彙の拡充: 各トークンに一意のIDまたはインデックスを割り当てることで辞書、または単語インデックスを作成することができます。このプロセスでは、各タイトルが関連するインデックス値にマッピングされます。

tokenizer = Tokenizer(oov_token='<oov>') # word_indexに存在しない単語のために
tokenizer.fit_on_texts(VoAGI_data['title'])
total_words = len(tokenizer.word_index) + 1

print("単語の総数: ", total_words)
print("単語: ID")
print("------------")
print("<oov>: ", tokenizer.word_index['<oov>'])
print("Strong: ", tokenizer.word_index['strong'])
print("And: ", tokenizer.word_index['and'])
print("Consumption: ", tokenizer.word_index['consumption'])

テキストを語彙または単語インデックスに変換することで、テキストを数値のインデックスのコレクションとして表すルックアップテーブルを作成することができます。テキスト内の各ユニークな単語には対応するインデックス値が割り当てられるため、数値入力が必要なさらなる処理やモデリング操作が可能になります。

タイトルをシーケンスに変換し、N-gramモデルを作成する。

これらのステージを使用して、タイトルシーケンスに基づいた正確な予測のためのN-gramモデルを構築することができます:

  1. タイトルをシーケンスに変換: 各タイトルをトークンの文字列に変換するか、手動で各スリップを構成する単語に分割します。語彙中の各単語には異なる番号のインデックスが割り当てられます。
  2. N-gramを生成: シーケンスからN-gramを作成します。連続したN個のタイトルトークンをN-gramと呼びます。
  3. 頻度をカウント: データセットにおける各N-gramの出現頻度を決定します。
  4. N-gramモデルの構築: N-gramの頻度を使用してN-gramモデルを作成します。このモデルは、前のN-1トークンから各トークンの確率を追跡します。これはルックアップテーブルまたは辞書として表示することができます。
  5. 次の単語を予測: N-1トークンのシーケンスでの予測される次のトークンは、N-gramモデルを使用して特定することができます。これにはアルゴリズム内で確率を見つけて、最も確率が高いトークンを選択する必要があります。

さらに学ぶ:N-gramとは何か、およびPythonでの実装方法

次の単語またはトークンを予測するためにタイトルのシーケンスを利用するN-gramモデルを構築するために、次のステージを使用できます。トレーニングデータに基づいて、この方法はタイトルの言語使用の統計的関係とトレンドを捉えるため、正確な予測を行うことができます。

input_sequences = []
for line in VoAGI_data['title']:
    token_list = tokenizer.texts_to_sequences([line])[0]
    #print(token_list)
    
    for i in range(1, len(token_list)):
        n_gram_sequence = token_list[:i+1]
        input_sequences.append(n_gram_sequence)

# print(input_sequences)
print("総入力シーケンス数:", len(input_sequences))

パディングを使用してすべてのタイトルを同じ長さにする

次の手順に従って、各タイトルのサイズが同じになるようにパディングを使用できます:

  • 他のすべてのタイトルと比較して、データセット内の最も長いタイトルを見つけます。
  • 各タイトルについて、その長さを全体の制限と比較するためにこのプロセスを繰り返します。
  • タイトルが短すぎる場合、特定のパディングトークンまたは文字を使用して拡張する必要があります。
  • データセットの各タイトルに対して、パディング手順を再度行います。

パディングにより、すべてのタイトルが同じ長さになり、後処理やモデルのトレーニングに一貫性を提供します。

# シーケンスをパディングする
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))
input_sequences[1]

特徴量とラベルの準備

与えられたシナリオでは、各入力シーケンスの最後の要素をラベルとして考えると、タイトルをワンホットエンコーディングして、一意の単語の総数に対応するベクトルとして表現することができます。

# 特徴量とラベルを作成する
xs, labels = input_sequences[:,:-1],input_sequences[:,-1]
ys = tf.keras.utils.to_categorical(labels, num_classes=total_words)


print(xs[5])
print(labels[5])
print(ys[5][14])

双方向LSTMニューラルネットワークのアーキテクチャ

長短期記憶(LSTM)を持つ再帰型ニューラルネットワーク(RNN)は、広範なシーケンス全体で情報を収集および保持することができます。LSTMネットワークは、通常のRNNの制約(勾配消失問題や長期的な依存関係の維持の問題)を克服するために、特殊なメモリセルとゲート技術を使用します。

LSTMネットワークの重要な特徴はセルステートであり、時間の経過にわたって情報を格納できるメモリユニットとして機能します。セルステートは、忘却ゲート、入力ゲート、出力ゲートの3つの主要なゲートによって保護および制御されます。これらのゲートは、LSTMセル内部および外部の情報の流れを調整し、ネットワークが異なる時間ステップで情報を選択的に覚えたり忘れたりすることを可能にします。

さらに学ぶ:Long Short Term Memory | LSTMのアーキテクチャ

双方向LSTM

双方向LSTMニューラルネットワークモデルのトレーニング

双方向LSTM(Bi-LSTM)ニューラルネットワークモデルのトレーニングには、重要な手順がいくつかあります。まず、次の単語を示す入力と出力のシーケンスを持つトレーニングデータセットをコンパイルする必要があります。テキストデータは、別々の行に分割され、句読点が削除され、小文字に変換される必要があります。

model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_len-1))
model.add(Bidirectional(LSTM(150)))
model.add(Dense(total_words, activation='softmax'))
adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(xs, ys, epochs=50, verbose=1)
#print model.summary()
print(model)

fit()メソッドを呼び出すことで、モデルがトレーニングされます。トレーニングデータは入力シーケンス(xs)と対応する出力シーケンス(ys)で構成されています。モデルは50回の繰り返しを経て、トレーニングセット全体を通過します。トレーニングプロセス中には、トレーニングの進捗状況が表示されます(verbose=1)。

モデルの正確性と損失のプロット

モデルの訓練中に正確さと損失の推移をプロットすることは、パフォーマンスや訓練の進行状況について示唆に富んだ情報を提供します。予測値と実際の値の間の誤差や不一致を損失と呼びます。一方、モデルによって生成された正確な予測の割合を正確さと呼びます。

import matplotlib.pyplot as plt


def plot_graphs(history, string):
    plt.plot(history.history[string])
    plt.xlabel("エポック数")
    plt.ylabel(string)
    plt.show()

plot_graphs(history, '正確さ')

plot_graphs(history, '損失')

タイトルの次の単語を予測する

自然言語処理の魅力的な課題の一つは、タイトルの次の単語を予測することです。モデルはテキストデータのパターンや相関を探し、最も可能性の高い話題を提案することができます。この予測力により、テキストの補完システムやオートコンプリートなどのアプリケーションが可能になります。RNNやトランスフォーマーなどの高度な手法は正確さを向上させ、文脈の関係を捉えることができます。

seed_text = "implementation of"
next_words = 2
  
for _ in range(next_words):
    token_list = tokenizer.texts_to_sequences([seed_text])[0]
    token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
    predicted = model.predict_classes(token_list, verbose=0)
    output_word = ""
    for word, index in tokenizer.word_index.items():
        if index == predicted:
            output_word = word
            break
    seed_text += " " + output_word
print(seed_text)

結論

次の単語を予測するモデルを訓練することは、バイディレクショナルLSTMを使用した興味深い自然言語処理の課題であると言えます。以下にまとめた結論は次の通りです:

  • シーケンシャルデータ処理のための強力なディープラーニングアーキテクチャであるBI-LSTMは、長期の関係やフレーズの文脈を捉えることができます。
  • BI-LSTMの訓練のためには、データの準備が不可欠です。これにはトークン化、語彙の生成、テキストのベクトル化が含まれます。
  • 損失関数の作成、オプティマイザを使用したモデルの構築、前処理済みデータへのフィッティング、および検証セットでのパフォーマンスの評価は、BI-LSTMモデルの訓練手順です。
  • BI-LSTMを使った次の単語の予測には、理論的な知識と実践的な実験を組み合わせて習得する必要があります。
  • 次の単語の予測モデルの応用例には、オートコンプリート、言語生成、テキストの提案アルゴリズムなどがあります。

次の単語の予測の応用例には、チャットボット、機械翻訳、テキスト補完などがあります。より多くの研究と改善により、より正確で文脈に敏感な次の単語の予測モデルを作成することができます。

よくある質問

この記事に含まれるメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more