任务描述
本关任务:根据本关所学有关支持向量机的知识,编写基于支持向量机理论进行文本分类的程序,并通过所有测试用例。
相关知识
为了完成本关任务,你需要掌握:
-
支持向量机理论的思想;
-
支持向量机分类器的实现。
支持向量机简介
支持向量机(SVM)算法被认为是文本分类中效果较为优秀的一种方法,它是一种建立在统计学习理论基础上的机器学习方法。该算法基于结构风险最小化原理,将数据集合压缩到支持向量集合,学习得到分类决策函数。这种技术解决了以往需要无穷大样本数量的问题,它只需要将一定数量的文本通过计算抽象成向量化的训练文本数据,提高了分类的精确率。 支持向量机(SVM)算法是根据有限的样本信息,在模型的复杂性与学习能力之间寻求最佳折中,以求获得最好的推广能力支持向量机算法的主要优点有:
-
专门针对有限样本情况,其目标是得到现有信息下的最优解而不仅仅是样本数量趋于无穷大时的最优值;
-
算法最终转化为一个二次型寻优问题,理论上得到的是全局最优点,解决了在神经网络方法中无法避免的局部极值问题;
-
支持向量机算法能同时适用于稠密特征矢量与稀疏特征矢量两种情况,而其他一些文本分类算法不能同时满足两种情况;
-
支持向量机算法能够找出包含重要分类信息的支持向量,是强有力的增量学习和主动学习工具,在文本分类中具有很大的应用潜力。
基于 SVM 的文本分类
SVM 文本分类算法主要分四个步骤:文本特征提取、文本特征表示、归一化处理和文本分类。接下来,我们将详细介绍相关步骤:
1、文本特征提取 目前,在对文本特征进行提取时,常采用特征独立性假设来简化特征选择的过程,达到计算时间和计算质量之间的折中。一般的方法是根据文本中词汇的特征向量,通过设置特征阀值的办法选择最佳特征作为文本特征子集,建立特征模型。
2、文本特征表示 我们常使用 TF-IDF 来表示文本特征,TF-IDF的主要思想是:一批文档中某词出现的频率越高,它的区分度则越小,权值也越低;而在一个文档中,某词出现的频率越高,区分度则越大,权重越大。
count_vect = CountVectorizer()
x_train_counts = count_vect.fit_transform(description_list) # 将文本中的词语转换为词频矩阵
tfidf_transformer = TfidfTransformer()
x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) # 用于统计vectorizer中每个词语的TFIDF值
3、归一化处理 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
4、文本分类 经过文本预处理、特征提取、特征表示、归一化处理后,已经把原来的文本信息抽象成一个向量化的样本集,然后把此样本集与训练好的模板文件进行相似度计算,若不属于该类别,则与其他类别的模板文件进行计算,直到分进相应的类别,这就是 SVM 模型的文本分类方式。
from sklearn.svm import SVC # 导入 SVM 模型
clf = SVC(kernel='linear').fit(train_x, train_y) # 进行训练
y_score = clf.predict(test_x) # 进行分类预测
编程要求
在右侧编辑器中的 Begin-End 之间补充 Python 代码,完成基于支持向量机理论对所输入文本数据进行文本分类,并输出文本分类结果。其中文本数据的路径通过 input 从后台获取。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
测试输入:
data1.csv
预期输出:
本次文本分类的准确率为: 21.43%
完成了基于 SVM 的文本分类。
参考代码:
import numpy as np
from sklearn.svm import SVC
from sklearn.feature_extraction.text import CountVectorizer
from collections import Counter
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfTransformer
from test import get_data,get_result
df = get_data()
counter = Counter(df['variety'].tolist())
top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))}
df = df[df['variety'].map(lambda x: x in top_10_varieties)]
description_list = df['description'].tolist()
varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()]
varietal_list = np.array(varietal_list)
count_vect = CountVectorizer()
x_train_counts = count_vect.fit_transform(description_list)
# 任务:完成对文本的TF-IDF值的计算
# ********** Begin *********#
tfidf_transformer = TfidfTransformer()
x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) # 用于统计vectorizer中每个词语的TFIDF值
# ********** End *********#
train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3)
clf = SVC(kernel='linear').fit(train_x, train_y)
y_score = clf.predict(test_x)
n_right = 0
for i in range(len(y_score)):
if y_score[i] == test_y[i]:
n_right += 1
get_result(n_right,test_y)