TF-IDF ประตูสู่การทำ Text Analysis ด้วย Machine Learning
เอาล่ะ เรามาลองเริ่มคิดจากพื้นฐานนะครับว่า สิ่งที่เราต้องการทำคืออะไร
ขอยกตัวอย่างโจทย์ในลักษณะของการทำ Classification ในมุมของการทำ feature extraction เราก็อยากได้ feature ที่สามารถใช้แยกความแตกต่างของแต่ละ document ได้ดีที่สุด
ทีนี้ ปัญหาคือ ถ้าเราใช้วิธีการนับคำที่มีอยู่ในแต่ละ document ตรง ๆ แล้วเอาแต่ละคำมาตั้งเป็น feature เราก็คงจะได้ feature ที่ไม่ได้มีความสามารถในการแยกความแตกต่างได้ดีซักเท่าไหร่ เพราะเราให้น้ำหนักกับทุกคำเท่ากันยังไงละครับ
ความจริงคือ เราอยากให้น้ำหนักคำที่แสดงให้เห็นถึงความแตกต่างของแต่ละ document มากกว่า แทนที่จะไปให้น้ำหนักกับคำที่พบได้ทั่วไปในทุก document อย่างเช่น เป็น, อยู่, คือ (ถ้าวัดกันที่ความถี่ คำพวกนี้จะมีจำนวนมากซะด้วย)
TF-IDF จึงเกิดขึ้นมา เพื่อทำการปิด gap ตรงนี้นี่แหละครับ โดยแทนที่จะนับแค่ความถี่ของคำที่ปรากฎในแต่ละ document เรายังนับจำนวน document ที่มีคำนั้น ๆ ปรากฎอยู่ด้วย โดยหลักการง่าย ๆ ก็คือว่า คำที่ปรากฎแค่ในบาง document น่าจะเป็น feature ที่ใช้แยกความแตกต่างได้ดี ส่วนคำที่ปรากฎในเกือบทุก document ก็คงเป็น feature ที่ไม่น่าสนใจซักเท่าไหร่
สำหรับในรายละเอียดนั้น TF-IDF ประกอบด้วยสองส่วน คือ
Term Frequency (TF) – ความถี่ของคำ ๆ หนึ่งที่ปรากฎใน document นั้น ๆ
Inverse Document Frequency (IDF) – ส่วนกลับของจำนวน document ที่มีคำนั้น ๆ ปรากฎอยู่
ยิ่งคำ ๆ นั้น เป็นคำทั่วไปซึ่งปรากฎอยู่ในหลาย document ค่า IDF นี้ก็ยิ่งมีค่าน้อยลง (เข้าใกล้ 0) ซึ่งก็จะเป็นการลดน้ำหนักของคำ ๆ นั้นนั่นเองครับ
เมื่อนำทั้งสองส่วนมาคูณกัน ก็จะได้เป็นค่า TF-IDF ของคำหนึ่งที่ปรากฎใน document ครับ
ยกตัวอย่างเช่น เรามีข้อมูลอยู่ทั้งหมด 100 document โดยมี 2 document ที่เราหยิบมาเป็นตัวอย่าง Document 1 มีความยาว 70 คำ, Document 2 มีความยาว 80 คำ เราลองมาดูกันครับว่า เมื่อเราลองหยิบ 3 คำที่ปรากฎใน document เหล่านี้ ซึ่งมีจำนวนครั้งที่ปรากฎในแต่ละ document และจำนวน document ที่มีคำ ๆ นั้นอยู่ตามตารางด้านล่างมาคำนวณค่า TF-IDF ผลที่ได้จะเป็นอย่างไร
Word | จำนวนครั้งที่ปรากฎใน Document 1 | จำนวนครั้งที่ปรากฎใน Document 2 | จำนวน document ที่มีคำนั้นอยู่ |
High | 15 | 5 | 80 |
Screw | 4 | 1 | 10 |
Blade | 1 | 5 | 12 |
ค่า TF ของแต่ละคำใน Document 1 ก็จะคำนวณได้ตามนี้
TF(High) = 15/70 = 0.214
TF(Screw) = 4/70 = 0.057
TF(Blade) = 1/70 = 0.014
ส่วนค่า TF ของแต่ละคำใน Document 2 ก็จะเป็นตามนี้
TF(High) = 5/80 = 0.063
TF(Screw) = 1/80 = 0.013
TF(Blade) = 5/80 = 0.063
สำหรับ IDF ของคำ ๆ หนึ่ง จะมีค่าเท่าเดิมไม่ว่าสำหรับ document ไหนอยู่แล้วครับ
IDF(High) = ln(100/80) = 0.223
IDF(Screw) = ln(100/10) = 2.303
IDF(Blade) = ln(100/12) = 2.120
ทำให้ได้ค่า TF-IDF ของแต่ละคำบนแต่ละ document เป็นแบบนี้ครับ
High | Screw | Blade | |
TF-IDF ใน Document 1 | 0.048 | 0.132 | 0.030 |
TF-IDF ใน Document 2 | 0.014 | 0.029 | 0.133 |
จะเห็นได้ว่า ถึงจำนวนคำว่า High ในทั้งสอง Document จะต่างกันมาก แต่เพราะคำว่า High ปรากฎอยู่ถึงใน 80 จาก 100 document จึงแสดงว่า High เป็นคำที่ค่อนข้าง common และไม่น่าเป็น feature ที่ใช้ในการแยกความแตกต่างที่ดี TF-IDF ที่ได้จะเห็นว่ามีค่าต่างกันเพียง 0.034 เมื่อเทียบกับอีกสองคำซึ่งปรากฎอยู่ในไม่กี่ document และค่า TF-IDF ต่างกันประมาณ 0.1 ถึงแม้จำนวนครั้งที่ปรากฎในแต่ละ document จะแตกต่างกันไม่มากก็ตาม ซึ่งแสดงว่า คำว่า Screw และ Blade ก็น่าจะเป็น feature ที่ดีในการเอาไปใช้งานเพื่อแยกความแตกต่างของแต่ละ document ต่อไปครับ
เท่านี้เราก็ได้ meaningful feature ที่พร้อมจะนำไปทำ Machine Learning Model ต่อได้แล้วครับ แล้วในโอกาสหน้า เรามาดูกันต่อว่ามีเครื่องมืออะไรบ้าง ที่สามารถนำมาใช้ในการทำงานจริงได้ครับ