TF-IDF คำไหนสำคัญนะ?

lukkiddd
lukkiddd
Published in
3 min readNov 29, 2017

คำเตือน บทความนี้ อาจจะยาวนิดนึง รวมถึงมี ภาพ และ ข้อความจำนวนมาก ค่อย ๆ อ่าน ระวังตาลายนะครับ :D หายใจเข้าลึก ๆ ถ้าพร้อมแล้ว มาเริ่มกันเลยครับ

เริ่มได้!!

TF-IDF หรือ Term Frequency-Inverse Document Frequency — เป็นหนึ่งในวิธีหา “คำ(term)” ที่สำคัญ ใน “เอกสาร(document)” โดยดูจากเนื้อหาของเอกสารทั้งหมด มักจะใช้ในงานพวก Information-retrieval หรือ Text mining

TF-IDF เกิดจากผลคูณของสองค่า คือ TF(Term Frequency) กับ IDF(Inverse Document Frequency)

Term ในที่นี้ ผมจะกำหนดให้เป็น “คำ” นะครับ แต่จริง ๆ แล้ว มันไม่ใช่

Term Frequency

หรือ ความถี่ของ คำ(term) และเนื่องจากว่าแต่ละ เอกสาร(document) อาจจะมีความยาวที่แตกต่างกัน ดังนั้นการคำนวณ Term Frequency จึงมักจะหารด้วยความยาวของ document (จำนวนคำทั้งหมดใน document นั้น)

วิธีการคำนวณ Term Frequency มีหลายวิธี เช่น

  • Raw counts
  • Log normalization
  • Double normalization

Raw counts

แบบง่าย ๆ เลยก็คือนับจำนวน คำ(term) ที่มีใน เอกสาร(document) นั้น ๆ เช่น

function นับ term ใน document

เมื่อนับ คำ(term) ใน เอกสารที่ 1 (document 1) จะได้

ตัวอย่างนับ term ใน document

Term Frequency

หลังจากนั้นนำค่าที่ได้แต่ละคำ ไปหารกับจำนวนคำทั้งหมดใน document ในตัวอย่างมีทั้งหมด 8 คำ

function สำหรับคำนวณ term-frequency

จะได้ว่า

ตัวอย่างคำนวณ term frequency แบบ raw counts

เราก็จะได้ค่า Term Frequency ของแต่ละคำ(term)มาแล้ว และนี่คือวิธีการที่ง่ายที่สุดในการหาค่า Term Frequency ครับ

Log Normalization

อีกรูปแบบนึงในการหาค่า Term Frequency คือการหาค่าความถี่แบบ log scaled

เหมาะสำหรับข้อมูลที่จำนวนความถี่ของคำมีช่วงต่างกันมากๆ เช่น มีคำนึงมีความถี่แค่ 1 แต่อีกคำมีความถี่เป็น 1000

Log Normalization จะมาช่วย normalized ค่าไม่ให้แตกต่างกันเกินไป

function สำหรับคำนวณ term frequency แบบ log normalization
กำหนดให้ logTF = logNormalization
ตัวอย่างคำนวณ term frequency แบบ log normalization

หมายเหตุ: เมื่อ f(term, document) = 0, logNormalization จะเป็น 0

Double Normalization

เหมาะสำหรับข้อมูลที่มีความยาวของ เอกสาร (document) ไม่เท่ากัน หรือต่างกันมาก เช่น
document a มีแค่ 10 คำ แต่ document b มี 1000 คำ

Double Normalization จะมาช่วยป้องกันไม่ให้เกิด bias เนื่องจากความยาวของ เอกสาร (document) มันมีผลต่อการคำนวณ

function สำหรับคำนวณ term frequency แบบ double normalization
กำหนดให้ dn = doubleNormalization
ตัวอย่างคำนวณ term frequency แบบ double normalization

Inverse Document Frequency

ใช้สำหรับวัดความสำคัญของ คำ(term) ใน เอกสาร(document) ทั้งหมด หมายถึง ถ้า คำ (term) เจอในหลาย เอกสาร (document) มันย่อมมีความสำคัญลดลง เช่น

จะเห็นว่า document1 กับ document2 มีคำที่เหมือนกันคือ

และมีคำที่ไม่เหมือนกันคือ

ดังนั้นจะเห็นว่า คำ(term) ที่แตกต่างกันจะมีความสำคัญมากกว่า เพราะเป็นคำที่ใช้บอกว่า เอกสาร(document) นี้มีข้อมูลเรื่องอะไร

และอีกเช่นกัน Inverse Document Frequency ก็มีวิธีคิดหลายวิธี เช่นกัน แต่เราจะพูดถึงแค่แบบธรรมดาก่อน ในบทความนี้นะครับ :D

  • แบบธรรมดา
  • แบบ smooth
  • แบบ max
  • แบบ probabilistic

แบบธรรมดา

N       คือ จำนวน document ทั้งหมด
df(t) คือ จำนวน document ที่มี term t

ดังนั้นถ้าคำนวนจากตัวอย่าง จะได้

ตัวอย่างคำนวณ inverse document frequency สำหรับ document1

TF-IDF

พอมาถึงตรงนี้แล้วสิ่งที่เราต้องทำก็คือ เอาผลของ Term Frequency และ Inverse Document Frequency มา คูณ กัน เท่านี้เราก็จะได้ tf-idf weight ของ คำ(term) นั้น ๆ แล้ว

ถ้า weight ของ tf-idf เยอะ เกิดจาก คำ(term) มีความถี่ใน เอกสาร(document) ที่ใช้คำนวนสูง แต่มีความถี่ต่ำใน เอกสาร(document) อื่น ๆ ใน collection ทั้งหมด

tf-idf weight จะช่วยทำการกรอง คำ(term) ที่มีความ common ออกไป ทำให้เรารู้ว่า เอกสาร(document) แต่ละอัน มันเป็นเรื่องอะไร

ส่งท้าย

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

https://www.facebook.com/groups/408004796247683/

--

--