Kaip apdoroti tekstinius duomenis naudojant „TF-IDF“ „Python“

Kompiuteriai yra gerai su skaičiais, bet ne tiek su tekstiniais duomenimis. Vienas iš plačiausiai naudojamų tekstinių duomenų apdorojimo būdų yra TF-IDF. Šiame straipsnyje mes sužinosime, kaip jis veikia ir kokie yra jo bruožai.

Remdamiesi savo nuojauta, manome, kad dažniau pasirodantys žodžiai turėtų turėti didesnę reikšmę analizuojant tekstinius duomenis, tačiau tai ne visada būna. Tokie žodžiai kaip „the“, „will“ ir „you“ - vadinami stoteliniais žodžiais - dažniausiai pasirodo teksto korpuse, tačiau jų reikšmė yra labai maža. Vietoj to retai vartojami žodžiai iš tikrųjų padeda atskirti duomenis ir turi daugiau svorio.

TF-IDF įvadas

TF-IDF reiškia „Term Frequency - Inverse Data Frequency“. Pirmiausia sužinosime, ką šis terminas reiškia matematiškai.

Terminas Dažnis (tf) : nurodo žodžio dažnumą kiekviename korpuse esančiame dokumente. Tai santykis, kiek kartų žodis pasirodė dokumente, palyginti su bendru to dokumento žodžių skaičiumi. Jis didėja, kai to žodžio atvejų dokumente daugėja. Kiekvienas dokumentas turi savo tf.

Atvirkštinis duomenų dažnis (idf): naudojamas apskaičiuojant retų žodžių svorį visuose korpuso dokumentuose. Korpuse retai pasitaikantys žodžiai turi aukštą IDF balą. Tai pateikiama žemiau pateikta lygtimi.

Sujungę šiuos du, mes gauname TF-IDF balą (w) už žodį korpuse esančiame dokumente. Tai yra tf ir idf sandauga:

Paimkime pavyzdį, kad gautume aiškesnį supratimą.

1 sakinys: automobilis važiuojamas keliu.

2 sakinys: sunkvežimis važiuojamas greitkeliu.

Šiame pavyzdyje kiekvienas sakinys yra atskiras dokumentas.

Dabar apskaičiuosime TF-IDF dviem aukščiau išvardintiems dokumentams, kurie atspindi mūsų korpusą.

Iš pirmiau pateiktos lentelės matome, kad bendrų žodžių TF-IDF buvo nulis, o tai rodo, kad jie nėra reikšmingi. Kita vertus, „automobilio“, „sunkvežimio“, „kelio“ ir „greitkelio“ TF-IDF nėra nulis. Šie žodžiai turi daugiau reikšmės.

„Python“ naudojimas TF-IDF apskaičiavimui

Dabar leidžia „Python“ koduoti TF-IDF nuo nulio. Po to pamatysime, kaip mes galime naudoti „sklearn“, kad automatizuotume procesą.

Funkcija computeTFapskaičiuoja kiekvieno korpuso žodžio TF balą pagal dokumentą.

Funkcija computeIDFapskaičiuoja kiekvieno korpuso žodžio IDF balą.

Žemiau pateikta funkcija computeTFIDFapskaičiuoja kiekvieno žodžio TF-IDF balą, padaugindama TF ir IDF balus.

Aukščiau nurodytu kodu sukurta produkcija dokumentų rinkiniams D1 ir D2 yra tokia pati, kokią mes rankiniu būdu apskaičiavome aukščiau lentelėje.

Jei norite užbaigti diegimą, galite kreiptis į šią nuorodą.

mokykis

Dabar pamatysime, kaip tai įgyvendinti naudojant „sklearn“ „Python“.

Pirmiausia importuosime TfidfVectorizersklearn.feature_extraction.text:

Dabar mes inicijuosime, vectorizertada iškviesime tinkamumą ir transformuosime jį, kad apskaičiuotume TF-IDF balą tekstui.

Po gaubtu „sklearn fit_transform“ vykdo šiuos veiksmus fit ir transformfunkcijas. Jų galite rasti oficialioje „GlHub“ sklearn bibliotekoje.

 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

Vienas dalykas, kurį reikia pastebėti aukščiau pateiktame kode, yra tas, kad vietoj tik „n_samples“ žurnalo prie „n_sample“ buvo pridėta 1, kad būtų apskaičiuotas IDF rezultatas. Tai užtikrina, kad žodžiai, kurių IDF balas yra nulis, nebus visiškai užgniaužti.

Gauta išvestis yra iškreiptos matricos forma, kuri yra normalizuota, kad gautų tokį rezultatą.

Taigi mes pamatėme, kaip mes galime lengvai koduoti TF-IDF tik 4 eilutėse naudodami „sklearn“. Dabar mes suprantame, koks galingas TF-IDF yra įrankis, leidžiantis apdoroti tekstinius duomenis iš korpuso. Norėdami sužinoti daugiau apie „sklearn TF-IDF“, galite naudoti šią nuorodą.

Laimingo kodavimo!

Dėkojame, kad perskaitėte šį straipsnį. Būtinai pasidalinkite, jei jums tai naudinga.

Norėdami sužinoti daugiau apie programavimą, galite sekti mane, kad jums būtų pranešta kiekvieną kartą, kai sugalvoju naują įrašą.

Cheers!

Be to, prisijunkime prie „ Twitter“ , „ Linkedin“ , „ Github“ ir „ Facebook“ .