ML.BAG_OF_WORDS 関数

ML.BAG_OF_WORDS 関数を使用し、トークン化されたドキュメントの表現を単語のバッグ(マルチセット)として計算します(単語の順序と文法は無視します)。TRANSFORM 句内で ML.BAG_OF_WORDS を使用できます。

構文

ML.BAG_OF_WORDS(
  tokenized_document
  [, top_k]
  [, frequency_threshold]
)
OVER()

引数

ML.BAG_OF_WORDS は次の引数を取ります。

  • tokenized_document: トークン化されたドキュメントを表す ARRAY<STRING> 値。トークン化されたドキュメントは、テキスト分析に使用される用語(トークン)の集まりです。BigQuery でのトークン化の詳細については、TEXT_ANALYZE をご覧ください。
  • top_k: 省略可能な引数。INT64 値を取ります。この値は、不明な用語を除く辞書のサイズを表します。このしきい値に達するまで、ほとんどのドキュメントに出現する top_k の用語が辞書に追加されます。たとえばこの値が 20 の場合、ほとんどのドキュメントに出現する上位 20 個の固有の用語が追加され、他の用語は追加されません。
  • frequency_threshold: 省略可能な引数。辞書に含めるために用語が出現しなければならないドキュメントの最小数を表す INT64 値を取ります。たとえば、この値が 3 の場合、辞書に追加されるには、トークン化されたドキュメント内で用語が 3 回以上出現する必要があります。

top_kfrequency_threshold の条件を満たしていれば、用語が辞書に追加されます。条件を満たしていない場合は、不明な用語とみなされます。不明な用語は常に辞書の最初の用語になり、0 として表されます。辞書の残りの部分は、アルファベット順に並べられます。

出力

ML.BAG_OF_WORDS は、入力のすべての行の値を返します。各値の型は次のとおりです。

ARRAY<STRUCT<index INT64, value FLOAT64>>

定義:

  • index: 辞書に追加された用語のインデックス。不明な用語のインデックスは 0 です。
  • value: ドキュメント内の対応する数。

割り当て

Cloud AI サービスの関数の割り当てと上限をご覧ください。

次の例では、不明な用語なしで、入力列 f に対して ML.BAG_OF_WORDS 関数を呼び出しています。

WITH ExampleTable AS (
  SELECT 1 AS id, ['a', 'b', 'b', 'c'] AS f
  UNION ALL
  SELECT 2 AS id, ['a', 'c'] AS f
)

SELECT ML.BAG_OF_WORDS(f, 32, 1) OVER() AS results
FROM ExampleTable
ORDER BY id;

出力は次のようになります。

+----+---------------------------------------------------------------------------------------+
| id |                                        results                                        |
+----+---------------------------------------------------------------------------------------+
|  1 | [{"index":"1","value":"1.0"},{"index":"2","value":"2.0"},{"index":"3","value":"1.0"}] |
|  2 |                             [{"index":"1","value":"1.0"},{"index":"3","value":"1.0"}] |
+----+---------------------------------------------------------------------------------------+

不明な用語はないため、結果にインデックス 0 がないことに注意してください。

次の例では、入力列 f に対して ML.BAG_OF_WORDS 関数を呼び出します。

WITH ExampleTable AS (
  SELECT 1 AS id, ['a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd'] AS f
  UNION ALL
  SELECT 2 AS id, ['a', 'c', NULL] AS f
)

SELECT ML.BAG_OF_WORDS(f, 4, 2) OVER() AS results
FROM ExampleTable
ORDER BY id;

出力は次のようになります。

+----+---------------------------------------------------------------------------------------+
| id |                                        results                                        |
+----+---------------------------------------------------------------------------------------+
|  1 | [{"index":"0","value":"5.0"},{"index":"1","value":"1.0"},{"index":"2","value":"4.0"}] |
|  2 | [{"index":"0","value":"1.0"},{"index":"1","value":"1.0"},{"index":"2","value":"1.0"}] |
+----+---------------------------------------------------------------------------------------+
 

frequency_threshold の値が 2 に設定されている場合、bd の値は 1 つのドキュメントにしか出現しないため、返されません。

次の例では、top_k の値を小さくして ML.BAG_OF_WORDS 関数を呼び出しています。

WITH ExampleTable AS (
  SELECT 1 AS id, ['a', 'b', 'b', 'c'] AS f
  UNION ALL
  SELECT 2 AS id, ['a', 'c', 'c'] AS f
)

SELECT ML.BAG_OF_WORDS(f, 2, 1) OVER() AS results
FROM ExampleTable
ORDER BY id;

出力は次のようになります。

+----+---------------------------------------------------------------------------------------+
| id |                                        results                                        |
+----+---------------------------------------------------------------------------------------+
|  1 | [{"index":"0","value":"2.0"},{"index":"1","value":"1.0"},{"index":"2","value":"1.0"}] |
|  2 |                             [{"index":"1","value":"1.0"},{"index":"2","value":"2.0"}] |
+----+---------------------------------------------------------------------------------------+
 

b の値が返されないのは、上位 2 つの用語を指定しており、b は 1 つのドキュメントにしか出現しないからです。

次の例では、同じ頻度の用語が 2 つ含まれています。これらの用語の 1 つは、アルファベット順であるため結果から除外されています。

WITH ExampleData AS (
  SELECT 1 AS id, ['a', 'b', 'b', 'c', 'd', 'd', 'd'] as f
  UNION ALL
  SELECT 2 AS id, ['a', 'c', 'c', 'd', 'd', 'd'] as f
)

SELECT id, ML.BAG_OF_WORDS(f, 2 ,2) OVER() as result
FROM ExampleData
ORDER BY id;

結果は次のようになります。

+----+---------------------------------------------------------------------------------------+
| id |                                         result                                        |
+----+---------------------------------------------------------------------------------------+
|  1 | [{"index":"0","value":"5.0"},{"index":"1","value":"1.0"},{"index":"2","value":"1.0"}] |
|  2 | [{"index":"0","value":"3.0"},{"index":"1","value":"1.0"},{"index":"2","value":"2.0"}] |
+----+---------------------------------------------------------------------------------------+

次のステップ