Gensim - การสร้างเมทริกซ์ TF-IDF

ที่นี่เราจะเรียนรู้เกี่ยวกับการสร้างเมทริกซ์ความถี่ - ผกผันความถี่เอกสาร (TF-IDF) ด้วยความช่วยเหลือของ Gensim

TF-IDF คืออะไร?

เป็นรุ่น Term Frequency-Inverse Document Frequency ซึ่งเป็นรุ่น bag-of-word มันแตกต่างจากคลังข้อมูลทั่วไปเพราะมันให้น้ำหนักโทเค็นเช่นคำที่ปรากฏในเอกสารบ่อยๆ ในระหว่างการเริ่มต้นอัลกอริทึมแบบจำลอง tf-idf นี้คาดว่าคลังข้อมูลการฝึกอบรมจะมีค่าจำนวนเต็ม (เช่นแบบจำลอง Bag-of-Words)

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

มันคำนวณอย่างไร?

โมเดล TF-IDF คำนวณ tfidf ด้วยความช่วยเหลือของสองขั้นตอนง่ายๆดังต่อไปนี้ -

ขั้นตอนที่ 1: การคูณองค์ประกอบภายในและส่วนกลาง

ในขั้นตอนแรกนี้แบบจำลองจะคูณส่วนประกอบท้องถิ่นเช่น TF (Term Frequency) ด้วยส่วนประกอบส่วนกลางเช่น IDF (Inverse Document Frequency)

ขั้นตอนที่ 2: ทำให้ผลลัพธ์เป็นปกติ

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

จากผลของสองขั้นตอนข้างต้นนี้คำที่เกิดขึ้นบ่อยครั้งในเอกสารจะทำให้น้ำหนักลดลง

วิธีการรับน้ำหนัก TF-IDF

ในที่นี้เราจะนำตัวอย่างไปใช้เพื่อดูว่าเราจะรับน้ำหนัก TF-IDF ได้อย่างไร โดยพื้นฐานแล้วในการรับน้ำหนัก TF-IDF อันดับแรกเราต้องฝึกคอร์ปัสจากนั้นจึงใช้คอร์ปัสนั้นภายในแบบจำลอง tfidf

ฝึก Corpus

ดังที่กล่าวไว้ข้างต้นเพื่อให้ได้ TF-IDF เราต้องฝึกคลังข้อมูลของเราก่อน ขั้นแรกเราต้องนำเข้าแพ็คเกจที่จำเป็นทั้งหมดดังนี้ -

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

ตอนนี้ให้รายการที่มีประโยค เรามีสามประโยคในรายการของเรา -

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

จากนั้นทำโทเค็นของประโยคดังนี้ -

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

สร้างวัตถุของ corpora.Dictionary() ดังต่อไปนี้ -

dictionary = corpora.Dictionary()

ตอนนี้ส่งประโยคโทเค็นเหล่านี้ไปที่ dictionary.doc2bow() วัตถุดังต่อไปนี้ -

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

ต่อไปเราจะได้รับรหัสคำและความถี่ในเอกสารของเรา

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

เอาต์พุต

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

ด้วยวิธีนี้เราได้ฝึกฝนคลังข้อมูลของเรา (คลังข้อมูลกระเป๋าของ Word)

ต่อไปเราต้องใช้คลังข้อมูลที่ได้รับการฝึกฝนนี้ภายในแบบจำลอง tfidf models.TfidfModel().

นำเข้าแพ็กเกจ numpay ก่อน -

import numpy as np

ตอนนี้ใช้คลังข้อมูลที่ได้รับการฝึกฝนของเรา (BoW_corpus) ภายในวงเล็บเหลี่ยมของ models.TfidfModel()

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

ต่อไปเราจะได้รับรหัสคำและความถี่ในคลังข้อมูลแบบจำลอง tfidf ของเรา -

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

เอาต์พุต

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

จากผลลัพธ์ข้างต้นเราจะเห็นความแตกต่างของความถี่ของคำในเอกสารของเรา

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

น้ำหนักของคำต่างกัน

ตามที่กล่าวไว้ข้างต้นคำที่จะเกิดขึ้นบ่อยขึ้นในเอกสารจะมีน้ำหนักน้อยลง มาทำความเข้าใจความแตกต่างของน้ำหนักของคำจากสองผลลัพธ์ข้างต้น คำ‘are’เกิดขึ้นในเอกสารสองชุดและถูกลดน้ำหนักลง ในทำนองเดียวกันคำว่า‘you’ ปรากฏในเอกสารทั้งหมดและถูกลบออกทั้งหมด