4. 支持向量机短文本分类

任务说明

本案例使用支持向量机(SVM)对短文本进行二分类。输入为若干条中文短文本(如商品评论),每条标注为正面(1)或负面(0)。目标是通过TF-IDF特征将文本向量化,训练线性SVM分类器,并对新样本完成类别预测。

实现代码

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 1. 构造训练数据(短文本 + 标签)
train_texts = [
    "这个手机屏幕清晰,运行流畅",
    "电池续航太差,半天就没电",
    "外观漂亮,手感很好",
    "拍照模糊,对焦很慢",
    "价格实惠,性价比高",
    "系统卡顿,经常闪退",
]
train_labels = [1, 0, 1, 0, 1, 0]  # 1=正面, 0=负面

# 2. 中文分词
def tokenize(text):
    return " ".join(jieba.cut(text))

train_corpus = [tokenize(t) for t in train_texts]

# 3. TF-IDF特征提取
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(train_corpus)

# 4. 训练线性SVM分类器
svm_model = SVC(kernel="linear", C=1.0)
svm_model.fit(X_train, train_labels)

# 5. 对新样本进行预测
new_texts = [
    "这个耳机音质很好,值得购买",
    "质量太差,用两天就坏了",
]
new_corpus = [tokenize(t) for t in new_texts]
X_new = vectorizer.transform(new_corpus)
pred_labels = svm_model.predict(X_new)

# 6. 输出预测结果
for text, label in zip(new_texts, pred_labels):
    print(f"文本: {text} → 预测类别: {'正面' if label == 1 else '负面'}")

# 7. 在训练集上评估(仅作演示,实际应使用测试集)
train_pred = svm_model.predict(X_train)
print(f"训练集准确率: {accuracy_score(train_labels, train_pred):.2f}")

运行方式

安装依赖:pip install jieba scikit-learn。将代码保存为 svm_short_text.py,执行 python svm_short_text.py。

验证方法

观察终端输出:两条新样本应分别被预测为“正面”和“负面”。训练集准确率输出为1.00(因为训练样本线性可分,且评估在训练集上进行)。若需更严谨验证,可将数据划分为训练集和测试集,或使用交叉验证。

判定标准

  • 程序无报错,正常输出两条预测结果。
  • 第一条新文本(含“音质很好”“值得购买”)预测为正面,第二条(含“质量太差”“用两天就坏”)预测为负面。
  • 训练集准确率输出为1.00,说明模型在训练数据上完全拟合。

关键说明

本案例使用线性核SVM,适合短文本高维稀疏特征场景。实际应用中应使用独立测试集评估泛化能力,并可通过网格搜索调节C参数。分词使用jieba默认词典,未做停用词过滤,可根据数据情况自行添加。

原始短文本 jieba分词 TF-IDF向量化 线性SVM训练 类别预测 数据流与维度变化 训练样本: 6条中文短文本 分词后: 以空格分隔的词序列 TF-IDF矩阵: 6×N (N为词典大小, 本例N≈30) SVM模型: 线性核, C=1.0, 决策边界为超平面 输出: 新样本的类别标签 (0/1) 高维稀疏向量 超平面 w·x+b=0