Kuidas TF-IDF-i ja Pythoni Scikit-Learn abil märksõnu tekstist välja tõmmata

Veel 2006. aastal, kui pidin Java-märksõnade väljavõtmiseks kasutama TF-IDF-i, kirjutasin lõpuks kogu koodi nullist. Ei Data Science ega GitHub polnud toona asi ja raamatukogud olid lihtsalt piiratud.

Tänapäeval on maailm palju erinev. Teil on Githubis mitu teeki ja avatud lähtekoodiga hoidlat, mis pakuvad TF-IDF-i korralikku rakendust. Kui te ei vaja palju kontrolli selle üle, kuidas TF-IDF-i matemaatikat arvutatakse, soovitan soojalt taaskasutada tuntud pakettide nagu Sparki MLLib või Pythoni scikit-learn teeke.

Üks probleem , et ma märkasin neid raamatukogud on, et nad on mõeldud eelnevalt samm muid ülesandeid nagu klastrite teema modelleerimine ja tekstiliigitamissüsteemide. TF-IDF-i saab tegelikult kasutada dokumendist oluliste märksõnade väljavõtmiseks, et mõista, mis dokumenti iseloomustab. Näiteks kui tegelete Vikipeedia artiklitega, saate tf-idf abil välja tõmmata sõnad, mis on antud artiklile unikaalsed. Neid märksõnu saab kasutada dokumendi väga lihtsa kokkuvõttena ja tekstianalüütika jaoks, kui vaatame neid märksõnu kokku.

Selles artiklis näitan teile, kuidas saate faili scikit-learn abil TF-IDF-i abil dokumentidest märksõnu välja tõmmata. Teeme seda spetsiaalselt korstna ületäitumise andmestikul. Kui soovite juurdepääsu täielikule Jupyteri märkmikule , pöörduge palun minu repo poole.

Oluline märkus: eeldan, et seda õpetust järgivad inimesed on juba TF-IDF-i mõistega tuttavad. Kui te seda ei ole, tutvuge palun enne selle lugemist kontseptsiooniga. Internetis on paar videot, mis annavad intuitiivse selgituse selle kohta, mis see on. Akadeemilisema selgituse saamiseks soovitaksin oma doktorinõustaja selgitust.

Andmekogum

Selles näites kasutame Stack Overflow andmekogumit, mis on natuke lärmakas ja simuleerib seda, millega võiksite tegelikus elus tegeleda. Selle andmekogumi leiate minu juhendaja repost.

Pange tähele, et faile on kaks . Suuremat, stackoverflow-data-idf.json20 000 postitusega faili kasutatakse pöörddokumendi sageduse (IDF) arvutamiseks. Väiksemat faili, stackoverflow-test.json500 postitust, kasutataks testkomplektina, millest saaksime märksõnu välja võtta. See andmekogum põhineb Google'i Big Query avalikult kättesaadaval Stack Overflow dumpil.

Heidame pilgu meie andmekogumisse. Allolev kood loeb ühe rea kohta JSONi stringi data/stackoverflow-data-idf.jsonpandade andmekaadrisse ja prindib välja selle skeemi ja postituste koguarvu.

Siin lines=Truetähendab see lihtsalt seda, et käsitleme kõiki tekstifaili ridu eraldi jsoni stringidena.

Pange tähele, et see virna ületäitumise andmekogum sisaldab 19 välja, sealhulgas postituse pealkiri, sisu, sildid, kuupäevad ja muud metaandmed, mida me selle õpetuse jaoks ei vaja. Selle õpetuse jaoks huvitab meid peamiselt keha ja pealkiri. Nendest saab meie märksõnade väljavõtte tekstiallikas.

Loome nüüd välja, mis ühendab mõlemad bodyja titlenii on meil need kaks ühes valdkonnas. Trükime ka oma uue välja teise tekstikirje lihtsalt selleks, et näha, kuidas tekst välja näeb.

Oh, see ei tundu eriti loetav! Noh, seda kogu koristamise pärast, mis sisse läks pre_process(..). Saate teha palju rohkem asju pre_process(..), näiteks kõrvaldada kõik koodilõigud ja normaliseerida sõnad juurte järgi. Lihtsuse huvides teostame vaid mõningast kerget eeltöötlust.

IDF-i jaoks sõnavara ja sõnade loendamine

Nüüd peame looma sõnavara ja alustama loendamisprotsessi. CountVectorizeriga saame luua sõnavara kogu meie tekstist df_idf['text'], millele järgneb sõnavaras olevate sõnade arv:

Kahe viimase rea tulemus ülaltoodud koodist on arvude hõre maatriksesitus. Iga veerg tähistab sõna sõnavaras. Iga rida tähistab meie andmekogumi dokumenti, kus väärtuseks on sõna loend.

Pange tähele, et selle esituse korral võib mõne sõna arv olla 0, kui seda sõna vastavas dokumendis ei kuvata.

Siin edastame CountVectorizerile kaks parameetrit max_dfja stop_words. Esimene on lihtsalt ignoreerida kõiki sõnu, mis on ilmunud 85% dokumentidest, kuna need võivad olla ebaolulised. Hilisem on kohandatud peatussõnade loend. Seadistades saate kasutada ka stopp-sõnu, mis on sklearnile omased stop_words='english'. Selle õpetuse jaoks kasutatud peatussõnade loendi leiate siit.

Saadud kuju word_count_vectoron (20000,124901), kuna meil on 20 000 dokumenti (ridu) ja sõnavara suurus on 124 901.

Mõnes tekstikaevamisrakenduses, näiteks klastrite moodustamisel ja tekstide klassifitseerimisel, piirame tavaliselt sõnavara suurust. max_features=vocab_sizeCountVectorizeri kiirendamisel on seda tõesti lihtne seadistada . Selle õpetuse jaoks piirdume oma sõnavara suurusega 10 000:

Vaatame nüüd 10 sõna oma sõnavarast:

['serializing', 'private', 'struct', 'public', 'class', 'contains', 'properties', 'string', 'serialize', 'attempt']

Armas, need on enamasti seotud programmeerimisega.

TfidfTransformer IDF-i arvutamiseks

Nüüd on aeg arvutada IDF-i väärtused.

Allpool olevas koodis võtame word_count_vectorIDF-i loomiseks, kui käivitate, sisuliselt hõreda maatriksi CountVectorizerist ( ) fit(...):

Äärmiselt oluline punkt : IDF peaks alati põhinema suurtel korpustel ja see peaks esindama tekste, mida kasutaksite märksõnade väljavõtmiseks. Olen veebis näinud mitmeid artikleid, mis arvutavad IDF-i käputäie dokumentide abil. Sa mõttekuse üleüldse IDF massiga kui see ei ole põhineb suures korpusi nagu:

  1. teie sõnavara muutub liiga väikeseks ja
  2. teil on piiratud võime jälgida sõnade käitumist, millest teate.

TF-IDF-i arvutamine ja märksõnade väljavõtmine

Kui meie IDF on arvutatud, oleme valmis arvutama TF-IDF ja seejärel ekstraheerima TF-IDF vektoritest peamised märksõnad.

Selles näites toome välja peamised märksõnad küsimustele data/stackoverflow-test.json. Sellel andmefailil on 500 küsimust väljadega, mis on identsed data/stackoverflow-data-idf.jsonülaltooduga. Alustame oma testfaili lugemisest, vajalike väljade - pealkirja ja keha - väljavõtmisega ning tekstide loendisse toomisega.

Järgmine samm on meie testikomplekti antud dokumendi tf-idf väärtuse arvutamine, kutsudes seda üles tfidf_transformer.transform(...). See genereerib tf-idf skooride vektori.

Järgmisena sorteerime vektoris olevad sõnad tf-idf väärtuste kahanevas järjekorras ja seejärel kordame ülemise n märksõna väljavõtmiseks. Allpool toodud näites eraldame märksõnad meie testikomplekti esimese dokumendi jaoks.

sort_coo(...)Meetodi olemus sorteerib väärtuste vektor säilitades tulba indeksile. Kui teil on veergude register, on vastava sõna väärtuse otsimine väga lihtne, nagu näeksite seal, extract_topn_from_vector(...)kus me teeme feature_vals.append(feature_names[idx]).

Mõned tulemused!

Selles jaotises näete virna ületäitumise küsimust, millele järgnevad vastavad eraldatud märksõnad.

Küsimus Eclipse'i pistikprogrammi integreerimise kohta

Alates ülaltoodud märksõnadele, top märksõnad tegelikult mõtet, see räägib eclipse, maven, integrate, war, ja tomcat, mis on kõik unikaalne selle konkreetse küsimuse.

On paar märksõna, mille oleks võinud kõrvaldada, näiteks possibilityja võib-olla isegi project. Seda saate teha, lisades oma peatusloendisse tavalisemad sõnad. Võite isegi luua oma peatusloendi, mis on teie domeenile väga spetsiifiline.

Nüüd vaatame veel ühte näidet.

Küsimus SQL-i impordi kohta

Isegi kõigi HTML-märgenditega suudame eeltöötluse tõttu siin välja tuua mõned päris toredad märksõnad. Viimane sõna appropriatelykvalifitseeruks peatussõnaks. Tulemuste täpsustamiseks ideede saamiseks võite jätkata erinevate näidete esitamist.

Voilà! Nüüd saate olulised märksõnad välja tõmmata mis tahes tüüpi tekstist!

Ressursid

  • Selle õpetuse täielik lähtekood ja andmekogum
  • Virnake ülevooluandmed Google'i BigQuery'sse

Järgige minu blogi, et saada lisateavet tekstikaevanduse, NLP ja masinõppe kohta rakenduslikust vaatenurgast.

See artikkel avaldati algselt aadressil kavita-ganesan.com.