
Davne 2006. godine, kada sam morao koristiti TF-IDF za izdvajanje ključnih riječi u Javi, završio sam ispisujući sav kôd ispočetka. Tada ni Data Science ni GitHub nisu bili stvar, a knjižnice su bile samo ograničene.
Svijet je danas puno drugačiji. Na Githubu imate nekoliko knjižnica i spremišta otvorenog koda koji pružaju pristojnu implementaciju TF-IDF-a. Ako vam nije potrebna velika kontrola nad izračunavanjem TF-IDF matematike, toplo preporučujem ponovnu upotrebu knjižnica iz poznatih paketa kao što su Spark-ov MLLib ili Python-ov scikit-learn.
Jedini problem koji sam primijetio kod ovih knjižnica je taj što su zamišljeni kao predkorak za druge zadatke poput klasterizacije, modeliranja tema i klasifikacije teksta. TF-IDF se zapravo može koristiti za izdvajanje važnih ključnih riječi iz dokumenta kako bi se stekao osjećaj što karakterizira dokument. Na primjer, ako imate posla s člancima na Wikipediji, možete koristiti tf-idf za izdvajanje riječi koje su jedinstvene za dati članak. Te se ključne riječi mogu koristiti kao vrlo jednostavan sažetak dokumenta i za tekstualnu analitiku kada ove ključne riječi promatramo zajedno.
U ovom članku pokazat ću vam kako pomoću scikit-learna možete izvući ključne riječi iz dokumenata pomoću TF-IDF-a. To ćemo posebno učiniti na skupu podataka preljeva steka. Ako želite pristup cjelovitoj Jupyterovoj bilježnici , prijeđite na moj repo.
Važna napomena: Pretpostavljam da su ljudi koji slijede ovaj vodič već upoznati s konceptom TF-IDF-a. Ako niste, prije početka čitanja upoznajte se s konceptom. Postoji nekoliko videozapisa na mreži koji intuitivno objašnjavaju što je to. Za akademskija objašnjenja preporučio bih objašnjenje mog doktora nauka.
Skup podataka
U ovom ćemo primjeru koristiti skup podataka Stack Overflow koji je pomalo bučan i simulira ono s čime biste se mogli nositi u stvarnom životu. Ovaj skup podataka možete pronaći u mom repo tutorialu.
Primijetite da postoje dvije datoteke . Veća datoteka, stackoverflow-data-idf.json
s 20.000 postova, koristi se za izračunavanje inverzne učestalosti dokumenata (IDF). Manja datoteka, stackoverflow-test.json
s 500 postova, koristila bi se kao testni skup za izdvajanje ključnih riječi. Ovaj se skup podataka temelji na javno dostupnom odlagalištu Stack Overflow iz Googleova velikog upita.
Zavirimo u naš skup podataka. Kôd u nastavku čita json niz po retku iz data/stackoverflow-data-idf.json
okvira podataka pande i ispisuje njegovu shemu i ukupan broj postova.
Ovdje to lines=True
jednostavno znači da svaki redak u tekstualnoj datoteci tretiramo kao zaseban json niz.


Primijetite da ovaj niz podataka Stacka Overflow sadrži 19 polja, uključujući naslov posta, tijelo, oznake, datume i druge metapodatke koji nam nisu potrebni za ovaj vodič. U ovom nas vodiču najviše zanimaju sadržaj i naslov. Oni će postati naš izvor teksta za izdvajanje ključnih riječi.
Sada ćemo stvoriti polje koje kombinira oboje body
i title
tako imamo dva u jednom polju. Ispisat ćemo i drugi unos teksta u našem novom polju samo da bismo vidjeli kako tekst izgleda.

Uh, ovo ne izgleda baš čitljivo! Pa, to je zbog cjelokupnog čišćenja pre_process(..)
. Možete napraviti puno više stvari pre_process(..)
, na primjer eliminirati sve odjeljke koda i normalizirati riječi u korijen. Radi jednostavnosti izvršit ćemo samo neke blage predobrade.
Stvaranje rječnika i broja riječi za IDF
Sada moramo stvoriti rječnik i započeti postupak brojanja. CountVectorizer možemo koristiti za stvaranje rječnika iz cijelog teksta u našem df_idf['text']
, a zatim slijedi brojanje riječi u rječniku:

Rezultat posljednja dva retka iz gornjeg koda je oskudni matrični prikaz brojanja. Svaki stupac predstavlja riječ u rječniku. Svaki redak predstavlja dokument u našem skupu podataka, gdje su vrijednosti brojevi riječi.
Imajte na umu da bi s ovim prikazom broj nekih riječi mogao biti 0 ako se riječ ne pojavi u odgovarajućem dokumentu.
Ovdje prosljeđujemo dva parametra CountVectorizeru max_df
i stop_words
. Prva je samo zanemarivanje svih riječi koje su se pojavile u 85% dokumenata, jer one mogu biti nevažne. Kasnije je prilagođeni popis zaustavnih riječi. Također možete koristiti zaustavljanje riječi koje su izvorne za sklearn postavljanjem stop_words='english'
. Popis zaustavnih riječi korišten za ovaj vodič možete pronaći ovdje.
Rezultirajući oblik word_count_vector
je (20000,124901), jer u našem skupu podataka (redovi) imamo 20 000 dokumenata, a veličina rječnika je 124 901.
U nekim aplikacijama za rukovanje tekstom, poput grupiranja i klasifikacije teksta, obično ograničavamo veličinu rječnika. To je stvarno lako učiniti postavljanjem max_features=vocab_size
prilikom instanciranja CountVectorizer-a. U ovom uputstvu ograničimo veličinu rječnika na 10 000:

Pogledajmo sada 10 riječi iz našeg rječnika:

['serializing', 'private', 'struct', 'public', 'class', 'contains', 'properties', 'string', 'serialize', 'attempt']
Slatko, to su uglavnom povezane s programiranjem.
TfidfTransformer za izračunavanje IDF-a
Sada je vrijeme za izračunavanje IDF vrijednosti.
U donjem kodu u osnovi preuzimamo rijetku matricu od CountVectorizer ( word_count_vector
) da bismo generirali IDF kada pozivate fit(...)
:

Izuzetno važna stvar : IDF bi se uvijek trebao temeljiti na velikim korpusima i trebao bi predstavljati tekstove koje biste koristili za izdvajanje ključnih riječi. Na webu sam vidio nekoliko članaka koji izračunavaju IDF koristeći pregršt dokumenata. Porazit ćete cijelu svrhu ponderiranja IDF-a ako se ne temelji na velikim korpusima kao što su:
- vaš rječnik postaje premalen i
- imate ograničenu sposobnost promatranja ponašanja riječi za koje znate.
Izračunavanje TF-IDF-a i izdvajanje ključnih riječi
Nakon što izračunamo svoj IDF, spremni smo izračunati TF-IDF, a zatim izvući ključne riječi iz vektora TF-IDF-a.
U ovom ćemo primjeru izdvojiti glavne ključne riječi za pitanja u data/stackoverflow-test.json
. Ova datoteka podataka sadrži 500 pitanja s poljima identičnim onima data/stackoverflow-data-idf.json
kao što smo vidjeli gore. Započet ćemo čitanjem naše testne datoteke, izdvajanjem potrebnih polja - naslova i teksta - i stavljanjem tekstova na popis.

Sljedeći je korak izračunavanjem vrijednosti tf-idf za zadani dokument u našem testnom skupu pozivanjem tfidf_transformer.transform(...)
. Ovo generira vektor tf-idf rezultata.
Dalje, riječi u vektoru sortiramo silaznim redoslijedom vrijednosti tf-idf, a zatim ponovimo postupak izvlačenja ključnih riječi n. U primjeru u nastavku izdvajamo ključne riječi za prvi dokument u našem testnom skupu.


sort_coo(...)
Postupak uglavnom sortira vrijednosti u vektoru čuvajući indeks stupca. Jednom kada imate indeks stupaca, zaista je lako potražiti odgovarajuću vrijednost riječi kao što biste vidjeli extract_topn_from_vector(...)
gdje radimo feature_vals.append(feature_names[idx])
.
Neki rezultati!
U ovom ćete odjeljku vidjeti pitanje prelijevanja stoga praćeno odgovarajućim izdvojenim ključnim riječima.
Pitanje o integraciji dodatka Eclipse

Iz gore navedenih ključnih riječi, vrh ključne riječi zapravo smisla, to govori o eclipse
, maven
, integrate
, war
, i tomcat
koji su svi jedinstvene na ovom konkretnom pitanju.
Postoji nekoliko ključnih riječi koje su mogle biti eliminirane, possibility
a možda čak i project
. To možete učiniti dodavanjem još uobičajenih riječi na svoj zaustavni popis. Možete čak stvoriti svoj vlastiti skup zaustavljanja, vrlo specifičan za vašu domenu.
Pogledajmo sada još jedan primjer.
Pitanje o SQL uvozu

Čak i sa svim html oznakama, zbog predobrade, ovdje smo u stanju izdvojiti neke prilično lijepe ključne riječi. Posljednja riječ appropriately
kvalificirala bi se kao zaustavna riječ. Možete nastaviti prikazivati različite primjere kako biste dobili ideje kako precizno podesiti rezultate.
Voilà! Sada možete izvući važne ključne riječi iz bilo koje vrste teksta!
Resursi
- Potpuni izvorni kod i skup podataka za ovaj vodič
- Slažite prekomjerne podatke na Googleovom BigQueryju
Slijedite moj blog da biste saznali više o rudarstvu teksta, NLP-u i strojnom učenju iz primijenjene perspektive.
Ovaj je članak izvorno objavljen na kavita-ganesan.com.