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

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

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

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

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%左右,所以我们对程序的优化和技术的升级能做还有很多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容