Tokenizer
ถึงเวลามาเข้าเรื่องกันแล้ว โดยเรื่องที่กล่าวไปข้างต้นเป็นการยกตัวอย่างการค้นหาโดยใช้ Tokenizer ชนิดหนึ่ง ซึ่งในโลกความจริงแล้ว ผลลัพธ์ที่เราเอาออกมา อาจจะไม่ต้องถูกที่สุด แต่ควรจะตรงกับความต้องการของผู้ใช้ที่สุด ในบล็อกนี้ผมก็เลยจะขอหยิบ Tokenizer บางตัวมาลองให้ดูนะครับ
keyword
สำหรับการ match data ตรงตัวกับ input ที่เข้าไปเลย
ตัวอย่าง Keyword Tokenizer
POST _analyze
{
"tokenizer": "keyword",
"text": "การที่มีเธอมันก็ดี"
}
ผลลัพธ์ (แบบย่อ)
["การที่มีเธอมันก็ดี"]
thai, icu_tokenizer
thai tokenizer และ icu tokenizer มีลักษณะการตัดคำที่ค่อนข้างจะคล้ายกัน แต่จะมีผลลัพธ์ที่ไม่เหมือนกันหลายจุด โดยส่วนมากจะนำไปใช้กับการค้นหา document เชิงบทความ หรือเกี่ยวเนื้อความ ที่มีคำที่มีความหมายอยู่เยอะๆ
ตัวอย่าง Thai Tokenizer
POST _analyze
{
"tokenizer": "thai",
"text": "การที่มีเธอมันก็ดี"
}
ผลลัพธ์ Thai Tokenizer (แบบย่อ)
["การ","ที่","มี","เธอ","มัน","ก็ดี"]
ตัวอย่าง ICU Tokenizer
POST _analyze
{
"tokenizer": "thai",
"text": "การที่มีเธอมันก็ดี"
}
ผลลัพธ์(แบบย่อ)
["การ","ที่","มี","เธอ","มัน","ก็","ดี"]
ngram
เป็นตัวตัดคำที่อยู่ในลักษณะที่ดึงตัวอักษรมาทำ Index เป็นชุดๆ ตัวอย่างเช่น…
quick -> [q, qu, ui, ic, ck, k]
จะเห็นว่าการตัดข้อความ เราจะไม่สนใจความหมายของ document ดังนั้น ลักษณะในการนำไปใช้ที่มีประโยชน์ที่สุด จะเป็นเบอร์โทรศัพท์ กับ ชื่อเป็นส่วนใหญ่
ตัวอย่าง ICU Tokenizer
POST _analyze
{
"tokenizer": "ngram",
"text": "การที่มีเธอมันก็ดี"
}
ผลลัพธ์(แบบย่อ)
["ก","กา","าร","รท","ที","-ี่","-่ม","มี","-ีเ","เธ","ธอ","อม","มั",
"-ัน","นก","ก็","-็ด","ดี","-ี"]
จากตัวอย่างข้างต้น ข้อความจะถูกหั่นเป็น 2 ตัวอักษร ซึ่งเอาจริงๆแล้วการค้นหาโดยใช้ ngram อาจจะได้ผลอยู่บ้าง แต่ว่าสิ่งที่เกิดคือ จะทำให้ได้ document (ขยะ) ที่ไม่เกี่ยวกับข้อความที่ user ต้องการ เนื่องจากการที่ match กับแต่ละตัวอักษรที่หั่นมาได้ในผลลัพธ์นั่นเอง
ดังนั้นถ้าหากลองเปลี่ยนมาใช้กับเบอร์โทรศัพท์ หรือชื่อบุคคล จะได้ผลลัพธ์ดังนี้
0912345678 => ["0","09","91","12","23","34","45","56","67","78","8"]
สมชาย สายชม => ["ส","สม","มช","ชา","าย","ย "," ส","สา","าย","ยช","ชม","ม"]
ลองคิดถึงเวลาที่เราหาเบอร์โทรศัพท์หรือชื่อใครสักคนใน social network ดูครับ เราพิมไปแค่ไม่กี่ตัวหรืออาจจะมีพิมพ์ผิดบ้าง แต่โปรแกรมก็หาให้เราเจอ ซึ่งการใช้ ngram ก็จะช่วยเรื่องนี้ได้เหมือนกัน
นอกจากนี้ก็ยังมี tokenizer ตัวอื่นๆอีกหลายตัว ตามรูปแบบการใช้งาน ซึ่งอาจจะใช้ควบคู่กับ ตัว filter ที่มีหน้าที่ process ผลลัพธ์หลังจากที่ผ่าน tokenizer มาอีกต่อนึงได้