Tokenisasi

Halaman ini menjelaskan cara menambahkan tokenisasi ke tabel. Tokenisasi adalah yang diperlukan untuk membuat token yang digunakan dalam indeks penelusuran.

Ringkasan

Tokenisasi adalah proses transformasi nilai menjadi token. Metode yang Anda digunakan untuk membuat token pada dokumen menentukan jenis dan efisiensi pencarian yang dapat dilakukan pengguna.

Spanner menyediakan tokenizer untuk teks natural language, {i>substring<i}, teks verbatim, angka, dan boolean. Skema {i>database<i} menggunakan tokenizer yang cocok dengan jenis pencarian yang dibutuhkan untuk kolom tersebut. Tokenizer memiliki karakteristik berikut:

  • Setiap tokenizer adalah fungsi SQL yang mendapatkan input, seperti string atau angka, dan argumen yang dinamai untuk opsi tambahan.
  • Tokenizer menghasilkan TOKENLIST.

Misalnya, string teks The quick brown fox jumps over the lazy dog ditokenkan menjadi [the,quick,brown,fox,jumps,over,the,lazy,dog]. String HTML The <b>apple</b> is <i>red</i> ditokenkan menjadi [the,apple,is,red].

Token memiliki karakteristik berikut:

  • Token disimpan dalam kolom yang menggunakan jenis data TOKENLIST.
  • Setiap token disimpan sebagai urutan byte, dengan serangkaian yang terkait. Misalnya, dalam aplikasi teks lengkap, token biasanya satu kata dari dokumen tekstual.
  • Saat membuat token nilai HTML, Spanner menghasilkan atribut yang menunjukkan keterlihatan token dalam dokumen. Spanner menggunakan atribut ini untuk penilaian guna meningkatkan istilah yang menonjol (seperti tajuk).

Tokenizer

Spanner mendukung fungsi tokenizer berikut:

  • Tokenizer teks lengkap (TOKENIZE_FULLTEXT) menghasilkan token kata utuh untuk kueri natural language.

    Contoh

    Kedua fungsi berikut

    TOKENIZE_FULLTEXT("Yellow apple")
    TOKENIZE_FULLTEXT("Yellow &lt;b>apple&lt;/b>", content_type=>"text/html")
    

    menghasilkan token yang sama: [yellow,apple].

  • Tokenizer substring (TOKENIZE_SUBSTRING) menghasilkan token untuk setiap n-gram dari setiap kata. Fungsi ini digunakan untuk menemukan {i>substring<i} kata dalam sebuah teks.

    Contoh

    TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
    

    Menghasilkan token berikut: [ello,hell,hello,orld,worl,world].

  • Tokenizer N-gram (TOKENIZE_NGRAMS) menghasilkan n-gram dari input (tanpa membaginya menjadi kata-kata terpisah). Fungsi ini digunakan untuk mempercepat predikat ekspresi reguler.

    Contoh

    Fungsi berikut:

    TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
    

    Menghasilkan token berikut: ["Big ","ig T","g Ti"," Tim", "Time"].

  • Tokenizer pencocokan persis (TOKEN dan TOKENIZE_BOOL) digunakan untuk mencari baris yang berisi nilai tertentu di salah satu kolomnya. Misalnya, aplikasi yang mengindeks katalog produk mungkin ingin mencari produk dari merek dan warna tertentu.

    Contoh

    Fungsi berikut:

    TOKEN("hello")
    TOKEN(["hello", "world"])
    

    Buat token berikut: [hello] dan [hello,world].

    Fungsi berikut:

    TOKENIZE_BOOL(true)
    

    Menghasilkan token berikut: [y].

  • Tokenizer angka (TOKENIZE_NUMBER) digunakan untuk menghasilkan serangkaian token yang mempercepat perbandingan numerik penelusuran. Untuk kondisi kesetaraan, tokennya adalah angka itu sendiri. Untuk rentang kondisi tertentu (seperti rating >= 3.5), kumpulan token lebih terperinci.

    Contoh

    Pernyataan fungsi berikut:

    TOKENIZE_NUMBER(42, comparison_type=>"equality")
    TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
    

    Buat token berikut: "==42" dan "==42", "[1,75]","[36, 45]","[36,55]","[36, 75]".

Fungsi tokenisasi biasanya digunakan dalam ekspresi kolom yang dihasilkan. Ini kolom ditetapkan sebagai HIDDEN sehingga tidak disertakan dalam SELECT * hasil kueri.

Contoh berikut menggunakan tokenizer teks lengkap dan tokenizer numerik untuk membuat {i>database<i} yang menyimpan nama dan peringkat album musik. Pernyataan DDL melakukan dua hal:

  1. Menentukan kolom data AlbumTitle dan Rating.
  2. Menentukan AlbumTitle_Tokens dan AlbumRating_Tokens. TOKENLIST ini kolom menjadi token nilai dalam kolom data sehingga Spanner dapat mengindeksnya.

    CREATE TABLE Albums (
      AlbumId STRING(MAX) NOT NULL,
      AlbumTitle STRING(MAX),
      Rating FLOAT64,
      AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN,
      Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN
    ) PRIMARY KEY(AlbumId);
    

Setiap kali nilai dasar diubah, AlbumTitle_Tokens dan Rating_Tokens akan diperbarui secara otomatis.

Membuat token teks biasa atau konten HTML

Tokenisasi teks mendukung jenis konten HTML dan teks biasa. Gunakan Spanner TOKENIZE_FULLTEXT fungsi untuk membuat token. Kemudian gunakan CREATE SEARCH INDEX Pernyataan DDL untuk menghasilkan indeks penelusuran.

Misalnya, pernyataan DDL CREATE TABLE berikut menggunakan metode fungsi TOKENIZE_FULLTEXT untuk membuat token dari AlbumTitles di Tabel Albums. Pernyataan DDL CREATE SEARCH INDEX membuat penelusuran indeks dengan AlbumTitles_Tokens baru.

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  AlbumTitle STRING(MAX),
  AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(AlbumTitle_Tokens)

Proses tokenisasi menggunakan aturan berikut:

  • Tokenisasi tidak mencakup stemming atau koreksi dari kata yang salah eja. Misalnya, dalam kalimat seperti "Seorang kucing sedang melihat group of cats", token "cat" diindeks secara terpisah dari token "cats". Dibandingkan dengan mesin telusur lain yang menormalisasi token selama penulisan, Spanner menyediakan opsi untuk memperluas kueri penelusuran ke menggunakan bentuk kata yang berbeda. Untuk informasi selengkapnya, lihat Mode kueri yang ditingkatkan.
  • Stopword (seperti "a") disertakan dalam indeks penelusuran.
  • Penelusuran teks lengkap selalu tidak peka huruf besar/kecil. Proses tokenisasi akan mengonversi semua token menjadi huruf kecil.

Proses tokenisasi melacak posisi setiap token dalam token teks. Posisi ini kemudian digunakan untuk mencocokkan frasa. Posisi disimpan dalam indeks penelusuran bersama dengan docid.

Google terus meningkatkan kualitas algoritma tokenisasi. Dalam beberapa kasus, ini mungkin menyebabkan string di-tokenkan secara berbeda di masa mendatang dari cara ditokenkan sekarang. Kami memperkirakan kasus semacam ini akan sangat jarang terjadi. Contohnya adalah apakah ada peningkatan dalam bahasa China, Jepang, dan Korea (CJK) segmentasi.

Argumen content_type menentukan apakah format konten menggunakan data biasa teks atau HTML. Gunakan setelan berikut untuk menetapkan content_type:

  • Untuk tokenisasi teks, tetapkan argumen content_type ke "text/plain". Setelan ini adalah setelan default.
  • Untuk tokenisasi HTML, tetapkan argumen content_type ke "text/html". Tanpa argumen ini, tag HTML dianggap sebagai tanda baca. Dalam mode HTML, Spanner menggunakan heuristik untuk menyimpulkan seberapa terlihatnya teks pada halaman. Misalnya, apakah teks ada dalam judul atau ukuran fontnya. Atribut yang didukung untuk HTML meliputi small, medium, large, title, dan `link'. Seperti posisi, atribut disimpan bersama token kata dalam indeks penelusuran. Tokenisasi tidak membuat token untuk HTML apa pun {i>tag<i}.

Atribut token tidak memengaruhi pencocokan atau hasil SEARCH atau fungsi SEARCH_SUBSTRING. Mereka hanya digunakan untuk peringkat.

Contoh berikut menunjukkan cara membuat token teks:

CREATE TABLE T (
  ...
  Text STRING(MAX),
  Html STRING(MAX),
  Text_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Text, content_type=>"text/plain")) HIDDEN,
  Html_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Html, content_type=>"text/html")) HIDDEN
) PRIMARY KEY(...);

Peningkatan deteksi bahasa dengan argumen language_tag

Tokenisasi mendeteksi bahasa input secara otomatis, secara default. Jika bahasa input diketahui, argumen language_tag dapat digunakan untuk pertajam perilaku ini:

AlbumTitle_Tokens TOKENLIST
  AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN

Sebagian besar aplikasi membiarkan argumen language_tag tidak ditentukan dan justru mengandalkan deteksi bahasa otomatis. Segmentasi untuk bahasa Asia seperti China, Korea, dan Jepang tidak memerlukan pengaturan bahasa tokenisasi.

Contoh berikut menunjukkan kasus saat language_tag memengaruhi tokenisasi:

Fungsi tokenisasi Token yang diproduksi
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que") [a, tout, pourquoi, il, ya, un, parce, que]
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que", \ language_tag=>"fr") [a, tout, pourquoi, il, y, a, un, parce, que]
TOKENIZE_FULLTEXT("旅 行") Dua token: [旅, 行]
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") Satu token: [旅行]

Langkah selanjutnya