HomeLập trìnhPythonCách xử lý...

Cách xử lý dữ liệu văn bản bằng TF-IDF trong Python


của Mayank Tripathi

1*JTk6iVMiZCQCr8duiaKlHQ

Máy tính xử lý tốt các con số, nhưng không tốt với dữ liệu văn bản. Một trong những kỹ thuật được sử dụng rộng rãi nhất để xử lý dữ liệu văn bản là TF-IDF. Trong bài viết này, chúng ta sẽ tìm hiểu cách nó hoạt động và các tính năng của nó là gì.

Từ trực giác của mình, chúng tôi nghĩ rằng những từ xuất hiện thường xuyên hơn sẽ có trọng lượng lớn hơn trong phân tích dữ liệu văn bản, nhưng không phải lúc nào cũng vậy. Những từ như “the”, “will” và “you” — được gọi là ngưng từ — xuất hiện nhiều nhất trong một kho văn bản, nhưng có rất ít ý nghĩa. Thay vào đó, những từ hiếm là những từ thực sự giúp phân biệt dữ liệu và có trọng lượng hơn.

Giới thiệu về TF-IDF

TF-IDF là viết tắt của cụm từ “Tần số thuật ngữ – Tần số dữ liệu nghịch đảo”. Đầu tiên, chúng ta sẽ tìm hiểu thuật ngữ này có nghĩa là gì về mặt toán học.

Tần suất thuật ngữ (tf): cung cấp cho chúng ta tần suất xuất hiện của từ trong từng tài liệu trong kho văn bản. Đó là tỷ lệ số lần từ xuất hiện trong tài liệu so với tổng số từ trong tài liệu đó. Nó tăng lên khi số lần xuất hiện của từ đó trong tài liệu tăng lên. Mỗi tài liệu có tf riêng của nó.

Đọc thêm  Python .pop() – Cách bật từ Danh sách hoặc Mảng trong Python
1*HM0Vcdrx2RApOyjp_ZeW_Q

Tần số dữ liệu nghịch đảo (idf): được sử dụng để tính trọng số của các từ hiếm trên tất cả các tài liệu trong kho văn bản. Những từ hiếm khi xuất hiện trong ngữ liệu có điểm IDF cao. Nó được đưa ra bởi phương trình dưới đây.

1*A5YGwFpcTd0YTCdgoiHFUw

Kết hợp hai điều này, chúng tôi đưa ra điểm số TF-IDF (w) cho một từ trong tài liệu trong ngữ liệu. Nó là sản phẩm của tf và idf:

1*nSqHXwOIJ2fa_EFLTh5KYw
1*q2tRgjV_J-MLvnhwNAl0KQ

Hãy lấy một ví dụ để hiểu rõ hơn.

Câu 1: Xe chạy trên đường.

Câu 2: Xe tải chạy trên đường cao tốc.

Trong ví dụ này, mỗi câu là một tài liệu riêng biệt.

Bây giờ chúng ta sẽ tính toán TF-IDF cho hai tài liệu trên, đại diện cho kho văn bản của chúng ta.

1*q3qYevXqQOjJf6Pwdlx8Mw

Từ bảng trên, chúng ta có thể thấy rằng TF-IDF của các từ phổ biến bằng 0, điều này cho thấy chúng không có ý nghĩa. Mặt khác, TF-IDF của “ô tô”, “xe tải”, “đường bộ” và “đường cao tốc” khác không. Những từ này có ý nghĩa hơn.

Sử dụng Python để tính TF-IDF

Bây giờ hãy viết mã TF-IDF bằng Python từ đầu. Sau đó, chúng ta sẽ xem cách chúng ta có thể sử dụng sklearn để tự động hóa quy trình.

Chức năng computeTF tính toán điểm TF cho mỗi từ trong ngữ liệu, theo tài liệu.

1*AgBLM-NRFEpWVhXM7I3XjQ
1*RE_h1NoBqyW24oGU3tthew

Chức năng computeIDF tính toán điểm IDF của mỗi từ trong ngữ liệu.

1*EjHweFHuNa-rznvdPQaRbQ
1*cGGCFDVZRdh4yVWKdUKj1g

Chức năng computeTFIDF bên dưới tính điểm TF-IDF cho mỗi từ, bằng cách nhân điểm TF và IDF.

Đọc thêm  Tuyên bố chuyển đổi Python - Ví dụ về trường hợp chuyển đổi
1 *QSTMOhLvIEcRtrEBzwrfPA

Đầu ra do đoạn mã trên tạo ra cho bộ tài liệu D1 và D2 ​​giống như những gì chúng ta đã tính toán thủ công ở trên trong bảng.

1*aLUwNr58mazdfs7DHT1Z6Q

Bạn có thể tham khảo liên kết này để thực hiện đầy đủ.

sklearning

Bây giờ chúng ta sẽ xem cách chúng ta có thể triển khai điều này bằng sklearn trong Python.

Đầu tiên, chúng tôi sẽ nhập khẩu TfidfVectorizer từ sklearn.feature_extraction.text:

1*w9tnnHtsjZwyuFhve5uM1g

Bây giờ chúng ta sẽ khởi tạo vectorizer và sau đó gọi tính năng khớp và chuyển đổi nó để tính điểm TF-IDF cho văn bản.

1*H0_K3rA-tK3hP8KUdq3o8A

Về cơ bản, sklearn fit_transform thực hiện như sau fit transform chức năng. Chúng có thể được tìm thấy trong thư viện sklearn chính thức tại GitHub.


    def fit(self, X, y=None):
        """Learn the idf vector (global term weights)
        Parameters
        ----------
        X : sparse matrix, [n_samples, n_features]
            a matrix of term/token counts
        """
        if not sp.issparse(X):
            X = sp.csc_matrix(X)
        if self.use_idf:
            n_samples, n_features = X.shape
            df = _document_frequency(X)

            # perform idf smoothing if required
            df += int(self.smooth_idf)
            n_samples += int(self.smooth_idf)

            # log+1 instead of log makes sure terms with zero idf don't get
            # suppressed entirely.
            idf = np.log(float(n_samples) / df) + 1.0
            self._idf_diag = sp.spdiags(idf, diags=0, m=n_features,
                                        n=n_features, format="csr")

        return self

    def transform(self, X, copy=True):
        """Transform a count matrix to a tf or tf-idf representation
        Parameters
        ----------
        X : sparse matrix, [n_samples, n_features]
            a matrix of term/token counts
        copy : boolean, default True
            Whether to copy X and operate on the copy or perform in-place
            operations.
        Returns
        -------
        vectors : sparse matrix, [n_samples, n_features]
        """
        if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.floating):
            # preserve float family dtype
            X = sp.csr_matrix(X, copy=copy)
        else:
            # convert counts or binary occurrences to floats
            X = sp.csr_matrix(X, dtype=np.float64, copy=copy)

        n_samples, n_features = X.shape

        if self.sublinear_tf:
            np.log(X.data, X.data)
            X.data += 1

        if self.use_idf:
            check_is_fitted(self, '_idf_diag', 'idf vector is not fitted')

            expected_n_features = self._idf_diag.shape[0]
            if n_features != expected_n_features:
                raise ValueError("Input has n_features=%d while the model"
                                 " has been trained with n_features=%d" % (
                                     n_features, expected_n_features))
            # *= doesn't work
            X = X * self._idf_diag

        if self.norm:
            X = normalize(X, norm=self.norm, copy=False)

        return X

Một điều cần lưu ý trong đoạn mã trên là, thay vì chỉ nhật ký của n_samples, 1 đã được thêm vào n_samples để tính điểm IDF. Điều này đảm bảo rằng các từ có điểm IDF bằng 0 không bị loại bỏ hoàn toàn.

Đọc thêm  Cách cạo trang web bằng Python

Đầu ra thu được ở dạng ma trận lệch, được chuẩn hóa để có kết quả sau.

1*d_Pk4czfcod_vFlFugWysA

Vì vậy, chúng tôi đã thấy cách chúng tôi có thể dễ dàng viết mã TF-IDF chỉ trong 4 dòng bằng sklearn. Bây giờ chúng ta đã hiểu TF-IDF mạnh mẽ như thế nào với tư cách là một công cụ để xử lý dữ liệu văn bản từ kho văn bản. Để tìm hiểu thêm về sklearn TF-IDF, bạn có thể sử dụng liên kết này.

Chúc mừng mã hóa!

Cảm ơn đã đọc bài viết này. Hãy chắc chắn để chia sẻ nó nếu bạn thấy nó hữu ích.

Để biết thêm về lập trình, bạn có thể theo dõi tôi để bạn nhận được thông báo mỗi khi tôi có bài đăng mới.

Chúc mừng!

Ngoài ra, hãy kết nối trên Twitter, liên kết, GithubFacebook.





Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status