+7

TF-IDF ( term frequency – inverse document frequency)

Tóm tắt

Xử lý ngôn ngữ là một kĩ thuật quan trọng nhằm giúp máy tính hiểu được ngôn ngữ của con người, qua đó hướng dẫn máy tính thực hiện và giúp đỡ con người trong những công việc có liên quan đến ngôn ngữ như : dịch thuật, phân tích dữ liệu văn bản, nhận dạng tiếng nói, tìm kiếm thông tin, tóm tắt văn bản, và rất nhiều ứng dụng khác.

Một trong những kĩ thuật để xử lý ngôn ngữ tự nhiên : tf-idf. Đây là một kĩ thuật cơ bản và được sử dụng kết hợp với rất nhiều thuật toán khác để xử lý những ứng dụng được nêu ở trên.

TF-IDF

Viết tắt của thuật ngữ tiếng Anh term frequency – inverse document frequency,tf-idf là trọng số của một từ trong văn bản thu được qua thống kê thể hiện mức độ quan trọng của từ này trong một văn bản, mà bản thân văn bản đang xét nằm trong một tập hợp các văn bản.

Thuật toán này thường được sử dụng vì: trong ngôn ngữ luôn có những từ xảy ra thường xuyên với các từ khác. Và một trong những phát biểu nổi tiếng nhất Zipf’s law phát biểu về vấn đề này như sau:

The nth most common word in a human language text occurs with a frequency inversely proportional to n.

n-gram-rank.png

Có nghĩa là luôn có một tập các từ mà tần số xuất hiện, sử dụng nhiều hơn các từ khác , điều này đúng trong bất kì ngôn ngữ nào. Chính vì vậy ta cần có một phương pháp để làm mịn đường cong tần số trên hay là việc cân bằng mức độ quan trọng giữa các từ

Các tính trọng số tf-idf

Tf- term frequency : dùng để ước lượng tần xuất xuất hiện của từ trong văn bản. Tuy nhiên với mỗi văn bản thì có độ dài khác nhau, vì thế số lần xuất hiện của từ có thể nhiều hơn . Vì vậy số lần xuất hiện của từ sẽ được chia độ dài của văn bản (tổng số từ trong văn bản đó)

TF(t, d) = ( số lần từ t xuất hiện trong văn bản d) / (tổng số từ trong văn bản d)

public double tf(List<String> doc, String term) {
    double result = 0;
    for (String word : doc) {
       if (term.equalsIgnoreCase(word))
              result++;
       }
    return result / doc.size();
}

IDF- Inverse Document Frequency: dùng để ước lượng mức độ quan trọng của từ đó như thế nào . Khi tính tần số xuất hiện tf thì các từ đều được coi là quan trọng như nhau. Tuy nhiên có một số từ thường được được sử dụng nhiều nhưng không quan trọng để thể hiện ý nghĩa của đoạn văn , ví dụ :

  • Từ nối: và, nhưng, tuy nhiên, vì thế, vì vậy, …
  • Giới từ: ở, trong, trên, …
  • Từ chỉ định: ấy, đó, nhỉ, …

Vì vậy ta cần giảm đi mức độ quan trọng của những từ đó bằng cách sử dụng IDF :

IDF(t, D) = log_e( Tổng số văn bản trong tập mẫu D/ Số văn bản có chứa từ t )

public double idf(List<List<String>> docs, String term) {
    double n = 0;
    for (List<String> doc : docs) {
        for (String word : doc) {
            if (term.equalsIgnoreCase(word)) {
                n++;
                break;
            }
        }
    }
    return Math.log(docs.size() / n);
}

Vậy giá trị của tf-idf :

public double tfIdf(List<String> doc, List<List<String>> docs, String term) {
    return tf(doc, term) * idf(docs, term);
}

Ví dụ

public static void main(String[] args) {

    List<String> doc1 = Arrays.asList("red", "green", "blue", "yellow", "red", "red");
    List<String> doc2 = Arrays.asList("red", "pink", "white", "dark", "orange", "pink");
    List<String> doc3 = Arrays.asList("green", "yellow", "white", "white", "purpil");
    List<List<String>> documents = Arrays.asList(doc1, doc2, doc3);

    TFIDFCalculator calculator = new TFIDFCalculator();
    double tfidf = calculator.tfIdf(doc1, documents, "red");
    System.out.println("TF-IDF (red) = " + tfidf);

}

Kết quả trọng số tf-idf của "red" : 0.2027325540540822

Tham khảo

Bài viết có sự tham khảo từ blog : https://guendouz.wordpress.com/2015/02/17/implementation-of-tf-idf-in-java/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí