Naturali 论文 | 基于多篇章多答案的阅读理解系统

——Naturali 奇点机智 2018机器阅读理解技术竞赛系统报告

摘要:机器阅读理解任务一直是自然语言处理领域的重要问题。2018机器阅读理解技术竞赛提供了一个基于真实场景的大规模中文阅读理解数据集,对中文阅读理解系统提出了很大的挑战。为了应对这些挑战,我们在数据预处理、特征表示、模型选择、损失函数的设定和训练目标的选择等方面基于以往的工作做出了对应的设计和改进,构建出一个最先进的中文阅读理解系统。我们的系统在正式测试集上ROUGE-L和BLEU-4分别达到了63.38和59.23,在105支提交最终结果的队伍里面取得了第一名。

关键词:机器阅读理解;问答系统;深度循环神经网络

中图分类号:TP391 文献标识码:A

System Report for 2018 NLP Challenge on Machine Reading Comprehension

Abstract: Machine Reading Comprehension (MRC) has long been a central problem in Natural Language Processing (NLP). 2018 NLP Challenge on Machine Reading Comprehension provides a large-scale application-oriented dataset for Chinese Machine Reading Comprehension, which is much more challenging than previous Chinese MRC dataset. To cope with those challenges, we put effort in all aspects, including preprocessing strategy, feature expression, model design, loss function and training criterion. Our system achieves 63.38 in ROUGE-L score and 59.23 in BLEU-4 score on the final test set, ranked first among 105 participating teams.

Key words: Machine Reading Comprehension; Question Answering; Deep Recurrent Neural Network

论文原文链接:http://aclweb.org/anthology/D18-1235

1 引言

机器阅读理解任务是自然语言处理的核心问题。近年来各个数据集的发布,大大推进了机器阅读理解任务的发展。最近,在由中国中文信息学会和中国计算机学会主办,百度公司,中国中文信息学会评测工委会和中国计算机学会中文信息技术专委会承办的2018机器阅读理解技术竞赛中,提出了一个大规模的源于真实搜索引擎任务场景的中文阅读理解数据集,这将对中文阅读理解领域的发展产生很大的推动作用。

与其它早前发布的数据集相比,本次比赛的数据有如下特点:一、来源于真实数据,包含不同类型的问题。数据不但包括事实类问题,还包括大量意见型问题,而意见型问题常常对应多个答案;二、问题对应的文档以网页全文的形式给出,其长度也大大超过常见阅读理解模型的限制;三、数据包括百度搜索和百度知道两部分不同来源的数据,相互间存在很大差异。这些特点决定了这个数据集比以往的机器阅读理解数据集具有更大的挑战。

为了应对这些挑战,我们从数据预处理、特征表示、模型选择、损失函数的设定和训练方法的选择等多个方面对系统进行改进。实验表明,每个部分的改进都对结果的提高做出了贡献。最终,我们的系统在ROUGE-L和BLEU-4上分别取得了63.38和59.23的分数,获得了2018机器阅读理解技术竞赛的第一名。

接下来,我们将从竞赛数据集和评价方法、数据预处理、模型结构、实现细节、实验结果和样例分析等方面分章节介绍我们的工作,并在结论部分对工作进行总结。

2 竞赛数据集和评价方法

本次竞赛的数据集包括30万问题(其中训练集27万,开发集1万,测试集2万),其中20万来自先前公开发布的DuReader数据集[1],所有问题均为来自搜索引擎场景中用户的真实问题。每个问题提供最多5个候选文档以及人工撰写的一个或者多个答案作为参考答案。数据集分为百度搜索和百度知道两部分(以下简称搜索和知道),每一部分各包括15万问题。搜索部分的文档来源于百度搜索引擎提供的相关度最高的网页,而知道部分的文档来源于百度知道网站的站内搜索提供的相关度最高的问题对应的网页。与大多数常用的阅读理解数据集不同的是,本次竞赛数据集提供的每个文档都包含来源网页的全文文本内容。

竞赛以测试集的人工标注答案为参考答案,采用ROUGE-L和BLEU4作为评价指标,其中以ROUGE-L作为主评价指标。同时对于是非及实体类型问题,对ROUGE-L和BLEU4评价指标进行了轻微的改动,适当增加了正确识别是非答案类型及匹配实体的得分奖励,一定程度上弥补传统ROUGE-L和BLEU4指标对是非和实体类型问题评价不敏感的问题。

3 数据预处理

3.1 文档预处理

由于这次比赛数据集提供的每个文档都包含来源网页的全部文本内容,长度比其他常用数据集长很多,最长的文档包含多达9万多个词,大大超出了常用的机器阅读理解模型可以接受的范围(通常为数百词)。因此,我们需要对文档进行预处理,抽取出文档中可能含有答案的部分作为篇章输入,放入模型中进行训练和预测。

对于知道和搜索两部分数据,我们采取了不同的预处理方法。知道的数据来源是百度知道问答中相关问题的对应网页,所有内容都是与网页标题对应的问题(和用户提出的问题不一定相同)相关的信息。基于越前面的信息可能越有用的假设,对于知道数据里面的每一篇文档,我们将文档标题和所有段落顺次连接,中间插入特殊的符号表示段落分割,然后截取最前面不超过预设最大长度的内容,将得到的结果作为预处理的结果。

对于搜索部分的数据,文档包含一般网页的全部文本信息,前面部分的内容有可能与问题没有关系。因此,我们采取如下策略:

  1. 将标题和各段内容以特殊符号分隔连接在一起,如果得到的结果没有超过预设最大长度,则将其作为预处理的结果;
  2. 否则,我们计算各段落和问题的BLEU-4分数,以衡量段落和问题的相关性;
  3. 在分数排名前k的段落中,选择最早出现的段落;
  4. 选取标题,这个段落以及下一个段落;
  5. 对于此后第3到第10个段落,选取每个段落的第一句话;
  6. 将所有选取的内容以特殊符号分隔连接在一起,截取最前面不超过预设最大长度的内容,将得到的结果作为预处理的结果。

上述方法基于两个假设:第一,答案可能出现在与问题相似的段落后面;第二,越靠前面的内容越重要。引入文档标题的原因在于从文档标题很容易判断文档内容是否与问题相关。

引入上述启发式预处理机制后,采用同样的模型,得到的结果比基线系统提供的简单预处理方法有大幅提高,对此我们将在实验部分具体说明。值得注意的是,数据集提供了未经过分词的原始文本以及分词后的结果,我们的模型选择分词后的结果作为输入。

3.2 参考答案片段

与大多数主流工作相同,我们将阅读理解任务建模成篇章中的片段抽取问题。在数据集中,每个问题可能对应多个人工撰写的答案。对于每个答案,我们在篇章中寻找一个与答案F1分数最高的片段,作为这个答案的参考答案片段,在训练时使用。对于仅使用一个答案片段的模型,我们采用与任意一个答案的F1分数最高的片段作为参考答案片段训练模型(这种情况与百度提供的基线系统一致)。

4 模型结构

4.1 特征表示层

在现在常见的机器阅读理解模型中,词向量是最常用的特征表示方法。以往的工作表明,使用预先训练好的词向量作为输入,并在阅读理解任务的训练过程中固定保持词向量不变,相比于使用随机初始化的词向量,并在训练过程中同步训练词向量,效果会有提升。因而,我们的模型也使用相同的方法。

在英文阅读理解模型中,加入基于字符序列得到的词表示对于结果有稳定的提升效果。这是因为英文单词有丰富的词缀变化,语义相同词性不同的单词拥有相同的词干,只在词缀上有所区分,而词缀相同的单词往往词性相同。这样的特性使得引入字符序列的信息能够缓解未登录词的问题。而汉语词汇没有这样的特性,含有相同字的不同词语的意思可能完全没有任何联系。我们也尝试使用循环神经网络整合预训练好的字向量的信息得到词的表示,作为额外的特征表示,但是实验效果并没有明显的变好。

在以往的工作如Hu[2]等中,除了词向量以外,一些其它的特征也被运用在阅读理解模型当中。我们的模型使用了词性标注信息。我们使用词性标注工具,对每个问题和对应的篇章进行词性标注,得到其中每一个词的词性信息。对于每一种词性,我们预先训练好对应的词性向量。问题和篇章中的每个词对应的词性向量也作为词的特征表示之一。

对于篇章里面的每一个词,我们还使用一个额外的二值特征wiq,表示这个词有没有在对应的问题中出现。

问题的类型也能够对回答问题提供帮助。2018机器阅读理解技术竞赛将问题分成三种类型:实体类,描述类和判断类。我们认为这样的划分不够细致,通过简单的关键字匹配,将问题划分成九种常见类型,大致对应英文的各个疑问词。具体的问题分类和对应的关键词信息见表1。

给定任意一个问题,首先按表1的顺序从上到下匹配各个关键词,如果问题包含某一分类的其中一个关键词,则被匹配到该分类。如果问题没有包含上述任意关键词,则认为问题是数据集给定的类型。因此,我们一共将问题分为十二类,对于每个问题,都会在问题开始加上一个特殊符号表示其对应的问题类型。

4.2 问题篇章分别编码层

参照已有的工作,我们采取双向LSTM模型分别对问题和篇章的输入特征x_i^qx_j^p进行编码,得到问题和篇章的编码表示u_i^qu_j^p

4.3 问题篇章匹配层

分别给定问题和篇章的编码表示u_i^qu_j^p,匹配层负责融合两方面的信息,生成包含问题和篇章信息的隐层表示。现在主流的模型大多数都利用注意力机制将问题和篇章的编码信息进行融合。我们在模型中尝试使用了BiDAF、MatchLSTM和DCA三种不同的匹配层。

4.3.1 BiDAF匹配层

Seo[3]等提出的BiDAF模型利用双向注意力机制来融合问题和篇章的信息的方法。我们首先通过内积计算出每个问题中的词和每个篇章中的词的相似度:

然后利用他们的方法计算出问题到篇章(context2query)和篇章到问题(query2context)的注意力表示:

然后再利用一层双向LSTM得到隐层表示:

4.3.2 MatchLSTM匹配层

参照Wang和Jiang[4]提出的MatchLSTM模型,我们首先计算:

然后再利用一层双向LSTM得到隐层表示:

4.3.3 DCA匹配层

Hasan和Fischer[5]提出在使用双向注意力机制之后,再使用一层注意力机制进一步融合信息的方法:

然后再利用一层双向LSTM得到隐层表示:

在实验结果部分,我们会比较不同匹配层对模型性能带来的影响。

4.4 答案抽取层

我们将阅读理解任务建模成篇章片段抽取问题,答案抽取层利用两步的指针网络,以匹配层输出的隐层表示h_j^p为输入,分别预测答案片段在篇章中的开始位置和结束位置的概率分布和:

其中t=1,2。

在答案抽取层,为了给一个问题统一寻找一个答案片段,同一问题对应的不同篇章得到的隐层表示被连接起来,这部分的实现和基线系统相同。

4.5 损失函数

对于片段抽取模型来说,通常采取如下损失函数:

其中a_1a_2分别表示参考答案片段对应篇章中的开始位置和结束位置。

与大多数已有的阅读理解数据集不同,2018机器阅读理解技术竞赛的数据集为每个问题提供不止一个参考答案。最终评判的时候,只要机器预测的答案与其中一个答案相同或者类似,就会得到比较高的分数。因而,与只考虑一个参考答案的经典模型相比,在训练的时候考虑所有参考答案可以更有效的利用数据,训练出更好的模型。对于给出多个参考答案的问题,我们利用3.2节介绍的方法对于每个答案找到它在篇章中的参考答案片段,并定义如下损失函数:


其中a_1^ka_2^k分别表示第k个答案对应片段在篇章中的开始位置和结束位置。

4.6 利用辅助任务联合训练

Tan[6]等提出了以预测答案从哪个篇章得到的问题作为辅助训练任务,进行联合训练,提高多篇章阅读理解模型性能的方法。我们借鉴了他们的思路,设计了篇章选择损失函数。

我们对于每一个篇章得到的隐层表示,使用“注意力池化”(attention pooling)和投影得到和问题的匹配分数g

然后将辅助任务损失函数L_{sp}定义为:

其中sel_k表示是否有答案片段出自该篇章。

于是,我们使用最大似然估计联合训练优化目标函数:

4.7 利用最小风险训练

前面提出的损失函数使用最大似然估计,目标是最大化训练集中每个问题的参考答案区间出现的概率。与之相比,使用最小风险训练直接对评估指标的期望进行优化,在机器翻译等方向取得了很好的结果。

在阅读理解任务上,最小风险训练的目标函数可以被定义为:

其中表示预测的答案,表示参考答案,是衡量两者差异的函数,我们直接使用ROUGE-L作为。

参考前人的工作,进行最小风险训练的时候,我们以最大似然估计训练得到的模型参数作为初始化参数。在这种情况下,我们发现,联合训练最大似然估计和最小风险训练的目标函数可以得到更好的结果:

4.8 判断类问题模型

对于判断类问题,给出和参考答案一致的判断结果(Yes,No或者Depends)会得到分数的加成。于是我们单独训练了一个模型,给定问题和提取出来的答案进行分类。模型结构与上面描述的阅读理解主模型类似,只是篇章输入变成了提取出来的答案。模型仅使用预训练词向量作为特征输入,经过相同的编码层和匹配层,得到隐层表示h_j^p,然后使用“注意力池化”(attention pooling)得到向量表示r^p

然后将r^p做投影到分类维度,再用交叉熵做损失函数训练分类模型。

5 实现细节

5.1 预训练词向量

我们利用数据集提供的未分词文本和分词结果,使用一层的LSTM模型训练了一个分词器,然后用这个分词器将SogouT的部分文档进行分词,用分词得到的结果作为输入,以语言模型为训练目标,使用一层的LSTM模型训练256维的中文词向量。得到的预训练词向量被用在阅读理解模型中,并且在训练阅读理解模型的过程中保持不变。

5.2 模型参数和训练方法

在训练过程中,我们设定每篇篇章的最大长度为500词,batch size为32。为防止模型过拟合,层与层之间采用了dropout技术,所有隐层表示向量为150维,单模型系统的dropout比例设为0.15。我们使用\lambda_{M}RT=10.0,在单一模型情况下\lambda_{p^s}=5.0。

我们采用Adam算法来优化我们的模型,学习率(learning rate)在训练过程中保持0.001不变。对于知道部分和搜索部分的数据,我们使用两个模型分别训练和预测。使用最大似然估计训练模型时,我们训练10轮(epoch),每一轮训练之后在开发集测试性能,最终选择开发集上性能最好的模型。使用最小风险训练时,模型以最大似然估计训练得到的参数作为初始化参数进行训练。由于使用最小风险训练速度较慢,且使用最大似然估计训练好的模型参数进行初始化以后,模型通常在第一轮训练结束的时候就达到最好的效果,于是使用最小风险训练时我们只训练1轮。

5.3 实验环境和训练时间

实验所用的服务器使用4核Intel(R) Xeon(R) CPU E5-2630 v4 2.20GHz CPU,配有128G内存,显卡为TITAN X Pascal,显存大小为12G。每个实验使用单个GPU进行训练。

在搜索部分数据上,BiDAF模型每一轮数据训练和验证时间约为3小时,MatchLSTM模型约为5小时,DCA模型约为3个小时。知道部分数据每一轮训练所用时间与搜索部分数据相仿。使用最小风险训练时,由于每次要计算所有片段和参考答案的Rouge-L值,训练速度相对缓慢,BiDAF模型每一轮大概需要16个小时。

5.4 预测结果和结果后处理

预测时,我们使用模型预测答案片段在篇章的开始位置和结束位置的概率分布,并寻找同一篇章内使得开始位置概率乘以结束位置概率最大的片段作为预测结果。

值得说明的是,数据集对每个问题提供多个文档,这些文档来源于搜索结果,并按照搜索结果顺序呈现,也就是说搜索系统认为更靠前的文档与问题更相关,而这个信息在我们的系统里面并没有显示体现。尽管模型在训练的时候增加了辅助任务预测答案从哪一个篇章得到,我们发现,对于训练好的模型,在开发集中仅使用前3篇文档进行预测的结果,比使用全部(最多5篇)文档进行预测得到的结果有明显提高。在实验部分我们会给出数据进行具体说明。因此,在最后预测的时候,对于每个问题,我们仅使用前3篇文档进行预测得到结果。

我们还对提取出来的片段进行简单后处理,包括去除我们在预处理阶段增加的特殊分隔符和\u3000、\n等特殊符号,以及对标点符号进行规范化处理。最终提交的结果是经过后处理的结果。

5.5 集成模型

由于实验结果表明,使用BiDAF,MatchLSTM和DCA作为匹配层的效果相近,为了使得集成模型来源的各个模型具有多样性,所以我们采用了来自不同匹配模型的结果进行集成。我们还使用了不同的dropout比例,不同的联合学习比率训练不同的模型。表2详细介绍了集成结果来源的各个模型的不同部分具体选项。所有18种不同选择分别被用于训练,共得到18个模型,这些模型的结果最后被集成得到最终结果。

6 实验结果

6.1 不同匹配模型的选择

在模型结构的匹配层部分,我们介绍了BiDAF、MatchLSTM和DCA三种不同的选择。我们在开发集上比较了选用不同匹配方法的模型结果。表3展示了不同匹配层在搜索和知道上的结果。由于不同模型结果非常接近,为了减少误差,对于每种情况,我们使用两个不同的随机种子训练模型,最终汇报的结果是两个模型结果的平均值。

可以看出,使用不同的匹配层得到的结果非常接近。MatchLSTM得到的结果最好,但是和BiDAF和DCA得到的结果非常接近。因此,在之后的单模型实验中,我们选择使用速度较快的BiDAF匹配层。而在集成模型的时候,为了使来源的各个模型具有多样性,我们使用了BiDAF,MatchLSTM和DCA匹配层得到的不同模型。

6.2 模型其它各部分的贡献

我们从基线系统开始,逐步增加各个部分,验证每个部分对于效果带来的影响。表4总结了这部分的实验结果,其中数据是模型在开发集上没有经过后处理的直接预测结果的表现。值得说明的是,比赛提供的结果评估脚本里计算BLEU4指标的方式造成了每个问题权重不等,答案长的问题实际权重更高,这是不合理的,而计算ROUGE-L的时候每个问题的权重是相同的,且最终比赛结果也选择了ROUGE-L作为主要的评价指标,所以我们汇报实验结果的时候主要关注ROUGE-L的结果。

从实验结果可以看出,每项改变都使系统性能得到提升。其中,我们提出的的启发式篇章预处理的方法非常有效,使用这种方法相对于基线系统的预处理方法有大幅提高,在搜索部分提升了11.30,在知道部分也提升了4.62。使用预训练词向量使得搜索和知道部分的结果分别进一步提升了4.51和4.50。进一步增加其它特征(词性标注,问题类型,wiq)会在搜索和知道上分别带来0.17和0.65的额外提升。与仅利用一个答案相比,在损失函数中考虑多个答案使ROUGE-L指标在搜索和知道上分别进一步上升了1.60和1.30。值得说明的是,加上辅助任务进行联合训练后,虽然ROUGE-L值没有大幅提高,但是模型训练的稳定性得到了增强。

最终,基于上面的模型,再使用最小风险训练,我们的模型在开发集上搜索和知道的ROUGE-L值分别达到49.61和58.11,相比基线系统分别提高18.84和12.21。这是我们的单系统模型在开发集上没有使用后处理的结果。

6.3 仅用前三篇文档进行预测的的结果

如5.5节所说,我们在实验中发现,对于同一个训练好的模型,在开发集中仅使用前3篇文档得到的篇章进行预测的结果,比使用全部文档进行预测得到的结果有明显提高,表5给出了对比的实验结果。

6.4 判断模型的影响

表6比较了使用4.8节描述的判断模型给判断类问题抽取出来的答案加上判断结果后,对于在线测试集上ROUGE-L和BLEU4带来的变化。可以看出,加上判断结果后,ROUGE-L和BLEU4分别提高了0.26和0.23。

6.5 在线测试集的结果

表7显示了我们的单模型和集成模型在在线测试集的结果。集成模型的具体设置见实验细节中的集成模型部分。可以看出,相比于单一模型,集成模型在ROUGE-L和BLEU-4上分别有1.58和2.28的提高。

6.6 最终结果

图1显示了比赛公布的最终结果,我们的系统在ROUGE-L和BLEU-4上分别取得了63.38和59.23的结果,排名第一,分别领先第2名2.39和3.30。

图 1:最终比赛结果

7 样例分析

图2给出了一些开发集中我们系统预测答案没有完全和参考答案相符的例子。其中,对于问题1,我们的预测答案包含了额外的非答案信息。问题2的预测答案只包括了参考答案的一部分,没有完整包含应有的信息。问题3对应了另外的情况,我们的预测答案是文档里完整包含了答案信息的片段,但是标注者重新整理了这个片段并编写得到了更简洁和合适的参考答案。问题4则对应了最差的情况,我们的系统预测的结果完全不是回答给定问题的答案。从这些例子可以看出,我们的系统尽管整体上取得了很好的结果,在一些情况下仍然存在预测的答案不够准确(缺少必要部分,包含不必要的部分),甚至完全错误的情况。一种可能的解决方法是考虑引入答案验证模块,提高答案的准确性。

图 2:样例分析

8 结论

2018机器阅读理解技术竞赛的数据集是基于真实场景的大规模数据集,包含不同类型的问题和不同来源的文档,非常具有挑战性。针对数据集的特点,我们从数据预处理、特征表示、模型选择、损失函数的设定和训练方法的选择等多个方面入手构造系统,在正式测试集中在ROUGE-L和BLEU-4上分别取得了63.38和59.23的分数,在最终提交结果的105支参赛队伍里取得了第一名的成绩。

参考文献

[1]Wei He, Kai Liu, Jing Liu, Yajuan Lyu, Shiqi Zhao, Xinyan Xiao, Yuan Liu, Yizhong Wang, Hua Wu, Qiaoqiao She, Xuan Liu, Tian Wu, Haifeng Wang. DuReader: a Chinese Machine Reading Comprehension Dataset from Real-world Applications [J]. arXiv preprint arXiv:1711.05073, 2018

[2]Minghao Hu, Yuxing Peng, Zhen Huang, Xipeng Qiu, Furu Wei, Ming Zhou. Reinforced Mnemonic Reader for Machine Reading Comprehension[J]. arXiv preprint arXiv:1705.02798, 2017.

[3]Minjoon Seo, Aniruddha Kembhavi, Ali Farhadi, and Hannaneh Hajishirzi. Bidirectional attention flow for machine comprehension. [J]. arXiv preprint arXiv: 1611.01603, 2016.

[4]Shuohang Wang and Jing Jiang. Machine comprehension using match-lstm and answer pointer. [J]. arXiv preprint arXiv: 1608.07905, 2016.

[5]Hasan Z, Fischer S. Pay More Attention-Neural Architectures for Question-Answering[J].

[6]Chuanqi Tan, Furu Wei, Nan Yang, Bowen Du, Weifeng Lv, and Ming Zhou. S-net: From answer extraction to answer synthesis for machine reading comprehension. [J]. arXiv preprint arXiv: 1706.04815, 2017

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容