của Mayank Tripathi

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ó.

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.

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:


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.

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.


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


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.

Đầ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.

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
:

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.

Về cơ bản, sklearn fit_transform thực hiện như sau fit
và 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.
Đầu ra thu được ở dạng ma trận lệch, được chuẩn hóa để có kết quả sau.

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, Github và Facebook.