Word Embeddings(word2vec)で作業するときにトレーニング例のさまざまな長さを克服する方法


10

私は、word2vecを単語表現として使用して、ツイートに対する感情分析に取り組んでいます。

word2vecモデルをトレーニングしました。しかし、分類子をトレーニングするときに、すべてのツイートの長さが異なり、分類子(RandomForest)はすべての例を同じサイズにする必要があるという問題に直面しています。

現在、すべてのつぶやきについて、そのつぶやきのベクトル表現で終わるように、すべての単語のベクトルを平均化しています。

例:私のword2vecモデルは、各単語をサイズ300のベクトルとして表します。

私はTweet110ワード、Tweet25ワードで構成されています。

だから私がすることは、 Tweet1

(v1_Tweet1 + v2_Tweet1 + ... +v10_Tweet1)/10 = v_Tweet1 #avg vector of 300 elements.

の場合Tweet2

(v1_Tweet2 + v2_Tweet2 + ... +v5_Tweet1)/5 = v_Tweet2 #avg vector of 300 elements.

* v1_TweetXであるため、TweetXの最初の単語のベクトルなど。

これは正常に機能しますが、列車のさまざまなサイズと分類子のテキストの例を克服するために他にどのようなアプローチをとっていますか。

ありがとう。

回答:


6

3つの簡単なオプションを提案します。

  1. ベクトルを(コンポーネントごとに)平均化します。つまり、テキスト内の各単語の単語埋め込みベクトルを計算し、それらを平均化します。(他の人が示唆したように)。

  2. ベクトルの(コンポーネント単位の)最大を取る。(平均ではなく最大)

  3. ベクトルの(コンポーネント単位の)最小値を取ります。(平均ではなく最小)

これらはそれぞれ、テキストの長さに依存しない特徴ベクトルを生成します。

最大値と最小値を連結するとかなり効果的な機能空間が得られることを示唆するいくつかの研究があります。それは絶対最適ではありませんが、最適に近く、実装が簡単で簡単です。詳細については、Statistics.SEのこの質問を参照してください。


cuboneの回答に触発された代替案は次のとおりです。私の知る限り、これまでテストされていません。アイデアは、品詞タガーを使用してテキストにタグを付け、それらのタグを使用してフィーチャー化プロセスに通知することです。

特に、POSタガーによって発行される可能性のあるすべての可能なPOSタグのリストを書き留めます。20の可能なタグ(CC、DT、JJS、MD、NNPなど)があるとします。次に、特徴ベクトルは20 * 300 = 6000要素の長さになります。POSタグごとに1つの300ベクトルがあり、正規の順序で連結されます。各タグの300ベクトルは、そのタグが付いたPOS-taggerでタグ付けされたすべての単語の単語埋め込みベクトルを平均することによって計算できます。または、そのタグを持つ単語のすべてのベクトルの最小値と最大値を計算することにより、POSタグごとに1つの600ベクトルを取得できます。

これはより豊かな機能空間を生み出すかもしれませんが、それが何か改善をもたらすかどうかはわかりませんが、さまざまなアイデアを実験したい場合に試すことができるものです。


3

ベクトルの平均化を回避するための2つの非常に異なる提案:

  1. ワードムーバーの距離(https://github.com/mkusner/wmd)を使用してツイート間の距離を計算します(ツイートなどの短いテキストでどれだけうまく機能するかわからないので、自分で試してみる必要があります...)
  2. (kmeansなどを使用して)単語ベクトル自体をクラスター化し、ツイートごとに、そのクラスターに属する単語が含まれているかどうかをエンコードするkエントリ(クラスターごとに1つ)を持つベクトルを作成します。これは、word2vecのKaggleチュートリアルで見たと思います。見つけたら、喜んでリンクを貼ってください。

1

ツイートの平均を取得して単一のベクターを取得する代わりに、代わりに各単語のベクターを取得し、さまざまな長さのベクターサイズについて、ゼロでパディングを行うことができます。


こんにちは、あなたの応答をありがとう。質問を小さな例で更新しました。回答を更新して、これを私が提供した例にどのように適用しますか?ありがとう。
antorqs 2016

あなたの編集後、私はそれをよりよく理解します。しかし、なぜ単一のベクトルが必要なのでしょうか。分類の代わりにすべての単語(ベクトル)を使用できないのはなぜですか?
Hima Varsha、2016

私はすべての単語ベクトルを使用します。ただし、すべてのツイートを同じサイズで表現する必要があります。分類子の場合、すべての例は同じサイズでなければなりません。
antorqs

ベクトライザーを使用して、ツイートに対してfit_transformを実行してみましたか?
Hima Varsha、2016

1

私の仕事では、単語ベクトルを平均化することによって同じ方法で行いました。しかし、私が試したかった別のアイデアがあります。それはPOSタグの助けを借りてです。

まず、可能な限りすべてのPOSタグを使用して最も複雑な文を作成し、これらのPOSタグをテンプレートとして設定します。Twitterコーパスの各文について、POSはその中のすべての単語にタグを付け、それらの単語ベクトルをテンプレートのPOSタグにそれぞれ適用します。したがって、見えないPOSタグはゼロになります。

例:NNP PDT DT NNS VB MD JJS CC PRP RBSテンプレートです。したがって、各位置には300次元のベクトルが含まれ、合計で3000次元のベクトルになります。最初のツイートのPOSタグがのNNP VB JJS PRP場合、単語ベクトルはこれらの位置に適用され、位置にNNP VB JJS PRPベクトルがあり、他の位置には300次元のゼロベクトルがあります。

この方法は、単一のベクトルで文を表現する問題を解決するだけでなく、正しいPOSに配置することで文の構文構造も保持します。

もちろん、POSタグが複数ある場合や、タグの位置が乱れている場合は問題が発生します。これは可能性の1つにすぎません。


このアプローチはよくわかりません。アプローチを明確化/詳しく説明するために編集できますか?私のツイートのPOSタグがテンプレートと同じ順序で表示されない場合はどうしますか?テンプレートに存在しないPOSタグがツイートに含まれている場合、どうする予定ですか?これはかなり壊れやすいようです。
DW

あなたの答えに触発されて、私はあなたの考えに基づいているが、私のコメントで言及されている脆弱性に対処しようとする考えを私の答えに追加しました。あなたが思いついたものが好きです!
DW

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.