Topic-Aware Neural Keyphrase Generation for Social Media Language 【论文复现赛】

本文由腾讯AILab和香港中文大学联合发表,文章关注的问题为自然语言理解的中的关键短语(keyphrase)生成问题,另外所研究的场景是更为常见与广泛的社交媒体(social media)。

1. 背景

随着网络技术和硬件设备的发展,人与人之间的沟通逐渐的变得更加的便携和简易,而且twitter、Facebook、weibo等广泛被使用的社交媒体为人们之间的沟通和意见的交流提供了一个很好的平台。不同地方的用户可以在不同的地方及不同的时间在社交媒体上分享自己的生活,或是对于社会中发生的热点事件给出自己的看法。

正如任何事物都是一把双刃剑,社交媒体的发展也不可避免的会带来诸多的问题。但如何中它所存在的内容中得到有用的信息也是一件十分重要的事情,因此社交媒体的关键行短语生成问题成为了自然语言理解领域一个热门的方向。所谓的主题性短语生成(主题性短语抽取)任务的目的在于从大量的文本中提取出可以表达主题的关键性信息,而所关注的信息层级在短语这个层次。

现有的方法主要是直接中给定的文本中抽取到表示关键主题的短语或是使用得到的词来组成短语,这样的做法可以在一定程度中得到想要的结果,特别是在例如科学文献等比较规范化的文本语料中效果不错。但是社交媒体上的内容具有一个很大的特点,那表示数据的稀疏性。由于社交媒体本身的定位,用户所发布的内容通常篇幅较短、格式各异,因此那些在规范化文本上有效的方法在这里往往效果很差。

从文中给出的例子中我们可以看出,在[S]这句话中我们无法找到它所对应的关键短语:超级碗(super bowl)。但其中所出现的yellow pants和匹兹堡钢人队(Steeler)具有很大的联系。因此,社交媒体中出现yellow pants的内容往往也和超级碗具有很大的关联性,因此现有的方法是无法正确的得到,那如何解决这个问题呢?

我们可以想一下:关于同一主题来说,不同的人所给出的内容是有差别的;对于同一主题的描述相关的词也有很多。因此,如果从不同的词中首先得到关于主题的隐表示再进行后续的关键性短语生成任务,既可以得到包含主题词的文本,也可以得到并没有在现有文本中出现的主题短语,这也是本文提出的模型的出发点。

2. 模型

本文采用主题模型结合seq2seq对keyphrase generation进行建模。然后作者通过实验对构思进行验证,本文模型取得了state-of-art的结果。

由于本文所提出的方法是结合了主题感知的关键性短语生成,因此模型的架构如下所示:

其中上图中绿色的部分表示主题模型(topic model),上面的两部分整体上表示生成模型(generation model)。

假设所处理的语料库记为 { x 1 , x 2 , . . . , x ∣ C ∣ } \{x_{1},x_{2},...,x_{|C|}\} {x1x2,...,xC},那么其中的   x i \ x_{i}  xi这里表示为两种形式   X b o w \ X_{bow}  Xbow   X s e q \ X_{seq}  Xseq   X b o w \ X_{bow}  Xbow这里表示为基于词袋模型的向量形式,   X s e q \ X_{seq}  Xseq是一般的基于词典的索引序列向量形式。前者做为主题模型的输入,后者做为生成模型的Encoder的输入。

(1)主题模型(Neural Topic Model,NTM):

NTM整体上基于变分自编码器的架构,它所处理的任务即   X b o w \ X_{bow}  Xbow的重建。中间过程得到的隐表示做为主题的隐表示参与生成模型Decoder的生成过程。
利用NTM对于   X b o w \ X_{bow}  Xbow的重建过程,模型可以逐渐学习到关于不同的词所对应的主题信息,然后将其做为后续生成过程的指导信息。

  • BoW Encoder
    利用神经网络估计先验变量和
  • BoW Decoder
    与LDA类似,其假设存在个主题存在,其中每一个主题都表示有一个topic-word的分布,而其中的每一个document都有一个Topic Mixed Distribution。在神经网络模型之中使用Gaussian Softmax的方式产生

(2)生成模型(Neural Keyphrase Generation Model,KG)

生成模型这里采用了基于注意力机制的Seq2Seq模型,其中Encoder使用双向的GRU,Decoder使用单向的GRU。

为了模型的效果,这里也使用了COPY机制允许模型可以直接从源文本中直接抽取关键性短语。模型整体的运行机制和一般的Seq2Seq模型并没有太大的区别,因此理解起来也并不难,只需要清楚模型各部分的输入和输出。

(3)Topic-Aware Sequence Decoder

decoder的输入除了上一时刻的状态之外,还包括了主题模型信息和sequence encoder状态
通过attention计算document的核心词,然后结合当前时刻的状态进行单词预测
为了缓解OOV问题,本文采用Pointer-generator network

(4)损失函数

针对keyphrase generation,损失函数为交叉熵损失
针对神经主题模型(NTM),损失函数为KL散度损失

3.实验

论文实验部分所使用的三个数据集分别采样自StackExchange、Twitter和Weibo,其中对于数据的预处理和模型的参数设置可见原文的实验部分,实验所使用的评估指标为MAP和F1。实验结果如下表:

本项目使用了两个数据集StackExchange和Weibo来复现。

1.源代码在work/TAKG-Paddle/目录下

2.模型和训练日志在work/TAKG-Paddle/model目录下

3.预测结果在work/TAKG-Paddle/pred目录下

4.复现指标:

Weibo数据集:F1@1=0.34681, F1@3=0.2459, MAP=0.41036

StackExchange数据集:F1@3=0.28701, F1@5=0.25589, MAP=0.30102

Weibo数据集复现指标与原论文基本一致,StackExchange数据集复现指标与原论文中的指标有差异。

#3.1 安装所需环境
!pip install gensim
#3.2 转到代码目录
%cd work/TAKG-Paddle
#3.3 Weibo和StackExchange数据数据预处理
#!python preprocess.py -data_dir data/StackExchange
#!python preprocess.py -data_dir data/Weibo
#3.4 Weibo数据预训练,NTM模型100轮
#!python train_wb.py -data_tag Weibo_s100_t10 -only_train_ntm -ntm_warm_up_epochs 100
#3.4.1 Weibo数据联合训练
#!python train_wb.py  -data_tag Weibo_s100_t10 -use_topic_represent  -copy_attention -topic_attn -load_pretrain_ntm -joint_train   -check_pt_ntm_model_path model/Weibo_s100_t10.topic_num50.ntm_warm_up_100.20210928-210759/e27.val_loss=85.831.sparsity=0.020.ntm_model
#3.4.2 用验证损失最小的模型模型,进行Weibo数据预测
#!python predict_wb.py -model model/Weibo_s100_t10.joint_train.use_topic.topic_num50.topic_attn.no_topic_dec.copy.seed9527.emb150.vs50000.dec300.20210930-020654/e3.val_loss=1.244.model-0h-11m -ntm_model model/Weibo_s100_t10.joint_train.use_topic.topic_num50.topic_attn.no_topic_dec.copy.seed9527.emb150.vs50000.dec300.20210930-020654/e3.val_loss=1.244.model_ntm-0h-11m
#3.4.3  Weibo数据预测结果精度评测
#!python pred_evaluate.py -pred pred/predict__Weibo_s100_t10.joint_train.use_topic.topic_num50.topic_attn.no_topic_dec.copy.seed9527.emb150.vs50000.dec300.20210930-020654__e3.val_loss=1.244.model-0h-11m/predictions.txt -src data/Weibo/test_src.txt -trg data/Weibo/test_trg.txt
#3.5 用StackExchange数据,预训练NTM模型100轮
!python train.py -data_tag StackExchange_s150_t10 -only_train_ntm -ntm_warm_up_epochs 100
#3.5.1 用StackExchange数据联合训练
!python train.py -data_tag StackExchange_s150_t10    -use_topic_represent -topic_copy   -topic_attn -joint_train -load_pretrain_ntm -check_pt_ntm_model_path model/StackExchange_s150_t10.topic_num50.ntm_warm_up_100.20211004-092113/e100.val_loss=198.658.sparsity=0.870.ntm_model
#3.5.2 用验证损失最小的模型进行预测
!python predict.py -mode model/StackExchange_s150_t10.joint_train.use_topic.topic_num50.topic_attn.no_topic_dec.seed9527.emb150.vs50000.dec300.20211004-105909/e4.val_loss=2.312.model-0h-24m -ntm_model model/StackExchange_s150_t10.joint_train.use_topic.topic_num50.topic_attn.no_topic_dec.seed9527.emb150.vs50000.dec300.20211004-105909/e4.val_loss=2.312.model_ntm-0h-24m
#3.5.3 对预测的结果进行精度评测
预测的结果进行精度评测
!python pred_evaluate.py -pred pred/predict__StackExchange_s150_t10.joint_train.use_topic.topic_num50.topic_attn.no_topic_dec.seed9527.emb150.vs50000.dec300.20211004-105909__e4.val_loss=2.312.model-0h-24m/predictions.txt -src data/StackExchange/test_src.txt -trg data/StackExchange/test_trg.txt

4.总结

论文的主要结论: 在不使用潜在主题的情况下,优于现有模型;使用潜在主题在社交媒体流这样的文法不严格的语料上(noisy)表现更好。

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐