基于fasttext的新客服文本分类

基于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是一个快速文本分类算法,在保持高精度的情况下加快了训练速度和测试速度,
且不需要预训练好的词向量,自己训练词向量。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值