バックグラウンド:
MapReduce を使用して Hadoop 上の Java で「ドキュメント用語」マトリックスを作成しようとしています。ドキュメント用語マトリックスは、各行がドキュメントを表し、各列が可能な単語/用語を表す巨大なテーブルのようなものです。
問題文:
用語インデックス リストが既にあると仮定すると (どの用語がどの列番号に関連付けられているかがわかります)、各ドキュメントの各用語のインデックスを検索して行ごとに行列を作成できるようにする最善の方法は何ですか? -行 (つまり、ドキュメントごと)?
これまでのところ、2 つのアプローチを考えることができます。
アプローチ #1:
ターム インデックス リストを Hadoop 分散ファイル システムに保存します。マッパーがインデックス作成のために新しいドキュメントを読み取るたびに、新しい MapReduce ジョブを生成します。ドキュメント内の一意の単語ごとに 1 つのジョブであり、各ジョブは分散された用語リストにその用語をクエリします。このアプローチは、やり過ぎのように思えます。新しいジョブの開始に関連するオーバーヘッドがあると推測しているためです。また、このアプローチでは数千万のジョブが必要になる可能性があるためです。また、別の MapReduce ジョブ内で MapReduce ジョブを呼び出すことができるかどうかもわかりません。
アプローチ #2:
各マッパーが用語インデックス リストのローカル コピーになるように、各ドキュメントに用語インデックス リストを追加します。このアプローチは、ストレージをかなり無駄にします (ドキュメントと同じ数の用語索引リストのコピーが存在します)。また、用語インデックス リストを各ドキュメントにマージする方法がわかりません。それらをマッパーまたはリデューサーでマージしますか?
質問の更新 1
入力ファイル形式:
入力ファイルは、すべてのドキュメント (製品レビュー) を含む CSV (カンマ区切り値) ファイルになります。ファイルには列ヘッダーはありませんが、各レビューの値は次の順序で表示されます: product_id、review_id、review、stars。以下は偽の例です。
「製品 A」、「1」、「製品 A は非常に非常に高価です。」、「2」</p>
「製品 G」、「2」、「素晴らしい製品!!」、「5」</p>
ターム インデックス ファイル形式:
用語インデックス ファイルの各行は、インデックス番号、タブ、単語で構成されます。インデックス ファイルという用語は、SQL テーブルの主キー (単語) のリストに似ています。特定のドキュメント内の単語ごとに、単語が見つかるまで用語インデックス ファイルの各行を繰り返し処理することを暫定的に計画しています。その単語の列番号は、その単語に関連付けられた列/用語インデックスとして定義されます。以下は、前述の 2 つの製品レビューの例を使用して作成された用語索引ファイルの例です。
1 すごい
2 製品
3a
4は
5 とても
6 高い
出力ファイル形式:
多くのゼロを含む行列を圧縮するための業界標準である「Matrix Market」(MM) 形式で出力したいと考えています。ほとんどのレビューには可能なすべての単語のごく一部しか含まれていないため、これは理想的な形式です。特定のドキュメントでは、ゼロ以外の列を指定するだけで済みます。
MM 形式の最初の行には、タブで区切られた 3 つの値があります。ドキュメントの総数、単語列の総数、ヘッダーを除く MM ファイルの行の総数です。ヘッダーの後に追加される各行には、特定のエントリに関連付けられたマトリックス座標とエントリの値が次の順序で含まれます: reviewID、wordColumnID、entry (この単語がレビューに表示される回数)。Matrix Market フォーマットの詳細については、次のリンクを参照してください: http://math.nist.gov/MatrixMarket/formats.html .
各レビューの ID は、ドキュメント用語マトリックスの行インデックスと同じになります。このようにして、Matrix Market 形式でレビューの ID を保持できるため、各レビューを星評価に関連付けることができます。私の最終的な目標は、この質問の範囲を超えていますが、テキストに基づいて新しいレビューの星の数を予測する自然言語処理アルゴリズムを構築することです。
上記の例を使用すると、最終的な出力ファイルは次のようになります (Stackoverflow にスペースの代わりにタブを表示させることができません)。
2 6 7
1 2 1
1 3 1
1 4 1
1 5 2
1 6 1
2 1 1
2 2 1