Airbnb 推薦算法 Real-time Personalization using Embeddings for Search Ranking at Airbnb

背景介紹

論文《Real-time Personalization using Embeddings for Search Ranking at Airbnb》是airbnb公布的房源推薦算法,獲得了2018年的KDD最佳論文,論文基于airbnb的房源推薦場(chǎng)景,需要對(duì)客人和房主都進(jìn)行有效的推薦槐臀,即用戶輸入目的地和行程日期進(jìn)行搜索時(shí)未檩,將位置蔓姚、價(jià)格、風(fēng)格和評(píng)價(jià)等方面對(duì)用戶有吸引力的房子排前瘾杭,也要考慮房主的偏好站蝠,將可能會(huì)拒絕客人的排名名降低汰具,比如用戶評(píng)價(jià)差,有寵物菱魔,人數(shù)等留荔。論文主要服務(wù)于相似物品的推薦和搜索排序兩個(gè)場(chǎng)景,前者是用戶在瀏覽一個(gè)房源時(shí)澜倦,界面上的相似房源推薦聚蝶,后者是用戶進(jìn)行搜索后的房源展示順序,99%的房源預(yù)定都發(fā)生在這兩個(gè)場(chǎng)景下藻治,算法的最終目標(biāo)是提升推薦房源的預(yù)訂率碘勉,論文所說(shuō)的實(shí)時(shí)的個(gè)性化推薦,是根據(jù)用戶和房主的實(shí)時(shí)行為對(duì)房源的推薦進(jìn)行一定的調(diào)整桩卵,需要注意的是文章的標(biāo)題是設(shè)計(jì)了一些embedding的方法用于實(shí)時(shí)的個(gè)性化推薦验靡,而非實(shí)時(shí)的更新。

Embedding可以將高維的id/類別類特征轉(zhuǎn)換為稠密雏节、連續(xù)的向量胜嗓,向量之間可以計(jì)算夾角計(jì)算相似性,也便于神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)矾屯。embedding的計(jì)算常見(jiàn)的有兩種:

  1. 有監(jiān)督學(xué)習(xí)兼蕊,end-to-end。embedding作為優(yōu)化變量件蚕,隨機(jī)初始化孙技,在優(yōu)化最終logloss的過(guò)程中,得到有意義的embedding作為“副產(chǎn)品”排作,Youtube對(duì)video_id牵啦、Wide&Deep對(duì)app_id、Deep Interest Network對(duì)商品id的embedding都是這一思路妄痪。
  2. 無(wú)監(jiān)督學(xué)習(xí)哈雏,兩步走。以Item2vec: Neural Item Embedding for Collaborative Filtering為代表衫生。第一步裳瘪,就是簡(jiǎn)單套用word2vec的思路,在電商場(chǎng)景罪针,就將word2vec中的句子換成購(gòu)物車彭羹,將單詞換成商品;新聞推薦場(chǎng)景中泪酱,將句子換成session派殷,將單詞換成文章还最。再直接調(diào)word2vec算法,就得到商品毡惜、文章的embedding向量拓轻。第二步,這些embedding向量经伙,可以用于召回扶叉,可以用于第一類方法的embedding矩陣的初值,也可以當(dāng)特征喂入其他模型橱乱。

本文的embedding計(jì)算方式屬于第二種辜梳。

論文重點(diǎn)內(nèi)容

這篇論文的重點(diǎn)可以分為以下三個(gè)部分:

  1. Listing Embeddings
  2. Listing_type Embeddings 和 User_type Embeddings
  3. 兩類embedding如何用戶實(shí)時(shí)的個(gè)性化推薦

這里的listing表示房源,listing_type和user_type是粗粒度的房源類型和用戶類型泳叠,文章的重點(diǎn)是提出了與業(yè)務(wù)緊密結(jié)合的embedding方法作瞄。下面將分別對(duì)每種embedding的設(shè)計(jì)原理、有效性驗(yàn)證和如何應(yīng)用于實(shí)時(shí)的個(gè)性化推薦進(jìn)行詳細(xì)的說(shuō)明危纫。

Listing Embedding

論文用點(diǎn)擊行為表示用戶的短期興趣宗挥,基于用戶的Listing點(diǎn)擊序列,得到每個(gè)listing的embedding种蝶∑豕ⅲ看似平淡無(wú)奇,但是有一些別致的設(shè)計(jì):

序列的構(gòu)建

每個(gè)序列都由某個(gè)用戶的點(diǎn)擊時(shí)間構(gòu)成螃征,按時(shí)間先后順序排序搪桂,相隔超過(guò)30min的點(diǎn)擊時(shí)間被隔開(kāi)為不同的序列。

原始計(jì)算方法+負(fù)采樣

類似于word2vec中的skip-gram算法盯滚,窗口大小為2m踢械,softmax損失函數(shù),要優(yōu)化的目標(biāo)函數(shù)為:



其中



vl表示房源l的向量表示魄藕。
采用了隨機(jī)負(fù)采樣

其中Dp表示正例内列,Dn表示負(fù)采樣的正例,l表示Listing背率,c表示上下文话瞧。
采用了隨機(jī)梯度下降的優(yōu)化方法。

增加預(yù)定的Listing為全局內(nèi)容


最初的版本是上圖中橙色的部分寝姿,用戶的點(diǎn)擊序列可以分為兩類交排,以預(yù)定為結(jié)尾的和只有點(diǎn)擊沒(méi)有預(yù)定,為了讓embedding的構(gòu)造不僅體現(xiàn)出相鄰上下文的相似關(guān)系饵筑,也能體現(xiàn)出最后的預(yù)定信息埃篓,可以對(duì)以預(yù)定為結(jié)尾的序列,將預(yù)定的Listing作為全局的上下文翻翩,每次窗口滑動(dòng)時(shí)都作為正例參與訓(xùn)練都许,即每次訓(xùn)練都加上圖中紫色的Listing,有點(diǎn)類似于doc2vec中的設(shè)置嫂冻,目標(biāo)函數(shù)的最后一項(xiàng)體現(xiàn)了這一點(diǎn)胶征。


針對(duì)搜索的市場(chǎng)集中的特點(diǎn)增加負(fù)例

訂房的搜索結(jié)果通常限制在某一個(gè)市場(chǎng)區(qū)域中,就容易導(dǎo)致正例集合Dp中包含的Listing都來(lái)自同一個(gè)市場(chǎng)區(qū)域桨仿,而反例由于隨機(jī)采樣包含各個(gè)市場(chǎng)區(qū)域睛低,這樣就導(dǎo)致同一個(gè)市場(chǎng)的Listing的embedding訓(xùn)練不充分,所以文章又增加了一些搜索區(qū)域的負(fù)例服傍,用集合Dmn表示钱雷,在目標(biāo)函數(shù)上的體現(xiàn)如下:


Listing的冷啟動(dòng)Embedding設(shè)置

對(duì)于新的Listing,肯定沒(méi)有embedding可用吹零,文章利用新Listing的一些基本信息罩抗,比如位置、價(jià)格灿椅、類型等套蒂,找到三個(gè)基本距離最近、類型茫蛹、價(jià)位相同的已有Embedding的Listings操刀,將它們的Embedding做平均,作為新Listing的初始Embedding婴洼,這樣的設(shè)定可以覆蓋98%的新Listing骨坑。

Listing的Embedding有效性初步驗(yàn)證

文章在上線這種方法之前先進(jìn)行了Embedding效果的觀察,分三個(gè)方面:

  1. 觀察Kmeans分到同一蔟的Listing的地理位置是否相近柬采,考察了Embedding對(duì)市場(chǎng)區(qū)域的相似度的學(xué)習(xí)情況欢唾,結(jié)果發(fā)現(xiàn)同一蔟的Listing地理位置相近,學(xué)習(xí)有效警没,聚類結(jié)果還可以反過(guò)來(lái)幫助市場(chǎng)區(qū)域的劃分匈辱;
  2. 用cosine相似度評(píng)估相同類型、相同價(jià)格區(qū)間的Listing相似度杀迹,比較發(fā)現(xiàn)類型相同亡脸、價(jià)格區(qū)間相同的Listing往往相似度更高;
  3. 用KNN找一些特殊結(jié)構(gòu)树酪、類型的Listing最近鄰浅碾,考察Embedding對(duì)房屋結(jié)構(gòu)和風(fēng)格這種不易挖掘的相似度學(xué)習(xí)情況,結(jié)果找到的最近鄰?fù)彩怯邢嗨频慕Y(jié)構(gòu)和風(fēng)格续语,比如城堡垂谢、樹(shù)屋等。



實(shí)際應(yīng)用中的生成和更新

訓(xùn)練Listing Embedding用了8億點(diǎn)擊序列疮茄,使用了登陸的用戶滥朱,按id進(jìn)行g(shù)roup并按時(shí)間排序根暑,30min無(wú)動(dòng)作則隔開(kāi),并且移除了停留時(shí)間短(30s)和過(guò)短的序列(<2)徙邻,最后進(jìn)行匿名訓(xùn)練排嫌,并且對(duì)預(yù)定結(jié)尾的序列進(jìn)行了5倍的過(guò)采樣,訓(xùn)練了450萬(wàn)的Listing embedding缰犁。
文章使用滑動(dòng)窗口淳地,每天都對(duì)Embedding進(jìn)行更新,并發(fā)現(xiàn)重新訓(xùn)練比在之前的結(jié)果上進(jìn)行增量訓(xùn)練效果更好帅容,學(xué)習(xí)到的embedding維度為32颇象,Skip-gram窗口大小為10(前5后5)。使用時(shí)將Embedding結(jié)果加載在內(nèi)存并徘,并用map reduce進(jìn)行實(shí)時(shí)計(jì)算遣钳。

User-type & Listing-type Embeddings

通過(guò)點(diǎn)擊序列得到的Embedding主要體現(xiàn)了相同市場(chǎng)區(qū)域的Listing相似度,反映了用戶短期的興趣饮亏,但是用戶長(zhǎng)期的興趣也依然有用耍贾,比如用戶搜索了Los Angeles的Listing,他之前在New York和London也有預(yù)定信息路幸,就可以給他推薦和之前預(yù)定相似的Listing荐开。于是文章就希望利用用戶的預(yù)定序列,生成能反映長(zhǎng)期興趣的User Embedding和Listing Embedding简肴,分別對(duì)應(yīng)租客和房源的長(zhǎng)期興趣晃听。
但是對(duì)每個(gè)用戶或者Listing都生成預(yù)定序列用類似上文的學(xué)習(xí)方法面臨著一些現(xiàn)實(shí)挑戰(zhàn):

  1. 用戶的預(yù)定序列數(shù)據(jù)量少,預(yù)定的數(shù)據(jù)量遠(yuǎn)少于點(diǎn)擊砰识;
  2. 有很多用戶只有一次預(yù)定記錄能扒,序列長(zhǎng)度只為1,無(wú)法使用辫狼;
  3. 能有效學(xué)習(xí)到Embedding的對(duì)象至少需要出現(xiàn)5-10次初斑,這樣的限制條件使得能用的數(shù)據(jù)量更少了;
  4. 預(yù)定發(fā)生時(shí)間跨度較長(zhǎng)的話膨处,用戶的偏好可能會(huì)發(fā)生變化见秤。

基于以上現(xiàn)實(shí)業(yè)務(wù)情況考慮,文章決定不以User ID和生成預(yù)定序列真椿,而是粗化粒度鹃答,從用戶類型和Listing類型的角度生成embedding。

User type和Listing type的構(gòu)造

文章通過(guò)規(guī)則映射的方式將用戶和Listing劃分成不同的類別突硝,如下兩張表所示测摔,以用戶為例,首先根據(jù)一些基本信息或歷史消費(fèi)信息,根據(jù)每一維度不同取值劃分成不同的桶锋八,不同用戶就會(huì)落入到不同的桶中浙于,再綜合考慮所有維度,就得到了每個(gè)用戶的類別挟纱,特別的路媚,隨著時(shí)間的拉近,不同時(shí)段的用戶的類別可能不同樊销,不同Listing的類別也可能不同
另外脏款,一些只有基本信息可以利用的用戶分到的類別還可以起到冷啟動(dòng)的作用围苫。

得到在相同向量空間的結(jié)果

如果用戶向量和Listing向量在相同的向量空間中,就可以直接通過(guò)相似度計(jì)算來(lái)體現(xiàn)二者的契合匹配程度撤师。
文章利用用戶的預(yù)定序列剂府,將用戶ID和預(yù)定的Listing ID都替換成各自對(duì)應(yīng)的type,然后以用戶剃盾、Listing交替的方式排列組成可用的序列腺占,值得注意的是,這里每個(gè)序列都是某一個(gè)用戶的預(yù)定記錄痒谴,但是用戶的類型和Listing的類型是會(huì)隨著時(shí)間變化的衰伯。如下圖所示,Ut代表User type积蔚,Lt代表Listing type意鲸,這里是要對(duì)Uti進(jìn)行更新。


和Skip-gram類似的尽爆,采用了滑動(dòng)窗口怎顾,每次對(duì)窗口中心的元素進(jìn)行更新,對(duì)User type和List type的更新公式是類似的漱贱。
User type:

Listing type:

其中槐雾,book表示預(yù)定,正例幅狮,neg是反例募强,負(fù)采樣,C表示上下文彪笼,包括了User type和Listing type钻注,這樣使得學(xué)習(xí)到的embedding在同一個(gè)向量空間。
這樣構(gòu)造的Listing type分布在各個(gè)市場(chǎng)區(qū)域配猫,沒(méi)有必要進(jìn)行額外市場(chǎng)區(qū)域的負(fù)采樣了幅恋。

加入拒絕信號(hào)

點(diǎn)擊和預(yù)定反映了用戶的興趣,但是在airbnb里泵肄,戶主是可以拒絕用戶預(yù)定的捆交,拒絕是個(gè)強(qiáng)烈的反映戶主偏好的信號(hào)淑翼,在得到的embedding中,戶主和他討厭的用戶類型不能是相似的品追,如果相似了進(jìn)行推薦玄括,也是不利于提升預(yù)訂率的∪馔撸基于這方面的考慮遭京,文章將拒絕信號(hào)加入了目標(biāo)函數(shù)中:


兩類embedding如何用戶實(shí)時(shí)的個(gè)性化推薦

論文主要服務(wù)于相似物品的推薦和搜索排序兩個(gè)場(chǎng)景,前者是用戶在瀏覽一個(gè)房源時(shí)泞莉,界面上的相似房源推薦哪雕,用到了Listing Embedding,后者是用戶進(jìn)行搜索后的房源展示順序鲫趁,Listing Embedding和User/Listing Type embedding都有使用斯嚎。

相似房源推薦

之前的方法是利用search model的結(jié)果,經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn)直接用Listing embedding找相似就可以達(dá)到比之前更好的效果挨厚,經(jīng)過(guò)線下驗(yàn)證后上線堡僻,相似房源的點(diǎn)擊率增加了20%以上
這是線下評(píng)價(jià)指標(biāo)圖疫剃,藍(lán)色表示baseline钉疫,其余的分別表示利用不同目標(biāo)函數(shù)公式后的結(jié)果,縱坐標(biāo)表示預(yù)定的Listing在相似中的排名巢价,數(shù)值越低越好陌选,橫坐標(biāo)表示距離預(yù)定的點(diǎn)擊次數(shù),可以看出使用了embedding的方法在早期點(diǎn)擊的優(yōu)勢(shì)最為明顯蹄溉,添加了預(yù)定信息和區(qū)域負(fù)采樣的embedding方法效果最好咨油。

線下評(píng)價(jià)

搜索排序模型

原始的搜索排序模型利用了Listing/user/query的feature以及它們之間交互信息的feature,根據(jù)用戶對(duì)搜索結(jié)果的交互柒爵,設(shè)定了一些label役电,包括{0, 0.01, 0.25, 1, -0.4},0表示房源有曝光但是沒(méi)點(diǎn)擊棉胀,0.01表示用戶點(diǎn)擊了房源法瑟,0.25表示用戶聯(lián)系了房東但是并沒(méi)有預(yù)訂,1表示房源預(yù)訂成功唁奢,-0.4表示房東拒絕了用戶的預(yù)訂霎挟。采用的是GBDT(Gradient Boosting Decision Trees)回歸算法
文章利用了用戶實(shí)時(shí)的點(diǎn)擊等信息來(lái)構(gòu)造新的相似特征加入到GBDT算法中麻掸,具體地酥夭,將用戶最近兩周有行為的房源做個(gè)分類,一共包括6個(gè)類別,1)用戶擊過(guò)的房源熬北,用 H_c 表示疙描;2)用戶點(diǎn)擊并且停留時(shí)長(zhǎng)超過(guò)60秒的房源,表示長(zhǎng)點(diǎn)擊房源讶隐,用 H_lc 表示起胰;3)曝光卻沒(méi)有點(diǎn)擊的房源,用 H_s 表示巫延;4)用戶加入收藏的房源效五,用 H_w 表示;5)用戶聯(lián)系過(guò)房東但是卻未預(yù)訂的房源炉峰,用 H_i 表示火俄;6)用戶在過(guò)去兩周內(nèi)預(yù)定過(guò)的房源,用 H_b 表示讲冠。將候選房源與上述6個(gè)類別的房源計(jì)算相似度,作為特征加入到搜索排序模型中适瓦,如圖10的前6個(gè)特征竿开,EmbClickSim, EmbSkipSim等。這些數(shù)據(jù)都是用的用戶最近兩周的行為玻熙,表示用戶的短期興趣否彩。


具體如何計(jì)算,我們以 H_c 為例進(jìn)行介紹嗦随,其他5個(gè)類別的計(jì)算方法相同列荔。對(duì)于每個(gè)類別,根據(jù)城市再一次進(jìn)行劃分枚尼,比如H_c中的房源來(lái)自于New York和Los Angeles兩個(gè)城市贴浙,將H_c劃分為H_c(NY)和H_c(LA)。將 H_c(NY) 中所有房源的embedding求平均署恍,作為centroid embedding崎溃,然后計(jì)算當(dāng)前候選房源與centroid embedding的余弦相似度。類似的盯质,計(jì)算候選房源與 H_c(LA) 的centroid embedding的余弦相似度袁串。最后,取兩個(gè)相似度的最大值作為EmbClickSim呼巷。如果 H_c 中的房源來(lái)自于兩個(gè)以上城市囱修,也是相同的計(jì)算方法。
下圖表示了各個(gè)特征的重要性和覆蓋率王悍,可以看到破镰,UserTypeListingTypeSim, EmbClickSim和EmbSkipSim的覆蓋度較高。第3列顯示了特征的重要程度,分母表示一共有104個(gè)特征啤咽,分子表示該特征的重要程度排名晋辆。
對(duì)User type和List type embedding的利用就是查詢現(xiàn)在的用戶的類別和Listing的類別,求出二者的相似性作為特征宇整。

引入 embedding features后瓶佳,線上NDCU提升2.27%,booking DCU增長(zhǎng)2.58%

總而言之鳞青,
對(duì)Listing Embedding的使用:通過(guò)獲取并實(shí)時(shí)更新用戶歷史兩周的點(diǎn)擊等信息霸饲,構(gòu)造了不同的集合,再對(duì)需要排序的Listing臂拓,計(jì)算到各個(gè)集合中Listing的相似度厚脉,作為特征加入模型中。
對(duì)User/Listing Type Embedding的使用:獲取當(dāng)前用戶的類型和要排序的Listing的類型胶惰,計(jì)算相似度傻工,作為特征加入模型中
在實(shí)際應(yīng)用時(shí),都將embedding或相似度加載到后端中孵滞,便于快速計(jì)算中捆,維度設(shè)置成32也是性能和成本trade-off的結(jié)果。

參考文獻(xiàn):
https://astro.temple.edu/~tua95067/kdd2018.pdf
https://zhuanlan.zhihu.com/p/57234648
https://www.zhihu.com/question/302288216/answer/530729525

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坊饶,一起剝皮案震驚了整個(gè)濱河市泄伪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匿级,老刑警劉巖蟋滴,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異痘绎,居然都是意外死亡津函,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)孤页,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)球散,“玉大人,你說(shuō)我怎么就攤上這事散庶〗堆撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵悲龟,是天一觀的道長(zhǎng)屋讶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)须教,這世上最難降的妖魔是什么皿渗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任斩芭,我火速辦了婚禮,結(jié)果婚禮上乐疆,老公的妹妹穿的比我還像新娘划乖。我一直安慰自己,他們只是感情好挤土,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布琴庵。 她就那樣靜靜地躺著,像睡著了一般仰美。 火紅的嫁衣襯著肌膚如雪迷殿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天咖杂,我揣著相機(jī)與錄音庆寺,去河邊找鬼。 笑死诉字,一個(gè)胖子當(dāng)著我的面吹牛懦尝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壤圃,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼陵霉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了埃唯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹰晨,失蹤者是張志新(化名)和其女友劉穎墨叛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體模蜡,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漠趁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忍疾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闯传。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卤妒,靈堂內(nèi)的尸體忽然破棺而出甥绿,到底是詐尸還是另有隱情,我是刑警寧澤则披,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布共缕,位于F島的核電站,受9級(jí)特大地震影響士复,放射性物質(zhì)發(fā)生泄漏图谷。R本人自食惡果不足惜翩活,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望便贵。 院中可真熱鬧菠镇,春花似錦、人聲如沸承璃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绸硕。三九已至堂竟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玻佩,已是汗流浹背出嘹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咬崔,地道東北人税稼。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垮斯,于是被迫代替她去往敵國(guó)和親郎仆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容