Naiivin Bayes-tekstiluokittajan kehittäminen JAVA PlatoBlockchain Data Intelligencessä. Pystysuuntainen haku. Ai.

Naiivien Bayes-tekstiluokittelijoiden kehittäminen JAVA: ssa

Aikaisemmissa artikkeleissa olemme keskustelleet Naiivi Bayes -tekstiluokitin ja käytön merkitys Ominaisuuksien valintatekniikat tekstiluokituksessa. Tässä artikkelissa aiomme koota kaiken ja rakentaa Naive Bayes -tekstien luokittelualgoritmin yksinkertainen toteutus JAVA: ssa. Luokittelijan koodi on avoimen lähteen (GPL v3 -lisenssillä) ja voit ladata sen osoitteesta Github.

Päivitys: Datumbox Machine Learning Framework on nyt avoimen lähdekoodin ja ilmainen download. Tutustu pakettiin com.datumbox.framework.machinelearning.classification nähdäksesi Naive Bayes -luokittelijan käyttöönoton Javassa.

Naive Bayesin Java-toteutus

Koodi on kirjoitettu JAVA: ssa ja se voidaan ladata suoraan Github. Se on lisensoitu GPLv3: lla, joten voit vapaasti käyttää sitä, muokata sitä ja levittää sitä vapaasti.

Tekstiluokittelija toteuttaa Monikokoiset naiivit Bayes malli yhdessä Chisquare-ominaisuusvalinta algoritmi. Kaikki teoreettiset yksityiskohdat siitä, kuinka molemmat tekniikat toimivat, on katettu aiemmissa artikkeleissa, ja yksityiskohtaiset javadoc-kommentit löytyvät toteutusta kuvaavasta lähdekoodista. Siksi tässä segmentissä keskityn luokittelijan arkkitehtuurin korkean tason kuvaukseen.

1. NaiveBayes-luokka

Tämä on tekstiluokittajan pääosa. Se toteuttaa menetelmiä, kuten juna () ja ennusta (), jotka vastaavat luokittelijan kouluttamisesta ja käytöstä ennusteisiin. On huomattava, että tämä luokka on myös vastuussa asianmukaisten ulkoisten menetelmien kutsumisesta asiakirjan esikäsittelyyn ja merkitsemiseen ennen koulutusta / ennustamista.

2. NaiveBayesKnowledgeBase -objekti

Koulutuksen tulos on NaiveBayesKnowledgeBase -objekti, joka tallentaa kaikki tarvittavat tiedot ja todennäköisyydet, joita Naive Bayes -luokittelija käyttää.

3. Asiakirjaobjekti

Sekä koulutus- että ennustetekstit toteutuksessa on tallennettu sisäisesti dokumenttiobjekteiksi. Asiakirjaobjekti tallentaa kaikki asiakirjan tunnukset (sanat), niiden tilastot ja asiakirjan kohdeluokituksen.

4. FeatureStats -objekti

FeatureStats-objekti tallentaa useita tilastoja, jotka luodaan Ominaisuuksien poimintavaiheen aikana. Tällaisia ​​tilastoja ovat ominaisuuksien ja luokan yhteiset laskelmat (joista yhteiset todennäköisyydet ja todennäköisyydet arvioidaan), luokan laskelmat (joista prioreita arvioidaan, jos mitään ei anneta syötteeksi) ja harjoituksiin käytettyjen havaintojen kokonaismäärä.

5. FeatureExtraction-luokka

Tämä on luokka, joka vastaa ominaisuuksien poiston suorittamisesta. On huomattava, että koska tämä luokka laskee sisäisesti useita tilastoja, joita myöhemmässä vaiheessa tosiasiallisesti vaaditaan luokittelualgoritmi, kaikki nämä tilastot välimuistiin palautetaan ja palautetaan FeatureStats-objektissa niiden uudelleenlaskennan välttämiseksi.

6. TextTokenizer-luokka

Tämä on yksinkertainen tekstin tokenointiluokka, joka vastaa alkuperäisten tekstien esikäsittelystä, tyhjentämisestä ja tokenoimisesta ja muuntamisesta asiakirjaobjekteiksi.

NaiveBayes JAVA -luokan käyttäminen

NaiveBayesExample-luokasta löydät esimerkkejä NaiveBayesE-luokan käytöstä. Esimerkkikoodin tavoitteena on esittää esimerkki, joka kouluttaa yksinkertaisen Naive Bayes -luokittajan tekstin kielen havaitsemiseksi. Luokittelijan kouluttamiseksi tarjoamme aluksi harjoitustietojen polut HashMap-tietokantaan ja lataamme sitten niiden sisällön.

   //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()));
   }

NaiveBayes-luokitin koulutetaan lähettämällä sille tiedot. Kun koulutus on valmis, NaiveBayesKnowledgeBase -objekti tallennetaan myöhempää käyttöä varten.

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

Lopuksi käyttääksesi luokittelijaa ja ennakoida uusien esimerkkien luokkia, sinun tarvitsee vain alustaa uusi luokitin ohittamalla NaiveBayesKnowledgeBase-objekti, jonka olet aiemmin hankkinut koulutuksella. Sitten soittamalla yksinkertaisesti ennuste () -menetelmälle saadaan asiakirjan ennustettu luokka.

   //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);   

Tarvittavat laajennukset

Erityistä JAVA-toteutusta ei tule pitää täydellisenä käyttövalmiina ratkaisuna hienostuneisiin tekstien luokitteluongelmiin. Tässä on joitain tärkeitä laajennuksia, jotka voitaisiin tehdä:

1. Avainsanan poiminta:

Vaikka yksittäisten avainsanojen käyttö voi olla riittävä yksinkertaisiin ongelmiin, kuten kielen havaitsemiseen, muut monimutkaisemmat ongelmat vaativat n-gramman erottamisen. Siten voidaan joko toteuttaa hienostuneempi tekstin erotusalgoritmi päivittämällä TextTokenizer.extractKeywords () -menetelmä tai käyttää Datumboxin Avainsanojen poisto -sovellusliittymä toiminto, jolla saadaan kaikki asiakirjan n grammat (avainsanayhdistelmät).

2. Tekstin esikäsittely:

Ennen luokittelijan käyttöä asiakirja on yleensä esikäsiteltävä tarpeettomien merkkien / osien poistamiseksi. Vaikka nykyinen toteutus suorittaa rajoitetun esikäsittelyn käyttämällä TextTokenizer.preprocess () -menetelmää, HTML-sivujen analysoinnissa asiat muuttuvat vaikeimmiksi. Voit yksinkertaisesti leikata HTML-tunnisteet ja pitää vain asiakirjan selkeän tekstin tai turvautua kehittyneempiin koneoppimistekniikoihin, jotka tunnistavat sivun päätekstin ja poistavat alatunnisteeseen, otsikoihin, valikoihin jne. Kuuluvan sisällön. voi käyttää Datumboxia Tekstin purkamisen sovellusliittymä toiminto.

3. Muut Naive Bayes -mallit:

Nykyinen luokitteluohjelma toteuttaa Multinomial Naive Bayes -luokittajan, kuitenkin kuten aiemmassa artikkelissa Aistien analyysi, erilaiset luokitteluongelmat vaativat erilaisia ​​malleja. Joissakin tapauksissa algoritmin binaarimuotoinen versio olisi tarkoituksenmukaisempi, kun taas toisissa Bernoulli-malli tarjoaa paljon parempia tuloksia. Käytä tätä toteutusta lähtökohtana ja seuraa Naiivi Bayesin opetusohjelma laajentaa mallia.

4. Lisäominaisuuksien valintamenetelmät:

Tämä toteutus käyttää Chisquare-ominaisuuksien valintaalgoritmia luokitukseen sopivimpien ominaisuuksien valitsemiseen. Kuten näimme edellisessä artikkelissa, Chisquare-ominaisuuksien valinta menetelmä on hyvä tekniikka, joka välittää tilastotiedot sopivien ominaisuuksien valitsemiseksi, silti sillä on taipumus antaa parempia pisteitä harvinaisista ominaisuuksista, jotka esiintyvät vain yhdessä luokassa. Parannuksia voidaan tehdä poistamalla meluisat / harvinaiset ominaisuudet ennen ominaisuuksien valintaan siirtymistä tai ottamalla käyttöön lisämenetelmiä, kuten keskinäistä tietoa, josta keskustelimme edellä mainitussa artikkelissa.

5. Suorituskyvyn optimointi:

Erityisessä toteutuksessa oli tärkeää parantaa koodin luettavuutta sen sijaan, että suorittaisi koodille mikrooptimointeja. Huolimatta siitä, että tällaiset optimoinnit tekevät koodista rumin ja vaikeamman lukea / ylläpitää, ne ovat usein välttämättömiä, koska monet tämän algoritmin silmukat suoritetaan miljoonia kertoja koulutuksen ja testauksen aikana. Tämä toteutus voi olla hyvä lähtökohta oman viritetyn version kehittämiselle.

Melkein siellä… Viimeiset muistiinpanot!

I-kuullut-HES-hyvä-at-koodaus-lJotta ymmärrät tämän toteutuksen toimivan, sinun kannattaa lukea kaksi aiempaa artikkelia aiheesta Naiivi Bayes -luokitin ja Ominaisuuksien valinta. Saat oivalluksia menetelmien teoreettisesta taustasta ja se tekee algoritmin / koodin osista selkeämpiä.

Meidän on huomattava, että Naive Bayes on helppo, nopea ja useimmiten "melko tarkka", mutta on myös "Naiivi", koska se olettaa ominaisuuksien ehdollisen riippumattomuuden. Koska tätä olettamaa ei läheskään koskaan täytetä tekstien luokitteluongelmissa, Naive Bayes ei ole miltei koskaan parhaiten suoriutuvia luokittelijoita. Sisään Datumbox-sovellusliittymä, joitain standardin Naive Bayes -luokittajan laajennuksia käytetään vain yksinkertaisiin ongelmiin, kuten kielen tunnistus. Monimutkaisempien tekstien luokitteluongelmien vuoksi edistyneemmät tekniikat, kuten Max Entropy -luokitin ovat välttämättömiä.

Jos käytät toteutusta mielenkiintoisessa projektissa pudota meille rivi ja esittelemme projektisi blogissamme. Jos pidät artikkelista, ota hetki ja jaa se Twitterissä tai Facebookissa. 🙂

Aikaleima:

Lisää aiheesta Datumbox