עבודה עם כלי ניתוח טקסט

הפונקציות CREATE SEARCH INDEX DDL statement,‏ SEARCH ו-TEXT_ANALYZE תומכות באפשרויות מתקדמות להגדרה של כלי לניתוח טקסט. הבנה של כלי ניתוח הטקסט ב-BigQuery והאפשרויות שלהם מאפשרת לכם לשפר את חוויית החיפוש.

במאמר הזה מפורטת סקירה כללית של מנתחי הטקסט השונים שזמינים ב-BigQuery ואפשרויות ההגדרה שלהם, וגם דוגמאות לאופן שבו מנתחי טקסט פועלים עם חיפוש ב-BigQuery. מידע נוסף על התחביר של כלי ניתוח הטקסט זמין במאמר בנושא ניתוח טקסט.

כלי ניתוח טקסט

‫BigQuery תומך במנתחי הטקסט הבאים:

  • NO_OP_ANALYZER
  • LOG_ANALYZER
  • PATTERN_ANALYZER

NO_OP_ANALYZER

כדאי להשתמש ב-NO_OP_ANALYZER כשרוצים להתאים נתונים שעברו עיבוד מראש בצורה מדויקת. לא מתבצעת טוקניזציה או נרמול של הטקסט. מכיוון שהכלי הזה לא מבצע טוקניזציה או נורמליזציה, הוא לא מקבל הגדרות. מידע נוסף על NO_OP_ANALYZER זמין במאמר NO_OP_ANALYZER.

LOG_ANALYZER

ה-LOG_ANALYZER משנה את הנתונים בדרכים הבאות:

  • הטקסט מומר לאותיות קטנות.
  • ערכי ASCII שגדולים מ-127 נשמרים כמו שהם.

  • הטקסט מפולח למונחים נפרדים שנקראים אסימונים באמצעות התווים הבאים להפרדה:

    [ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \n \r \s \t %21 %26
    %2526 %3B %3b %7C %7c %20 %2B %2b %3D %3d %2520 %5D %5d %5B %5b %3A %3a %0A
    %0a %2C %2c %28 %29
    

    אם אתם לא רוצים להשתמש בתווי ההפרדה שמוגדרים כברירת מחדל, אתם יכולים לציין את תווי ההפרדה שבהם אתם רוצים להשתמש כאפשרויות של כלי ניתוח הטקסט. ‫LOG_ANALYZER מאפשר לכם להגדיר מפרידים ספציפיים ומסנני טוקנים כדי לקבל שליטה רבה יותר על תוצאות החיפוש. מידע נוסף על אפשרויות ההגדרה הספציפיות שזמינות כשמשתמשים ב-LOG_ANALYZER זמין במאמרים בנושא אפשרות הניתוח delimiters ואפשרות הניתוח token_filters.

PATTERN_ANALYZER

הכלי PATTERN_ANALYZER text analyzer מחלץ אסימונים מטקסט באמצעות ביטוי רגולרי. המנוע והתחביר של הביטויים הרגולריים שמשמשים עם PATTERN_ANALYZER הם RE2. ‫PATTERN_ANALYZER tokenizes patterns in the following order:

  1. הפונקציה מוצאת את המחרוזת המשנית הראשונה שתואמת לתבנית (משמאל) במחרוזת. זהו טוקן שצריך לכלול בפלט.
  2. הפונקציה מסירה את כל מה שנמצא במחרוזת הקלט עד לסוף מחרוזת המשנה שנמצאה בשלב 1.
  3. התהליך חוזר על עצמו עד שהמחרוזת ריקה.

בטבלה הבאה מופיעות דוגמאות לחילוץ אסימוני PATTERN_ANALYZER:

דוגמת קוד הטקסט שהוזן טוקנים של פלט
ab ababab
  • ab
ab abacad
  • ab
[a-z]{2} abacad
  • ab
  • ac
  • מודעה
aaa aaaaa
  • aaa
[a-z]/ a/b/c/d/e
  • a/
  • b/
  • c/
  • d/
/[^/]+/ aa/bb/cc
  • /bb/
[0-9]+ abc
(?:/?)[a-z] /abc
  • /abc
(?:/)[a-z] /abc
  • /abc
(?:[0-9]abc){3}(?:[a-z]000){2} 7abc7abc7abcx000y000
  • 7abc7abc7abcx000y000
‪".+" ‫"cats" ו-"dogs"
  • ‫"cats" ו-"dogs"


שימו לב: השימוש בכמתחמים חמדנים + גורם להתאמה למחרוזת הארוכה ביותר האפשרית בטקסט, ולכן 'cats' ו-'dogs' מחולצים כאסימון בטקסט.
".+?" ‫"cats" ו-"dogs"
  • ‪"cats"
  • ‫"dogs"


שימו לב לשימוש בlazy quantifiers +?‎ שגורם להתאמה של הביטוי הרגולרי למחרוזת הקצרה ביותר האפשרית בטקסט, וכך המחרוזות 'cats' ו-'dogs' מחולצות כ-2 טוקנים נפרדים בטקסט.

שימוש בPATTERN_ANALYZER text analyzer מאפשר לכם לשלוט יותר בטוקנים שחולצו מטקסט כשמשתמשים בו עם הפונקציה SEARCH. בטבלה הבאה מוצגים דפוסים שונים ותוצאות שונות שמתקבלות מהם:SEARCH

דוגמת קוד שאילתה טקסט טוקנים מהטקסט SEARCH(text, query)‎ הסבר
abc abcdef abcghi
  • abcghi
TRUE ‫'abc' in ['abcghi']
cd[a-z] abcdef abcghi
  • abcghi
לא נכון ‫'cde' in ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
TRUE ‫'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
TRUE ‫'/bb/' in ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
שגיאה לא נמצאה התאמה למונח בשאילתה
[0-9]+ abc abc123 שגיאה לא נמצאה התאמה למונח בשאילתה
[0-9]+ ‫`abc` abc123 שגיאה לא נמצאה התאמה במונח השאילתה

ההתאמה של גרש הפוך היא כגרש הפוך, ולא כתו מיוחד.
[a-z][a-z0-9]*@google\.com כתובת האימייל שלי היא: test@google.com test@google.com
  • test@google.com
TRUE ‫'test@google.com' ב-'test@google.com'
abc abc\ abc abc
  • abc
TRUE ‫'abc' in ['abc']

שימו לב ש-'abc abc' היא שאילתת משנה יחידה(כלומר) אחרי שהיא עוברת ניתוח על ידי מנתח שאילתות החיפוש, כי הרווח מוחרג.
(?i)(?:Abc) (no normalization) aBcd Abc
  • Abc
לא נכון ‫'aBc' in ['Abc']
(?i)(?:Abc)

normalization:
lower_case = true
aBcd Abc
  • abc
TRUE 'abc' in ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
TRUE ‫'/abc' ב- ['/abc']
(?:/?)abc abc d/abc
  • /abc
לא נכון ‫'abc' ב- ['/abc']
‪".+" ‪"cats" ‫"cats" ו-"dogs"
  • ‫"cats" ו-"dogs"
לא נכון ‫'"cats"' in ['"cats" and "dogs"]

הערה: השימוש בכמתים חמדנים + גורם לביטוי הרגולרי להתאים למחרוזת הארוכה ביותר האפשרית בטקסט, ולכן המחרוזת '"cats" and "dogs"' מחולצת כטוקן בטקסט.
".+?" ‪"cats" ‫"cats" ו-"dogs"
  • ‪"cats"
  • ‫"dogs"
TRUE ‫'"cats"' ב- ['"cats"', '"dogs"]

שימו לב לשימוש בכמתים עצלים +? שגורם לביטוי הרגולרי להתאים למחרוזת הקצרה ביותר האפשרית בטקסט, וכך המילים '"cats"' ו-'"dogs"' מחולצות כ-2 טוקנים נפרדים בטקסט.

דוגמאות

בדוגמאות הבאות מוצג שימוש בניתוח טקסט עם אפשרויות התאמה אישית ליצירת אינדקסים של חיפוש, לחילוץ טוקנים ולהחזרת תוצאות חיפוש.

LOG_ANALYZER עם נירמול NFKC ICU ומילות עצירה

בדוגמה הבאה מוגדרות LOG_ANALYZER אפשרויות עם נורמליזציה של NFKC ICU ומילות עצירה. בדוגמה הזו, טבלת הנתונים הבאה כבר מאוכלסת בנתונים:

CREATE TABLE dataset.data_table(
  text_data STRING
);

כדי ליצור אינדקס חיפוש עם נורמליזציה של NFKC ICU ורשימה של מילות עצירה, יוצרים מחרוזת בפורמט JSON באפשרות analyzer_options של הצהרת CREATE SEARCH INDEX DDL. רשימת האפשרויות המלאה שזמינות כשיוצרים אינדקס חיפוש באמצעות LOG_ANALYZER מופיעה במאמר LOG_ANALYZER. בדוגמה הזו, מילות העצירה הן "the", "of", "and", "for".

CREATE OR REPLACE SEARCH INDEX `my_index` ON `dataset.data_table`(ALL COLUMNS) OPTIONS(
  analyzer='PATTERN_ANALYZER',
  analyzer_options= '''{
    "token_filters": [
      {
        "normalizer": {
          "mode": "ICU_NORMALIZE",
          "icu_normalize_mode": "NFKC",
          "icu_case_folding": true
        }
      },
      { "stop_words": ["the", "of", "and", "for"] }
    ]
  }''');

בהמשך לדוגמה הקודמת, בטבלה הבאה מתואר חילוץ הטוקן לערכים שונים של text_data. שימו לב שבמסמך הזה, סימן השאלה הכפול () מודגש בכתב נטוי כדי להבדיל בינו לבין שני סימני שאלה (??):

טקסט הנתונים טוקנים לאינדקס הסבר
The Quick Brown Fox ‪["quick", "brown", "fox"] תהליך יצירת הטוקנים של LOG_ANALYZER יוצר את הטוקנים [The, Quick, Brown, Fox].

לאחר מכן, נורמליזציה של ICU עם icu_case_folding = true אותיות קטנות באסימונים כדי ליצור את הרשימה ['the', 'quick', 'brown', 'fox']

לבסוף, המסנן של מילות עצירה מסיר את המילה 'the' מהרשימה.
The Ⓠuick Ⓑrown Ⓕox ‪["quick", "brown", "fox"] הטוקניזציה של LOG_ANALYZER יוצרת את הטוקנים ['The', 'Ⓠuick', 'Ⓑrown', 'Ⓕox'].

בשלב הבא, הנורמליזציה של NFKC ICU עם icu_case_folding = true אותיות קטנות של הטוקנים יוצרת את הרשימה ['the', 'quick', 'brown', 'fox']

לבסוף, המסנן של מילות העזר מסיר את המילה 'the' מהרשימה.
ⓆuickⒻox ‪["quick??fox"] הטוקניזציה של LOG_ANALYZER יוצרת את הטוקנים ['The', 'ⓆuickⒻox'].

בשלב הבא, מתבצעת נורמליזציה של NFKC ICU עם icu_case_folding = true אותיות קטנות בטוקנים כדי ליצור את הערך ['quick??fox']. שימו לב שסימן השאלה הכפול ב-Unicode עבר נורמליזציה ל-2 תווים של סימן שאלה ב-ASCII.

לבסוף, המסנן של מילות עצירה לא עושה כלום כי אף אחד מהטוקנים לא נמצא ברשימת המסננים.

אחרי שיוצרים את אינדקס החיפוש, אפשר להשתמש בפונקציה SEARCH כדי לחפש בטבלה באמצעות אותן הגדרות של כלי הניתוח שצוינו באינדקס החיפוש. הערה: אם הגדרות הניתוח בפונקציה SEARCH לא תואמות להגדרות של אינדקס החיפוש, לא ייעשה שימוש באינדקס החיפוש. משתמשים בשאילתה הבאה:

SELECT
  SEARCH(
  analyzer => 'LOG_ANALYZER',
  analyzer_options => '''{
    "token_filters": [
      {
        "normalizer": {
          "mode": "ICU_NORMALIZE",
          "icu_normalize_mode": "NFKC",
          "icu_case_folding": true
        }
      },
      {
        "stop_words": ["the", "of", "and", "for"]
      }
    ]
  }''')

מחליפים את מה שכתוב בשדות הבאים:

  • search_query: הטקסט שרוצים לחפש.

בטבלה הבאה מוצגות תוצאות שונות על סמך טקסט חיפוש שונה וערכים שונים של search_query:

text_data search_query תוצאה הסבר
The Quick Brown Fox "Ⓠuick" TRUE הרשימה הסופית של הטוקנים שחולצו מהטקסט היא ['quick', 'brown', 'fox'].
הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['מהר'].

אפשר למצוא את כל האסימונים של שאילתת הרשימה באסימוני הטקסט.
The Ⓠuick Ⓑrown Ⓕox "quick" TRUE הרשימה הסופית של הטוקנים שחולצו מהטקסט היא ['quick',‏ 'brown',‏ 'fox'].
הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['מהר'].

אפשר למצוא את כל האסימונים של שאילתת הרשימה באסימוני הטקסט.
ⓆuickⒻox "quick" FALSE הרשימה הסופית של הטוקנים שחולצו מהטקסט היא ['quick??fox'].

הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['מהיר'].

הערך 'quick' לא מופיע ברשימת האסימונים מהטקסט.
ⓆuickⒻox "quickfox" TRUE הרשימה הסופית של הטוקנים שחולצו מהטקסט היא ['quick??fox'].

הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['quick??fox'].

האסימון 'quick??fox' נמצא ברשימת האסימונים מהטקסט.
ⓆuickⒻox "`quickfox`" FALSE ב-LOG_ANALYZER, התו backtick דורש התאמה מדויקת של הטקסט.

PATTERN_ANALYZER לחיפוש IPv4 עם מילות עצירה

בדוגמה הבאה מוגדר PATTERN_ANALYZER מנתח הטקסט לחיפוש תבנית ספציפית תוך סינון מילות עצירה מסוימות. בדוגמה הזו, התבנית תואמת לכתובת IPv4 ומתעלמת מהערך של localhost ‏ (127.0.0.1).

בדוגמה הזו, ההנחה היא שהטבלה הבאה מאוכלסת בנתונים:

CREATE TABLE dataset.data_table(
  text_data STRING
);

כדי ליצור אינדקס חיפוש, האפשרות pattern ורשימה של מילות עצירה, יוצרים מחרוזת בפורמט JSON באפשרות analyzer_options של הצהרת CREATE SEARCH INDEX DDL. רשימת האפשרויות המלאה שזמינות כשיוצרים אינדקס חיפוש באמצעות PATTERN_ANALYZER מופיעה במאמר PATTERN_ANALYZER. בדוגמה הזו, מילות העצירה הן כתובת ה-localhost, 127.0.0.1.

CREATE SEARCH INDEX my_index
ON dataset.data_table(text_data)
OPTIONS (analyzer = 'PATTERN_ANALYZER', analyzer_options = '''{
  "patterns": [
    "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
  ],
  "token_filters": [
    {
      "stop_words": [
        "127.0.0.1"
      ]
    }
  ]
}'''
);

כשמשתמשים בביטויים רגולריים עם analyzer_options, צריך לכלול שלושה סמלי \ מובילים כדי לבצע escape לביטויים רגולריים שכוללים סמל \, כמו \d או \b.

בטבלה הבאה מתוארות אפשרויות הטוקניזציה לערכים שונים של text_data

טקסט הנתונים טוקנים לאינדקס הסבר
abc192.168.1.1def 172.217.20.142 ‪["192.168.1.1", "172.217.20.142"] הדפוסים של IPv4 מזהים את כתובות ה-IPv4 גם אם אין רווח בין הכתובת לטקסט.
104.24.12.10abc 127.0.0.1 ‪["104.24.12.10"] הכתובת '127.0.0.1' מסוננת כי היא מופיעה ברשימת מילות העצירה.

אחרי שיוצרים את אינדקס החיפוש, אפשר להשתמש בפונקציה SEARCH כדי לחפש בטבלה על סמך הטוקניזציה שצוינה ב-analyzer_options. משתמשים בשאילתה הבאה:

SELECT
  SEARCH(dataset.data_table.text_data
  "search_data",
  analyzer => 'PATTERN_ANALYZER',
  analyzer_options => '''{
    "patterns": [
      "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
      ],
    "token_filters": [
      {
        "stop_words": [
          "127.0.0.1"
        ]
      }
    ]
  }'''
);

מחליפים את מה שכתוב בשדות הבאים:

  • search_query: הטקסט שרוצים לחפש.

בטבלה הבאה מוצגות תוצאות שונות על סמך טקסט חיפוש שונה וערכים שונים של search_query:

text_data search_query תוצאה הסבר
128.0.0.2 ‪"127.0.0.1" שגיאה אין טוקן חיפוש בשאילתה.

השאילתה עוברת דרך כלי ניתוח הטקסט, שמסנן את הטוקן '127.0.0.1'.
abc192.168.1.1def 172.217.20.142 ‪"192.168.1.1abc" TRUE רשימת הטוקנים שחולצו מהשאילתה היא [‎"192.168.1.1"‎].

רשימת האסימונים שחולצו מהטקסט היא [‎"192.168.1.1", "172.217.20.142"]‎.
abc192.168.1.1def 172.217.20.142 ‪"`192.168.1.1`" TRUE רשימת הטוקנים שחולצו מהשאילתה היא [‎"192.168.1.1"‎].

רשימת האסימונים שחולצו מהטקסט היא [‎"192.168.1.1", "172.217.20.142"]‎.

הערה: התווים ` נחשבים לתווים רגילים ב-PATTERN_ANALYZER.

המאמרים הבאים