
A számítógépek jól állnak a számokkal, de a szöveges adatokkal nem annyira. A szöveges adatok feldolgozásának egyik legelterjedtebb technikája a TF-IDF. Ebben a cikkben megtudhatjuk, hogyan működik és mik a jellemzői.
Intuíciónk alapján úgy gondoljuk, hogy a gyakrabban megjelenő szavaknak nagyobb súlyuk legyen a szöveges adatok elemzésében, de ez nem mindig így van. Az olyan szavak, mint a „a”, a „akarat” és a „te” - ún. Stopwords - a szövegtestben jelennek meg a legtöbbször, de nagyon kevés jelentőségűek. Ehelyett a ritka szavak azok, amelyek valóban segítenek megkülönböztetni az adatokat, és nagyobb súllyal bírnak.
Bevezetés a TF-IDF-be
A TF-IDF jelentése „Term Frequency - Inverse Data Frequency”. Először megtudjuk, mit jelent ez a kifejezés matematikailag.
Term Frequency (tf) : megadja a szó gyakoriságát a korpusz egyes dokumentumaiban. Ez azt az arányt jelenti, hogy hányszor jelent meg a szó egy dokumentumban, és az abban szereplő szavak teljes számához viszonyítva. Növeli az adott szó előfordulásának számát a dokumentumban. Minden dokumentumnak megvan a saját tf-je.

Fordított adatfrekvencia (idf): a ritka szavak súlyának kiszámítására szolgál a korpusz összes dokumentumában. A korpuszban ritkán előforduló szavak magas IDF-ponttal rendelkeznek. Az alábbi egyenlet adja.

Ezt a kettőt egyesítve a TF-IDF pontszámot (w) kapjuk egy korpuszban lévő dokumentumban szereplő szóra. A tf és az idf szorzata:


Vegyünk egy példát az egyértelműbb megértéshez.
1. mondat: Az autót az úton hajtják.
2. mondat: A teherautót az országúton hajtják.
Ebben a példában minden mondat külön dokumentum.
Most kiszámoljuk a TF-IDF-et a fenti két dokumentumra, amelyek a korpuszunkat képviselik.

A fenti táblázatból láthatjuk, hogy a köznapi szavak TF-IDF értéke nulla volt, ami azt mutatja, hogy nem szignifikánsak. Másrészt az „autó”, „teherautó”, „út” és „autópálya” TF-IDF értéke nem nulla. Ezeknek a szavaknak nagyobb jelentősége van.
A Python használata a TF-IDF kiszámításához
Lehetővé teszi, hogy a TF-IDF a Python-ban legyen a semmiből. Ezt követően meglátjuk, hogyan használhatjuk a sklearn-et a folyamat automatizálására.
A függvény dokumentumonként computeTF
kiszámítja a korpusz egyes szavainak TF-pontszámát.


A függvény computeIDF
kiszámítja a korpusz minden szavának IDF-pontszámát.


Az computeTFIDF
alábbi függvény kiszámítja az egyes szavak TF-IDF pontszámát, megszorozva a TF és IDF pontszámokat.

A fenti kód által a D1 és D2 dokumentumkészlet által előállított kimenet megegyezik azzal, amit fentebb a táblázatban kiszámítottunk.

Erre a hivatkozásra hivatkozhat a teljes megvalósítás érdekében.
sklearn
Most meglátjuk, hogyan tudjuk ezt megvalósítani a sklearn használatával a Pythonban.
Először is, mi lesz importálni TfidfVectorizer
re sklearn.feature_extraction.text
:

Most inicializáljuk, majd meghívjuk az vectorizer
illesztést és átalakítjuk rajta, hogy kiszámítsuk a szöveg TF-IDF pontszámát.

A motorháztető alatt a sklearn fit_transform a következőket fit
és transform
funkciókat hajtja végre . Ezek megtalálhatók a GitHub hivatalos sklearn könyvtárában.
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
Egy dolgot észre kell venni a fenti kódban, hogy az n_minták naplója helyett 1-et adtak az n_mintákhoz az IDF-pontszám kiszámításához. Ez biztosítja, hogy a nulla IDF-ponttal rendelkező szavak ne legyenek teljesen elnyomva.
A kapott kimenet ferde mátrix formájában van, amelyet normalizálunk, hogy a következő eredményt kapjuk.

Így láttuk, hogyan lehet a TF-IDF-et egyszerűen 4 sorban kódolni a sklearn segítségével. Most már megértettük, hogy a TF-IDF milyen hatékony eszköz a szöveges adatok feldolgozására egy korpuszból. Ha többet szeretne megtudni a sklearn TF-IDF-ről, használja ezt a linket.
Boldog kódolást!
Köszönjük, hogy elolvasta ezt a cikket. Feltétlenül ossza meg, ha hasznosnak találja.
Ha többet szeretne tudni a programozásról, kövessen engem, hogy értesítést kapjon minden alkalommal, amikor új bejegyzéssel állok elő.
Egészségére!
Továbbá, lássunk csatlakozik Twitter , Linkedin , GitHub és a Facebook .