其他
使用qa_match开源工具完成58同城AI算法大赛
导读
以人工智能技术为核心的智能客服近年来被广泛应用,它不仅能给用户提供高效和个性化的客户服务体验,还可以为企业节省大量客服人力成本。智能客服的本质是充分理解用户的意图,在知识库中精确查找与之相匹配的内容,自动回答用户的问题。文本匹配、分类是智能客服里最核心的技术,同时也是自然语言理解领域中的核心问题之一。
背景
模型和数据准备
1. 下载SPTM源码
git clone https://github.com/wuba/qa_match.git
cd qa_match
2. 下载竞赛数据
从大赛首页下载竞赛数据并解压,可以将下载的数据解压到qa_match的data_demo文件夹下,解压后生成data文件夹,具体文件结构如下:
SPTM模型训练
1. 预训练语言模型
cd sptm
mkdir -p model/pretrain
nohup python run_pretraining.py --train_file="../data_demo/data/pre_train_data" \
--vocab_file="../data_demo/data/vocab"\
--model_save_dir="./model/pretrain"\
--batch_size=512 \
--print_step=100 \
--weight_decay=0 \
--embedding_dim=1000 \
--lstm_dim=500 \
--layer_num=1 \
--train_step=100000 \
--warmup_step=10000 \
--learning_rate=5e-5 \
--dropout_rate=0.1 \
--max_predictions_per_seq=10 \
--clip_norm=1.0 \
--max_seq_len=100 \
--use_queue=0 > pretrain.log2>&1&
参数 | 说明 |
vocab | 词典文件(竞赛提供的vocab文件) |
train_file/valid_data | 训练/验证集 |
lstm_dim | lstm的门控单元数 |
embedding_dim | 词嵌入维度 |
dropout_rate | 节点被dropout的比例 |
layer_num | LSTM的层数 |
weight_decay | adam的衰减系数 |
max_predictions_per_seq | 每个句子中,最多会mask的词数 |
clip_norm | 梯度裁剪阈值 |
use_queue | 是否使用队列生成预训练数据 |
2. 训练分类模型
shuf ../data_demo/data/train_data| tr -d "\r" > ../data_demo/data/train_data_shuf
head -n1000../data_demo/data/train_data_shuf > ../data_demo/data/valid_data_final
tail -n+1001../data_demo/data/train_data_shuf > ../data_demo/data/train_data_final
python run_classifier.py --output_id2label_file="model/id2label.has_init" \
--vocab_file="../data_demo/data/vocab"\
--train_file="../data_demo/data/train_data_final"\
--dev_file="../data_demo/data/valid_data_final"\
--model_save_dir="model/finetune"\
--lstm_dim=500 \
--embedding_dim=1000 \
--opt_type=adam \
--batch_size=256 \
--epoch=20 \
--learning_rate=1e-4 \
--seed=1 \
--max_len=100 \
--print_step=10 \
--dropout_rate=0.1 \
--layer_num=1 \
--init_checkpoint="model/pretrain/lm_pretrain.ckpt-500000"
具体参数含义如下表所示:
参数 | 说明 |
output_id2label_file | (id,标签)映射文件,最后预测的时候使用 |
opt_type | 优化器类型,有sgd/adagrad/adam几种可选 |
seed | 随机种子的值,使用相同的随机种子保证微调模型结果一致 |
init_checkpoint | 预训练模型保存的checkpoint,即前面预训练的结果文件 |
SPTM模型预测
1. 用训练好的分类模型进行打分
python run_prediction.py --input_file="../data_demo/data/test_data" \
--vocab_file="../data_demo/data/vocab"\
--id2label_file="model/id2label.has_init"\
--model_dir="model/finetune"> "../data_demo/data/result_test_raw"
2. 生成竞赛最终预测文件并上传
1) 从竞赛提供的验证集test_data取出扩展问题id
awk '{print $2}' test_data >ext_id
awk -F',' '{print $1}'result_test_raw | awk -F'|' '{print $1}'| awk -F'__' '{print $3}' > std_id
echo ext_id,std_id > 58cop.csv
paste -d","ext_id std_id >> 58cop.csv
3. 上传竞赛预测文件
推荐阅读: