วันศุกร์ที่ 12 มิถุนายน พ.ศ. 2552

weight = tf * idf

ตอนแรกตั้งใจอย่างมากมายว่าจะเขียนเรื่องสรุปเกี่ยวกับ Information Retrieval (IR) ทั้งหมดนะคะ แต่ช่วงนี้กำลังมึนๆ เลยขอติดไว้ก่อนนะคะ blogนี้จะเขียนคำถามที่มักพบบ่อยมากๆเวลาคนมาถามเรื่องเกี่ยวกับ IR นะคะ นั่นคือ weight ของคำคำนวณได้อย่างไร และ อะไรคือ tf , idf

จากการที่ IR ใช้ weight เพื่อบอกความสำคัญของ term ที่ใช้เป็น index ในการบ่งชี้ถึง document นะคะ (คนที่ไม่มีพื้น IR อาจจะ งง กันเล็กน้อยนะคะ)
โดย weight หรือ ค่าน้ำหนักของ index นะคะ ซึ่ง make sense ว่า index ใดที่มีน้ำหนักมาก ก็จะมีความสำคัญ และมีความสามารถในการบ่งชี้ถึง document สูง และในทางกลับกัน index ที่มีค่าน้ำหนักน้อย ก็จะมีความสามารถในการบ่งชี้ถึง document ต่ำ ซึ่งโดย ทั่วไปสูตรที่ใช้คำนวณ weight ใน IR คือ
Weight = tf * idf
ซึ่ง ค่า tf หรือ term frequency ชื่อก็บอกอยู่แล้วนะคะ มันก็คือ ความถี่ของ term โดยเราจะนับความถี่ใน 1 document เท่านั้น

ส่วน idf หรือ inverse document frequency เป็นค่าที่ใช้บ่งบอกความสำคัญของ term ที่เทียบกับ ทุกๆ document ที่เก็บอยู่ในฐานข้อมูล

idf = log N/n

N คือ จำนวณ document ทั้งหมดที่เก็บอยู่ในฐานข้อมูล
n คือ จำนวณ document ที่ term ปรากฎ (term ในที่นี้คือ คำที่เราต้องการจะหาค่าน้ำหนักของมันนะคะ)

Note: มี trick ให้คิดเล็กน้อยเกี่ยวกับ การคำนวณค่า weight นะคะ
จากที่เราบอกไปแล้วว่า weight ที่มีค่าสูง จะมีความสามารถในการบ่งชี้เอกสารมาก และสูตรของการคำนวณ weight = tf * idf ซึ่งเป็นการ คูณ นั่นหมายความว่า ถ้า index ใดมี tf มาก ก็แสดงว่ามีค่า weight มาก และมีความสามารถในการบ่งชี้สูงด้วย
จากประเด็นนี้จะขัดแย้งกับความเข้าใจว่า การที่มีความถี่เยอะๆ จะสามารถ specific ถึงเอกสารได้ยังไง ต้องยิ่งมีความถี่น้อยๆสิ ถึงจะบ่งชี้ไปยังเอกสารได้อย่างดีเยี่ยม
จากกรณีนี้เราจึงจำเป็นต้องใช้ค่า idf เพื่อถ่วงน้ำหนักของคำ ให้มีความ balance มากขึ้น เนื่องจาก idf จะเป็นตัวบ่งบอกว่า index มีความสำคัญต่อทั้งฐานข้อมูลแค่ไหน
โดย ที่มา ของ idf นั้น เกิดจากการหาความถี่ของ index ที่ปรากฎในฐานข้อมูลทั้งหมดก่อน แล้วมาทำการ inverse โดยใช้ log ซึ่งมีจุดประสงค์ในการกลับค่าจากน้อยให้เป็นมาก (ถึงตรงนี้ หลายคนอาจจะงงนะคะว่าค่าไหนน้อย ค่าไหนมาก) จะยกตัวอย่างง่ายๆให้ดูนะคะ
ตัวอย่างเช่น เราให้ฐานข้อมูลมีเอกสารทั้งสิ้น 10 เอกสาร นั่นคือ N = 10
กรณีแรก ให้ n =5 จะได้ค่า idf = log N/n
= log 10/5
= log 2
= 0.3010
กรณีสอง ให้ n=2 จะได้ค่า idf = log N/n
= log 10/2
= log 5
= 0.6989

อย่าลืมนะคะ ว่า n ในที่นี้คือ จำนวณเอกสารที่ index ของเราปรากฎ นั่นหมายความว่า
"n ยิ่งน้อย จะต้องมีความสามารถในการบ่งชี้สูง"
ซึ่งจากตัวอย่างก็ชัดเจนอยู่แล้วว่า log จะช่วยให้ค่าน้ำหนักเป็นไปตามที่เราต้องการ นั่นคือ เราอยากให้ index ที่ปรากฎอยู่เพียงแค่ 2 เอกสาร มีค่า น้ำหนักมากกว่า index ที่ปรากฎอยู่ทั้ง 5 เอกสาร ถ้าเราเอา ตัวเลข 2 กับ 5 นี้ไปคูณเลยโดยไม่ได้ทำการใส่ log ก่อน ก็จะทำให้ผลลัพธ์ที่ได้นั้นออกมาผิดกับความจริงที่ว่า ยิ่งปรากฎน้อยเอกสาร ยิ่งต้องเป็น index ที่ดี
สุดท้ายนี้ เนื่องจาก blog นี้เป็น blog แรกในการฝึกเขียน blog ความรู้นะคะ ถ้าผิดพลาดประการใด ก็ขอให้เพื่อนๆ ช่วย comment ทิ้งไว้ และจะรีบมาแก้ไขนะคะ ส่วนผู้ใดที่เข้ามาอ่านแล้วไม่เข้าใจอยากถามก็ถามทิ้งไว้ได้จะเข้ามาตอบค่ะ

7 ความคิดเห็น:

  1. ดีแล้วครับที่เริ่มเขียนแล้ว

    มีคำถามครับ ที่คุณบอกว่า "จากประเด็นนี้จะขัดแย้งกับความ เข้าใจว่า การที่มีความถี่เยอะๆ จะสามารถ specific ถึงเอกสารได้ยังไง ต้องยิ่งมีความถี่น้อยๆสิ ถึงจะบ่งชี้ไปยังเอกสารได้อย่างดีเยี่ยม" อันนี้ผมไม่ได้
    เข้าใจอย่างนี้นะครับ จากที่ผมเข้าใจคือ ถ้าเอกสารมีคำที่เป็นคีย์นี้อยู่เยอะ ก็น่าจะหมายถึงเอกสารที่เราต้องการไม่ใช่หรือครับ เช่นถ้าผมจะค้นหาเอกสารเกี่ยวกับ "เชียงใหม่" ถ้าเอกสารใดมีคำว่าเชียงใหม่ปรากฏอยู่เยอะ ๆ ก็น่าจะเป็นเอกสารเกี่ยวข้องกับเรื่องที่ผมต้องการค้นไม่ใช่หรือครับ

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

    ตอบลบ
  2. รับทราบข้อแนะนำค่ะอาจารย์ จะพยายามเขียนให้ดีขึ้นนะคะ
    ส่วนข้อที่อาจารย์สงสัย หนูต้องการสื่อถึง จำนวณความถี่ในการปรากฎในฐานข้อมูล หรือ df (document frequency) เช่น คำว่า เชียงใหม่ ถ้าปรากฎอยู่สัก 100 เอกสาร มันก็จะมีลักษณะความเป็นคีย์เวิร์ดน้อย เนื่องจากไม่สามารถ specific ถึงเอกสารได้
    ส่วนที่อาจารย์อธิบายนั้นเป็นคุณสมบัติ ของ tf ค่ะ หรือ ความถี่ใน 1 เอกสาร
    tf และ df ต่างกันตรงที่ tf ต้องการค่าเยอะๆ เพื่อใช้ในการบ่งชี้ ส่วน df ต้องการให้เป็นค่าน้อยๆ เพื่อใช้ในการบ่งชี้เหมือนกัน
    จากการที่ df ต้องการให้เป็นค่าน้อยนั้น การคำนวณหา weight จึงใช้ค่า inverse document frequency (idf) หรือ inverse จำนวณของ df จากค่าน้อยให้เป็นค่ามากนั่นเอง
    อย่างในตัวอย่าง ถ้า keyword ปรากฎใน 2 เอกสารจะมีค่าที่ใช้ในการคำนวณ weight มากกว่า keyword ที่ปรากฎอยู่ 5 เอกสารค่ะ
    หนูอาจจะอธิบายสั้นไปทำให้เข้าใจผิดได้ จะแก้ไขนะคะ

    ตอบลบ
  3. เข้าใจมากขึ้นเลยครับพี่ออย

    ตอบลบ
  4. เข้าใจละครับ แต่ผมอยากจะชี้ให้เห็นถึงจุดในการเขียนของคุณที่จะทำให้เกิดการเข้าใจผิดนะครับ สังเกตุไหมครับว่าในบทความคุณไม่มีพูดถึง df เลย แต่พูดถึง tf มาตลอด แต่จู่ ๆ คุณก็มาสรุปแบบนั้น อย่างนี้ถ้าเขียนไปให้คนอ่านโดยไม่มีโอกาสมาซักถามคุณอย่างนี้ ก็จะเกิดความเข้าใจผิดได้นะครับ

    ตอบลบ
  5. ขอบคุณค่ะอาจารย์ จะเขียนอธิบายตรง df เพิ่มเข้าไปค่ะ

    ตอบลบ
  6. ชื่นชมผู้เขียนค่ะ เขียนได้กระชับ อ่านเข้าใจง่ายมากค่ะ ขอบคุณมากต่ะ

    ตอบลบ