NeuralTemplateGen-代码功能梳理

先说一下这个模型是干嘛的~

简介

基于Encoder-Decoder方式的文本生成模型已成为NLG的主流,但是它存在诸如 (1)不可解释、(2)很难进行讲点或内容的选择这些缺点。

本文主要是对decoder进行了改进,使用隐半马尔科夫HSMM模型作为解码器,这种模型可以学习得到模板,这些模板是可控的而且也具有解释性。

该模型可以自动完成 讲点选择及排序文本模板生成模板槽位填充 几个过程,最终得到一句完整的话。

从四个方面来介绍代码的功能。

一、数据及数据准备

1.1 开源数据集E2E

E2E是一个最大的餐饮领域的开源数据集。常用用于NM。就是一个连词成句的过程。

  • mr: (textual meaning representation)就是“词”,类似属性名及属性值
  • ref:生成的可阅读的句子

一个mr的例子

name[The Vaults], 
eatType[pub], 
priceRange[more than £30], 
customer rating[5 out of 5], 
near[Café Adriatic]

对应生成的句子

Near Café Adriatic is a five star rated, high priced pub called The Vaults.
The Vaults is a 5 stars pub with middle prices in Café Adriatic.
The Vaults Pub is close to Café Adriatic, it is five star rated and it has high prices
The Vaults is near Café Adriatic, it's a pub that ranges more than 30 and customers rate it 5 out of 5.
The Vaults is a five star, expensive public house situated close to Café Adriatic
There is an expensive, five-star pub called The Vaults located near Café Adriatic.
The Vaults is a local pub with a 5 star rating and prices starting at £30. You can find it near Café Adriatic.
The Vaults is a pub with menu items more than £30 and a customer rating of 5 out of 5. The Vaults is located near Café Adriatic.
The Vaults with a amazing 5 out of 5 customer rating, is a pub near the Café Adriatic.  Menu price are more than £30 per item.
Rated 5 star by diners, The Vaults offers Pub fair near Café Adriatic.
The Vaults in  Café Adriatic is a great 5 stars pub with middle prices.
The Vaults costs more than 30 pounds and has a 5 out of 5 rating.  It is a pub located near Café Adriatic.
The Vaults is a pub that costs more than 30 pounds and has a 5 out of 5 rating.  It is located near Café Adriatic.
The pub Café Adriatic ranges more than 30 and is rated 5 out of 5 its near The Vaults.
The Vaults is an expensive, five-star pub located near Café Adriatic.

注意项

1.生成的都是事实类的描述,比如是一家适合家庭聚餐的饭馆,而没有描述性
2. 同一个样本可能在某些维度上有不同的值,比如,菜的价格,有人认为比较合适,有人认为比较贵。
3. 每一个样本一个维度上只有一个取值,比如,一个餐厅有多种菜系,但是每个样本的菜系取值只有一个(日本菜、意大利菜、中国菜等)

1.2 使用的数据

  1. source and target
  • src_train Data,属性及属性值,总数量42061,去重后数量4862
  • train Sequence,生成的句子,总数量42061,去重后数量40785
  1. field insource
['customerrating', 'name', 'area', 'food', 'near', 'priceRange', 'eatType']

1.3 数据准备

目前数据路径 data/sub_path下面包含src_train.txt, tgt_train.txt,train.txt, src_test.txt, tgt_test.txt, test.txt,src_valid.txt, tgt_valid.txtvalid.txt 文件,

src_*.txt文件是结构化的数据,tgt_*.txt文件是可读的文本。

但是模型训练需要的是train.txtvalid.txt文件。是怎么得到的呢?

可以执行

python data/make_e2e_labedata.py train > train.txt
python data/make_e2e_labedata.py valid > valid.txt

这个过程就是从生成文本中标记出那些和原数据完全一样的槽位值。
举个栗子:

原数据:

name: The Vaults
eatType: pub
priceRange: more than £ 30
customerrating: 5 out of 5
near: Café Adriatic 

生成的文本:

The Vaults pub near Café Adriatic has a 5 star rating . Prices start at £ 30 .

可以看到只有name,eatTypenear这些属性对应的属性值在生成文本中出现了,所以,我们用位置和属性id标记出来,标点符号的id是同一个。

那么这个例子的结果如下

[(0, 2, idx('name')), (2, 3, idx('eatType')), (4, 6, idx('near')), (11, 12, idx('unknow')), (17, 18, idx('unknow'))]

这样有助于我们学习模板的位置及类型关系。

二、训练过程

python chsmm.py \
    -data data/labee2e/ \
    -emb_size 300 \
    -hid_size 300 \
    -layers 1 \
    -K 55 \
    -L 4 \
    -log_interval 200 \
    -thresh 9 \
    -emb_drop \
    -bsz 15 \
    -max_seqlen 55 \
    -lr 0.5 \
    -sep_attn \
    -max_pool \
    -unif_lenps \
    -one_rnn \
    -Kmul 5 \
    -mlpinp \
    -onmt_decay \
    -cuda \
    -seed 1818 \
    -save models/chsmm-e2e-300-55-5.pt

主要过程如下:

  • 把样本打乱
  • make_combo_targs:把词和copy信息放到一个单独的Tensor中
  • make_masks:因为生成文本中可能会新词,在后续会处理掉,就是mask。这里面有两种操作,一种是直接把这个词去掉,还有一种平均
  • get_uniq_fields:每个batch的Fields都补齐到最大长度

三、模板抽取

这个过程主要是生成模板,还是以上面的例子,生成如下带有槽位的模板。

在这里插入图片描述
segs/路径下保存抽后的模板。模板生成方法如下:

使用non-autoregressive方法:

python chsmm.py -data data/sub_path/ -emb_size 300 -hid_size 300 -layers 1 -K 55 -L 4 -log_interval 200 -thresh 9 -emb_drop -bsz 16 -max_seqlen 55 -lr 0.5  -sep_attn -max_pool -unif_lenps -one_rnn -Kmul 5 -mlpinp -onmt_decay -cuda -load models/e2e-55-5.pt -label_train | tee segs/seg-e2e-300-55-5.txt

四、文本生成

有了模型和模板之后,就可以进行文本生成啦。(其实就是一个模板选择和槽位填充的过程。)

autoregressive 模型生成:

python chsmm.py -data data/sub_path/ -emb_size 300 -hid_size 300 -layers 1 -dropout 0.3 -K 60 -L 4 -log_interval 100 -thresh 9 -lr 0.5 -sep_attn -unif_lenps -emb_drop -mlpinp -onmt_decay -one_rnn -max_pool -gen_from_fi data/labee2e/src_uniq_valid.txt -load models/e2e-60-1-far.pt -tagged_fi segs/seg-e2e-60-1-far.txt -beamsz 5 -ntemplates 100 -gen_wts '1,1' -cuda -min_gen_tokes 0 > gens/gen-e2e-60-1-far.txt

-gen_from_fi 后面跟的文件是结构化数据
-tagged_fi后面是我们抽取好的模板
-load 是我们训练好的模型
-gens/路径下保留生成的文本。

注意 生成结果的格式: <文本>|||<模板片段>, 真正使用只需要保留文本。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值