So sánh tf và tf-idf năm 2024

This post was inspired back when I was trying to compute the TF-IDF matrix by hand using the standard formula, after computing TF and IDF first and then multiplying the two I did realize, there was something different compared to the one I obtained with Scikit-learn on my sample corpus, there I realized the difference between the Scikit-learn version and most standard and traditional version. Without further ado, let’s understand the differences.

What is the standard definition of TF-IDF?

TF-IDF definition: “term frequency-inverse document frequency, is a numerical statistic that is intended to reflect how important a word is to a document in a collection or corpus.[2]

Objective: The goal of using TF-IDF instead of the raw frequencies of occurrence of a token in a given document is to scale down the impact of tokens that occur very frequently in a given corpus and that are hence empirically less informative than features that occur in a small fraction of the training corpus.

How to Compute to it?

It is simply a product of two weights, the TF and the IDF weight:

  • TF: Term Frequency measures how frequently a term occurs in a document as every document is different in length, it is possible that a term would appear much more times in long documents than shorter ones. Thus TF is:
  • IDF: Inverse Document Frequency measures how important a term is. In TF, all terms are considered equally important. Thus we need to weigh down the frequent terms while scaling up the rare ones, by computing the following:
    Note: In Scikit-learn ,The log is not base 10 , though it is the natural logarithm (which has a base e, e is an irrational and transcendental number approximately equal to 2.718),

Here, there is a small example of what IDF means practically: The example has 4 terms: (a, boat, mobile and mobilegeddon).

Vậy tại sao BOW được sử dụng? Một trong những vấn đề lớn nhất với tài liệu là nó lộn xộn và không có cấu trúc. Đồng thời các thuật toán học máy ưu tiên các đầu vào có độ dài cố định, có cấu trúc, được xác định rõ ràng. Vì vậy bằng cách sử dụng kỹ thuật BOW, chúng ta có thể chuyển đổi các tài liệu có độ dài thay đổi thành một tài liệu có vector độ dài cố định.

Ví dụ sau sẽ cho thấy cơ chế hoạt động của phương pháp này:

Trích xuất đặc trưng 3 câu sau bằng phương pháp BOW.

Hình 1: Cho tập hợp các document (d1, d2, d3)

Trả lời

Bước 1: thông qua bước tokenization ta có thể biến đổi thành các câu trong hình 2.

Hình 2: Kết quả sau khi tokenization.

Cho rằng mỗi câu là một tài liệu (d1, d2 hoặc d3) riêng biệt và xây dựng một danh sách từ vựng (vocabulary) của tất cả các từ từ 3 câu trên. Kết quả sẽ nhận được các từ như sau:

Hình 3: tập từ vựng thu được.

Bước 2: xây dựng vector. Dựa vào tần suất xuất hiện từ (các từ này là duy nhất trong tập) trong câu “hôm_qua tôi học lập_trình”, ta xây dựng được vector như sau:

Hình 4: Vector thể hiện sự xuất hiện của các từ trong tài liệu d1.

Thực hiện tương tự với các câu còn lại, ta cũng nhận được các vector như sau:

  • hôm_nay tôi cũng học lập_trình => [0, 1, 0, 1, 1, 0, 1, 1]
  • ngày_mai tôi không học lập_trình => [0, 0, 1, 1, 0, 1, 1, 1]

Sau đó ta thu được bảng ma trận kết quả từ phương pháp BOW. Bảng này dành cho các giải thuật học máy.

Hình 5: bảng ma trận kết quả từ BOW.

2. Phương pháp TF-IDF:

Hình 6: Tổng quan cách tính TF-IDF.

Phương pháp TF-IDF là cách đo trọng số để thể hiện sự quan trọng của các từ trong tập dữ liệu. Được tính theo công thức:

Ý nghĩa và cách tính mỗi thành phần TF(t, d) và IDF(t, D) sẽ được trình bày ở các mục sau.

2.1. TF ( Term Frequency): Đo lường tần suất xuất hiện của một từ trong một tài liệu (document). Và một vài cách để tính toán TF như sau:

Cách 1: TF(t, d) = No. of times term ‘t’ occurs in a document

hoặc:

Cách 2: TF(t, d) = (No. of times term ‘t’ occurs in a document) / (No. Of terms in a document)

hoặc

Cách 3: TF(t, d) = (No. of times term ‘t’ occurs in a document) / (Frequency of most common term in a document). Viết lại dưới dạng công thức:

Trong đó:

  • f(t, d): là số lần xuất hiện của từ t trong tài liệu d.
  • max{f(w ,d): w∈d}: là tần suất của từ xuất hiện nhiều nhất trong tài liệu d.

Lưu ý: sklearn sử dụng cách đầu tiên (No. Of times a term ‘t’ appears in a document)

2.2 IDF (Inverse Document Frequency): Đo lường độ quan trọng của một từ trong toàn bộ tập hợp các tài liệu. Đối với từng tài liệu, việc một từ xuất hiện nhiều lần sẽ có mức độ cao hơn. Tuy nhiên, đối với toàn bộ tập tài liệu, một từ xuất hiện ở nhiều tài liệu thì sẽ trở nên không còn quan trọng nữa.

Đó là lý do vì sao cần phải giảm đi mức độ quan trọng của những từ đó bằng cách sử dụng IDF. Để tính giá trị IDF ta sẽ có vài cách như sau:

Cách 1: IDF (t, D) =1 + log e [ n / DF(t) ]

hoặc:

Cách 2: IDF(t, D) = log e [ n / DF(t) ]

Trong đó:

  • n: tổng số tài liệu có trong tập tài liệu D.
  • DF (document fluency):là số tài liệu có chứa từ t.

Lưu ý 1:

Khi chúng ta tính IDF, nếu từ t không xuất hiện ở bất kỳ tài liệu nào thì mẫu số của IDF sẽ bằng 0. Do vậy, để tránh phép chia cho 0, chúng ta có thể thay đổi mẫu số của IDF bằng cách cộng 1 vào cho nó.

Lưu ý 2:

Với tài liệu :

IDF(t, D) = log e [ (1+n) / ( 1 + DF(t) ) ] + 1 ( nếu smooth_idf = True)

hoặc:

IDF(t, D) = log e [ n / DF(t) ] + 1 (nếu smooth_idf = False)

2.3. Ví dụ 1— Cách tính TF-IDF

Dùng phương pháp TF-IDF để phân tích các tài liệu sau:

Hình 7: Cho tập hợp các document (d1, d2, d3)

Trả lời:

  • Bước 1: Tính TF

Trong ví dụ này tôi sử dụng cách 3 (trong mục 2.1) để tính các giá trị TF(t, d). Ta thu được bảng kết quả ở hình 8.

Hình 8: Bảng kết quả tính TF.

  • Bước 2: Tính IDF

Trong ví dụ này tôi sử dụng cách 2 (trong mục 2.2) để tính các giá trị IDF(t, D). Ta thu được bảng kết quả ở hình 9.

Hình 9: Bảng kết quả tính IDF.

  • Bước 3: Dựa vào công thức tính TF-IDF, ta có kết quả như hình 10: Hình 10: Bảng kết quả tính TF-IDF.

2.4. Ví dụ 2 - Cách tính TF-IDF

Cho corpus gồm 2 tài liệu như sau:

d1: A quick brown fox jumps over the lazy dog. What a fox!

d2: A quick brown fox jumps over the lazy fox. What a fox!

Hỏi: từ “fox” có liên quan như thế nào đối với tài liệu corpus D?

Trả lời:

Có thể trả lời bằng 1 trong 2 cách như sau

Cách 1: trả lời ngắn gọn

Tương tự ví dụ 1, tôi sử dụng cách 3 (trong mục 2.1) để tính các giá trị TF(t, d). Ta được kết quả:

  • Đối với d1:

TF-IDF = TF( “fox”, d1) * IDF(t,D) = 2/2 * log(2/2) = 0

  • Đối với d2:

TF-IDF = TF( “fox”, d2) * IDF(t,D) = 3/3 * log(3/3) = 0

\=> Từ “fox” không có độ quan trọng trong các dữ liệu corpus D.

Cách 2: Trả lời đầy đủ bằng bảng

  • Tính TF: Sử dụng cách 3 (trong mục 2.1) để tính các giá trị TF(t, d). Ta được kết quả hình 12. Hình 11: Cho tập hợp các document (d1, d2)Hình 12: Bảng kết quả tính TF.
  • Tính IDF: Sử dụng cách 2 (trong mục 2.2)để tính các giá trị IDF(t, D). Ta thu được bảng kết quả ở hình 13. Hình 13: Bảng kết quả tính IDF.
  • Tính TF-IDF: Hình 14: Bảng kết quả tính TF-IDF.

3. Hiện thực một vài chương trình

  • Cách sử dụng tf idf vectorizer trong thư viện sklearn 👉 Github Link

Lưu ý: trong sklearn kết quả sẽ khác so với những ví dụ 1 và ví dụ 2 trong mục 2.2 và 2.3 bởi vì normalization và cách tính TF(t, d) và IDF(t, D) khác (xem ). Nhưng cách nào cũng đúng.

4. Tài liệu tham khảo

[1] Quản Thành Thơ. Mạng nơ-ron nhân tạo: từ hồi quy đến học sâu. DHBK TPHCM.

[2] Prof. Andew Ng. Natural language processing. Coursera

[3] https://www.analyticsvidhya.com/blog/2021/11/how-sklearns-tfidfvectorizer-calculates-tf-idf-values/

[4] https://melaniewalsh.github.io/Intro-Cultural-Analytics/05-Text-Analysis/03-TF-IDF-Scikit-Learn.html