de Kavita Ganesan

Cum se extrag cuvinte cheie din text cu TF-IDF și Python’s Scikit-Learn

Cum se extrag cuvinte cheie din text cu TF IDF si

În 2006, când a trebuit să folosesc TF-IDF pentru extragerea cuvintelor cheie în Java, am ajuns să scriu tot codul de la zero. Nici Data Science, nici GitHub nu erau un lucru pe atunci, iar bibliotecile erau doar limitate.

Lumea este mult diferită astăzi. Ai mai multe biblioteci și depozite de coduri open-source pe Github care oferă o implementare decentă a TF-IDF. Dacă nu aveți nevoie de mult control asupra modului în care se calculează matematica TF-IDF, vă recomand să reutilizați bibliotecile din pachete cunoscute, cum ar fi MLLib-ul lui Spark sau Python’s scikit-learn.

o problema pe care l-am observat cu aceste biblioteci este că acestea sunt menite ca o etapă prealabilă pentru alte sarcini precum clusterizarea, modelarea subiectelor și clasificarea textului. TF-IDF poate fi de fapt folosit pentru a extrage cuvinte cheie importante dintr-un document pentru a avea o idee despre ceea ce caracterizează un document. De exemplu, dacă aveți de-a face cu articole Wikipedia, puteți utiliza tf-idf pentru a extrage cuvinte care sunt unice pentru un anumit articol. Aceste cuvinte cheie pot fi utilizate ca un rezumat foarte simplu al unui document și pentru analize de text atunci când analizăm aceste cuvinte cheie în ansamblu.

În acest articol, Vă voi arăta cum puteți utiliza scikit-learn pentru a extrage cuvinte cheie din documente folosind TF-IDF. Vom face acest lucru în mod specific pe un set de date de depășire a stivei. Dacă doriți acces la Notebook complet Jupyter, Vă rog mergeți la repo.

Notă importantă: Presupun că oamenii care urmează acest tutorial sunt deja familiarizați cu conceptul TF-IDF. Dacă nu sunteți, vă rugăm să vă familiarizați cu conceptul înainte de a citi mai departe. Există câteva videoclipuri online care oferă o explicație intuitivă a ceea ce este. Pentru o explicație mai academică aș recomanda-o pe Explicația consilierului de doctorat.

Set de date

În acest exemplu, vom folosi un set de date Stack Overflow, care este puțin zgomotos și simulează ceea ce ai putea avea de-a face cu viața reală. Puteți găsi acest set de date în repo tutorialul meu.

Observați că există două fișiere. Fișierul mai mare, stackoverflow-data-idf.json cu 20.000 de postări, este folosit pentru a calcula Frecvența Documentelor Inverse (IDF). Fișierul mai mic, stackoverflow-test.json cu 500 de postări, ar fi folosit ca set de test pentru a extrage cuvinte cheie din. Acest set de date se bazează pe datele disponibile publicului Stack Overflow dump din interogarea mare Google.

Să aruncăm o privire asupra setului nostru de date. Codul de mai jos citește un șir json de pe linie data/stackoverflow-data-idf.json într-un cadru de date pandas și imprimă schema și numărul total de postări.

Aici, lines=True înseamnă pur și simplu că tratăm fiecare linie din fișierul text ca un șir json separat.

Cum se extrag cuvinte cheie din text cu TF IDF si
Citiți fișierul json și imprimați schema și numărul total de postări Stack Overflow.
1611240186 514 Cum se extrag cuvinte cheie din text cu TF IDF si
Schema și numărul total de postări.

Observați că acest set de date Stack Overflow conține 19 câmpuri, inclusiv titlul postului, corpul, etichetele, datele și alte metadate de care nu avem nevoie pentru acest tutorial. Pentru acest tutorial, ne interesează în principal corpul și titlul. Acestea vor deveni sursa noastră de text pentru extragerea cuvintelor cheie.

Vom crea acum un câmp care să le combine pe ambele body și title deci îi avem pe cei doi într-un singur domeniu. De asemenea, vom imprima a doua intrare de text în noul nostru câmp doar pentru a vedea cum arată textul.

1611240186 184 Cum se extrag cuvinte cheie din text cu TF IDF si

Uh oh, nu pare foarte lizibil! Ei bine, asta din cauza tuturor curățărilor care au avut loc pre_process(..). Puteți face mult mai multe lucruri în pre_process(..), cum ar fi eliminarea tuturor secțiunilor de cod și normalizarea cuvintelor la rădăcina sa. Pentru simplitate, vom efectua doar câteva prelucrări ușoare.

Crearea vocabularului și a numărului de cuvinte pentru IDF

Acum trebuie să creăm vocabularul și să începem procesul de numărare. Putem folosi CountVectorizer pentru a crea un vocabular din tot textul din df_idf['text'] , urmat de numărul de cuvinte din vocabular:

1611240187 754 Cum se extrag cuvinte cheie din text cu TF IDF si

Rezultatul ultimelor două linii din codul de mai sus este o reprezentare a matricei rare a numărărilor. Fiecare coloană reprezintă un cuvânt din vocabular. Fiecare rând reprezintă documentul din setul nostru de date, unde valorile sunt numărul de cuvinte.

Notă că, cu această reprezentare, numărul unor cuvinte ar putea fi 0 dacă cuvântul nu ar apărea în documentul corespunzător.

Aici trecem doi parametri către CountVectorizer, max_df și stop_words. Primul este doar să ignori toate cuvintele care au apărut în 85% din documente, deoarece acestea pot fi neimportante. Ultima este o listă personalizată de cuvinte de oprire. Puteți utiliza, de asemenea, cuvinte stop care sunt native pentru sklearn prin setare stop_words="english". Lista de cuvinte de oprire folosită pentru acest tutorial poate fi găsită aici.

Forma rezultată a word_count_vector este (20000,124901), deoarece avem 20,000 de documente în setul nostru de date (rândurile), iar dimensiunea vocabularului este de 124,901.

În unele aplicații de extragere a textului, cum ar fi clusterizarea și clasificarea textului, de obicei limităm dimensiunea vocabularului. Este foarte ușor să faceți acest lucru setând max_features=vocab_size atunci când instanțiază CountVectorizer. Pentru acest tutorial să ne limităm dimensiunea vocabularului la 10.000:

1611240187 553 Cum se extrag cuvinte cheie din text cu TF IDF si

Acum, să analizăm 10 cuvinte din vocabularul nostru:

1611240187 775 Cum se extrag cuvinte cheie din text cu TF IDF si
['serializing', 'private', 'struct', 'public', 'class', 'contains', 'properties', 'string', 'serialize', 'attempt']

Dulce, acestea sunt în mare parte legate de programare.

TfidfTransformer pentru a calcula IDF

Este timpul să calculăm valorile IDF.

În codul de mai jos, luăm în esență matricea rară de la CountVectorizer (word_count_vector) pentru a genera IDF atunci când invocați fit(...) :

1611240187 517 Cum se extrag cuvinte cheie din text cu TF IDF si

Punct extrem de important: IDF ar trebui să se bazeze întotdeauna pe corpuri mari și ar trebui să fie reprezentativ pentru textele pe care le-ați folosi pentru a extrage cuvinte cheie. Am văzut mai multe articole pe Web care calculează IDF folosind o mână de documente. Tu vei învinge întregul scop a ponderii IDF dacă nu se bazează pe corpuri mari ca:

  1. vocabularul tău devine prea mic și
  2. aveți capacitate limitată de a observa comportamentul cuvintelor despre care știți.

Calculul TF-IDF și extragerea cuvintelor cheie

Odată ce am calculat IDF, suntem gata să calculăm TF-IDF și apoi să extragem cuvinte cheie de top din vectorii TF-IDF.

În acest exemplu, vom extrage cuvintele cheie de top pentru întrebările din data/stackoverflow-test.json. Acest fișier de date are 500 de întrebări cu câmpuri identice cu cel de data/stackoverflow-data-idf.json așa cum am văzut mai sus. Vom începe prin citirea fișierului nostru de testare, extragerea câmpurilor necesare – titlu și corp – și introducerea textelor într-o listă.

1611240187 506 Cum se extrag cuvinte cheie din text cu TF IDF si

Următorul pas este să calculăm valoarea tf-idf pentru un document dat în setul nostru de testare prin invocare tfidf_transformer.transform(...). Aceasta generează un vector de scoruri tf-idf.

Apoi, sortăm cuvintele din vector în Descendentă ordinea valorilor tf-idf și apoi iterați pentru a extrage primele-n cuvinte cheie. În exemplul de mai jos, extragem cuvinte cheie pentru primul document din setul nostru de testare.

1611240187 122 Cum se extrag cuvinte cheie din text cu TF IDF si
1611240187 348 Cum se extrag cuvinte cheie din text cu TF IDF si

sort_coo(...) metoda sortează în esență valorile din vector păstrând în același timp indexul coloanei. Odată ce aveți indexul coloanei, este foarte ușor să căutați valoarea cuvântului corespunzător așa cum ați vedea în extract_topn_from_vector(...) unde facem feature_vals.append(feature_names[idx]).

Câteva rezultate!

În această secțiune, veți vedea întrebarea de depășire a stivei urmată de cuvintele cheie extrase corespunzătoare.

Întrebare despre integrarea pluginului Eclipse

1611240187 731 Cum se extrag cuvinte cheie din text cu TF IDF si
Cuvinte cheie extrase efectiv.

Din cuvintele cheie de mai sus, cuvintele cheie de sus au de fapt sens, se vorbește despre eclipse, maven, integrate, war, și tomcat, care sunt toate unice pentru această întrebare specifică.

Există câteva cuvinte cheie care ar fi putut fi eliminate, cum ar fi possibility și poate chiar project. Puteți face acest lucru adăugând cuvinte mai frecvente în lista dvs. de opriri. Puteți chiar crea propriul set de liste de opriri, foarte specific domeniului dvs..

Acum să ne uităm la un alt exemplu.

Întrebare despre importul SQL

1611240187 787 Cum se extrag cuvinte cheie din text cu TF IDF si
Cuvinte cheie extrase efectiv

Chiar și cu toate etichetele html, datorită pre-procesării, putem extrage aici câteva cuvinte cheie destul de frumoase. Ultimul cuvant appropriately s-ar califica drept cuvânt de oprire. Puteți continua să difuzați diferite exemple pentru a obține idei despre cum să reglați fin rezultatele.

Voilà! Acum puteți extrage cuvinte cheie importante din orice tip de text!

Resurse

Urmăriți blogul meu pentru a afla mai multe Text Mining, NLP și Machine Learning dintr-o perspectivă aplicată.

Acest articol a fost publicat inițial la kavita-ganesan.com.