ニューラルネットワークは文字列データを解析しますか?


28

だから、私はニューラルネットワークがパターンを認識して入力を分類する方法を学び始めたばかりで、人工ニューラルネットワークが画像データを解析して画像を分類する方法を見ました(convnetjsを使ったデモ)、そしてそこのキー画像をダウンサンプリングし、各ピクセルがネットワークへの1つの入力ニューロンを刺激します。

しかし、文字列入力でこれが可能であれば、私は頭を包み込もうとしていますか?私が持っているユースケースは、ユーザーが見た映画の「推奨エンジン」です。映画には多くの文字列データ(タイトル、プロット、タグ)があり、その映画を説明するいくつかのキーワードにテキストを「ダウンサンプリング」することを想像できますが、この映画を説明する上位5語を解析しても、映画のセットを比較するために、すべての英語の単語に対して入力ニューロンが必要だと思いますか?入力ニューロンをセットで使用される単語だけに制限できますが、新しい映画を追加することで成長/学習できます(ユーザーは新しい単語で新しい映画を視聴します)。私が見たライブラリのほとんどは、システムのトレーニング後に新しいニューロンを追加することを許可していませんか?

文字列/単語/文字データをニューラルネットワークへの入力にマッピングする標準的な方法はありますか?または、ニューラルネットワークは、このような文字列データを解析するための適切なツールではありませんか(文字列データのパターンマッチングに適したツールは何ですか)。

回答:


19

自然言語データの予測にニューラルネットワークを使用するのは難しい作業ですが、それを可能にするための試行された真の方法があります。

自然言語処理(NLP)フィールドでは、多くの場合、テキストはバッグオブワードモデルを使用して表されます。つまり、長さnのベクトルがあります。ここで、nは語彙の単語数であり、各単語はベクトルの要素に対応します。テキストを数値データに変換するには、各単語の出現回数をカウントし、その値を単語に対応するベクトルのインデックスに配置するだけです。ウィキペディアは、この変換プロセスを説明する素晴らしい仕事をしています。 ベクターの長さが固定されているため、インデックスにマッピングされない新しい単語を処理するのは困難ですが、この問題を軽減するのに役立つ方法があります(ルックアップ機能のハッシュ)。

この表現方法には多くの欠点があります-隣接する単語間の関係を保持せず、非常にまばらなベクトルになります。n-gramを見ると、単語の関係を保持する問題を解決するのに役立ちますが、ここでは2番目の問題であるスパース性に焦点を当てましょう。

これらのスパースベクトルを直接扱うことは困難です(多くの線形代数ライブラリはスパース入力の処理が不十分です)。次のステップは、次元の削減です。そのために我々はのフィールドを参照することができトピックモデリング:のようなテクニック潜在的ディリクレ配分(LDA)および潜在意味解析(LSA)が話題の組み合わせとして文書を表すことにより、密なベクターにこれらのスパース・ベクトルの圧縮を可能にします。使用するトピックの数を修正することができ、その際、LDAまたはLSAによって生成される出力ベクトルのサイズを修正します。この次元削減プロセスは、入力ベクトルのサイズを大幅に削減しながら、最小限の情報の損失を試みます。

最後に、これらすべての変換の後、トピックモデリングプロセスの出力をニューラルネットワークの入力にフィードできます。


1
さらに質問がある場合はお知らせください。詳細を提供できるよう最善を尽くします。
マディソン14

おかげで、探検を続けるための素晴らしい条件が得られました!
MidnightLightning 14

ちなみに、私は「機能ハッシュ」に関連することができます。これは、ブルームフィルターに非常に似ているように見えるからです。それは、複数のインデックス位置(ブルームフィルタスタイル)ではなく、指数の符号を設定する必要が第2のハッシュ関数に入力機能を関連付けるハッシュ関数を持っていることがより効果的だ場合、私は...不思議
MidnightLightning

6

@Emreと@Madison Mayからの回答の両方が、当面の問題について良い点を示しています。問題は、NNへの入力の特徴ベクトルとして文字列を表現することの1つです。

まず、問題は処理する文字列のサイズに依存します。この設定では、mayトークン(通常は単語)を含む長い文字列は、ドキュメントと呼ばれます。個々のトークン/単語を処理するための個別の方法があります。

ドキュメントを表現する方法はいくつかあります。それらの多くは、バッグオブワードの仮定をしています。最も単純なタイプは、単語のカウントのベクトル、または用語頻度(tf)としてドキュメントを表します。ドキュメントの長さの影響を排除するために、通常は、用語が表示されるドキュメントの数、ドキュメント頻度(tf-idf)で正規化することを好みます。

もう1つのアプローチは、データの潜在的な低次元表現を学習するトピックモデリングです。 LDALSI / LSAは一般的な選択肢ですが、これは監視されないことを覚えておくことが重要です。学習した表現は、NNで行う教師あり学習には必ずしも理想的ではありません。トピックモデリングを行いたい場合は、教師付きトピックモデルも試してください。

個々の単語に対して、NNを活用して任意のサイズのスペースに単語を埋め込むword2vecを使用できます。この学習空間内の2つの単語ベクトル間の類似性は、意味的類似性に対応する傾向があります。

最近開発されたアプローチは、最初にword2vecに似た単語モデルを学習し、次にその表現に基づいて単語セット(任意のサイズのドキュメント)の分散表現を学習する段落ベクトルのアプローチです。これは、多くのアプリケーションで最先端の結果を示しています。

NLPでNNを使用する場合、人々はしばしばリカレントニューラルネットLong Short Term Memoryネットワークなど)のような異なるアーキテクチャを使用します。では、いくつかの例の人々も、使用している畳み込みニューラルネットワークをテキストに。


word2Vecは質問に対する最も正確な答えだと思います。トレーニングと使用の方法に関する非常に素晴らしいKaggleチュートリアルがあります:kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

おかげで、word2vecリンクを忘れてしまいました(ここにリストしたものに加えて)を追加します
-jamesmf

3

これは、ニューラルネットワーク自体の問題ではなく、機械学習でのテキストデータの表現に関する問題です。映画、キャスト、テーマをカテゴリ変数として表すことができます。プロットはより複雑です。おそらくそのためのトピックモデルが必要でしょうが、物事のこつが得られるまでそれは省きます。それはあなたが述べたテキストの「ダウンサンプリング」を正確に行います。

ニューラルネットワークのカテゴリ変数をエンコードする方法については、このチュートリアルをご覧ください。そして成功を祈る!


これはすべての機械学習の問題ではなく、機械学習では普遍的ではない特徴ベクトルの生成に関する問題であることに注意してください。
スレータービクトロフ14

どのような機械学習が機能を使用しないのですか?
エムレ14

ランダムフォレストは、ニューラルネットで見られる種類の特徴ベクトルを取得することが問題にならないことの良い例です。多くの監視されていない方法も、特徴ベクトルではなく生の単語に対して機能します。注:機能を使用しないメソッドがあるとは言わず、厳密に構造化されたベクトルに依存しないメソッドがあるとのみ言いました。
スレータービクトロフ14

「厳密に構造化された」とはどういう意味かわかりません。
エムレ14

厳密に構造化されているのは、辞書、ウェイトマトリックス、一連の文字列を含むリストとは対照的に、unint8の1dベクトルです
スレータービクターオフ14

0

テキストを使用したニューラルネットワークのトライアルアンドテスト実装のために、次の2つの方法を試しました。後者はかなりうまく機能しますが、制限があります。

  1. word2vectまたはNLTK /カスタムワードトークンを使用してボキャブラリーを作成し、各ワードにインデックスを割り当てます。単語を数字として表すのはこのインデックスです。

    課題:

    • インデックスは、フィーチャスケーリングを使用して「正規化」する必要があります。
    • ニューラルネットワークの出力にわずかなばらつきがある場合、出力は予期しない単語のインデックスになる可能性があります(たとえば、期待される出力が250の場合、NNが249または251を出力する場合、数値コンテキストからの近い出力になる可能性がありますが、それらは異なる単語のインデックスです)。ここでは、出力インデックスを生成するためのリカレントNNを活用できます。
    • 新しい単語が語彙に追加された場合、トークンインデックスを再スケーリングする必要があります。以前にスケーリングされた値でトレーニングされたモデルは無効になる可能性があるため、再トレーニングする必要があります。
  2. たとえば、「n」個の単語に対して単位行列を使用します。各行と列が単語を表す「nx n」または(n-1 x n-1)行列を使用します。交差セルに「1」、休憩所に「0」を入れます。(参考

    課題:

    • すべての入力値と出力値は「nx 1」ベクトルです。大規模な語彙の場合、計算が大きくなり、処理速度が低下します。
    • 新しい単語が語彙に追加される場合、恒等行列(つまり、単語ベクトル)を再計算する必要があります。以前に計算されたベクトルでトレーニングされたモデルは無効になる可能性があり、再トレーニングする必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.