0

BigQuery に保存されている最大 470 万のドキュメントのテーブルがあります。一部はプレーンテキストで、一部は HTML です。それらは 1 つあたり約 2,000 トークンで、幅広いバリエーションがあります。私は主に DataPrep を使用して処理を行っています。

それらのトークンを抽出し、 TF-IDF値を計算したいと考えています。

トークンカウント

より時間のかかる手順の 1 つは、次の手順を実行することです。

id, document
1, "foo bar foo baz"
2, "foo bar bar qux"

そして、これを次のように変えます:

id, word, count
1, foo, 2
1, bar, 1
1, baz, 1
2, foo, 1
2, bar, 2
2, qux, 1

それを行う1つの方法は次のとおりです。

  1. ドキュメントの抽出リスト{alphanum-underscore}+ id, wordlist 1, ["foo", "bar", "foo", "baz"] 2, ["foo", "bar", "bar", "qux"]
  2. 単語リストを平坦化 id, word 1, foo 1, bar 1, foo 1, baz 2, foo 2, bar 2, bar 2, qux
  3. グループごとの集計: id、単語、値: count() id, word, count 1, foo, 2 1, bar, 1 1, baz, 1 2, foo, 1 2, bar, 2 2, qux, 1

ただし、手順 2 と 3 は、特に大きなドキュメントでは非常に時間がかかります。

["foo", "bar", "foo", "baz"]理想的には、に変換する関数を持つことができます{"foo":2, "bar":1, "baz":1}。これは、カウントを抽出するためにフラット化してからグループ化する操作を必要とせず、その後のフラット化は小さくなります (各用語ではなく一意の用語で動作するため)。

ただし、DataPrep でそれを行う方法はわかりませんでした。:-/

これを行うためのより効率的な方法は何ですか?

HTMLからプレーンテキストへ

私のソース データは、プレーンテキストと html の組み合わせです。370 万のドキュメントのうち、平文を利用できるのは約 800k だけです。

この規模で機能する何らかの合理的な方法 (たとえば Nokogiri #content に相当するもの) で html をプレーンテキストに変換して、結果からトークンを抽出できるようにしたいと考えています。

bq queryを実行し、html を取り込み、nokogiri で処理し、処理済みのテーブルに出力するクラスターをスピンアップできます。しかし、それはちょっと複雑で、多くの I/O が必要です。

これを行うためのより簡単で効率的な方法はありますか?

4

1 に答える 1