Kako izvući ključne riječi iz teksta pomoću TF-IDF-a i Python-ovog Scikit-Learn-a

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.jsons 20.000 postova, koristi se za izračunavanje inverzne učestalosti dokumenata (IDF). Manja datoteka, stackoverflow-test.jsons 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.jsonokvira podataka pande i ispisuje njegovu shemu i ukupan broj postova.

Ovdje to lines=Truejednostavno 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 bodyi titletako 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_dfi 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_vectorje (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_sizeprilikom 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:

  1. vaš rječnik postaje premalen i
  2. 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.jsonkao š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 tomcatkoji su svi jedinstvene na ovom konkretnom pitanju.

Postoji nekoliko ključnih riječi koje su mogle biti eliminirane, possibilitya 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č appropriatelykvalificirala 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.