Gensim - Tạo ma trận TF-IDF

Ở đây, chúng ta sẽ tìm hiểu về cách tạo Ma trận Tần suất Tài liệu Nghịch đảo Thuật ngữ (TF-IDF) với sự trợ giúp của Gensim.

TF-IDF là gì?

Đó là mô hình Tần suất tài liệu nghịch đảo thuật ngữ, cũng là mô hình nhiều từ. Nó khác với kho ngữ liệu thông thường vì nó giảm trọng lượng của các mã thông báo tức là các từ xuất hiện thường xuyên trên các tài liệu. Trong quá trình khởi tạo, thuật toán mô hình tf-idf này mong đợi một kho dữ liệu huấn luyện có các giá trị nguyên (chẳng hạn như mô hình Bag-of-Words).

Sau đó tại thời điểm chuyển đổi, nó nhận một biểu diễn vectơ và trả về một biểu diễn vectơ khác. Vectơ đầu ra sẽ có cùng chiều nhưng giá trị của các đặc trưng hiếm (tại thời điểm đào tạo) sẽ được tăng lên. Về cơ bản, nó chuyển đổi các vectơ có giá trị nguyên thành các vectơ có giá trị thực.

Nó được tính như thế nào?

Mô hình TF-IDF tính toán tfidf với sự trợ giúp của hai bước đơn giản sau:

Bước 1: Nhân thành phần cục bộ và toàn cầu

Trong bước đầu tiên này, mô hình sẽ nhân một thành phần cục bộ như TF (Tần suất kỳ hạn) với một thành phần toàn cục như IDF (Tần suất tài liệu nghịch đảo).

Bước 2: Chuẩn hóa kết quả

Sau khi thực hiện xong phép nhân, trong bước tiếp theo, mô hình TFIDF sẽ chuẩn hóa kết quả thành độ dài đơn vị.

Kết quả của hai bước trên là các từ thường xuyên xảy ra trên các tài liệu sẽ được giảm trọng số.

Làm thế nào để lấy TF-IDF Weights?

Ở đây, chúng ta sẽ triển khai một ví dụ để xem cách chúng ta có thể lấy trọng số TF-IDF. Về cơ bản, để có được trọng số TF-IDF, trước tiên chúng ta cần đào tạo ngữ liệu và sau đó áp dụng ngữ liệu đó trong mô hình tfidf.

Huấn luyện Corpus

Như đã nói ở trên để có được TF-IDF, trước tiên chúng ta cần đào tạo kho tài liệu của mình. Đầu tiên, chúng ta cần nhập tất cả các gói cần thiết như sau:

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

Bây giờ cung cấp danh sách chứa các câu. Chúng tôi có ba câu trong danh sách của mình -

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

Tiếp theo, thực hiện mã hóa các câu như sau:

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

Tạo một đối tượng của corpora.Dictionary() như sau -

dictionary = corpora.Dictionary()

Bây giờ chuyển những câu được mã hóa này sang dictionary.doc2bow() đối tượng như sau -

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

Tiếp theo, chúng ta sẽ lấy id từ và tần số của chúng trong tài liệu của mình.

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

Đầu ra

[['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]]

Bằng cách này, chúng tôi đã đào tạo kho ngữ liệu của mình (Kho ngữ liệu Bag-of-Word).

Tiếp theo, chúng ta cần áp dụng kho dữ liệu được đào tạo này trong mô hình tfidf models.TfidfModel().

Đầu tiên nhập gói numpay -

import numpy as np

Hiện đang áp dụng kho ngữ liệu đã đào tạo của chúng tôi (BoW_corpus) trong dấu ngoặc vuông của models.TfidfModel()

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

Tiếp theo, chúng tôi sẽ lấy id từ và tần số của chúng trong kho ngữ liệu được mô hình hóa tfidf của chúng tôi -

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

Đầu ra

[['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]]

Từ kết quả đầu ra ở trên, chúng tôi thấy sự khác biệt về tần số của các từ trong tài liệu của chúng tôi.

Hoàn thành ví dụ triển khai

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])

Sự khác biệt về trọng lượng của các từ

Như đã thảo luận ở trên, các từ xuất hiện thường xuyên hơn trong tài liệu sẽ có trọng số nhỏ hơn. Chúng ta hãy hiểu sự khác biệt về trọng số của các từ từ hai kết quả đầu ra ở trên. Từ‘are’xảy ra trong hai tài liệu và đã được giảm trọng số. Tương tự, từ‘you’ xuất hiện trong tất cả các tài liệu và bị xóa hoàn toàn.