Kuidas töödelda tekstiandmeid Pythonis TF-IDF-i abil

Arvutid sobivad numbritega, kuid mitte nii palju tekstiandmetega. Üks tekstiandmete töötlemisel enimkasutatavaid tehnikaid on TF-IDF. Sellest artiklist saame teada, kuidas see töötab ja millised on selle omadused.

Oma sisetunde järgi arvame, et sagedamini esinevatel sõnadel peaks olema suurem kaal tekstianalüüsis, kuid see pole alati nii. Sõnad nagu “the”, “will” ja “you” - nn peatusõnad - esinevad teksti korpuses kõige rohkem, kuid neil on vähe tähtsust. Selle asemel on haruldased sõnad need, mis tegelikult aitavad andmeid eristada ja omavad suuremat kaalu.

TF-IDF-i sissejuhatus

TF-IDF tähistab tähtaega „Term Frequency - Inverse Data Frequency”. Esiteks õpime, mida see termin matemaatiliselt tähendab.

Termin Sagedus (tf) : annab meile sõna sageduse igas korpuse dokumendis. See on sõna dokumendis esinemiste arvu suhe selles dokumendis sisalduvate sõnade koguarvuga. See suureneb, kui selle sõna esinemiste arv dokumendis suureneb. Igal dokumendil on oma tf.

Pöördandmete sagedus (idf): kasutatakse haruldaste sõnade kaalu arvutamiseks kõigis korpuse dokumentides. Korpuses harva esinevatel sõnadel on kõrge IDF-skoor. Selle annab järgmine võrrand.

Nende kahe ühendamisel saame korpuses oleva dokumendi sõna TF-IDF skoori (w). See on tf ja idf korrutis:

Võtame näite selgema arusaamise saamiseks.

1. lause: autoga sõidetakse teel.

Lause 2: veoautot juhitakse maanteel.

Selles näites on iga lause eraldi dokument.

Arvutame nüüd TF-IDF-i kahe ülaltoodud dokumendi jaoks, mis esindavad meie korpust.

Ülaltoodud tabelist näeme, et tavaliste sõnade TF-IDF oli null, mis näitab, et need pole olulised. Teisest küljest pole TF-IDF “auto”, “veoauto”, “tee” ja “maantee” nullist erinev. Neil sõnadel on suurem tähendus.

TF-IDF-i arvutamiseks Pythoni kasutamine

Kodeerib nüüd Pythonis TF-IDF-i nullist. Pärast seda näeme, kuidas saame sklearn'i kasutada protsessi automatiseerimiseks.

Funktsioon computeTFarvutab korpuses iga sõna TF-skoori dokumendi kaupa.

Funktsioon computeIDFarvutab korpuses iga sõna IDF-skoori.

Allpool olev funktsioon computeTFIDFarvutab iga sõna TF-IDF skoori, korrutades TF ja IDF skoori.

Ülaltoodud koodiga toodetud väljund dokumendikomplekti D1 ja D2 jaoks on sama, mis me käsitsi tabelis eespool arvutasime.

Täieliku rakendamise kohta saate viidata sellele lingile.

sklearn

Nüüd näeme, kuidas saame seda Pylonis sklearn'i abil rakendada.

Esiteks me importida TfidfVectorizeralates sklearn.feature_extraction.text:

Nüüd lähtestame vectorizerja seejärel kutsume sobivuse ja teisendame selle üle, et arvutada teksti TF-IDF skoor.

Kapoti all täidab sklearn fit_transform järgmist fit ja transformfunktsioone. Need leiate GitHubi ametlikust sklearn'i raamatukogust.

 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

Üks asi, mida ülaltoodud koodis märgata, on see, et ID-skoori arvutamiseks on n-proovidele lisatud ainult 1 logi asemel 1. See tagab, et IDF-i nullskooriga sõnu ei suruta täielikult maha.

Saadud väljund on viltu maatriksi kujul, mis normaliseeritakse järgmise tulemuse saamiseks.

Nii nägime, kuidas saame sklearni abil TF-IDF-i hõlpsalt kodeerida vaid 4 real. Nüüd mõistame, kui võimas on TF-IDF kui vahend tekstist andmete korpuses töötlemiseks. Sklearn TF-IDF-i kohta lisateabe saamiseks võite kasutada seda linki.

Head kodeerimist!

Täname selle artikli lugemise eest. Jagage seda kindlasti, kui leiate sellest abi.

Programmeerimise kohta lisateabe saamiseks võite mind jälgida, nii et teid teavitatakse iga kord, kui ma uue postituse esitan.

Terviseks!

Olgem ühendatud ka Twitteris , Linkedinis , Githubis ja Facebookis .