UTL_TO_CHUNKS

大きなプレーン・テキスト・ドキュメントをテキストの小さなチャンクに分割するには、DBMS_VECTOR_CHAIN.UTL_TO_CHUNKSチェーン可能ユーティリティ関数を使用します。

用途

テキストからチャンクへの変換を実行します。このチェーン可能ユーティリティ関数は、操作のためにVECTOR_CHUNKS SQL関数を内部的にコールします。

大きなドキュメントを埋め込むには、まず、チャンク化と呼ばれる分割プロセスを介して、適切なサイズの複数のセグメントまたはチャンクに分割する必要があります(「データ変換のステージの理解」を参照)。チャンクは、単語(特定の単語や単語の断片を捕らえます)、文(特定の意味を捕らえます)または段落(より広いテーマを捕らえます)です。単一のドキュメントを複数のチャンクに分割し、それぞれをベクトルに変換できます。

構文

DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS (
    DATA         IN  CLOB | VARCHAR2,
    PARAMS       IN  JSON  default  NULL
) return VECTOR_ARRAY_T;

データ

この関数は、入力データ型をCLOBまたはVARCHAR2として受け入れます。

CLOBの配列を返します。各CLOBには、次のように、JSON形式のメタデータとともにチャンクが含まれています。

{
    "chunk_id"     : NUMBER,
    "chunk_offset" : NUMBER,
    "chunk_length" : NUMBER, 
    "chunk_data"   : "VARCHAR2(4000)"
}
次に例を示します。
{"chunk_id":1,"chunk_offset":1,"chunk_length":6,"chunk_data":"sample"}
説明は次のとおりです。
  • chunk_idは、各チャンクのチャンクIDを示します。

  • chunk_offsetは、ソース・ドキュメント内の各チャンクの元の位置を示します(ドキュメントの始まりの位置である1を基準とする)。

  • chunk_lengthは、各チャンクの文字長を示します。

  • chunk_dataは、各チャンクのテキストの部分を示します。

PARAMS

入力パラメータをJSON形式で指定します。

{
    "by"           :     mode,
    "max"          :     max,
    "overlap"      :     overlap,
    "split"        :     split_condition,
    "custom_list"  :     [ split_chars1, ... ],
    "vocabulary"   :     vocabulary_name,
    "language"     :     nls_language,
    "normalize"    :     normalize_mode,
    "norm_options" :     [ normalize_option1, ... ],
    "extended"     :     boolean
}

次に例を示します。

JSON('
  { "by"           :    "vocabulary",
    "vocabulary"   :    "myvocab",
    "max"          :    "100",
    "overlap"      :    "0",
    "split"        :    "custom",
    "custom_list"  :    [ "<p>" , "<s>" ],
    "language"     :    "american",
    "normalize"    :    "options",
    "norm_options" :    [ "whitespace" ] 
  }')

これらのパラメータの詳細を次に示します:

パラメータ 説明および許容される値

by

データを分割するモードを指定します。つまり、文字、単語または語彙トークンの数をカウントして分割します。

有効な値は次のとおりです。:

  • characters (またはchars):

    文字数をカウントして分割します。

  • words:

    単語数をカウントして分割します。

    単語は、英字のシーケンス、数字のシーケンス、個々の句読点、または記号として定義されます。空白の単語境界のないセグメント化された言語(中国語、日本語、タイ語など)では、各ネイティブ文字が単語とみなされます(つまり、ユニグラム)。

  • vocabulary:

    語彙トークンの数をカウントして分割します。

    語彙トークンは、埋込みモデルで使用されるトークナイザの語彙によって認識される単語または単語の断片です。語彙ファイルは、チャンカ・ヘルパーAPI DBMS_VECTOR_CHAIN.CREATE_VOCABULARYを使用してロードできます。

    ノート: 正確な結果を得るには、選択したモデルがチャンク化に使用される語彙ファイルと一致するようにしてください。語彙ファイルを使用していない場合は、入力長がモデルのトークン制限内で定義されていることを確認してください。

デフォルト値: words

max

各チャンクの最大サイズの制限を指定します。この設定では、大きいテキストで最大制限に達したときに、固定された位置で入力テキストが分割されます。maxの単位は、byモードに対応しています。つまり、特定の数の文字、単語、数字、句読点または語彙トークンが最大サイズ制限に達したときにデータが分割されます。

有効な値は次のとおりです。:

  • by characters: 50から4000文字

  • by words: 10から1000ワード

  • by vocabulary: 10から1000トークン

デフォルト値: 100

split [by]

最大サイズ制限に達したときに入力テキストを分割する位置を指定します。これにより、チャンクに対して適切な境界を定義することで、関連するデータが一緒になるように維持できます。

有効な値は次のとおりです。:

  • none:

    文字、単語または語彙トークンのmax制限で分割します。

  • newlineblanklineおよびspace:

    これらは、max値の前の最後の分割文字で分割される単一分割文字条件です。

    テキストの行の最後で分割するには、newlineを使用します。空白行(2つの改行などの文字のシーケンス)の最後で分割するには、blanklineを使用します。空白の最後で分割するには、spaceを使用します。

  • recursively:

    これは、文字(またはシーケンス)の順序付きリストを使用して入力テキストを分割する複数分割文字条件です。

    recursivelyは、次の順序でBLANKLINEnewlinespacenoneとして事前定義されています:

    1. 入力テキストがmax値より大きい場合は、最初の分割文字で分割されます。

    2. 失敗した場合は、2番目の分割文字で分割します。

    3. このように続きます。

    4. 分割文字が存在しない場合は、テキスト内のmaxの位置で分割します。

  • sentence:

    これは、文の境界で入力テキストを分割する文末分割条件です。

    この条件では、入力言語の文の句読点およびコンテキスト・ルールの知識を使用して、文の境界が自動的に判断されます。この言語固有の条件は、主に文末(EOS)の句読点および一般的な略記法に依存しています。

    コンテキスト・ルールは単語情報に基づいているため、この条件はテキストを(文字ではなく)単語または語彙で分割する場合にのみ有効です。

    ノート: この条件は、by wordおよびmaxの設定に従っているため、場合によっては正確な文の境界を判断できないことがあります。たとえば、文がmax値より大きい場合、文はmaxで分割されます。同様に、maxの制限内に収まる場合にのみ、テキストに複数の文が含まれます。

  • custom:

    カスタム分割文字リストに基づいて分割します。カスタム・シーケンスは、制限である16個の分割文字列まで指定でき、最大長はそれぞれ10文字です。

    custom_listパラメータを使用して、有効なテキスト・リテラルの配列を指定します。

    {
        "split"        :  "custom",
        "custom_list"  :  [ "split_chars1", ... ]
    }

    次に例を示します。

    {
        "split"        :    "custom",
        "custom_list"  :    [ "<p>" , "<s>" ]
    }

    ノート: シーケンスを省略できるのは、タブ(\t)、改行(\n)および改行(\r)の場合のみです。

デフォルト値: recursively

overlap

チャンクに含める必要がある先行するテキストの量(正の整数リテラルまたはゼロ)を指定します(存在する場合)。これは、先行するチャンク・テキストの一部を含めて、関連するテキスト(文など)を論理的に分割するのに役立ちます。

重なりの量は、チャンクの最大サイズの測定方法(文字、単語または語彙トークン)によって異なります。重なりは、指定されたsplit条件(newlineなど)から始まります。

有効な値: max5%から20%

デフォルト値: 0

language

入力データの言語を指定します。

この句は、別の言語では異なる解釈になる可能性がある特定の文字(句読点や略語など)がテキストに含まれている場合に特に重要です。

有効な値は次のとおりです。:

ノート: エスケープ文字は、SQL予約語でもある言語の略語(たとえば、INASORISなどの言語の略語)とともに使用する必要があります。

次に例を示します。

SELECT dbms_vector_chain.utl_to_chunks('this is an example', 
   JSON('{ "language" : "\"in\"" }')) 
from dual;
SELECT dbms_vector_chain.utl_to_chunks('this is an example', 
   JSON_OBJECT('language' value '"in"' RETURNING JSON)) 
from dual;

デフォルト値: セッションのNLS_LANGUAGE

normalize

ドキュメントがテキストに変換されるときに発生する可能性のある問題(連続する複数の空白やスマート・クォートなど)を自動的に前処理または後処理します。正規化モードを使用して高品質のチャンクを抽出することをお薦めします。

有効な値は次のとおりです。:

  • none:

    正規化を適用しません。

  • all:

    一般的なマルチバイト(Unicode)の句読点を標準のシングルバイトに正規化します。

  • options:

    norm_optionsパラメータを使用して、正規化オプションの配列を指定します。

    {
        "normalize"    :  "options",
        "norm_options" :  [ "normalize_option1", ... ]
    }
    • punctuation:

      テキストの文字セットでサポートされている引用符、ダッシュ、およびその他の句読点文字を、共通のASCII形式に変換します。次に例を示します。

      • U+2013 (Enダッシュ)はU+002D (ハイフンマイナス)にマップされます

      • U+2018(左一重引用符)はU+0027(アポストロフィ)にマップされます

      • U+2019(右一重引用符)はU+0027(アポストロフィ)にマップされます

      • U+201B (単一の高逆9引用符)はU+0027 (アポストロフィ)にマップされます

    • whitespace:

      不要な文字を排除することで、空白を最小化します。

      たとえば、空白行は維持されますが、余分な改行、点在する空白またはタブは削除されます: " \n \n " => "\n\n"

    • widechar:

      ワイド文字とマルチバイト文字の数字および(a-z)をシングルバイトに正規化します。

      これらは、日本語、中国語または韓国語のテキストで表示できる0-9およびa-z A-Zに相当するマルチバイトです。

    次に例を示します。

    {
        "normalize"    :  "options",
        "norm_options" :  [ "whitespace" ]
    }

デフォルト値: none

extended

max_string_sizeパラメータをextendedに設定することなく、VARCHAR2文字列の出力制限を32767バイトに増やします。

デフォルト値: 4000または32767 (max_string_size=extendedの場合)

SELECT D.id doc,
    JSON_VALUE(C.column_value, '$.chunk_id' RETURNING NUMBER) AS id,
    JSON_VALUE(C.column_value, '$.chunk_offset' RETURNING NUMBER) AS pos,
    JSON_VALUE(C.column_value, '$.chunk_length' RETURNING NUMBER) AS siz,
    JSON_VALUE(C.column_value, '$.chunk_data') AS txt
FROM docs D,
   dbms_vector_chain.utl_to_chunks(D.text,
   JSON('{ "by"       : "words",
           "max"      : "100",
           "overlap"  : "0",
           "split"    : "recursively",
           "language" : "american",
           "normalize": "all" }')) C;

エンドツーエンドの例:

この関数を使用してエンドツーエンドのシナリオ例を実行するには、「チャンク化と埋込みの実行」および「チャンク化パラメータの構成」を参照してください。

関連トピック