自然语言处理(...pythonml

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

2017-05-10  本文已影响3300人  Hellooooooworld

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

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

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

part.0 数据描述

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

上一篇下一篇

猜你喜欢

热点阅读