Python 2.x - 如何通过trainSet和testSet获取NLTK朴素贝叶斯分类的结果

时间:2017-04-10 13:55:32

标签: python python-2.7 nltk naivebayes nltk-trainer

我正在构建一个文本解析器来识别包含文本的犯罪类型。我的课程是为了加载2个csv文件的文本而构建的(一个文件用于训练,一个文件用于测试)。它的构建方式是我班级中的方法,用于在文本中快速处理,删除停用词,提取特征向量等。请遵循以下代码。

def classificaTexto(tweet):

On Main我使用正常的Naive Bayes并看到它们的准确性,然后使用交叉验证的Naive Bayes并看到它们的准确性。现在我想测试已经训练过的包含测试文本的朴素贝叶斯。如果是,在测试的基础上测试排序。

我的方法texto1 = 'Enviado por um seguidor: Carro roubado no conjunto Augusto Franco' classificaTexto(texto1) 。它只是做这项工作,但我甚至无法使用已经训练过的分类器。如果我创建一个文本

def classificaTexto(tweet):

该方法将完成其工作并进行排序。

其他信息: 我的csv就是这样形成的。一个例子: 文本前面的数字代表犯罪团队。这样做是为了可以使用该方法|1|,|Enviado por um seguidor :Exclusivo.Bom dia.2 caras vestidos de palhaços ontem a noite roubaram as armas dos guardas municipais que faziam a segurança do posto médico aqui no bairro Coroa do Meio!! Polícia nas ruas a procura dos marginais !!! Surreal isso...|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |2|,|Enviado por um seguidor :Segundo informações acaba de acontecer um homicídio na cidade de Malhador no povoado Boqueval \,vítima de pré nome Ronaldo.|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

namespace DataSourceContracts
{
using System.ServiceModel;
using System.ServiceModel.Web;
using ViewModel.DataSource;

    /// <summary>
    /// This is same as the exposed BLDB data REST service in abother project we need to keep both in sync. 
    /// The reason for not refering to the same project is the .Net framework version
    /// </summary>
    [ServiceContract]
    public interface IBLDBService : IDataSourceService
    {
        /// <summary>
        /// Sample method
        /// </summary>
        /// <param name="viewModel"></param>
        /// <returns></returns>
        [OperationContract]
        [WebInvoke(Method = "POST",  UriTemplate = "GetBLDBData")]
        MetaDataViewModel GetBLDBData(MetaDataViewModel viewModel);
    }
}

1 个答案:

答案 0 :(得分:1)

您只需要从调用classify()的同一对象中调用train()方法。一种方法是将对象作为方法的参数传递:

#Method to classify the text according to the feeling
def classificaTexto(nbc, tweet):

    textoProcessado = preProcessamentoText(tweet)
    result = nbc.classify(extracaoCaracteristicas(getVetorCaracteristicas(textoProcessado)))

    #print result
    if (result == 4) :
        print 'Crime não categorizado - ' + tweet
    elif (result == 1):
        print 'Roubo - ' + tweet
    elif(result == 2):
        print 'Homicídio - ' + tweet
    elif(result== 3):
        print 'Tráfico - ' + tweet
    else :
        print 'Não representa um crime - ' + tweet

那么你应该能够像这样使用它:

# Main function
if __name__ == '__main__':
    #load the 2 set (train and test)
    carregarTextos()
    test_set()

    # Extract the feature vector of all tweets in one go
    conjuntoTreino = nltk.classify.util.apply_features(extracaoCaracteristicas, tweets)

    # Train the classifier
    NBClassifier = nltk.NaiveBayesClassifier.train(conjuntoTreino)

    # Classify tweet
    texto1 = 'Enviado por um seguidor: Carro roubado no conjunto Augusto Franco'
    classificaTexto(NBClassifier, texto1)

<强>更新

如果您想对nltk.classify.util.apply_features()的输出进行分类,可以稍加修改classificaTexto()

def classificaTexto(nbc, data):

    for features in data:
        result = nbc.classify(features)
        #print result
        if (result == 4) :
            print 'Crime não categorizado - ' + tweet
        elif (result == 1):
            print 'Roubo - ' + tweet
        elif(result == 2):
            print 'Homicídio - ' + tweet
        elif(result== 3):
            print 'Tráfico - ' + tweet
        else :
            print 'Não representa um crime - ' + tweet

并像这样使用它:

# Main function
if __name__ == '__main__':
    #load the 2 set (train and test)
    carregarTextos()
    test_set()

    # Extract the feature vector of all tweets in one go
    conjuntoTreino = nltk.classify.util.apply_features(extracaoCaracteristicas, tweets)
    conjuntoTeste = nltk.classify.util.apply_features(extracaoCaracteristicas,testset)

    # Train the classifier
    NBClassifier = nltk.NaiveBayesClassifier.train(conjuntoTreino)

    # Classify testset    
    classificaTexto(NBClassifier, conjuntoTeste)
  

如果您希望立即将结果存储在results = nbc.classify_many(data)

中,也可以使用list