バッグオブワードモデル(BoW) は、順序付けされていない単語のコレクション (「バッグ」) に基づくテキスト表現を使用するテキスト モデルです。これは、自然言語処理と情報検索(IR)で使用されます。単語の順序(したがって、構文や文法の大部分)は無視されますが、多重性は考慮されます。
バッグオブワードモデルは、文書分類の手法でよく使用され、例えば、各単語の出現頻度が分類器のトレーニングの特徴として使用されます。[1]また、コンピュータービジョンにも使用されています。[2]
言語学の文脈における「言葉の袋」への初期の言及は、ゼリッグ・ハリスの1954年の分布構造に関する論文に見られる。[3]
意味
以下は、bag-of-words を使用してテキスト ドキュメントをモデル化したものです。次の 2 つの単純なテキスト ドキュメントがあります。
(1) ジョンは映画を見るのが好きです。メアリーも映画が好きです。
(2)メアリーはフットボールの試合を見るのも好きです。
これら 2 つのテキスト ドキュメントに基づいて、各ドキュメントのリストが次のように作成されます。
「ジョンは」「映画を」「見るのが好き」「メアリーは」「映画を」「好き」「私も」
「メアリー」、「また」、「好き」、「観る」、「サッカー」、「ゲーム」
各 bag-of-words をJSON オブジェクトとして表現し、それぞれのJavaScript変数に割り当てます。
BoW1 = { "ジョン" : 1 、"好き" : 2 、"に" : 1 、"見る" : 1 、"映画" : 2 、"メアリー" : 1 、"も" : 1 }; BoW2 = { "メアリー" : 1 、"また" : 1 、"好き" : 1 、"に" : 1 、"見る" : 1 、"サッカー" : 1 、"ゲーム" : 1 };
各キーは単語であり、各値は指定されたテキスト ドキュメント内でのその単語の出現回数です。
要素の順序は自由なので、たとえばはBoW1{"too":1,"Mary":1,"movies":2,"John":1,"watch":1,"likes":2,"to":1}と同等です。これは、厳密なJSON オブジェクト表現に期待されるものでもあります。
注: 別の文書がこれら2つの文書の結合のような場合、
(3) ジョンは映画を見るのが好きです。メアリーも映画が好きです。メアリーはフットボールの試合を見るのも好きです。
JavaScript 表現は次のようになります。
BoW3 = { "ジョン" : 1 、"好き" : 3 、"に" : 2 、"見る" : 2 、"映画" : 2 、"メアリー" : 2 、"も" : 1 、"また" : 1 、"サッカー" : 1 、"ゲーム" : 1 };
したがって、バッグ代数でわかるように、bags-of-words 表現における 2 つのドキュメントの「和集合」は、形式的には、各要素の重複度を合計した、互いに素な和集合です。
語順
テキストの BoW 表現では、すべての語順が削除されます。たとえば、「man bites dog」と「dog bites man」の BoW 表現は同じであるため、テキストの BoW 表現を処理するアルゴリズムは、これらを同じように処理する必要があります。この構文や文法の欠如にもかかわらず、BoW 表現は高速であり、語順を必要としない単純なタスクには十分です。たとえば、ドキュメント分類の場合、「stocks」「trade」「investors」という単語が複数回出現する場合、テキストは財務レポートである可能性が高いですが、これらを区別するには不十分です。
昨日は投資家たちは反発していたが、今日は後退している。
そして
昨日は投資家は撤退していたが、今日は反発している。
そのため、BoW 表現では文書の詳細な意味を判断するには不十分です。
実装
バッグオブワードモデルの実装では、文書の内容を表すために文書内の単語の頻度を使用することがあります。頻度は、文書頻度の逆数、つまりtf-idfによって「正規化」できます。さらに、分類という特定の目的のために、文書のクラスラベルを考慮するための教師あり代替手段が開発されています。 [4]最後に、いくつかの問題では、頻度の代わりにバイナリ(存在/不在または 1/0)の重み付けが使用されます(たとえば、このオプションはWEKA機械学習ソフトウェアシステムに実装されています)。
Python実装
# 最初に必要なパッケージをインストールしてください
# pip install --upgrade pip
# pip install tensorflow
from tensorflow import keras
from entering import List
from keras.preprocessing.text import Tokenizer
sentence = [ "ジョンは映画を見るのが好きです。メアリーも映画が好きです。" ]
def print_bow ( sentence : List [ str ]) -> None :
tokenizer = Tokenizer ()
tokenizer . fit_on_texts ( sentence )
sequences = tokenizer . texts_to_sequences ( sentence )
word_index = tokenizer . word_index
bow = {}
for key in word_index :
bow [ key ] = sequences [ 0 ] . count ( word_index [ key ])
print ( f "単語の袋文 1: \n { bow } " )
print ( f " { len ( word_index ) }個の一意のトークンが見つかりました。" )
print_bow (文)
ハッシュトリック
辞書を使用する代わりによく使われるのはハッシュトリックで、ハッシュ関数を使って単語をインデックスに直接マッピングする。[5]そのため、辞書を保存するためにメモリは不要。ハッシュ衝突は通常、メモリを解放してハッシュバケットの数を増やすことで対処される[説明が必要]。実際には、ハッシュはバッグオブワードモデルの実装を簡素化し、スケーラビリティを向上させる。
参照
注記
- ^ McTear et al 2016、167ページ。
- ^ Sivic, Josef (2009 年 4 月)。「テキスト検索としてキャストされたビデオの効率的な視覚検索」(PDF)。IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE、第 31 巻、第 4 号。反対。pp. 591–605。
- ^ ハリス、ゼリグ(1954)。「分配構造」。単語。10 (2/3): 146–62。doi :10.1080/00437956.1954.11659520。そして、この要素の組み合わせの蓄積は
、後の選択を行う際の要因になります...言語は単なる単語の集まりではなく、使用の過程で形成された特定の特性を持つツールです。
- ^ Youngjoong Ko (2012). 「テキスト分類のためのクラス情報を使用した用語重み付けスキームの研究」SIGIR'12 . ACM .
- ^ Weinberger, KQ; Dasgupta A.; Langford J.; Smola A.; Attenberg, J. (2009). 「大規模マルチタスク学習のための特徴ハッシュ」。機械学習に関する第 26 回国際会議の議事録。pp. 1113–1120。arXiv : 0902.2206。Bibcode : 2009arXiv0902.2206W。doi : 10.1145 / 1553374.1553516。ISBN 9781605585161. S2CID 291713。
参考文献
- McTear, Michael (et al) (2016).会話型インターフェース. Springer International Publishing.
