背景
在实际的业务场景里,用会话文本构建模型(机器学习/深度学习)来做意图分类之类的任务时,经常会出现人工打标不够准确的问题,标签都不准确的话模型当然无法学习到有效信息了。这个问题真的非常头疼…除了与业务沟通修正标签以外(通常很慢),用现有的数据尽量修正正负样本也能有效的提升模型区分效果。
方法
介绍一种比较简要的方法,这里的分类任务我用的是给句子做二分类,用sentence2vec方法把句子转换成向量后,采用PCA降维成二维数据,做可视化图就可以看出人工打标下正负样本的分布。
人工打标结果虽然不准,但还是可以用作参考,比方说可视化图中几乎仅有正样本分布的区域,就是人工判断样本正负上绝对没有异议的样本,可以作为新的正样本。
PCA降维及可视化的核心代码:
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
pca = PCA(n_components=2) #PCA
result = pca.fit_transform(data_vecs) #将句子向量(128维度)降维成二维向量,[1000, 128]->[1000,
主要步骤
- 句子转向量【略】;
- 句子向量用PCA降成二维信息;
- 每个句子的二维信息作为坐标,可视化;
- 根据可视化点图,分别截取不同区域的句子查看句子含义:
注:黄点为正样本,紫色点为负样本
比方我这里是以“要退保”意图为正样本,“不要退保”意图为负样本,图中右边区域正样本和负样本几乎都混杂在了一起,这些就是按照不同人员打标后标准不统一的结果,但左边的样本几乎没有负样本,说明这部分文本是没有异议的,可以筛出作为新的正样本。
我筛选的标准比较粗糙,直接将左边区域的作为新的正样本,也可以用机器学习中的模型来筛选出正样本应该也OK的