BiLSTM-CRF Models for Sequence Tagging(翻译)

Abstract(摘要)

  在本文中,我们为序列标注任务提出了一系列基于长短时记忆网络 (LSTM)的模型。这些模型包括 LSTM 网络,BI-LSTM 网络,带有条件随机场(CRF)层的 LSTM 网络(LSTM-CRF),以及带有 CRF 层的 BI-LSTM 网络(BI-LSTM-CRF)。我们第一次将 BI-LSTM-CRF 模型应用在 NLP 序列标注的基准数据集上。我们证明, 基于双向 LSTM 组件, BI-LSTM-CRF 模型可以有效地利用过去和未来的输入特征。借助 CRF 层, 它还可以使用句子级别的标记信息。BI-LSTM-CRF 模型在POS(词性标注),chunking(语义组块标注)和 NER(命名实体识别)数据集上产生了令人惊奇的精确度。另外,BI-LSTM-CRF模型是一个健壮的,并且对词嵌入具有更少依赖的模型。

1. 简介

  序列标注任务包括POS(词性标注),chunking(语义组块标注)和NER(命名实体识别),都是自然语言处理类别的任务。已经被研究者关注了数十年。这些输出的标签能够应用于下游的应用。例如, 可以使用在用户搜索查询上训练过的命名实体识别器来标识哪些文本范围是产品, 从而触发某些产品广告。另一个例子是, 搜索引擎可以使用此类标签信息来查找相关网页。
  绝大多数现有的序列标注模型都是线性统计模型,包括隐含马尔科夫模型(HMM),最大熵马尔科夫模型(MEMMs),以及条件随机场模型(CRF)。最近提出的基于卷积网络的模型也被用来解决序列标注问题。我们指出,像Conv-CRF这样,将卷积网络和CRF组合在一起的模型,在序列标注的任务上取得了比较好的效果。在语音理解社区,最近提出了基于循环神经网络和卷积网络的模型。其他相关的工作包括为语音识别提出了双向循环网络模型。
  在这篇文章中,我们为序列标注任务提出了一系列基于长短时记忆网络 (LSTM)_的模型。这些模型包括 LSTM 网络,BI-LSTM 网络,带有条件随机场(CRF)层的 LSTM 网络(LSTM-CRF),以及带有 CRF 层的 BI-LSTM 网络(BI-LSTM-CRF)。我们的贡献如下:

  1. 我们系统地比较了上述模型在 NLP 标记数据集上的性能;
  2. 我们第一次将 BI-LSTM-CRF 模型应用在 NLP 序列标注的基准数据集上。我们证明, 基于双向 LSTM 组件, BI-LSTM-CRF 模型可以有效地利用过去和未来的输入特征。借助 CRF 层, 它还可以使用句子级别的标记信息。BI-LSTM-CRF 模型在 POS(词性标注),chunking(语义组块标注)和 NER(命名实体识别)数据集上产生了令人惊奇的精确度。
  3. 我们证明了 BI-LSTM-CRF 模型是一个健壮的,并且对词嵌入具有更少依赖的模型。他可以在不依赖词嵌入的前提下产生精确的标记性能。

  本文剩余的内容是这样组织的。第二节描述本文中使用的序列标注模型。第三节展示训练过程。第四节报告实验结果。第五节讨论相关的研究。最后在第六节刻画结论。

2. 模型

  在这一节,我们描述文本使用的模型:LSTM、BI-LSTM、CRF、LSTM-CRF 以及 BI-LSTM-CRF。

2.1 LSTM网络

  循环神经网络(RNN)在多种任务包括语言模型和语音识别中取得了很有前景的效果。RNN 维护了关于历史信息的记忆,能够使模型通过长距离的特征来预测当前的输出。
  图1展示了RNN的结构,由输入层 x,隐藏层 h 以及输出层 y 组成。在命名实体标注的上下文中,x 表示输入特征而 y 表示标签。图1展示的命名实体识别系统中,每一个单词都标注为其他(O)或者四种实体类型(人名 - PER,地名 - LOC,组织机构 - ORG,杂项 - MISC)中的一个。句子 EU rejects German call to boycott British lamb. 被标注为B-ORG,O,B-MISC,O,O,O,B-MISC,O,O,。其中前缀 B- 和 I- 表示每一个实体的开始和中间的位置。
  一个输入层表示时刻 t 的特征。可能是基于独热编码的词特征,密集的特征向量或者稀疏向量。输入层的维度与应当与特征的大小相等。一个输出层表示在时刻 t ,标签取值的概率分布。输出层的维度与标签数量大小相等。与前馈神经网络相比,RNN引入了上个隐藏状态与当前隐藏状态的连接(因而产生了循环层的权重参数)。这种循环层是设计用来保存历史信息的。隐藏层和输出层的值是通过下面的方式进行计算的:


U,W 以及 V 就是在训练时刻被计算的连接权重,并且 f(z)g(z)sigmoidsoftmax 激活函数:

图1:一种简单的RNN模型

  在本文中,我们应用长短时记忆网络(Long Short-Term Memory)进行序列标注。LSTM 网络和 RNNs 一样,除了隐藏层的更新模块被专门构建的记忆细胞所取代。其结果就是,LSTM能够更好的发现和探索数据中长范围的依赖信息。图2展示了一个LSTM记忆细胞(cell)。

图2:LSTM的记忆细胞

LSTM的记忆细胞是通过下面的公式实现的:

其中 σ 是逻辑 sigmoid 函数,以及if, oc 分别是输入门,遗忘门,输出门和细胞向量,所有这些都与隐藏向量 h 的大小相同。权重矩阵下标的含义与名称是等价的。举个例子,W_{hi}是隐藏 - 输入门矩阵,W_{xo}是输入 - 输出门矩阵。从细胞(cell)到门(gate)向量的权值矩阵是对角矩阵,因此,每一个门向量中的元素 m 只接受来自于细胞向量元素m 的输入。

图3:一个LSTM网络

2.2 双向 LSTM 网络

  在序列标注任务中,我们需要在给定时间访问过去或未来的输入特征,因此我们可以利用双向 LSTM 网络(图4)。这样做,我们能够在指定的时间范围内有效地使用过去的特征(通过前向状态)和未来的特征(通过后向的状态)。我们使用通过时间的反向传播(BPTT)来训练双向LSTM网络。随着时间推移,在展开的网络上进行的前向和后向传递同常规网络中的前向和后向传递方式类似,除了我们需要对所有的时间步骤展开隐藏状态。我们还需要在数据点的开始和结束时进行特殊的处理。在我们的实现中,我们对整个句子进行前向扫描和后向扫描的时候仅仅需要在句子的开头将隐藏状态重置为0。我们做了批量的实现,这使得多个句子可以同时被处理。

图4:一种 BI-LSTM 网络

2.3 CRF网络

  有两种方式可以在预测当前标签的时候使用邻居的标签信息。第一种就是在每一个时间步都预测标签的分布然后使用 beam-like 编码方式来发现最优的标签序列。最大熵分类器和最大熵马尔科夫模型(MEMMs)都属于这种类别。第二种就是把关注点放在句子级别上,而不是个别位置,从而导致了条件随机场(CRF)模型的出现(图5)。注意,CRF 的输入和输出是直接相连的,这与 LSTM 和 BI-LSTM 网络刚好相反,是通过记忆细胞和循环组件连接在一起的。
  一般情况下,CRF模型能够产生更高的标签精度。有趣的是,这两种使用标签信息方式之间的关系与两种使用输入特征的方式的关系类似(可以看看前文中的LSTM网络和BI-LSTM网络),并且本文的结果证明了BI-LSTM比LSTM要优越。

图5:一种CRF网络

2.4 LSTM-CRF 网络

  我们将LSTM网络和CRF网络整合成为LSTM-CRF模型,如图6所示。通过LSTM层,这个模型可以有效的利用过去的输入特征,通过CRF层,模型可以有效的利用句子级的标签信息。CRF层由连接连续输出层的线条表示。CRF层具有一个状态转移矩阵作为参数。利用这样的一个层,我们可以有效地利用过去和未来的标签来预测当前的标签,这类似于双向LSTM网络能够利用过去和未来的输入特征。我们将分数矩阵f_θ([x]_1^T)看做是网络的输出。我们丢弃输入[x]_1^T来简化计数。矩阵携带θ的元素[f_θ]_{i,t}是网络输出的关于句子[x]_1^T中第 t 个词的第 i 个标签的分数。我们引入转换分数[A]_{i,j}来模拟一对连续的时间步长从第 i 个状态到第 j 个状态的转换。注意,这个转移矩阵与位置无关。现在我们来看看网络的新参数\breve \theta=\theta\bigcup\{[A]_{i,j}\forall i,j \}。然后,通过转移分数和网络分数的总和给出句子[x]^T_1的分数以及标签[i] ^T_1的路径:

动态编程可以有效地用于计算[A]_{i,j}和最佳标签的推理序列。

图6:一种LSTM-CRF模型

2.5 BI-LSTM-CRF网络

  与LSTM-CRF网络类似,我们将一个双向LSTM网络和一个CRF网络合并成为一个BI-LSTM-CRF网络(图7)。除像LSTM-CRF模型那样能够利用过去的输入特征和句子级别的标签信息之外,BI-LSTM-CRF模型还能够利用未来的输入特征,这项额外的功能可以提高标注的准确性,正如我们将在实验中展示的那样。


图7:一个BI-LSTM-CRF模型

3 训练过程

  本文使用的所有模型都有一个通用的SGD前向和后向的训练程序。我们选择最复杂的模型BI-LSTM-CRF,来展示算法1中描述的训练算法。在每一次迭代中,我们将整个训练数据分成很多批次,每一次处理一批。每一个批次包含一个句子列表,列表的大小由参数 batch size 决定。在我们的实验中,每一个批次的大小为100([ batch size ] = 100),这意味着每一次处理的句子列表的大小不会超出100。对于每个批次,我们首先运行BI-LSTM-CRF模型进行前向传递,其包括LSTM的前向状态和后向状态的前向传递。我们会获取所有位置的所有标签的输出分数作为结果。然后,我们运行CRF层的前向和后向传递,以计算网络输出和状态转换边缘的梯度。做完这些,我们将错误从输出反向传播到输入,这包括对LSTM前向和后向状态的反向传递。最后,我们更新网络参数,这包括转移矩阵 [A]_{i,j} \forall i,j 和原初的BI-LSTM的参数\theta

算法1:BI-LSTM-CRF模型训练过程

1: for each epoch do
2:   for each batch do
3:     1) bidirectional LSTM-CRF model forward pass:
4:         forward pass for forward state LSTM
5:         forward pass for backward state LSTM
6:     2) CRF layer forward and backward pass
7:     3) bidirectional LSTM-CRF model backward pass:
8:         backward pass for forward state LSTM
9:         backward pass for backward state LSTM
10:     4) update parameters
11:   end for
12: end for

4 实验

4.1 数据

  我们在三个NLP序列标注任务:Penn TreeBank(PTB,宾州树库)词性标注,CoNLL 2000 语义组块识别,以及CoNLL 2003 命名实体标注上测试了LSTM、BI-LSTM、CRF、LSTM-CRF以及BI-LSTM-CRF模型。表格1展示了句子、词以及训练标签的数量,以及验证和测试集。
  序列标注为每一个词分配一个标签,这个标签标识词的句法角色。在语义组块中,使用短语类型来标注每一个词。举个例子:标签 B-NP 表示一个词开始了一个名词短语。在NER(命名实体识别)任务中,每一个词使用其他的实体类型或者四种实体类型中的一个:Person,Location,Organization或者Miscellaneous来标注。对于语义组块识别和命名实体实体识别任务,我们使用 BIO2 规范来标注训练数据。

4.2 特征

  我们为三个数据集抽取相同类型的特征。这些特征可以分组为拼写特征和上下文特征。我们为指定的POS、chunking、NER数据集分别抽取了401K,76K,341K的特征数据。这些特征类似于使用 Stanford NER 工具抽取的特征。注意除了使用Senna嵌入之外,对于POS和chunking任务我们并未使用额外的数据。对于NER任务,我们报告使用拼写和上下文特征的性能,同时我们也增量报告了使用Senna嵌入和Gazetteer特征的结果。

4.2.1 拼写特征

  除了单词的小写特征外,我们还未一个给定的单词提取以下特征。

  • 是否首字母大写
  • 是否所有字母都是大写
  • 是否所有字母都是小写
  • 是否有非首字母的大写字母
  • 是否是由字母和数字混合的
  • 是否由标点符号
  • 字母前缀和后缀 (窗口大小为2到 5)
  • 是否由('s)结尾
  • 只包含一个字母,例如: I. B. M. 对IBM
  • 不只包含字母,例如:A. T. &T. 对..&
  • 单词模式特征,用大写字母、小写字母和数字分别映射到 "A"、"a" 和 "0",例如:D56y-3 到 A00a-0。
  • 单词模式摘要特征,类似于词模式特征,但是删除了连续相同的字符。

4.2.2 上下文特征

  对于三个数据集中的词特征,我们使用一元和二元语法特征。对于CoNLL2000数据集在POS任务,以及CoNLL2003数据集在POS和CHUNK任务上的特征,我们使用一元,二元和三元语法特征。

4.2.3 词嵌入

  词嵌入在提升序列标注性能上扮演了一个至关重要的角色。我们下载了词典长度为130K,维度为50维的词嵌入模型,在嵌入层,我们只是简单的将独热编码的词表示替换成为50维的词向量。

4.2.4 特征连接技巧

  我们处理拼写特征和上下文特征的方式和处理词特征的方法一样。也就是说,网络的输入同时包括词,拼写和上下文特征。然而,我们发现从拼写和上下文特征到输出的直接连接可以加速训练,并且会导致非常相似的标注精度。图8展示了特征与输出直接相连的网络。我们将报告所有使用了这种连接方式的精确度。我们注意到这种特征应用方式与 Mikolov et al. 2011 中使用的最大熵特征有相同的思想。不同之处在于 Mikolov et al. 2011 中采用了特征哈希技术,因此会发生特征碰撞。因为序列标注数据集中输出的标签数远远小于语言模型(通常有数十万个),所以我们可以保证在特征和输出之间采用全连接的同时避免潜在的特征碰撞。

图8:采用了MaxEnt特征的BI-LSTM-CRF模型

表1:句子,词以及训练标签的数量,验证和测试数据集

4.3 结果

  我们针对每一个数据集训练LSTM,BI-LSTM,CRF,LSTM-CRF以及BI-LSTM-CRF模型。我们使用两种方式来初始化词嵌入:RandomSenna。在第一类中我们随机地初始化词嵌入向量,第二类中,我们使用Senna词嵌入。对于每一种类别,我们使用相同的特征集,因此不同的结果完全是由于不同的网络产生的。我们使用训练数据训练模型,使用验证数据集来监控性能。如果分块的数据没有验证数据,我们使用部分训练数据来验证模型。
  我们使用0.1的学习率来训练模型。我们设置隐藏层的大小为300,同时发现模型的性能对于隐藏层大小并不敏感。这三种任务的训练需要不到10次迭代就能够收敛,一般需要不到几个小时。我们在表2中报告了模型在测试数据集上的性能,同时我们也列出了论文(Collobert et al., 2011)中的最好结果,表示为Conv-CRF。POS任务通过计算每个字的准确性进行评估,而 chunk 和 NER 任务则通过计算组块上的 F1 分数来评估。

表2:各模型在 POS、chunking 和 NER 任务上的标注性能比较

4.3.1 与Conv-CRF网络的比较

  我们有三个基准模型:LSTM,BI-LSTM 以及 CRF。LSTM是这三个数据集上最弱的基准。BI-LSTM 在 POS 和 chunking 数据集上的性能接近CRF,但是在NER数据集上的性能不如CRF。CRF模型在我们的实验中是最强的基准。对于随机类别, CRF 模型在所有三个数据集中的性能优于 Conv-CRF 模型。对于Senna类别,CRF 模型在 POS 任务上的表现优于 Conv-CRF,但在 chunking 和 NER 任务上的表现不如 Conv-CRF。LSTM-CRF 模型的性能在所有数据集上优于 CRF 模型。这表明了正向 LSTM 组件在建模序列数据中的有效性。BI-LSTM-CRF 模型进一步改进了 LSTM-CRF 模型,BI-LSTM-CRF 在除了随机类型的 POS 任务(该任务还是 LSTM-CRF 性能最好)之外的其他所有任务上取得了最好的标注性能。在 CoNLL 200 的 Senna 类别中,括号里面的数字是由 Gazetteer 特征生成。
  有趣的是,我们最好的模型 BI-LSTM-CRF 对 Senna 词嵌入的依赖性比 Conv-CRF 模型要小。例如,BI-LSTM-CRF 在随机类型和Senna类型之间的标记差异分别是 POS:0.12%,chunking:0.33%,NER:4.57% 。相反,Conv-CRF模型在很大程度上依赖于Senna嵌入以获得良好的标记准确性,标记差异分别为 POS:0.92%,chunking:3.99%和NER:7.20%。

4.3.2 模型健壮性

  为了估计模型在工程特征(拼写和上下文特征)方面的稳健性,我们仅仅使用词特征训练 LSTM,BI-LSTM,CRF,LSTM-CRF和 BI-LSTM-CRF 模型(移除了拼写和上下文特征)。表3显示了使用Senna字嵌入的建议模型在 POS,chunking 和 NER 数据集上的标记性能。其中括号中的数字表示与使用了拼写和上下文特征的相同模型相比,下降的性能。CRF模型在移除了拼写和上下文特征的情况下发生了显著的性能下降。这表明了CRF模型严重依赖特征工程的事实。换句话说,基于LSTM的模型,尤其是 BI-LSTM 和 BI-LSMT-CRF模型是更加健壮的,并且当我们移除工程化的特征后,受到的影响也最低。对于所有三个任务,BI-LSTM-CRF模型拥有最高的标注精度。例如,BI-LSTM-CRF 在 CoNLL 2000 上的 chunking 任务取得了94.40的F1分数,比起使用了拼写和上下文特征的模型,只降低了(0.06)。

表3:只使用词特征的情况下POS、chunking、NER任务的标注性能

4.3.3 与已存在系统的比较

  对于 POS 数据集,我们在使用或不使用额外数据资源的情况下实现了最先进的标记准确性。POS 数据集已经过广泛测试,过去的改进可以在表4中看到。我们的测试准确率为97.55%,在置信水平为95%时明显优于其他测试。此外,我们的BI-LSTM-CRF模型在无需使用Senna词嵌入的情况下达到了良好的精度。


表4:不同模型的POS标注精度比较

  所有 chunking 系统的性能如表5所示。Kudo 等人赢得了 CoNLL 2000 的挑战赛,F1得分为93.48%。 他们的方法是基于SVM的分类器。他们后来将结果提高到93.91%。最近的工作包括基于 CRF 的模型(ShaPereira ,2003年;Mcdonald 等人,2005年;Sun 等,2008年)。更近期的是(ShenSarkar,2005年),其使用的投票分类器方案获得了95.23%的准确度,其中每个分类器在不同的标签表示(IOB,IOE等)上训练。 除了(ShenSarkar,2005年)之外,我们的模型优于所有报告的系统。
  NER的所有系统的性能如表6所示。(Florian 等 ,2003年)在 NER CoNLL 2003 挑战中成为最佳系统,F1得分为88.76%。他们使用了各种机器学习分类器的组合。 排名第二的是(Chieu,2003年),F
1得分是88.31%,也是在外部地名录的帮助下。在这之后,(AndoZhang,2005年)以半监督方式达到了89.31%的F1值。(Passos 等,2014)报告了90.90%的最佳F1得分,它采用了一种新的形式来学习单词嵌入,这种方式可以利用相关词典中的信息来改进表示。我们的模型可以通过 Senna 嵌入和地名词典功能获得90.10的最佳F1分数。它的F1得分低于(Passos 等,2014),这可能是由于采用了不同的词嵌入这一事实。使用相同的Senna嵌入,BI-LSTM-CRF略微优于Conv-CRF(90.10%对比89.59%)。然而,如果使用随机嵌入,BI-LSTM-CRF明显优于Conv-CRF(84.26%对81.47%)。

表5:不同模型的chunking任务F1得分比较

表6:不同模型在NER任务上的F1得分比较

5. 讨论(Discussions)

  我们的工作与(Collobert等,2011年)的工作接近,都是使用深度神经网络进行序列标注。他们的工作使用的是卷积神经网络,而我们的工作是使用双向LSTM网络。
  我们的工作也接近(Hammerton,2003年;Yao 等,2014年)的工作,因为他们都使用 LSTM 网络进行序列标记。(Hammerton,2003年)的表现并不令人印象深刻。(Yao 等,2014年)的工作没有使用双向 LSTM 和 CRF 层,因此标注的准确性可能会受到影响。
  最后,我们的工作与(WangManning,2013年)的工作有关,其结论是非线性体系结构在高维离散特征空间中没有任何好处。 我们展示了使用 BI-LSTM-CRF 模型,我们始终获得比具有相同特征集的单个CRF模型更好的标记精度。

6. 结论(Conclusions)

  在这篇论文中,我们有计划的比较了基于LSTM网络的模型在序列标注上的性能。我们第一个提出将BI-LSTM-CRF模型应用于NLP基准序列标注数据。 我们的模型可以在POS,chunking 和 NER 数据集上产生最先进(或接近)的精度。此外,与(Collobert 等,2011年)中的观察相比,我们的模型是健壮的并且对字嵌入的依赖性较小。 它可以在不使用词嵌入的前提下实现准确的序列标注。

原文地址:《BiLSTM-CRF Models for Sequence Tagging》

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