SVM做文本分类详细操作流程

以天气分类为例,我们的目的是运用支持向量机SVM(libsvm)来训练出一个天气分类的模型,这个模型可以将新来的语料分成天气类和非天气类两个大类,即正类与负类,具体的流程如下:

1.爬取语料数据
首先,第一步要做的就是网上爬取天气相关的语料,可以运用Python爬虫爬取百度相关搜索的词条,进行多轮爬取,我们将跟天气相关的语料称为正语料,与天气无关的语料称为负语料,正语料和负语料分开爬取,一般来说,训练模型所需要的正负语料比例大概是1:3到1:5,也就是说训练天气模型的时候,正语料大概是10000条左右,负语料为3000+条。

2.语料的处理
爬完语料之后进行人工筛选,将一些不纯的正语料去掉,剩下的纯净的正语料。之后再将剩下的正负语料进行进一步处理,比如停用词的去除等操作,就是讲语料中没有意义的词去除,eg,“吗”、“的”……

3.抽取测试语料
这里要注意,语料处理好之后,大概要从语料中抽10%的语料,用于模型训练好之后的测试,即抽取大概1000条正语料和3000条负语料作为测试语料,剩下的语料作为训练语料。

4.分词处理
将所有的语料进行分词处理,将完整的语料分成若干词语,分词可以运用“结巴”分词的库。

5.语料标注
将每一个分词后的语料进行标注,正语料标注为1,负语料标注为0。语料和标签之间用TAB分隔,即“\t”。

6.打乱语料
将标注好的正负语料进行混合,然后进行打乱顺序,让带标签的正负语料充分混合。

7.特征提取(特征选择)
可以运用卡方或者互信息等方法将分词之后的语料每个词的特征提取出来,即每一个词语与当前类别的相关程度,特征提取也是为后面的向量化做准备的。可以用feature_select.py。

python feature_select.py input.txt output.txt

特征提取结束可以得到weather_train_feature_select.txt ,里面会有每个特征词与相关类别的相关度排序。
特征提取后的结果

8.向量化
就是将我们处理好的数据进行向量化,将我们的语料转化成向量,分好词的语料命中之前特征提取的特征词,那么就将向量中的这个值设置为1,其他的为0。这个过程中,特征词就是这个向量的维度,每个语料都是一个这么多维度的向量。向量化执行一个vector.sh脚本文件,里面指定feature_num,text_data,train_model这几个文件,其中feature_num=500是指我们取前500个特征词作为我们训练模型的维度,text_data使我们之前分好词打好标签的混合好的语料,train_data是我们指定好向量化好之后生成的向量化文件。
向量化需要配置的参数
同时还需要指定如下文件:
这里写图片描述
其中feature_file是进行特征选择之后的文件,weather_feature_kv.dict是一些时间和地点的简直对,目的是为了减少我们特征向量的维度,内容如图所示:
weather_feature_kv.dict
weather_feature.tire是自定义的一些的天气参数,如图所示:
这里写图片描述
我们之前定的维度是500维,加上这两个文件,特征向量就是502维的。

9.参数调优
向量化之后就是可以调用libsvm中的grid.py,libsvm就可以自动调出最优的参数c和g。(libsvm自行下载)调用示例:

python grid.py libsvm.weather.train.txt

其中libsvm.weather.train.txt是我们上一步向量化得到的文件。之后是漫长的参数调优,最后会得到c和g的结果。

10.训练模型
参数调优之后,我们就可以调用libsvm中的svm-train来训练模型,训练的时候同时要设置之前参数调优得到的结果,最终我们会得到一个天气的模型,训练模型用到train_model.sh,其中要制定好生成的模型文件路径 :

train_model=../../../weather_source/libsvm.fea${feature_num}.weather.model

除此之外,还要将参数调优得到的结果c和g传入一起训练,还要将参数b设置为1,为了得到的分数是其概率。最终可以得到我们想要的模型,如果我们

11.预测结果
调用svmpredict,根据训练获得的模型,对数据集合进行预测。通过对数据集合的预测,可测得准确率与召回率。调用方法如下所示:

    ./svm-predict ../weather_source/libsvm.weather.test.train.txt ../weather_source/libsvm.fea500.weather.model ../weather_source/predict_result.txt 

最终就会得到预测的结果predict_result.txt 。

猜你喜欢

转载自blog.csdn.net/oscar6280868/article/details/78437069