Elasticsearch Lesson 3 : How to personalize search result

Elasticsearch Lesson 3 : How to personalize search result
17/05/19   |   7.8k

Personalized Search

Personalized Search[1] หรือ การค้นหาที่มีการปรับแต่งให้เหมาะสมสำหรับตัวบุคคล

ตัวอย่างที่พบเห็นกันเช่น web search ที่ได้จาก google[7] เมื่อ sign in กับไม่ sign in แล้ว ค้นหาด้วย keyword เดียวกัน เราจะได้ผลลัพธ์ที่แตกต่างกันออกไปครับ

อีกตัวอย่างนึง คนไทยใช้ facebook กันเยอะครับ เคยรู้สึกไหมครับ ว่า เวลาเรากด like โพสต์จากคน หรือ เพจหนึ่งบ่อยๆ เข้า เราเริ่มจะเห็น โพส เจ้าของโพสบ่อยมากยิ่งขึ้น มันดู personalize กับผู้ใช้งานนั้นมากเลย

รูปจาก https://www.iconvix.com/edgerank-algorithm/

EdgeRank[2,6] เป็นอัลกอริทึมแรกเริ่มของ facebook ในการจัดเรียงลำดับ โพสต์ต่างๆ ให้เราได้เห็นกัน โดยมีองค์หลักอยู่ 3 ส่วนด้วยกัน หลักๆ คือ

1. ระดับความสัมพันธ์กันของคุณกับ creator อื่นๆ (Affinity)

2. คุณภาพของโพสต์วัดจากปฏิสัมพันธ์ที่เกิดขึ้น เช่น comment ดีกว่า like (Weight)

3. ความใหม่ของโพสต์ (Decay)

จะเห็นได้ว่า

โพสต์ ที่มีคนสนใจเยอะ มักจะถูกเสนอขึ้นมาบ่อยๆ ถึงแม้ว่าจะเก่าแล้วก็ตาม

ที่มาของข้อมูลที่ใช้ในการปรับแต่งการค้นหาจะมีด้วยกัน 3 องค์ประกอบ[8] คือ

1. ประวัติการค้นหา การใช้งาน (Search/Surf History)

2. ข้อมูลตำแหน่งเชิงกายภาพ (Location)

3. ความเป็นตัวตน (Social)

ซึ่งการปรับแต่งให้เหมาะสมสำหรับตัวบุคคล วิธีทั่วไปสองวิธีที่สามารถทำได้คือ

ปรับแต่ง search query หรือ ทำ search ranking ครับ

ซึ่งถ้าหากต้องการ feature การค้นหาที่ personalize กับพฤติกรรมการใช้งานดังที่กล่าวมา เรามีท่าอย่างไรให้ลองใช้กันบ้าง บน elasticsearch มีดังนี้ครับ

ปรับแต่งการค้นหาโดยใช้ Function score query

function score[3] สามารถแก้ไข ปรับแต่งคะแนนความสำคัญของ document ที่ได้จากการค้นหาได้

โค้ด(dsl-json) ที่ใช้ในการ query ในตัวอย่างเอาได้จาก gist นี้น่ะครับ

query ข้างบนเป็นการค้นหาด้วยคำค้น "การ์ดแสดงผล" โดยที่หากพบคำว่า ASUS จะคูณคะแนนผลลัพธ์ที่ได้ 3 และหากพบคำว่า MSI จะคูณคะแนนผลลัพธ์ที่ได้ 5

ผลลัพธ์การค้นหาที่ได้

"_score": 12.945694, "name": "VGA (การ์ดแสดงผล) MSI GTX 1080 Ti ARMOR 11G OC"
"_score": 7.842023,  "name": "VGA (การ์ดแสดงผล) ASUS CERBERUS GTX1070TI A8G"
"_score": 2.5891387, "name": "VGA (การ์ดแสดงผล) INNO3D GTX 1070 Ti X2 V2 8GB (..."

เทียบกับผลลัพธ์จากการค้นหาด้วย "การ์ดแสดงผล" ที่ไม่มี function score

"_score": 2.6140077,  "name": "VGA (การ์ดแสดงผล) ASUS CERBERUS GTX1070TI A8G"
"_score": 2.5891387,  "name": "VGA (การ์ดแสดงผล) INNO3D GTX 1070 Ti X2 V2 8GB (..."
"_score": 2.5891387,  "name": "VGA (การ์ดแสดงผล) MSI GTX 1080 Ti ARMOR 11G OC"

ซึ่ง การปรุงแต่งผลลัพธ์การค้นหานี้ทำอยู่ภายใต้ สมมุติฐานที่ว่า

จำนวนสินค้าที่ผู้ใช้ซื้อภายใต้แบรนด์เดียวกัน

แปรผันตรงกับ ความสนใจสินค้าภายใต้แบรนด์นั้น

B2 : หรือพูดสั้นๆ ว่า ยิ่งซื้อของเค้าเยอะ เท่าไหร่ ก็ยิ่งมีโอกาสเลือกของยี่ห้อนั้นอีกมากเท่านั้นแหล่ะ

B1 : ขอบคุณนะ B2

ซึ่งในความเป็นจริง จะ

ตั้งสมมุติฐานตามพฤติกรรมของผู้ใช้ เพื่อตอบโจทย์ความต้องการ

น่ะครับ

B1 : แล้วถ้าจะทำระบบจริงๆ มันต้องทำไรเพิ่มเติมบ้างอ่ะ

Practical Use

ในหัวข้อที่แล้ว เราพูดถึงการใช้ elasticsearch ในการปรับแต่งการค้นหาด้วย function score query ภายใต้สมมุติฐานหนึ่งๆ ในหัวข้อนี้ จะเป็นตัวอย่างการออกแบบระบบที่มี feature การปรับแต่งผลการค้นหา

ซึ่งขอยกตัวอย่าง ระบบ เป็น web e-commerce ที่มีการขายสินค้าที่ สินค้ามีแบรนด์ต่างๆ ระบุอยู่ ส่วนที่ต้องเพิ่มเติมเข้าไปจะเป็นการจัดเก็บข้อมูลบันทึกที่ผู้ใช้งาน(User) ดูข้อมูล กดชื่นชอบ ซื้อ หรือให้ความเห็นเกี่ยวกับสินค้า ดังรูป จะเกิดขึ้นที่ use case ชื่อ Update Transaction History

use case diagram ของ ระบบ web e-commerce ตัวอย่าง

และเมื่อผู้ใช้ทำการค้นหาอีกครั้ง การค้นหาจะถูกปรับแต่งโดยใช้ข้อมูลบันทึกที่ผู้ใช้คนนั้นกระทำมาก่อนเข้าไปด้วย  โดยเกิดขึ้นที่ use case ชื่อ Get Individual Transaction History ทำให้ผลลัพธ์ออกมาเฉพาะกับตัวบุคคลมากยิ่งขึ้น

B1 : แล้วอย่างนี้ค่า weight ที่ได้มันคิดมาได้ไง จากการบันทึกการค้นหา

ค่า weight แสดงถึง การให้ความสำคัญของแบรนด์นั้นๆ โดยที่หาก weight มากกว่าแสดงว่าผู้ใช้สนใจแบรนด์นั้นมากกว่า วิธีหนึ่งสามารถคำนวณได้จาก multivariate linear polynomial[5] โดยที่ แต่ละตัวแปรเป็น จำนวนครั้งของการกระทำแบบหนึ่งของผู้ใช้กับสินค้าแบรนด์นั้น

B1 : เฮือก "มัลไทแวรู่ ลิเนี่ย โพลิโนเมียล"

B2 : พหุนามดีกรีหนึ่งหลายตัวแปรน่ะ มันอ่านว่า "มัลไทแวเรียท" น่ะ

ซึ่งสัมประสิทธิ์เป็น bias สำหรับบอกว่า การกระทำไหนสำคัญกว่ากัน เช่น การซื้อสำคัญกว่า การดูข้อมูล เราก็กำหนดให้ สัมประสิทธิ์ของ ตัวแปรที่แทนจำนวนครั้งการซื้อสินค้าแบรนด์นั้น มากกว่าการกดดูข้อมูล ได้

B2 : Weight( View, Purc, Fav, Comt) = ( 1 + ( View + 2*Purc + Fav + Comt) ) / Total

       งี้ก็ได้

B1 : พอเข้าใจ (ว่าแต่ทำไมมันต้องหาร Total ด้วยนะ)

นอกจากนี้ การปรับแต่งดังที่กล่าวมาสามารถเพิ่มความสามารถได้โดย ใช้พฤติกรรมการซื้อของ ผู้ใช้งานคนอื่นๆ มาช่วยปรับแต่งผลการค้นหาของเราได้ หรือเรียกว่า

ปรับแต่งโดยใช้พฤติกรรมที่คล้ายคลึงกับเรา มานำเสนอเรา

ด้วยวิธีการ Collaborative Filtering[4,8,9] ได้อีกด้วย แต่ขอยังไม่กล่าวถึงรายละเอียด ณ ที่นี้ครับ

B2 : ถ้าไม่เคยทำ Personalized Search มาก่อน ก็อย่าเพิ่งข้ามไปท่ายากเลย ใช้แค่ พหุนามก่อนก็ได้

เพื่อนๆ อย่าลืมว่า นอกจากประวัติการใช้งานแล้ว ยังมีอีก หลายแหล่งข้อมูลที่ใช้ในการปรับแต่งการค้นหาได้ด้วย เช่น ข้อมูลตำแหน่งเชิงกายภาพ หรือ ความเป็นตัวตนของผู้ใช้งานด้วย

สรุปให้สั้นๆ บน elasticsearch มีท่า function score query ที่ใช้ในการปรับแต่งผลการค้นหา ให้ตรงกับตัวบุคคลของผู้ใช้งานได้ ภายใต้สมมุติฐานหนึ่งๆ โดยการตั้งสมมุติฐานควรจะตั้งให้สอดคล้องกับพฤติกรรมของผู้ใช้ เพื่อตอบโจทย์ความต้องการให้ได้มากที่สุดครับ

ทีนี้ก็หวังว่า

ถ้ารู้ว่าผู้ใช้ชอบอะไร แล้วต้องปรับผลการค้นหาให้ตอบโจทย์ได้แล้วน่ะ ;}

ในบทความถัดไปจะเป็น ตอนที่ 2 ของการปรับแต่งผลการค้นหา ด้วย search ranking โดยใช้ elasticsearch

ถ้ามีความคิดเห็น หรือข้อสงสัย อยากจะแชร์ก็ comment ด้านล่างนี้ได้เลยครับ

อ้างอิง

[1] https://en.wikipedia.org/wiki/Personalized_search

[2] http://edgerank.net/#Why-should-I-care-about-EdgeRank

[3] https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-function-score-query.html

[4] https://tupleblog.github.io/spotify/

[5] http://www.mathamazement.com/Lessons/Pre-Calculus/00_Prerequisites/polynomials.html

[6] https://www.iconvix.com/edgerank-algorithm/

[7] https://www.youtube.com/watch?v=EKuG2M6R4VM

[8] https://medium.com/@thanachart.rit/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-recommendation-engine-collaborative-filtering-%E0%B9%82%E0%B8%94%E0%B8%A2-python-e81fbb774fc1

[9] https://developers.ascendcorp.com/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-recommendation-engine-%E0%B8%88%E0%B8%B2%E0%B8%81-collaborative-filtering-3d1d68849102

[10] https://gist.github.com/GarKoZ/cb4427c8b132947c406ad3394864b7c2

บทเรียนก่อนๆ

tags : personalize personalized search elasticsearch search engine collaborative filtering function score function score query



ติดตามข่าวสารและเรื่องราวดีๆ ทาง Email