Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele TF-IDF | Perustekstin Mallit
Johdatus NLP:hen Pythonilla

TF-IDF

Pyyhkäise näyttääksesi valikon

TF-IDF:n ymmärtäminen

Vaikka bag of words -malli on yksinkertainen ja tehokas, se korostaa liikaa yleisiä termejä, mikä vaikeuttaa harvinaisempien mutta informatiivisempien sanojen tunnistamista. Tämän ratkaisemiseksi käytetään usein TF-IDF-mallia.

Note
Määritelmä

TF-IDF (term frequency-inverse document frequency) on tilastollinen mittari, joka kuvaa, kuinka tärkeä sana on tietylle dokumentille suhteessa laajempaan aineistoon.

Toisin kuin BoW, joka perustuu raakatermimääriin, TF-IDF ottaa huomioon sekä termin esiintymistiheyden dokumentissa että sen käänteisen esiintymistiheyden koko aineistossa. Tämä vähentää yleisten termien vaikutusta ja korostaa harvinaisempia, informatiivisempia sanoja.

Miten TF-IDF toimii

TF-IDF-arvo tietylle termille dokumentissa lasketaan seuraavasti:

tf-idf(t,d)=tf(t,d)×idf(t)\def\tfidf{\operatorname{tf-idf}} \def\tf{\operatorname{tf}} \def\idf{\operatorname{idf}} \tfidf(t, d) = \tf(t, d) \times \idf(t)

missä:

  • tt on termi (sana tai n-grammi);
  • dd on dokumentti.
TF-IDF-kaavat

On olemassa useita eri tapoja laskea tf\operatorname{tf}- ja idf\operatorname{idf}-arvot. Tarkastellaan yhtä yleistä vaihtoehtoa kummallekin:

Term Frequency (TF)

Kuvaa, kuinka usein termi esiintyy dokumentissa, ja kertoo sen suhteellisesta merkityksestä kyseisessä dokumentissa. Samoin kuin bag of words -mallissa, käytetään usein yksinkertaista laskentaa:

tf(t,d)=count(t,d)\def\tf{\operatorname{tf}} \def\count{\operatorname{count}} \tf(t, d) = \count(t, d)

Inverse Document Frequency (IDF)

Mittaa, kuinka harvinainen termi on koko korpuksessa. Se voidaan laskea luonnollisena logaritmina dokumenttien kokonaismäärän ja termiä sisältävien dokumenttien määrän suhteesta:

idf(t)=log(1+Ndocuments1+df(t))+1\def\idf{\operatorname{idf}} \def\df{\operatorname{df}} \idf(t) = \log\Bigl(\frac{1 + N_{documents}}{1 + \df(t)}\Bigr) + 1

Tässä kaavassa käytetään pehmennystä (lisätään 1), jotta vältytään nollalla jakamiselta ja varmistetaan, että myös yleiset termit saavat nollasta poikkeavan IDF-arvon. Käytännössä IDF pienentää usein esiintyvien termien painoarvoa ja korostaa harvinaisempia, informatiivisempia termejä.

Ilman IDF-komponenttia TF-IDF palautuisi pelkkään termien laskentaan — käytännössä bag of words -malliin.

TF-IDF:n laskeminen

Käydään läpi yksinkertainen esimerkki:

TF-IDF-laskenta

Tässä tapauksessa meillä on vain kaksi dokumenttia ja käytämme ainoastaan unigrammeja (yksittäisiä sanoja), joten laskelmat ovat suoraviivaisia. Aloitamme laskemalla termin esiintymistiheydet jokaiselle sanalle molemmissa dokumenteissa, minkä jälkeen lasketaan termien "a" ja "is" IDF-arvot.

Note
Huomio

Koska korpuksessa on vain kaksi dokumenttia, kaikilla termeillä, jotka esiintyvät molemmissa dokumenteissa, on IDF-arvo 1, kun taas muilla termeillä IDF-arvo on ~1.406465.

Lopuksi voidaan laskea kunkin termin TF-IDF-arvot jokaisessa dokumentissa kertomalla TF IDF:llä, jolloin saadaan seuraava matriisi:

TF-IDF-matriisi

L2-normalisointi

Tuloksena saadut TF-IDF-vektorit voivat vaihdella merkittävästi suuruudeltaan, erityisesti suurissa aineistoissa, johtuen dokumenttien pituuseroista. Tämän vuoksi L2-normalisointia käytetään yleisesti — kaikkien vektorien skaalaamiseksi yhtenäiseen pituuteen, mikä mahdollistaa tasapuoliset ja puolueettomat vertailut eri pituisille dokumenteille.

Note
Lisätietoa

L2-normalisointi, joka tunnetaan myös nimellä euklidinen normalisointi, on yksittäisiin vektoreihin sovellettava prosessi, jossa niiden arvot säädetään siten, että vektorin pituudeksi tulee 1.

L2-normalisointi tehdään jakamalla jokainen vektorin termi vektorin euklidisella normilla.

Jos dokumenttivektori näyttää tältä:

d=(w1,w2,w3,...,wN)d = (w_1, w_2, w_3, ..., w_N)

missä wiw_i on termin ii paino,

niin euklidinen normi näyttää tältä:

d2=w12+w22+w32+...+wN2\|d\|_2 = \sqrt{w^2_1 + w^2_2 + w^2_3 + ... + w^2_N}

ja normalisoitu vektori näyttää tältä:

dnorm=(w1d2,w2d2,w3d2,...,wNd2)d_{norm} = \Bigl(\frac{w_1}{\|d\|_2}, \frac{w_2}{\|d\|_2}, \frac{w_3}{\|d\|_2}, ..., \frac{w_N}{\|d\|_2})

Näin L2-normalisointi toimii kaksiulotteiselle vektorille (dokumentti, jossa on 2 termiä):

L2-normalisointi
Note
Huomio

Älä huoli, vaikka kaavat näyttävät monimutkaisilta. Käytännössä jaamme jokaisen TF-IDF-arvon dokumentissa dokumentin TF-IDF-vektorin pituudella (tai magnitudilla). Tämä skaalaa vektorin niin, että sen pituudeksi tulee 1, mikä mahdollistaa vektorien johdonmukaisen vertailun.

Soveltakaamme nyt L2-normalisointia TF-IDF-matriisiin, jonka laskimme aiemmin:

TF-IDF-matriisi

Tuloksena saatu matriisi on täsmälleen sama kuin esimerkkinä yhdessä aiemmista luvuista.

question mark

Mikä on TF-IDF-mallin keskeinen etu verrattuna BoW-malliin?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 6

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 3. Luku 6
some-alt