2012-04-18 28 views
5

Weka java API kullanarak bir belge sınıflandırması yapmaya çalışıyorum.StringToWordVector() - Weka çıkışının yorumlanması

Veri dosyalarının dizin yapılışı.

+- text_example 
| 
+- class1 
| | 
| 3 html files 
| 
+- class2 
| | 
| 1 html file 
| 
+- class3 
    | 
    3 html files 

Ben 'TextDirectoryLoader' ile oluşturulan 'Arff' dosyası var. Sonra filter.setOutputWordCounts(true) ile oluşturulan arff dosyasındaki StringToWordVector filtresini kullanıyorum.

Aşağıda, filtre uygulandıktan sonra çıktı örneği verilmiştir. Açıklığa kavuşturulmuş birkaç şey almam lazım.

@attribute </form> numeric 
@attribute </h1> numeric 
. 
. 
@attribute earth numeric 
@attribute easy numeric 

Bu büyük liste, ilk html dosyalarının içeriğinin belirteci olmalıdır. sağ?

Sonra var

, ilk 3 öğeler için hiçbir sınıf özelliği yoksa neden

@data 
{1 2,3 2,4 1,11 1,12 7,..............} 
{10 4,34 1,37 5,.......} 
{2 1,5 6,6 16,...} 
{0 class2,34 11,40 15,.....,4900 3,... 
{0 class3,1 2,37 3,40 5.... 
{0 class3,1 2,31 20,32 17...... 
{0 class3,32 5,42 1,43 10......... 

? (sınıf1 olmalı). , baştaki 0, {0 class2, ..}, {0 class3 ..} 'de olduğu anlamına gelir. Örneğin, class3 klasöründeki 3. html dosyasında, 32 tamsayı ile tanımlanan sözcüğün 5 kez göründüğünü belirtir. Sadece 32 tarafından atıfta bulunulan kelimeyi nasıl bulabilirim?

Özellik vektörünün boyutsallığını nasıl azaltabilirim? Tüm özellik vektörlerini aynı boyuta getirmemize gerek yok mu? (Eğitim setinden sadece 100 kez en sık kullanılan terimleri ve daha sonra test etmeye gelince, test belgelerinde sadece 100 terimin varlığını göz önünde bulundurun. Çünkü, bu şekilde tamamen yeni bir kelime bulursak ne olur? test aşamasında, sınıflandırıcı bunu görmezden gelebilecek mi?).

Burada bir şey mi özlüyorum? Weka'ya yeniyim.

Ayrıca, birisi bana, sınıflandırıcının StringToWordVector filtresiyle oluşturulan bu vektörü nasıl kullandığını açıklayabilirse, bu yardımı gerçekten takdir ediyorum. (Eğitim verileri, boyut indirgeme ile kelime oluşturmak gibi, Weka kodu içinde oluyor olanlardır?)

cevap

8
  1. @attribute büyük liste girişiniz türetilen tüm belirteçleri içerir.
  2. @data bölümünüz seyrek biçimde, yani her bir özellik için, değer yalnızca sıfırdan farklıysa belirtilir. İlk üç satır için, sınıf özniteliği class1'dir, onu göremezsiniz (bilinmediyse, ilk üç çizginin başlangıcında 0 ? görürsünüz). Neden böyle? Weka dahili olarak (sınıfları içeren) nominal nitelikleri çift olarak temsil eder ve sıfır olarak saymaya başlar. Yani üç sınıfınız dahili olarak: class1 = 0.0, class2 = 1.0, class3 = 2.0. Sıfır değerler, seyrek formatta belirtilmediğinden, ilk üç satırda sınıfı göremezsiniz. (Ayrıca "AŞAĞI ARFF dosyalarını" http://www.cs.waikato.ac.nz/ml/weka/arff.html numaralı bölüme bakın)
  3. İndeks n tarafından temsil edilen sözcüğü/belirteci almak için, ya sayılabilir ya da Instances nesnesine sahipseniz, attribute(n).name() numaralı telefonu çağırırsınız. Bunun için n 0 saymaya başlar.
  4. Özellik vektörünün boyutsallığını azaltmak için çok fazla seçenek vardır. En sık 100 terime sahip olmak istiyorsanız, stringToWordVector.setWordsToKeep(100). Bunun her sınıfa 100 kelime tutmaya çalışacağını unutmayın. Sınıf başına 100 kelime tutmak istemiyorsanız, stringToWordVector.setDoNotOperateOnPerClassBasis(true).Aynı frekansa sahip birkaç kelime varsa, 100'ün biraz üzerine çıkacaksınız, bu yüzden 100 sadece bir tür hedef değerdir.
  5. Test aşamasında ortaya çıkan yeni sözcükler için, bunun gerçekleştirilemediğini düşünüyorum çünkü sınıflandırmadan önce tüm örnekleri stringToWordVector vermelisiniz. İki sınıf bir kurulum kullandığımdan,% 100 emin değilim, ve tüm örneklerimi bu sınıflandırma hakkında bir şey söylemeden önce StringToWordVector izin verdim.

Genel olarak, farklı sınıfların nasıl kullanılacağını öğrenmek için Weka KnowledgeFlow aracını denemek için size yardımcı olabilirim. Orada işlerin nasıl yapıldığını biliyorsanız, bu bilgiyi Java kodunuz için oldukça kolay bir şekilde kullanabilirsiniz. Umut Cevabınız biraz geç olmasına rağmen size yardım edebildim.

+0

Evet ve cevapları kendim öğrendiğimde ans geç oldu. Ama cevabın için teşekkürler ve kabul ediyorum. Hey weka'da libsvm (wrapper) ile bir sınıf sınıflandırma deneyimi var mı? Ben bir çeşit sıkışmış değilim – KillBill

+0

@ user601 Hayır, özür dilerim. Weka'da hiç libsvm kullanmadım. Sadece meraktan dolayı: bazı makine öğrenimi/veri madenciliği konusuna bir tez yazdı mı? – Malhelo

+0

evet metin sınıflandırma içeren üst sınıf tezi yapıyorum. Benzer bir şey mi yapıyorsun? – KillBill

İlgili konular