美文网首页自然语言处理(...pythonml
文本分类的Python实现-基于支持向量机分类

文本分类的Python实现-基于支持向量机分类

作者: Hellooooooworld | 来源:发表于2017-05-10 15:06 被阅读3300次

    万夫一力,天下无敌。------刘基(明)

    要说无敌,在目前的文本分类中,支持向量机的分类算法就算是无敌了。
    那什么是支持向量机呢?支持向量机与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。他的优势主要是在于小样本,非线性及高维模式的识别。

    简短截说,直接进入正题。

    part.0 数据描述

    • 训练集为微信公众号政事儿,财新网的文章,分别作为特征集政治类和经济类的样本,可以单独使用SVC来训练完后进行单独预测,也可以训练和预测相结合。
    • SVC是支持向量机的分类算法,SVC的惩罚参数C的默认值为1,C越大,对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,泛化能力较强。
    • TF-IDF权重在进行中文文本分析时有着广泛的应用,但也不是什么时候都适用,有的时候,适用bool型的权重反而效果更好。通过增加CountVectorizer的参数(binary = True)就可以实现。

    part.1 引用和参数

    我们在进行实验之前,我们得对我们的文本词进行一些处理,所以我们得引用一些必要的包,来对文本进行处理,引用如下

    # -*- coding: utf-8 -*-
    import jieba
    import numpy as np
    import os
    import time
    import codecs
    import re
    import jieba.posseg as pseg
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.svm import SVC
    from sklearn.pipeline import Pipeline
    from sklearn import metrics
    
    open=codecs.open
    path_en='../After/En'
    path_peo='../After/new_people'
    content_train_src=[]      #训练集文本列表
    opinion_train_stc=[]      #训练集类别列表
    file_name_src=[]          #训练集文本文件名列表
    train_src=[]              #训练集总列表
    test_src=[]               #测试集总列表
    
    

    part.2文本读取和处理

    我们首先得把文本先读取进来,包括文件名,文件文本,文件归类,当然我为了测试导入时间,我们还引入了一个time包,来检验导入的速度。

    def readfile(path):
        for filename in os.listdir(path):
            starttime=time.time()
            filepath=path+"/"+filename
            filestr=open(filepath).read()
            opinion=path[9:]
            train_src.append((filename,filestr,opinion))
            endtime=time.time()
            print '类别:%s >>>>文件:%s >>>>导入用时: %.3f' % (opinion, filename, endtime - starttime)
        return train_src
    

    读取两个类文件夹中的文件,并放入一个列表中。

    train_src_all=readfile(path_en)
    train_src_all=train_src_all+readfile(path_peo)
    

    part.3读取训练包

    将上述的的总的训练集的各项读取到训练集文本,训练集类别,训练集文本文件名的列表中,并将三个列表放入同一个表中,用于后面的使用,并可以一一对应。

    def readtrain(train_src_list):
        for (fn,w,s) in train_src_list:
            file_name_src.append(fn)
            content_train_src.append(w)
            opinion_train_stc.append(s)
        train=[content_train_src,opinion_train_stc,file_name_src]
        return train
    
    

    在分别导出的时候,我们顺便把那些文本进行一些分词和词性筛选的操作。
    Word_cut_list()和Word_pseg()在先前文章已经提到过。
    传送门--->结巴分词和NLTK----一套中文文本分析的组合拳

    def segmentWord(cont):
        listseg=[]
        for i in cont:
            Wordp = Word_pseg(i)
            New_str = ''.join(Wordp)
            Wordlist = Word_cut_list(New_str)
            file_string = ''.join(Wordlist)
            listseg.append(file_string)
        return listseg
    
    train=readtrain(train_src_all)
    content=segmentWord(train[0])
    filenamel=train[2]
    opinion=train[1]
    

    part.4 训练集的划分

    划分训练集和测试机,并将训练集转换为词频矩阵,而后在计算TFIDF值。

    train_content=content[:3000]
    test_content=content[3000:]
    train_opinion=opinion[:3000]
    test_opinion=opinion[3000:]
    train_filename=filenamel[:3000]
    test_filename=filenamel[3000:]
    
    test_all=[test_content,test_opinion,test_filename]
    
    
    vectorizer=CountVectorizer()
    tfidftransformer=TfidfTransformer()
    tfidf = tfidftransformer.fit_transform(vectorizer.fit_transform(train_content))  # 先转换成词频矩阵,再计算TFIDF值
    
    print tfidf.shape
    

    part.5 单独预测和训练预测一体

    单独预测

    word = vectorizer.get_feature_names()
    weight = tfidf.toarray()
    # 分类器
    clf = MultinomialNB().fit(tfidf, opinion)
    docs = ["原任第一集团军副军长", "在9·3抗战胜利日阅兵中担任“雁门关伏击战英雄连”英模方队领队记者林韵诗继黄铭少将后"]
    new_tfidf = tfidftransformer.transform(vectorizer.transform(docs))
    predicted = clf.predict(new_tfidf)
    print predicted
    

    训练和预测一体的预测方式

    # 训练和预测一体
    text_clf = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', SVC(C=1, kernel = 'linear'))])
    text_clf = text_clf.fit(train_content, train_opinion)
    predicted = text_clf.predict(test_content)
    print 'SVC',np.mean(predicted == test_opinion)
    print set(predicted)
    print metrics.confusion_matrix(test_opinion,predicted) # 混淆矩阵
    

    part.6 简单总结

    这次的博文主要关于支持向量机的svc功能做了一些简单地介绍和应用,当然支持向量机的分类功能并不止这样简单,我们对分类的摸索的路还很长。
    我的数据集大概是3500个,然后这个程序需要花费30分钟,精确度大概为85%左右,所以我们对程序的优化和技术的升级能做还有很多。

    相关文章

      网友评论

      本文标题:文本分类的Python实现-基于支持向量机分类

      本文链接:https://www.haomeiwen.com/subject/apmwtxtx.html