使用Weka在Java中对推文进行分类

时间:2015-12-22 07:16:27

标签: java twitter machine-learning classification

我有一些推文可以进行情绪分析。因此,我使用Twitter4J获取推文,然后我决定使用Weka库来使用KMeans,Naive Bayes,SVM等方法。

首先,我手动将推文转换为文本文件,并自己编写课程。这是我的训练数据。在我的代码中,我读了这个文件,并试图训练和测试我的模型。但我得到了错误

"Exception in thread "main" weka.core.UnsupportedAttributeTypeException: Cannot handle string attributes!" 

要修复它,我使用了StringtoWordVector过滤器,但它也没有用。这是我的代码:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.bayes.NaiveBayes;
import weka.classifiers.lazy.IBk;
import weka.classifiers.meta.FilteredClassifier;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.unsupervised.attribute.StringToWordVector;

public class Driver {
    public static BufferedReader readDataFile(String filename) {
        BufferedReader inputReader = null;

        try {
            inputReader = new BufferedReader(new FileReader(filename));
        } catch (FileNotFoundException ex) {
            System.err.println("File not found: " + filename);
        }

        return inputReader;
    }

    public static void main(String[] args) throws Exception{
    BufferedReader datafile = readDataFile("file.txt");

     Instances data = new Instances(datafile);
     data.setClassIndex(data.numAttributes() - 1);



     FilteredClassifier fc = new FilteredClassifier();

     /
     Classifier cModel = (Classifier)new IBk();   

     cModel.buildClassifier(data);

     StringToWordVector swv = new StringToWordVector();
     fc.setFilter(swv);
     fc.setClassifier(cModel);


     // Test the model
     Evaluation eTest = new Evaluation(data);
     eTest.evaluateModel(cModel, data);

     // Print the result à la Weka explorer:
     String strSummary = eTest.toSummaryString();
     System.out.println(strSummary);

     // Get the confusion matrix
     double[][] cmMatrix = eTest.confusionMatrix();
     for(int row_i=0; row_i<cmMatrix.length; row_i++){
         for(int col_i=0; col_i<cmMatrix.length; col_i++){
             System.out.print(cmMatrix[row_i][col_i]);
             System.out.print("|");
         }
         System.out.println();
     }
}
}

我也想展示我的file.txt:

@relation twitter

@attribute tweetMsg string  
@attribute class{positive,negative,neutral}

@data

"bugün hava çok güzel",positive
"hiç iyi hissetmiyorum",negative
"hayat çok normal",neutral
"Diriliş Ertuğrul izlerken her türlü kumpasın döndüğünü görmek ama günün birinde Osmanlı Beyliği' nin kurulacağını bilmenin huzuru ?",positive
"Diriliş Ertuğrul dizisi ile tarihe merakim arttı ??",positive
"Kanka moralim bozuk diyorum boşver kanka gel diriliş ertuğrul izleyelim diyor yemin ederim kanka gibi kanka .",positive
"Diriliş Ertuğrul beni son zamanlarda futbol dışında TVde tutan tek yapım kurgusu, görseli süper",positive
"#kösemsultan Osmanlının gerçek yüzünü çıkardıkları için mi hoşunuza gitmiyor Diriliş Ertuğrul saçmalığın alası hadi onuda şikayet edin!!!",negative
"Benim için LeylaileMecnun neyse abim için Diriliş Ertuğrul da o.",neutral
"#MutlulukNeDiyeSorsalar diriliş Ertuğrul izlemek derim",positive
"beyler muhteşem yüz yıl kösemi izliyorum da diriliş ertuğrul bu diziye 10 takar. saray saray değil kadınlar hamamı sanki.",positive
"Diriliş Ertuğrul diziside ne boktan bir senaryo arkadaş. Herif 4 bölümde bir hain ilan edilip sonra obaya geri geliyor sonra yine hain :):)",negative
"Diriliş Ertuğrul izlemekten babama beyim dedim amk",neutral
"Diriliş ertuğrul haric bütün Türk dizileri saçmalik broo",positive

但是,这些推文都是土耳其语。所以,你认为我走的是正确的吗?或者我应该做一些更复杂的事情?就像首先阻止单词等

对我的问题的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

阅读错误消息:

Cannot handle string attributes!

显然是指这一行:

@attribute tweetMsg string

分类器IBk不支持string属性。