Naiv Bayes szövegosztályozó fejlesztése JAVA PlatoBlockchain Data Intelligence-ben. Függőleges keresés. Ai.

Naiv Bayes szövegosztályozó fejlesztése JAVA-ban

Korábbi cikkeinkben az elméleti hátteret tárgyaltuk Naiv Bayes szövegosztályozó és a használat fontossága Funkciókiválasztási technikák a szöveges osztályozásban. Ebben a cikkben mindent összeállítunk, és elkészítjük a Naive Bayes szövegosztályozó algoritmus egyszerű megvalósítását JAVA-ban. Az osztályozó kódja nyílt forráskódú (GPL v3 licenc alatt), és letölthető innen GitHub.

Frissítés: A Datumbox Machine Learning Framework nyílt forráskódú és ingyenes letöltés. Tekintse meg a com.datumbox.framework.machinelearning.classification csomagot a Naive Bayes Classifier Java nyelven való megvalósításának megtekintéséhez.

Naív Bayes Java implementáció

A kód JAVA nyelven íródott, és közvetlenül letölthető innen GitHub. A GPLv3 licenc alatt van, így nyugodtan használhatja, módosíthatja és szabadon terjesztheti.

A Szövegosztályozó megvalósítja a Multinomiális Naive Bayes modell együtt a Chisquare funkció kiválasztása algoritmus. Mindkét technika működésének minden elméleti részlete megtalálható a korábbi cikkekben, és részletes javadoc megjegyzések találhatók a megvalósítást leíró forráskódon. Így ebben a szegmensben az osztályozó architektúrájának magas szintű leírására fogok összpontosítani.

1. NaiveBayes osztály

Ez a szövegosztályozó fő része. Olyan módszereket valósít meg, mint például a train() és a prediction(), amelyek felelősek az osztályozó betanításáért és az előrejelzésekhez való felhasználásáért. Meg kell jegyezni, hogy ez az osztály felelős azért is, hogy meghívja a megfelelő külső módszereket a dokumentum előfeldolgozására és tokenizálására a betanítás/előrejelzés előtt.

2. NaiveBayesKnowledgeBase objektum

A képzés kimenete egy NaiveBayesKnowledgeBase objektum, amely tárolja az összes szükséges információt és valószínűséget, amelyet a Naive Bayes osztályozó használ.

3. Dokumentumobjektum

Mind a betanítás, mind a predikciós szövegek a megvalósításban belsőleg dokumentumobjektumként vannak tárolva. A Dokumentumobjektum a dokumentum összes tokenjét (szavait), azok statisztikáit és a dokumentum célosztályozását tárolja.

4. FeatureStats Object

A FeatureStats objektum számos statisztikát tárol, amelyek a Feature Extraction fázis során jönnek létre. Ilyen statisztika a jellemzők és osztályok együttes száma (amelyből a közös valószínűségek és valószínűségek becslése történik), az osztályok száma (amelyből a prioritásokat kiértékeli, ha nem adjuk meg bemenetként) és a képzéshez használt megfigyelések teljes száma.

5. FeatureExtraction Class

Ez az az osztály, amely a jellemzők kinyeréséért felelős. Meg kell jegyezni, hogy mivel ez az osztály a későbbi szakaszban az osztályozási algoritmus által ténylegesen megkövetelt statisztikák közül többet számít ki, ezek a statisztikák gyorsítótárazásra kerülnek, és egy FeatureStats objektumban kerülnek visszaadásra, hogy elkerüljék az újraszámításukat.

6. TextTokenenizer osztály

Ez egy egyszerű szöveg tokenizációs osztály, amely az eredeti szövegek előfeldolgozásáért, törléséért és tokenizálásáért, valamint Dokumentum objektumokká konvertálásáért felelős.

A NaiveBayes JAVA osztály használata

A NaiveBayesExample osztályban példákat találhat a NaiveBayes osztály használatára. A mintakód célja egy olyan példa bemutatása, amely egy egyszerű naiv Bayes osztályozót tanít a szöveg nyelvének észlelésére. Az osztályozó betanításához először megadjuk a betanítási adatkészletek elérési útját egy HashMap-ben, majd betöltjük azok tartalmát.

   //map of dataset files
   Map<String, URL> trainingFiles = new HashMap<>();
   trainingFiles.put("English", NaiveBayesExample.class.getResource("/datasets/training.language.en.txt"));
   trainingFiles.put("French", NaiveBayesExample.class.getResource("/datasets/training.language.fr.txt"));
   trainingFiles.put("German", NaiveBayesExample.class.getResource("/datasets/training.language.de.txt"));

   //loading examples in memory
   Map<String, String[]> trainingExamples = new HashMap<>();
   for(Map.Entry<String, URL> entry : trainingFiles.entrySet()) {
      trainingExamples.put(entry.getKey(), readLines(entry.getValue()));
   }

A NaiveBayes osztályozó képzése az adatok átadásával történik. A képzés befejezése után a NaiveBayesKnowledgeBase objektum tárolásra kerül későbbi használatra.

   //train classifier
   NaiveBayes nb = new NaiveBayes();
   nb.setChisquareCriticalValue(6.63); //0.01 pvalue
   nb.train(trainingExamples);
      
   //get trained classifier
   NaiveBayesKnowledgeBase knowledgeBase = nb.getKnowledgeBase();

Végül az osztályozó használatához és az új példák osztályainak előrejelzéséhez mindössze annyit kell tennie, hogy inicializál egy új osztályozót a NaiveBayesKnowledgeBase Object átadásával, amelyet korábban betanítással szerzett meg. Ezután egyszerűen apredit() metódus meghívásával megkapjuk a dokumentum előrejelzett osztályát.

   //Test classifier
   nb = new NaiveBayes(knowledgeBase);
   String exampleEn = "I am English";
   String outputEn = nb.predict(exampleEn);
   System.out.format("The sentense "%s" was classified as "%s".%n", exampleEn, outputEn);   

Szükséges bővítések

Az adott JAVA implementáció nem tekinthető teljes, használatra kész megoldásnak kifinomult szövegosztályozási problémákra. Íme néhány fontos bővítés, amelyet meg lehetne tenni:

1. Kulcsszókivonás:

Annak ellenére, hogy egyetlen kulcsszó használata elegendő lehet olyan egyszerű problémákhoz, mint például a nyelvészlelés, más bonyolultabb problémákhoz n-gramok kinyerése szükséges. Így vagy megvalósítható egy kifinomultabb szövegkivonási algoritmus a TextTokenizer.extractKeywords() metódus frissítésével, vagy a Datumbox Kulcsszókivonás API függvényt a dokumentum összes n-gramjának (kulcsszókombinációjának) lekéréséhez.

2. Szöveg előfeldolgozása:

Az osztályozó használata előtt általában szükséges a dokumentum előfeldolgozása, hogy eltávolítsuk a felesleges karaktereket/részeket. Annak ellenére, hogy a jelenlegi megvalósítás korlátozott előfeldolgozást végez a TextTokenizer.preprocess() metódussal, a HTML-oldalak elemzésekor a dolgok bonyolultabbá válnak. Egyszerűen levághatja a HTML-címkéket, és csak a dokumentum egyszerű szövegét tarthatja meg, vagy kifinomultabb gépi tanulási technikákat alkalmazhat, amelyek észlelik az oldal fő szövegét, és eltávolítják a láblécekhez, fejlécekhez, menükhöz stb. tartozó tartalmat. használhatja a Datumbox-ot Szövegkivonás API funkciót.

3. További Naive Bayes modellek:

A jelenlegi osztályozó a Multinomial Naive Bayes osztályozót valósítja meg, ennek ellenére, amint arról egy korábbi cikkünkben beszéltünk. Érzelmi elemzés, a különböző osztályozási problémák különböző modelleket igényelnek. Egyes esetekben az algoritmus bináris változata lenne megfelelőbb, míg másokban a Bernoulli-modell sokkal jobb eredményeket biztosít. Használja ezt a megvalósítást kiindulási pontként, és kövesse a Naiv Bayes bemutatója a modell bővítésére.

4. További funkcióválasztási módszerek:

Ez a megvalósítás a Chisquare jellemzőválasztó algoritmust használja az osztályozáshoz legmegfelelőbb jellemzők kiválasztásához. Ahogy egy korábbi cikkünkben láttuk, a Chisquare funkció kiválasztása A módszer egy jó technika, amely statisztikákra támaszkodik a megfelelő jellemzők kiválasztásához, ennek ellenére általában magasabb pontszámot ad a ritka jellemzőkre, amelyek csak az egyik kategóriában jelennek meg. Fejlesztések végezhetők a zajos/ritka jellemzők eltávolításával, mielőtt folytatnánk a funkciók kiválasztását, vagy további módszerek alkalmazásával, például a kölcsönös információval, amelyet a fent említett cikkben tárgyaltunk.

5. Teljesítményoptimalizálás:

Az adott megvalósításban a kód olvashatóságának javítása volt fontos, nem pedig a kód mikrooptimalizálása. Annak ellenére, hogy az ilyen optimalizálás csúnyábbá és nehezebben olvashatóvá/karbantarthatóvá teszi a kódot, gyakran szükség van rájuk, mivel ebben az algoritmusban sok ciklus milliószor kerül végrehajtásra a betanítás és a tesztelés során. Ez a megvalósítás remek kiindulópont lehet a saját tuningolt verziójának kidolgozásához.

Majdnem kész… Utolsó megjegyzések!

Azt hallottam, hogy jó a kódolásbanA megvalósítás működésének alapos megértése érdekében erősen javasoljuk, hogy olvassa el a két korábbi cikket Naiv Bayes osztályozó és a Funkció kiválasztása. Betekintést kap a módszerek elméleti hátterébe, és áttekinthetőbbé teszi az algoritmus/kód egyes részeit.

Meg kell jegyeznünk, hogy a Naive Bayes annak ellenére, hogy könnyű, gyors és legtöbbször „meglehetősen pontos”, egyben „naiv”, mert feltételezi a funkciók feltételes függetlenségét. Mivel ez a feltételezés szinte soha nem teljesül a szövegosztályozási problémákban, a Naive Bayes szinte soha nem a legjobban teljesítő osztályozó. Ban ben Datumbox API, a szabványos Naive Bayes osztályozó egyes bővítései csak olyan egyszerű problémák esetén használhatók, mint például a nyelvészlelés. Bonyolultabb szövegosztályozási problémák esetén fejlettebb technikák, mint pl Max Entropy osztályozó szükségesek.

Ha egy érdekes projektben használja a megvalósítást nekünk egy csepp sor és a projektedet bemutatjuk a blogunkban. Ha tetszett a cikk, kérjük, szánjon egy percet, és ossza meg a Twitteren vagy a Facebookon. 🙂

Időbélyeg:

Még több Datumbox