readme.md 5.9 KB
Newer Older
Y
yinhaofeng 已提交
1 2 3 4 5 6
# multiview-simnet文本匹配模型

以下是本例的简要目录结构及说明: 

```
├── data #样例数据
Y
yinhaofeng 已提交
7 8 9 10 11 12
    ├── train
        ├── train.txt #训练数据样例
    ├── test
        ├── test.txt #测试数据样例
    ├── preprocess.py #数据处理程序
    ├── data_process.sh #一键数据处理脚本
Y
yinhaofeng 已提交
13 14 15 16
├── __init__.py
├── README.md #文档
├── model.py #模型文件
├── config.yaml #配置文件
Y
change  
yinhaofeng 已提交
17 18 19 20
├── run.sh #运行脚本,在效果复现时使用
├── transform.py #整理格式准备计算指标的程序
├── reader.py #读者需要自定义数据集时供读者参考
├── evaluate_reader.py #读者需要自定义数据集时供读者参考
Y
yinhaofeng 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
```
注:在阅读该示例前,建议您先了解以下内容:

[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)

## 内容

- [模型简介](#模型简介)
- [数据准备](#数据准备)
- [运行环境](#运行环境)
- [快速开始](#快速开始)
- [效果复现](#效果复现)
- [进阶使用](#进阶使用)
- [FAQ](#FAQ)


## 模型简介
在个性化推荐场景中,推荐系统给用户提供的项目(Item)列表通常是通过个性化的匹配模型计算出来的。在现实世界中,一个用户可能有很多个视角的特征,比如用户Id,年龄,项目的点击历史等。一个项目,举例来说,新闻资讯,也会有多种视角的特征比如新闻标题,新闻类别等。多视角Simnet模型是可以融合用户以及推荐项目的多个视角的特征并进行个性化匹配学习的一体化模型。 多视角Simnet模型包括多个编码器模块,每个编码器被用在不同的特征视角上。当前,项目中提供Bag-of-Embedding编码器,Temporal-Convolutional编码器,和Gated-Recurrent-Unit编码器。我们会逐渐加入稀疏特征场景下比较实用的编码器到这个项目中。模型的训练方法,当前采用的是Pairwise ranking模式进行训练,即针对一对具有关联的User-Item组合,随机实用一个Item作为负例进行排序学习。 

模型的具体细节可以阅读论文[MultiView-Simnet](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/frp1159-songA.pdf):
<p align="center">
<img align="center" src="../../../doc/imgs/multiview-simnet.png">
<p>

## 数据准备
Y
yinhaofeng 已提交
46
BQ是一个智能客服中文问句匹配数据集,该数据集是自动问答系统语料,共有120,000对句子对,并标注了句子对相似度值。数据中存在错别字、语法不规范等问题,但更加贴近工业场景。执行以下命令可以获取上述数据集。
Y
yinhaofeng 已提交
47
```
Y
yinhaofeng 已提交
48 49 50
wget https://paddlerec.bj.bcebos.com/dssm%2Fbq.tar.gz
tar xzf dssm%2Fbq.tar.gz
rm -f dssm%2Fbq.tar.gz
Y
yinhaofeng 已提交
51
```
Y
yinhaofeng 已提交
52 53 54 55 56 57 58 59
数据集样例:
```
请问一天是否都是限定只能转入或转出都是五万。    微众多少可以赎回短期理财        0
微粒咨询电话号码多少    你们的人工客服电话是多少        1
已经在银行换了新预留号码。      我现在换了电话号码,这个需要更换吗      1
每个字段以tab键分隔,第1,2列表示两个文本。第3列表示类别(0或1,0表示两个文本不相似,1表示两个文本相似)。
```
最终输出的数据格式为一个标识句子的slot,后跟一个句子中词的token。两者形成{slot:token}的形式标识一个词:  
Y
yinhaofeng 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
```
0:358 0:206 0:205 0:250 0:9 0:3 0:207 0:10 0:330 0:164 1:1144 1:217 1:206 1:9 1:3 1:207 1:10 1:398 1:2 2:217 2:206 2:9 2:3 2:207 2:10 2:398 2:2
0:358 0:206 0:205 0:250 0:9 0:3 0:207 0:10 0:330 0:164 1:951 1:952 1:206 1:9 1:3 1:207 1:10 1:398 2:217 2:206 2:9 2:3 2:207 2:10 2:398 2:2
```

## 运行环境
PaddlePaddle>=1.7.2  
python 2.7  
PaddleRec >=0.1  
os : linux  

## 快速开始
本文提供了样例数据可以供您快速体验,在paddlerec目录下直接执行下面的命令即可启动训练: 

```
python -m paddlerec.run -m models/match/multiview-simnet/config.yaml
```   


## 效果复现
为了方便使用者能够快速的跑通每一个模型,我们在每个模型下都提供了样例数据。如果需要复现readme中的效果,请按如下步骤依次操作即可。  
1. 确认您当前所在目录为PaddleRec/models/match/multiview-simnet
2. 在data目录下载并解压数据集,命令如下:  
``` 
cd data
Y
yinhaofeng 已提交
85 86 87 88
wget https://paddlerec.bj.bcebos.com/dssm%2Fbq.tar.gz
tar xzf dssm%2Fbq.tar.gz
rm -f dssm%2Fbq.tar.gz
mv bq/train.txt ./raw_data.txt
Y
yinhaofeng 已提交
89
```
Y
yinhaofeng 已提交
90
3. 本文提供了快速将数据集中的汉字数据处理为可训练格式数据的脚本,您在解压数据集后,可以看见目录中存在一个名为bq的目录。将其中的train.txt文件移动到data目录下。然后可以在python3环境下运行我们提供的preprocess.py文件。即可生成可以直接用于训练的数据目录test.txt,train.txt,label.txt和testquery.txt。将其放入train和test目录下以备训练时调用。生成时间较长,请耐心等待。命令如下:
Y
yinhaofeng 已提交
91 92
```
python3 preprocess.py
Y
yinhaofeng 已提交
93 94 95 96
mkdir big_train
mv train.txt ./big_train
mkdir big_test
mv test.txt ./big_test
Y
yinhaofeng 已提交
97 98
cd ..
```
Y
yinhaofeng 已提交
99 100 101 102 103
也可以使用我们提供的一键数据处理脚本data_process.sh
```
sh data_process.sh
```
4. 退回multiview-simnet目录中,打开文件config.yaml,更改其中的参数  
Y
yinhaofeng 已提交
104

Y
yinhaofeng 已提交
105 106 107
    将workspace改为您当前的绝对路径。(可用pwd命令获取绝对路径) 
	将dataset_train中的data_path改为{workspace}/data/big_train
    将dataset_infer中的data_path改为{workspace}/data/big_test 
Y
yinhaofeng 已提交
108

Y
change  
yinhaofeng 已提交
109
5.  执行脚本,开始训练.脚本会运行python -m paddlerec.run -m ./config.yaml启动训练,并将结果输出到result文件中。然后启动格式整理程序transform,最后计算正逆序比:
Y
yinhaofeng 已提交
110 111 112 113 114 115
```
sh run.sh
```

运行结果大致如下:
```
Y
change  
yinhaofeng 已提交
116
................run.................
Y
yinhaofeng 已提交
117 118 119 120
8902
pnr: 13.6785350966
query_num: 1371
pair_num: 14429 14429
Y
change  
yinhaofeng 已提交
121
equal_num: 0
Y
yinhaofeng 已提交
122 123
正序率: 0.931873310694
13446 983
Y
yinhaofeng 已提交
124 125 126 127
```
## 进阶使用
  
## FAQ