Cara memproses data teks menggunakan TF-IDF di Python

Komputer bagus dengan nombor, tetapi tidak begitu banyak dengan data teks. Salah satu teknik yang paling banyak digunakan untuk memproses data teks adalah TF-IDF. Dalam artikel ini, kita akan belajar bagaimana ia berfungsi dan apa ciri-cirinya.

Dari intuisi kami, kami berpendapat bahawa kata-kata yang muncul lebih kerap harus mempunyai bobot yang lebih besar dalam analisis data teks, tetapi itu tidak selalu berlaku. Kata-kata seperti "the", "will", dan "you" - disebut kata berhenti - muncul paling banyak dalam korpus teks, tetapi sangat tidak penting. Sebaliknya, kata-kata yang jarang berlaku adalah kata-kata yang benar-benar membantu dalam membezakan antara data, dan membawa lebih banyak berat.

Pengenalan TF-IDF

TF-IDF adalah singkatan dari "Term Frequency - Inverse Data Frequency". Pertama, kita akan belajar apa maksud istilah ini secara matematik.

Istilah Kekerapan (tf) : memberi kita kekerapan kata dalam setiap dokumen di korpus. Ini adalah nisbah berapa kali kata itu muncul dalam dokumen berbanding dengan jumlah kata dalam dokumen itu. Ia bertambah seiring bertambahnya jumlah kata dalam dokumen tersebut. Setiap dokumen mempunyai tfnya sendiri.

Frekuensi Data Terbalik (idf): digunakan untuk mengira berat perkataan jarang di semua dokumen dalam korpus. Perkataan yang jarang berlaku di korpus mempunyai skor IDF yang tinggi. Ia diberikan oleh persamaan di bawah.

Dengan menggabungkan kedua-duanya, kami menghasilkan skor TF-IDF (w) untuk kata dalam dokumen di korpus. Ia adalah produk tf dan idf:

Mari kita ambil contoh untuk mendapatkan pemahaman yang lebih jelas.

Ayat 1: Kereta dipandu di jalan raya.

Ayat 2: Trak itu dipandu di lebuh raya.

Dalam contoh ini, setiap ayat adalah dokumen yang berasingan.

Kami sekarang akan mengira TF-IDF untuk dua dokumen di atas, yang mewakili korpus kami.

Dari jadual di atas, kita dapat melihat bahawa TF-IDF kata biasa adalah sifar, yang menunjukkan bahawa kata-kata itu tidak signifikan. Sebaliknya, TF-IDF dari "kereta", "trak", "jalan", dan "lebuh raya" tidak sifar. Kata-kata ini mempunyai lebih banyak makna.

Menggunakan Python untuk mengira TF-IDF

Mari kod sekarang TF-IDF di Python dari awal. Selepas itu, kita akan melihat bagaimana kita dapat menggunakan sklearn untuk mengotomatisasi prosesnya.

Fungsi computeTFmenghitung skor TF untuk setiap kata dalam korpus, berdasarkan dokumen.

Fungsi itu computeIDFmenghitung skor IDF setiap perkataan di korpus.

Fungsi computeTFIDFdi bawah ini menghitung skor TF-IDF untuk setiap perkataan, dengan mengalikan skor TF dan IDF.

Keluaran yang dihasilkan oleh kod di atas untuk set dokumen D1 dan D2 adalah sama dengan yang kami kirakan secara manual di atas dalam jadual.

Anda boleh merujuk pautan ini untuk pelaksanaannya secara menyeluruh.

sklearn

Sekarang kita akan melihat bagaimana kita dapat melaksanakannya dengan menggunakan sklearn di Python.

Pertama, kami akan mengimport TfidfVectorizerdari sklearn.feature_extraction.text:

Sekarang kita akan memulakan vectorizerdan kemudian memanggil sesuai dan mengubahnya untuk mengira skor TF-IDF untuk teks.

Di bawah tudung, sklearn fit_transform melaksanakan perkara berikut fit dan transformfungsi. Ini boleh didapati di perpustakaan sklearn rasmi di 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

Satu perkara yang perlu diperhatikan dalam kod di atas adalah bahawa, bukan hanya log n_samples, 1 telah ditambahkan ke n_samples untuk mengira skor IDF. Ini memastikan bahawa kata-kata dengan skor IDF sifar tidak ditekan sepenuhnya.

Output yang diperoleh adalah dalam bentuk matriks miring, yang dinormalisasi untuk mendapatkan hasil berikut.

Oleh itu, kami melihat bagaimana kami dapat dengan mudah membuat kod TF-IDF hanya dalam 4 baris menggunakan sklearn. Sekarang kita memahami betapa kuatnya TF-IDF sebagai alat untuk memproses data teks dari korpus. Untuk mengetahui lebih lanjut mengenai sklearn TF-IDF, anda boleh menggunakan pautan ini.

Selamat pengekodan!

Terima kasih kerana membaca artikel ini. Pastikan anda kongsikan jika anda menganggapnya bermanfaat.

Untuk lebih lanjut mengenai pengaturcaraan, anda boleh mengikuti saya, agar anda mendapat pemberitahuan setiap kali saya datang dengan siaran baru.

Ceria!

Also, Let’s get connected on Twitter, Linkedin, Github and Facebook.