如何使用余弦相似度完成文本分类并计算分类准确率?
基于Sentence-BERT嵌入的情感三分类实现方案
核心分类逻辑
你已经完成了文本向量化步骤,接下来通过相似度匹配规则即可完成三分类,整体流程如下:
- 首先用训练集数据生成三类情感对应的基准特征:将训练集里同一类的所有样本嵌入取平均值,得到负向、中性、正向三个类别中心向量
- 对每条测试样本的嵌入,分别计算它和三个类别中心的余弦相似度,取相似度最高的类别作为该样本的预测标签
- 所有测试样本预测完成后,将预测标签和测试集真实标签比对,计算正确预测的占比即可得到分类准确率
代码实现示例
依赖导入
from sentence_transformers import util import numpy as np from sklearn.metrics import accuracy_score
步骤1:计算类别中心向量
# 前置变量说明: # train_embeddings:训练集所有样本的嵌入数组 # train_labels:训练集对应的标签,约定0=负向、1=中性、2=正向 # 分别提取三类的嵌入并计算均值中心 neg_center = np.mean(train_embeddings[train_labels == 0], axis=0) neu_center = np.mean(train_embeddings[train_labels == 1], axis=0) pos_center = np.mean(train_embeddings[train_labels == 2], axis=0) class_centers = np.array([neg_center, neu_center, pos_center])
步骤2:批量预测测试集标签
# 计算所有测试嵌入和三个类别中心的余弦相似度矩阵 cos_sim_matrix = util.cos_sim(test_embeddings, class_centers) # 取每行最大值对应的索引作为预测标签 pred_labels = np.argmax(cos_sim_matrix.numpy(), axis=1)
步骤3:计算分类准确率
# test_labels:测试集对应的真实标签 accuracy = accuracy_score(test_labels, pred_labels) print(f"分类准确率:{accuracy:.4f}")
优化方案
如果你的数据集存在类别不均衡、类内特征差异大的问题,可替换为K近邻分类获得更稳定的效果:
from sklearn.neighbors import KNeighborsClassifier # 基于余弦距离构建KNN分类器,k值建议取3/5/7等奇数避免平票 knn_clf = KNeighborsClassifier(n_neighbors=5, metric='cosine') knn_clf.fit(train_embeddings, train_labels) pred_labels = knn_clf.predict(test_embeddings) accuracy = accuracy_score(test_labels, pred_labels)
内容的提问来源于stack exchange,提问作者Valdas
相关产品推荐
相关产品推荐

