Hogyan lehet kiemelni a kulcsszavakat a szövegből a TF-IDF és a Python Scikit-Learn segítségével

Még 2006-ban, amikor a TF-IDF-et kellett használnom a Java kulcsszavak kinyerésére, végül a nulláról írtam az összes kódot. Sem a Data Science, sem a GitHub akkor nem volt valami dolog, és a könyvtárak csak korlátozott számban voltak.

A világ ma sokkal másabb. A Github-on több könyvtár és nyílt forráskódú tár található, amelyek a TF-IDF megfelelő megvalósítását biztosítják. Ha nem kell nagyon ellenőrizni a TF-IDF matematika kiszámítását, akkor nagyon ajánlom az ismert csomagokból származó könyvtárak újrafelhasználását, mint például a Spark MLLib vagy a Python scikit-learn.

Az egyetlen probléma , amelyet ezeknél a könyvtáraknál figyeltem fel, az az, hogy más feladatok, mint például a klaszterezés, a témamodellezés és a szöveges osztályozás előtti lépések. A TF-IDF valójában felhasználható fontos kulcsszavak kinyerésére egy dokumentumból, hogy megértsük, mi jellemzi a dokumentumot. Például, ha Wikipédia-cikkekkel foglalkozik, akkor a tf-idf segítségével kivonhatja az adott cikkhez tartozó szavakat. Ezeket a kulcsszavakat fel lehet használni egy dokumentum nagyon egyszerű összefoglalásaként, és szöveganalitikához, ha ezeket a kulcsszavakat összesítve vizsgáljuk.

Ebben a cikkben megmutatom, hogyan használhatja a scikit-learn segítségével kulcsszavakat a dokumentumokból a TF-IDF segítségével. Ezt kifejezetten egy halom túlcsordulás adatkészleten fogjuk megtenni. Ha hozzáférést szeretne kapni a teljes Jupyter Notebookhoz , kérjük, menjen át a repóhoz .

Fontos megjegyzés: Feltételezem, hogy az oktatóanyagot követők már ismerik a TF-IDF fogalmát. Ha nem, kérjük, olvassa el a koncepciót, mielőtt továbbolvasna. Van néhány online videó, amely intuitív magyarázatot ad arra, hogy mi ez. Akadémiai magyarázatként a doktori tanácsadóm magyarázatát javaslom.

Adatkészlet

Ebben a példában egy Stack Overflow adatkészletet fogunk használni, amely kissé zajos és szimulálja, hogy mivel foglalkozhatna a való életben. Ezt az adatkészletet megtalálhatja az oktatóprogramomban.

Figyelje meg, hogy két fájl van . A nagyobb, stackoverflow-data-idf.json20 000 bejegyzést tartalmazó fájlt az inverz dokumentum gyakoriságának (IDF) kiszámítására használják. A kisebb, stackoverflow-test.json500 bejegyzést tartalmazó fájlt tesztkészletként használnánk kulcsszavak kinyeréséhez. Ez az adatkészlet a Google Big Query nyilvánosan elérhető Stack Overflow dumpján alapul.

Vessünk egy pillantást az adatkészletünkre. Az alábbi kód soronként egy-egy json karakterláncot olvas data/stackoverflow-data-idf.jsonbe egy pandas adatkeretbe, és kinyomtatja annak sémáját és a bejegyzések teljes számát.

Ez lines=Trueegyszerűen azt jelenti, hogy a szövegfájl minden egyes sorát külön json karakterláncként kezeljük.

Vegye figyelembe, hogy ez a Stack Overflow adatkészlet 19 mezőt tartalmaz, beleértve a bejegyzés címét, a törzset, a címkéket, a dátumokat és más metaadatokat, amelyekre nincs szükségünk az oktatóanyaghoz. Ehhez az oktatóanyaghoz leginkább a törzs és a cím érdekel. Ezek lesznek a szövegforrásunk a kulcsszavak kinyeréséhez.

Most létrehozunk egy mezőt, amely mindkettőt egyesíti, bodyés titleígy a kettő egy mezőben van. Az új mezőnkben a második szöveges bejegyzést is kinyomtatjuk, hogy lássuk, hogyan néz ki a szöveg.

Ó, ez nem tűnik túl olvashatónak! Nos, ez az összes takarítás miatt történt pre_process(..). Sokkal több dolgot végezhet pre_process(..), például kiküszöbölhet minden kódrészletet, és normalizálhatja a szavakat a gyökeréig. Az egyszerűség kedvéért csak némi előfeldolgozást hajtunk végre.

Szókincs és szószám létrehozása az IDF számára

Most létre kell hoznunk a szókincset és el kell kezdenünk a számlálási folyamatot. A CountVectorizer segítségével szókincset hozhatunk létre az összes szövegből df_idf['text'], amelyet a szókincs szavainak száma követ:

A fenti kód utolsó két sorának eredménye a számok ritka mátrixos ábrázolása. Minden oszlop egy szót képvisel a szókincsben. Minden sor az adathalmazunk dokumentumát jelöli, ahol az értékek a szószámok.

Vegye figyelembe, hogy ezzel az ábrázolással egyes szavak száma 0 lehet, ha a szó nem szerepel a megfelelő dokumentumban.

Itt két paramétert adunk át a CountVectorizer-nek, max_dfés stop_words. Az első csak az, hogy figyelmen kívül hagyunk minden olyan szót, amely a dokumentumok 85% -ában megjelent, mivel ezek jelentéktelenek lehetnek. A későbbi egy egyedi leállítási szavak listája. Beállítással használhat olyan leállítási szavakat is, amelyek natívak a sklearn számára stop_words='english'. Az oktatóanyaghoz használt stop szó lista itt található.

Az így kapott alakja word_count_vector(20000,124901), mivel 20 000 dokumentum van az adatkészletünkben (a sorok), és a szókincs mérete 124 901.

Egyes szövegbányászati ​​alkalmazásokban, mint például a klaszterezés és a szövegosztályozás, általában korlátozzuk a szókincs méretét. Nagyon könnyű ezt megtenni a beállítással a max_features=vocab_sizeCountVectorizer példányának létrehozásakor. Ehhez az oktatóanyaghoz szűkítsük szókincsünket 10 000-re:

Most nézzünk meg 10 szót a szókincsünkből:

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

Édes, ezek többnyire programozással kapcsolatosak.

TfidfTransformer az IDF kiszámításához

Itt az ideje, hogy kiszámolja az IDF értékeket.

Az alábbi kódban lényegében a ritka mátrixot vesszük a CountVectorizer ( word_count_vector) -ből az IDF előállításához, amikor meghívja fit(...):

Rendkívül fontos szempont : az IDF-nek mindig nagy korpuszokra kell épülnie, és reprezentatívnak kell lennie azokra a szövegekre, amelyeket a kulcsszavak kinyerésére használna. Számos olyan cikket láttam már az interneten, amelyek az IDF-et kiszámítják egy maroknyi dokumentum felhasználásával. Meg fogja győzni az IDF súlyozás teljes célját , ha az nem egy nagy korpuszon alapszik, mint:

  1. a szókincsed túl kicsi lesz, és
  2. korlátozott képességed van megfigyelni a szavak viselkedését, amelyekről tudsz.

A TF-IDF kiszámítása és a kulcsszavak kibontása

Miután kiszámoltuk az IDF -ünket, készen állunk a TF-IDF kiszámítására, majd a legfontosabb kulcsszavak kivonására a TF-IDF vektorokból.

Ebben a példában kibontjuk a legfontosabb kulcsszavakat a kérdésekben data/stackoverflow-test.json. Ennek az adatfájlnak 500 kérdése van, a mezők megegyeznek a data/stackoverflow-data-idf.jsonfentiekkel. Kezdjük azzal, hogy elolvassuk a tesztfájlunkat, kibontjuk a szükséges mezőket - cím és törzs -, és felsoroljuk a szövegeket.

A következő lépés az, hogy meghívással kiszámoljuk a tesztkészletünk egy adott dokumentumának tf-idf értékét tfidf_transformer.transform(...). Ez generálja a tf-idf pontszámok vektorát.

Ezután a vektorban lévő szavakat a tf-idf értékek csökkenő sorrendjében rendezzük, majd ismétléssel a top-n kulcsszavak kibontásához. Az alábbi példában kulcsszavakat vonunk le a tesztkészletünk első dokumentumához.

A sort_coo(...)módszer lényegében a vektorban lévő értékeket rendezi, megőrizve az oszlopindexet. Ha megvan az oszlopindex, akkor nagyon könnyű megkeresni a megfelelő szóértéket, ahogyan azt látnánk, extract_topn_from_vector(...)ahol csináljuk feature_vals.append(feature_names[idx]).

Néhány eredmény!

Ebben a szakaszban látni fogja a verem túlcsordulás kérdését, amelyet a megfelelő kibontott kulcsszavak követnek.

Kérdés az Eclipse Plugin integrációjáról

A fenti kulcsszavak, a felső kulcsszavak valóban van értelme, beszél eclipse, maven, integrate, war, és tomcat, melyek mindegyike egyedi erre a kérdésre.

Van néhány kulcsszó, amelyet ki lehetne küszöbölni, mint például possibilityés talán project. Ezt úgy teheti meg, hogy általánosabb szavakat ad hozzá a leállítási listához. Akár saját, a saját domainjére jellemző leállítási listát is létrehozhat.

Most nézzünk meg egy másik példát.

Kérdés az SQL importálásról

Még az összes html címke mellett is, az előfeldolgozás miatt itt elég szép kulcsszavakat tudunk kinyerni. Az utolsó szó appropriatelymegállító szónak minősülne. Folytathat különböző példákat, hogy ötleteket szerezzen az eredmények finomhangolásához.

Voálá! Most bármilyen típusú szövegből kivonhatja a fontos kulcsszavakat!

Erőforrások

  • Az oktatóanyag teljes forráskódja és adatkészlete
  • Túlcsorduló adatokat halmozhat a Google BigQuery-jén

Kövesse a blogomat, hogy többet tudjon meg a szövegbányászatról, az NLP-ről és a gépi tanulásról egy alkalmazott szempontból.

Ezt a cikket eredetileg a kavita-ganesan.com címen tették közzé.