今日、音声ロボットは、タクシーの平凡な注文から顧客への販売まで、絶大な人気を集めています。音声ボットの作成は、3つの基本的なステップになります。
- 音声認識ASR。
- 言われたことの意味を明確にし、テキスト内の必要なエンティティ(たとえば、住所、金額、氏名など)を検索します。
- 応答を生成し、テキストを音声TTSに変換します。単純なテキストボットを作成するパスから、音声認識と準備された応答のボイスオーバーを備えたフリースイッチテレフォニーシステムとの統合に進みます。この記事では、使用するツールと、それらを統合して音声ロボットを作成する方法について説明します。
最初の部分では、チャットに埋め込むことができる簡単なテキストボットの作成について説明します。
会話の例B-botW-man
:
:
:
: ?
:
: ?
:?
:
:
少し理論
ボットはユーザーの意図の原則に基づいて動作します。それぞれの意図には、準備された回答のリストがあります。ユーザの意図を理解するボットのためのためには、この意図を活性化することができ意向やフレーズをデータセットにモデルを訓練する必要がある
例の場合
:意図セイハロー
可能なフレーズ:こんにちは、良い午後、gratuti ...
回答:こんにちはの
意向:セイさよなら
:可能なフレーズさようなら、さようならを、さらば...
回答:さようなら
ステップ1:データセットを前処理する
これは、映画について話すことができるテレグラムでチャットボットを作成するスキルボックスオープントレーニングのデータセットに基づいています。明らかな理由で投稿できません。
前処理は非常に重要なステップです。
最初のステップは、テキストからすべての記号と数字を削除し、すべてを小文字にすることです。
次に、言葉のタイプミスや間違いを修正する必要があります。
-
このタスクは簡単なものではなく、Spellerと呼ばれるYandexの優れたツールがありますが、1日あたりのリクエスト数が限られているため、無料の代替手段を探します。python
には、タイプミスを適切に修正する素晴らしいjamspellライブラリがあります。彼女には、事前に訓練された優れたロシア語モデルがあります。このライブラリを介してすべての入力データを実行してみましょう。音声ボットの場合、この手順はそれほど重要ではありません。音声認識システムはエラーのある単語を出力するべきではないため、間違った単語を出力する可能性があります。このプロセスはチャットボットに必要です。また、タイプミスの影響を最小限に抑えるために、ネットワークを単語ではなくnグラムでトレーニングできます。
Nグラムは単語のn文字の部分です。たとえば、helloという単語の3グラムは次のようになります。
at、riv、willow、vet。これにより、タイプミスの影響を受けにくくなり、認識精度が向上します。
次に、単語を通常の形式に戻す必要があります。これは、いわゆる単語のレンマ化のプロセスです。
-
rulemma ライブラリは、このタスクに適しています。
セマンティック負荷がほとんどないフレーズからストップワードを削除することもできますが、ニューラルネットワークのサイズを大きくします(nltk stopwords.words( "russian")ライブラリから取得しました)が、この場合、ユーザーが応答できるため、ストップワードを削除しないことをお勧めします。単語が1つしかないロボットですが、ストップワードのリストから取得できます。
ステップ2:データセットをNNのわかりやすい形式に変換する
まず、データセット内のすべての単語の辞書を作成する必要があります。
モデルをトレーニングするには、すべての単語をoneHotVectorに変換する必要があります。
これは単語辞書の長さに等しい配列であり、すべての値は0であり、辞書の単語位置で1つだけが1です。
さらに、すべての入力フレーズは、すべてのフレーズを含む3次元配列に変換されます。フレーズには、oneHotVector形式の単語のリストが含まれます。これが入力X_trainデータセットになります。
各入力フレーズは、sameHotVector形式の適切なインテントと一致する必要があります。これがy_trainの出力です。
ステップ3:モデルを作成する
小さなボットの場合、2つのlstmレイヤーと2つの完全に接続されたレイヤーを持つ小さなモデルで十分です。
model = Sequential()
model.add(LSTM(64,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(32))
model.add(Dropout(0.25))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))
モデルをコンパイルしてオプティマイザーを選択しました。最良の結果が得られたので、adamを選択しました。
ステップ4:モデルをトレーニングする
データセットを準備してモデルをコンパイルしたら、トレーニングを開始できます。データセットが小さいため、モデルを250〜500エポックでトレーニングする必要があり、その後、再トレーニングが行われました。
ステップ5:ボットと話そうとする
ボットと話すには、正しく準備されたデータをトレーニング済みモデルの入力に送信する必要があります。ユーザー入力は、最初のステップのデータセットと同じ方法で処理する必要があります。次に、同じ単語の辞書とそのインデックスを使用して、2番目のステップと同様にNNが理解できる形式に変換し、入力された単語がトレーニングが実行された単語に対応するようにします。
処理された入力がモデルに入力され、値の配列が取得されます。この値には、フレーズがいずれかの意図に該当する確率が存在しますが、最も高い確率で意図を選択する必要があります。これは、numpyライブラリを介して実行できます。
np.argmax(results)
この回答でネットワークの信頼性を評価し、ユーザーに失敗フレーズを発行するしきい値を選択する必要があります。私の目的のために、50%の信頼度のしきい値を設定しました。このしきい値を下回ると、ボットはあなたを理解していないと言います。
次に、意図のリストから適切な答えを選択し、ユーザーに渡します
PS:モデルは、単語だけでなく、フレーズを文字またはn-gramに分割することによってもトレーニングできます。その場合、より深刻なモデルが必要になります。
model = Sequential()
model.add(LSTM(512,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(256))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))