JAVA PlatoBlockchain Veri Zekasında Naive Bayes Metin Sınıflandırıcısının Geliştirilmesi. Dikey Arama. Ai.

JAVA'da Naif Bayes Metin Sınıflandırıcısı Geliştirme

Önceki makalelerde teorik arka planı tartışmıştık. Naive Bayes Metin Sınıflandırıcı ve kullanmanın önemi Özellik Seçim teknikleri Metin Sınıflandırmasında. Bu makalede, her şeyi bir araya getireceğiz ve JAVA'da Naive Bayes metin sınıflandırma algoritmasının basit bir uygulamasını oluşturacağız. Sınıflandırıcının kodu açık kaynaklıdır (GPL v3 lisansı altında) ve şu adresten indirebilirsiniz: Github.

Güncelleme: Datumbox Machine Learning Framework artık açık kaynak kodlu ve ücretsiz indir. Java'da Naive Bayes Sınıflandırıcısının uygulamasını görmek için com.datumbox.framework.machinelearning.classification paketine bakın.

Naive Bayes Java Uygulaması

Kod JAVA'da yazılmıştır ve doğrudan şuradan indirilebilir: Github. GPLv3 altında lisanslanmıştır, bu yüzden onu kullanmaktan, değiştirmekten ve özgürce yeniden dağıtmaktan çekinmeyin.

Metin Sınıflandırıcı, Çok terimli Naif Bayes ile birlikte model Chisquare Unsur Seçimi algoritması. Her iki tekniğin nasıl çalıştığına dair tüm teorik ayrıntılar önceki makalelerde ele alınmıştır ve ayrıntılı javadoc yorumları, uygulamayı açıklayan kaynak kodda bulunabilir. Bu nedenle, bu bölümde sınıflandırıcının mimarisinin üst düzey bir tanımına odaklanacağım.

1. NaiveBayes Sınıfı

Bu, Metin Sınıflandırıcının ana parçasıdır. Bir sınıflandırıcıyı eğitmekten ve tahminler için kullanmaktan sorumlu olan train () ve tahmin () gibi yöntemleri uygular. Bu sınıfın aynı zamanda, eğitim / tahminden önce belgeyi ön işleme ve belirtmek için uygun harici yöntemleri çağırmaktan da sorumlu olduğu unutulmamalıdır.

2. NaiveBayesKnowledgeBase Nesnesi

Eğitimin çıktısı, Naive Bayes Sınıflandırıcısı tarafından kullanılan tüm gerekli bilgileri ve olasılıkları saklayan bir NaiveBayesKnowledgeBase Nesnesidir.

3. Belge Nesnesi

Uygulamadaki hem eğitim hem de tahmin metinleri Belge Nesneleri olarak dahili olarak saklanır. Belge Nesnesi, belgenin tüm simgelerini (sözcüklerini), bunların istatistiklerini ve belgenin hedef sınıflandırmasını depolar.

4. FeatureStats Nesnesi

FeatureStats Nesnesi, Özellik Çıkarma aşamasında oluşturulan çeşitli istatistikleri depolar. Bu tür istatistikler, Özelliklerin ve Sınıfın (ortak olasılıkların ve olasılıkların tahmin edildiği) Ortak sayıları, Sınıf sayıları (bunlardan hiçbiri girdi olarak verilmemişse önceliklerin değerlendirildiği) ve eğitim için kullanılan toplam gözlem sayısıdır.

5. FeatureExtraction Sınıfı

Bu, özellik çıkarımının yapılmasından sorumlu olan sınıftır. Bu sınıf, daha sonraki aşamada sınıflandırma algoritması tarafından gerçekten gerekli olan birkaç istatistiği dahili olarak hesapladığından, tüm bu istatistiklerin önbelleğe alındığı ve yeniden hesaplanmalarını önlemek için bir FeatureStats Nesnesine döndürüldüğü unutulmamalıdır.

6. TextTokenizer Sınıfı

Bu bir basit orijinal metinlerin önişlemesinden, temizlenmesinden ve belirteç haline getirilmesinden ve bunları Belge nesnelerine dönüştürmekten sorumlu metin belirteçleştirme sınıfı.

NaiveBayes JAVA Sınıfını Kullanma

NaiveBayesExample sınıfında, NaiveBayes Sınıfının kullanımına ilişkin örnekler bulabilirsiniz. Örnek kodun hedefi, bir metnin Dilini tespit etmek için basit bir Naive Bayes Sınıflandırıcıyı eğiten bir örnek sunmaktır. Sınıflandırıcıyı eğitmek için, başlangıçta eğitim veri setlerinin yollarını bir HashMap'te sağlıyoruz ve ardından içeriklerini yüklüyoruz.

   //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 sınıflandırıcı, ona verileri ileterek eğitilir. Eğitim tamamlandığında NaiveBayesKnowledgeBase Nesnesi daha sonra kullanılmak üzere saklanır.

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

Son olarak, sınıflandırıcıyı kullanmak ve yeni örneklerin sınıflarını tahmin etmek için yapmanız gereken tek şey, daha önce eğitimle edindiğiniz NaiveBayesKnowledgeBase Nesnesini geçerek yeni bir sınıflandırıcı başlatmaktır. Daha sonra basitçe tahmin () yöntemini çağırarak belgenin tahmin edilen sınıfını elde edersiniz.

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

Gerekli Genişletmeler

Özel JAVA uygulaması, karmaşık metin sınıflandırma problemleri için kullanıma hazır tam bir çözüm olarak görülmemelidir. Yapılabilecek önemli genişletmelerden bazıları şunlardır:

1. Anahtar Kelime Çıkarma:

Dil Algılama gibi basit problemler için tek anahtar kelimeler kullanmak yeterli olsa da, diğer daha karmaşık problemler n-gramların çıkarılmasını gerektirir. Böylece, TextTokenizer.extractKeywords () yöntemini güncelleyerek daha gelişmiş bir metin çıkarma algoritması uygulayabilir veya Datumbox'ın Anahtar Kelime Çıkarma API'si belgenin tüm n-gramlarını (anahtar kelime kombinasyonları) alma işlevi.

2. Metin Ön İşleme:

Bir sınıflandırıcı kullanmadan önce, genellikle gereksiz karakterleri / parçaları kaldırmak için belgeyi önceden işlemek gerekir. Mevcut uygulama, TextTokenizer.preprocess () yöntemini kullanarak sınırlı ön işleme gerçekleştirse de, HTML sayfalarını analiz etmek söz konusu olduğunda işler daha karmaşık hale gelir. Basitçe HTML etiketlerini kırpıp belgenin yalnızca düz metnini saklayabilir veya sayfanın ana metnini algılayan ve altbilgi, üstbilgi, menülere vb. Ait içeriği kaldıran daha karmaşık Makine Öğrenimi tekniklerine başvurulabilir. Datumbox'ı kullanabilir Metin Çıkarma API fonksiyonu.

3. Ek Naif Bayes Modelleri:

Mevcut sınıflandırıcı, Multinomial Naive Bayes sınıflandırıcısını uygular, yine de önceki bir makalede tartıştığımız gibi. Duygu Analizifarklı sınıflandırma problemleri farklı modeller gerektirir. Bazılarında algoritmanın İkili bir versiyonu daha uygun olurken, bazılarında Bernoulli Modeli çok daha iyi sonuçlar sağlayacaktır. Bu uygulamayı bir başlangıç ​​noktası olarak kullanın ve talimatlarını izleyin. Naive Bayes Eğitimi Modeli genişletmek için.

4. Ek Özellik Seçim Yöntemleri:

Bu uygulama, sınıflandırma için en uygun özellikleri seçmek için Chisquare özellik seçim algoritmasını kullanır. Önceki bir makalede gördüğümüz gibi, Chisquare özellik seçimi yöntem, uygun özellikleri seçmek için istatistiklere dayanan iyi bir tekniktir, ancak yine de kategorilerden birinde görünen nadir özelliklerden daha yüksek puanlar verme eğilimindedir. Özellik seçimine geçmeden önce gürültülü / nadir özelliklerin kaldırılmasıyla veya yukarıda bahsedilen makalede tartıştığımız Karşılıklı Bilgi gibi ek yöntemler uygulanarak iyileştirmeler yapılabilir.

5. Performans Optimizasyonu:

Özel uygulamada, kod üzerinde mikro optimizasyonlar gerçekleştirmek yerine kodun okunabilirliğini geliştirmek önemliydi. Bu tür optimizasyonların kodu daha çirkin ve okumayı / sürdürmeyi zorlaştırmasına rağmen, bu algoritmadaki birçok döngü eğitim ve test sırasında milyonlarca kez çalıştırıldığı için genellikle gereklidir. Bu uygulama, kendi ayarlanmış sürümünüzü geliştirmek için harika bir başlangıç ​​noktası olabilir.

Neredeyse bitti ... Son Notlar!

Ben-kodlamada-iyi-l-duydumBu uygulamanın nasıl çalıştığını daha iyi anlamak için önceki iki makaleyi okumanız şiddetle tavsiye edilir. Naive Bayes Sınıflandırıcı ve Öznitelik Seçimi. Yöntemlerin teorik arka planı hakkında bilgi edineceksiniz ve bu, algoritmanın / kodun bölümlerini daha net hale getirecektir.

Naive Bayes'in kolay, hızlı ve çoğu zaman “oldukça doğru” olmasına rağmen, aynı zamanda özelliklerin koşullu bağımsızlık varsayımını yaptığı için “Naif” olduğunu da belirtmeliyiz. Bu varsayım, Metin Sınıflandırma problemlerinde neredeyse hiç karşılanmadığından, Naive Bayes neredeyse hiçbir zaman en iyi performans gösteren sınıflandırıcı değildir. İçinde Veri Kutusu API'si, standart Naive Bayes sınıflandırıcısının bazı genişletmeleri yalnızca Dil Algılama gibi basit sorunlar için kullanılır. Daha karmaşık metin sınıflandırma sorunları için daha gelişmiş teknikler, örneğin Max Entropy sınıflandırıcı gerekli.

Uygulamayı ilginç bir projede kullanırsanız bize yazmaktan ve projenizi blogumuzda yayınlayacağız. Ayrıca makaleyi beğendiyseniz lütfen bir dakikanızı ayırın ve Twitter veya Facebook'ta paylaşın. 🙂

Zaman Damgası:

Den fazla Veri kutusu