基于fasttext的新客服文本分类效果评估
具体步骤如下:
- 数据处理
- 模型搭建
- 效果评估
- 结论
第一部分数据处理包括:数据读取、数据标准化格式处理、训练集和验证集数据准备
数据读取
import pandas as pd
df = pd.read_csv('./input/分类打标文档_all.csv')[['标签一级', 'voice_txt']]
df.columns = ['labels', 'str']
数据标准化格式处理
fasttext模型训练时使用的标准数据分为两块 (标签加工+文本分词):
第一块的组成是“label”+“类别名称”,这里的类别名称可以是中文也可以是英文,标签其实可以填写多个,但是不推荐(模型效果差);
第二块是对文本部分,需完成分词操作,并使用空格分割;
第一块与第二块之间用 逗号’,'拼接,完成数据标准化格式处理。
标签加工
将标签加工为模型所需的固定“label”+“类别名称”格式
def create_label(x):
return '__label__' + str(x)
df['label_type'] = df['labels'].apply(lambda x: create_label(x))
文本分词
采用jieba分析工具,原理如下:
1、基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);
2、采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合,计算最大概率路径;
3、对于未登录词,采用了基于汉字成词能力的隐马尔可夫模型(HMM)。
具体详见博文分词工具原理
import jieba
def str_cut(x):
x = ' '.join(i for i in jieba.cut(x))
return x
df['text'] = df['str'].apply(lambda x: str_cut(x))
格式化合并
df['model_text'] = df['label_type'] + "," + df['text']
训练集和验证集数据准备
抽取9成数据进行训练 1成数据进行验证
import numpy as np
from sklearn.model_selection import train_test_split
x_train,x_text = train_test_split(df, train_size=0.9, random_state=18)
np.savetxt('./data_set',
x_train.values,
delimiter=' ',
fmt="%s",
encoding='utf-8')
第二部分模型搭建包括:模型构建与数据预测
模型构建
为了使模型尽可能简单,选取了能耗低的参数用于模型训练
import fasttext
model = fasttext.train_supervised('data_set',
epoch = 1000,
lr = 0.9,
dim = 10,
wordNgrams = 3,
loss='softmax')
model.save_model("./model/fasttext_all.bin")
model = fasttext.load_model("./model/fasttext_all.bin")
数据预测
利用训练好的模型在验证集上进行预测
def x_pre(x):
f = model.predict(x)[0][0].split(',')[0].replace('__label__','')
return f
x_text['pred'] = x_text['text'].apply(lambda x: x_pre(x))
第三部分效果评估
将验证集预测结果与验证集实际结果进行比对,计算模型准确率,在标签一中,模型准确率达到0.94相当不错的成绩。
pred = x_text['pred'].reset_index(drop=True)
labels = x_text['labels'].reset_index(drop=True)
acc_lst = []
for i in range(len(x_text)):
if labels[i] == pred[i]:
acc_lst.append(1)
else:
acc_lst.append(0)
print(sum(acc_lst)/len(acc_lst))
print(sum(acc_lst)/len(acc_lst))
结论
fastText是一个快速文本分类算法,在保持高精度的情况下加快了训练速度和测试速度,
且不需要预训练好的词向量,自己训练词向量。