深度學(xué)習(xí)項(xiàng)目實(shí)踐怠堪,使用神經(jīng)網(wǎng)絡(luò)分析電影評(píng)論的正能量與負(fù)能量

在前面章節(jié)中揽乱,我們花費(fèi)大量精力詳細(xì)解析了神經(jīng)網(wǎng)絡(luò)的內(nèi)在原理名眉。神經(jīng)網(wǎng)絡(luò)由如下4個(gè)部分組成:

1,神經(jīng)層凰棉,每層由多個(gè)神經(jīng)元組合而成损拢。

2,輸入訓(xùn)練數(shù)據(jù)渊啰,已經(jīng)數(shù)據(jù)對(duì)應(yīng)的結(jié)果標(biāo)簽

3探橱,設(shè)計(jì)損失函數(shù),也就是用數(shù)學(xué)公式來表示绘证,神經(jīng)網(wǎng)絡(luò)的輸出結(jié)果與正確結(jié)果之間的差距。

4哗讥,優(yōu)化嚷那,通過梯度下降法修改神經(jīng)元的鏈路權(quán)重,然后使得網(wǎng)絡(luò)的輸出結(jié)果與正確結(jié)果之間的差距越來越小杆煞。

下圖就能將網(wǎng)絡(luò)的各個(gè)組件以及我們前面討論過的內(nèi)容綜合起來:

屏幕快照 2018-06-19 上午10.58.04.png

神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程魏宽,其實(shí)就是把大量數(shù)據(jù)輸入,讓網(wǎng)絡(luò)輸出結(jié)果决乎,計(jì)算結(jié)果與預(yù)期結(jié)果間的差距队询,通過梯度下降法修改神經(jīng)元鏈路權(quán)重,以便降低輸出結(jié)果與預(yù)期結(jié)果的差距构诚。這個(gè)流程反復(fù)進(jìn)行蚌斩,數(shù)據(jù)量越大,該流程進(jìn)行的次數(shù)越多范嘱,鏈路權(quán)重的修改就能越精確送膳,于是網(wǎng)絡(luò)輸出的結(jié)果與預(yù)期結(jié)果就越準(zhǔn)確。

本節(jié)我們將神經(jīng)網(wǎng)絡(luò)技術(shù)直接運(yùn)用到具體的項(xiàng)目實(shí)踐上丑蛤,我們用神經(jīng)網(wǎng)絡(luò)來判斷用戶在網(wǎng)絡(luò)上編寫的影評(píng)中包含的是正能量還是負(fù)能量叠聋,如果對(duì)電影正能量的影評(píng)越多,電影的票房便會(huì)越好受裹,負(fù)能量影評(píng)越多碌补,電影票房可能就會(huì)暗淡。在項(xiàng)目中我們不再像以前一樣從零創(chuàng)建一個(gè)網(wǎng)絡(luò)棉饶,而是直接使用keras框架快速的搭建學(xué)習(xí)網(wǎng)絡(luò)厦章。

首先要做的是將影評(píng)數(shù)據(jù)下載到本地,我們使用的是國外著名電影評(píng)論網(wǎng)站IDMB的數(shù)據(jù)砰盐,數(shù)據(jù)有60000條影評(píng)闷袒,其中一半包含正能量,另一半包含負(fù)能量岩梳,這些數(shù)據(jù)將用于訓(xùn)練我們的網(wǎng)絡(luò)囊骤,數(shù)據(jù)的下載代碼如下:

from keras.datasetsimportimdb(train_data, train_labels),(test_data, test_labels)= imdb.load_data(num_words=10000)

數(shù)據(jù)流不小晃择,下載可能需要幾十秒,運(yùn)行上面代碼后也物,結(jié)果如下:

屏幕快照 2018-06-19 上午11.04.58.png

數(shù)據(jù)中的評(píng)論是用英語擬寫的文本宫屠,我們需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,把文

本變成數(shù)據(jù)結(jié)構(gòu)后才能提交給網(wǎng)絡(luò)進(jìn)行分析滑蚯。我們當(dāng)前下載的數(shù)據(jù)條目中浪蹂,包含的已經(jīng)不是原來的英文,而是對(duì)應(yīng)每個(gè)英語單詞在所有文本中的出現(xiàn)頻率告材,我們加載數(shù)據(jù)時(shí)坤次,num_words=10000,表示數(shù)據(jù)只加載那些出現(xiàn)頻率排在前一萬位的單詞斥赋。我們看看數(shù)據(jù)內(nèi)容:

print(train_data[0])print(train_labels[0])

上面帶運(yùn)行后結(jié)果如下:

屏幕快照 2018-06-19 上午11.10.42.png

train_data的一個(gè)元素的值是1缰猴,它對(duì)應(yīng)的是頻率出現(xiàn)排在第一位的單詞,假設(shè)頻率出現(xiàn)最高的單詞是"is"疤剑,那么train_data第1個(gè)元素對(duì)應(yīng)的單詞就是"is"滑绒,以此類推。train_lables用來存儲(chǔ)對(duì)應(yīng)影評(píng)是正能量還是負(fù)能量隘膘,1表示正能量疑故,0表示負(fù)能量。

接下來我們嘗試根據(jù)train_data中給定的單詞頻率弯菊,把單詞還原回來纵势。頻率與單詞的對(duì)應(yīng)存儲(chǔ)在imdb.get_word_index()返回的哈希表中,通過查詢?cè)摫砦笮覀兙湍軐㈩l率轉(zhuǎn)換成對(duì)應(yīng)的單詞吨悍,代碼如下:

#頻率與單詞的對(duì)應(yīng)關(guān)系存儲(chǔ)在哈希表word_index中,它的key對(duì)應(yīng)的是單詞,value對(duì)應(yīng)的是單詞的頻率word_index = imdb.get_word_index()#我們要把表中的對(duì)應(yīng)關(guān)系反轉(zhuǎn)一下蹋嵌,變成key是頻率育瓜,value是單詞reverse_word_index = dict([(value, key)for(key, value)inword_index.items()])'''

在train_data所包含的數(shù)值中,數(shù)值1栽烂,2躏仇,3對(duì)應(yīng)的不是單詞,而用來表示特殊含義腺办,1表示“填充”焰手,2表示”文本起始“,

3表示”未知“怀喉,因此當(dāng)我們從train_data中讀到的數(shù)值是1书妻,2,3時(shí)躬拢,我們要忽略它躲履,從4開始才對(duì)應(yīng)單詞见间,如果數(shù)值是4,

那么它表示頻率出現(xiàn)最高的單詞

'''decoded_review =' '.join([reverse_word_index.get(i-3,'?')foriintrain_data[0]])print(decoded_review)

上面這段代碼運(yùn)行后工猜,我們把條目一的影評(píng)還原如下:

屏幕快照 2018-06-19 上午11.32.26.png

對(duì)英語不好的同學(xué)可能會(huì)吃力點(diǎn)米诉,但沒辦法,這些標(biāo)記好的訓(xùn)練數(shù)據(jù)只有英語才有篷帅,中文沒有相應(yīng)的訓(xùn)練數(shù)據(jù)史侣,從這點(diǎn)看可以明白,為何西方人的科技會(huì)領(lǐng)先中國魏身,他們有很多人愿意做一些為他人鋪路的工作惊橱。

在把數(shù)據(jù)輸入網(wǎng)絡(luò)前,我們需要對(duì)數(shù)據(jù)進(jìn)行某種格式化叠骑,數(shù)據(jù)的格式對(duì)網(wǎng)絡(luò)的分析準(zhǔn)確性具有很大的影響李皇。在深度學(xué)習(xí)中,有一種常用的數(shù)據(jù)格式叫:one-hot-vector宙枷,它的形式是這樣的,假設(shè)集合中總共有10個(gè)整數(shù){0,1,2,3,4,5,6,7,8,9}茧跋,我們選取一個(gè)子集,它包含所有偶數(shù)慰丛,也就是{0,2,4,6,8},那么對(duì)應(yīng)的one-hot-vector就是一個(gè)含有10個(gè)元素的向量瘾杭,如果某個(gè)元素出現(xiàn)在子集中诅病,我們就把向量中對(duì)應(yīng)的元素設(shè)置為1,沒有出現(xiàn)則設(shè)置為0粥烁,于是對(duì)應(yīng)子集的向量就是:[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]贤笆。

由于文本中只包含10000個(gè)單詞,于是我們?cè)O(shè)置一個(gè)長度為一萬的向量讨阻,當(dāng)某個(gè)頻率的詞出現(xiàn)在文章中時(shí)芥永,我們就把向量相應(yīng)位置的元素設(shè)置成1,代碼如下:

importnumpyasnpdefvectorize_sequences(sequences, dimension=10000):'''

? ? sequences 是包含所有評(píng)論的序列钝吮,一條評(píng)論對(duì)應(yīng)到一個(gè)長度為10000的數(shù)組埋涧,因此我們要構(gòu)建一個(gè)二維矩陣,

? ? 矩陣的行對(duì)應(yīng)于評(píng)論數(shù)量奇瘦,列對(duì)應(yīng)于長度為10000

? ? '''results = np.zeros((len(sequences),dimension))fori, sequenceinenumerate(sequences):? ? ? ? results[i, sequence] =1.0returnresultsx_train = vectorize_sequences(train_data)x_test = vectorize_sequences(test_data)print(x_train[0])y_train = np.asarray(train_labels).astype('float32')y_test = np.asarray(test_labels).astype('float32')

經(jīng)過上面的格式化后棘催,網(wǎng)絡(luò)的輸入數(shù)據(jù)就是簡單的向量,訓(xùn)練數(shù)據(jù)對(duì)應(yīng)的結(jié)果就是簡單的0或1耳标。接下來我們要構(gòu)建一個(gè)三層網(wǎng)絡(luò)醇坝,代碼如下:

fromkerasimportmodelsfromkerasimportlayersmodel = models.Sequential()#構(gòu)建第一層和第二層網(wǎng)絡(luò),第一層有10000個(gè)節(jié)點(diǎn)次坡,第二層有16個(gè)節(jié)點(diǎn)#Dense的意思是呼猪,第一層每個(gè)節(jié)點(diǎn)都與第二層的所有節(jié)點(diǎn)相連接#relu 對(duì)應(yīng)的函數(shù)是relu(x) = max(0, x)model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))#第三層有16個(gè)神經(jīng)元画畅,第二層每個(gè)節(jié)點(diǎn)與第三層每個(gè)節(jié)點(diǎn)都相互連接model.add(layers.Dense(16, activation='relu'))#第四層只有一個(gè)節(jié)點(diǎn),輸出一個(gè)0-1之間的概率值model.add(layers.Dense(1, activation='sigmoid'))

上面代碼構(gòu)造了一個(gè)四層網(wǎng)絡(luò)郑叠,第一層含有10000個(gè)神經(jīng)元夜赵,用于接收長度為10000的文本向量,第二第三層都含有16個(gè)神經(jīng)元乡革,最后一層只含有一個(gè)神經(jīng)元寇僧,它輸出一個(gè)概率值,用于標(biāo)記文本含有正能量的可能性沸版。

接下來我們?cè)O(shè)置損失函數(shù)和設(shè)置鏈路參數(shù)的調(diào)教方式嘁傀,代碼如下:

fromkerasimportlossesfromkerasimportmetricsfromkerasimportoptimizersmodel.compile(optimizer=optimizers.RMSprop(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])

optimizer參數(shù)指定的是如何優(yōu)化鏈路權(quán)重,事實(shí)上各種優(yōu)化方法跟我們前面講的梯度下降法差不多视粮,只不過在存在一些微小的變化细办,特別是在更新鏈路權(quán)值時(shí),會(huì)做一些改動(dòng)蕾殴,但算法主體還是梯度下降法笑撞。當(dāng)我們的網(wǎng)絡(luò)用來將數(shù)據(jù)區(qū)分成兩種類型時(shí),損失函數(shù)最好使用binary_crossentroy,它的表達(dá)式如下:

Hy′(y):=?∑i(y′ilog(y[i])+(1?y′[i])log(1?y[i]))

其中y[i]對(duì)應(yīng)的是訓(xùn)練數(shù)據(jù)提供的結(jié)果钓觉,y'[i]是我們網(wǎng)絡(luò)計(jì)算所得的結(jié)果茴肥。metrics用于記錄網(wǎng)絡(luò)的改進(jìn)效率,我們暫時(shí)用不上荡灾。接著我們把訓(xùn)練數(shù)據(jù)分成兩部分瓤狐,一部分用于訓(xùn)練網(wǎng)絡(luò),一部分用于檢驗(yàn)網(wǎng)絡(luò)的改進(jìn)情況:

x_val = x_train[:10000]partial_x_train = x_train[10000:]y_val = y_train[: 10000]partial_y_train = y_train[10000:]history= model.fit(partial_x_train, partial_y_train, epochs=20, batch_size=512,? ? ? ? ? ? ? ? ? ? validation_data = (x_val, y_val))

訓(xùn)練數(shù)據(jù)總共有60000條批幌,我們把最前一萬條作為校驗(yàn)數(shù)據(jù)础锐,用來檢測網(wǎng)絡(luò)是否優(yōu)化到合適的程度,然后我們把數(shù)據(jù)從第一萬條開始作為訓(xùn)練網(wǎng)絡(luò)來用荧缘,把數(shù)據(jù)分割好后皆警,調(diào)用fit函數(shù)就可以開始訓(xùn)練過程,上面代碼運(yùn)行后結(jié)果如下:

屏幕快照 2018-06-19 下午5.38.26.png

我把代碼運(yùn)行結(jié)果最后部分信息截取出來胜宇。我們看到loss的值越來越小耀怜,這意味著網(wǎng)絡(luò)越來越能準(zhǔn)確的識(shí)別訓(xùn)練數(shù)據(jù)的類型,但是校驗(yàn)數(shù)據(jù)的識(shí)別準(zhǔn)確度卻越來越低桐愉,也就是我們的模型只試用與訓(xùn)練數(shù)據(jù)财破,不適用與校驗(yàn)數(shù)據(jù),這意味著我們的訓(xùn)練過程有問題从诲。fit函數(shù)返回的history對(duì)象記錄了訓(xùn)練過程中左痢,網(wǎng)絡(luò)的相關(guān)數(shù)據(jù),通過分析這些數(shù)據(jù),我們可以了解網(wǎng)絡(luò)是如何改進(jìn)自身的俊性,它是一個(gè)哈希表略步,記錄了四種內(nèi)容:

history_dict = history.historyprint(history_dict.keys())

上面輸出結(jié)果如下:

dict_keys(['val_loss', 'val_acc', 'loss', 'acc'])

它記錄了網(wǎng)絡(luò)對(duì)訓(xùn)練數(shù)據(jù)識(shí)別的精確度和對(duì)校驗(yàn)數(shù)據(jù)識(shí)別的精確度。我們把數(shù)據(jù)畫出來看看:

importmatplotlib.pyplotaspltacc = history.history['acc']val_acc = history.history['val_acc']loss = history.history['loss']val_loss = history.history['val_loss']epochs = range(1, len(acc) +1)#繪制訓(xùn)練數(shù)據(jù)識(shí)別準(zhǔn)確度曲線plt.plot(epochs, loss,'bo', label='Trainning loss')#繪制校驗(yàn)數(shù)據(jù)識(shí)別的準(zhǔn)確度曲線plt.plot(epochs, val_loss,'b', label='Validation loss')plt.title('Trainning and validation loss')plt.xlabel('Epochs')plt.ylabel('Loss')plt.legend()plt.show()

上面代碼運(yùn)行后結(jié)果如下:

屏幕快照 2018-06-19 下午5.48.15.png

我們看上面圖示能發(fā)現(xiàn)一個(gè)問題定页,隨著迭代次數(shù)的增加趟薄,網(wǎng)絡(luò)對(duì)訓(xùn)練數(shù)據(jù)識(shí)別的準(zhǔn)確度越來越高,也就是loss越來越低典徊,然后校驗(yàn)數(shù)據(jù)的識(shí)別準(zhǔn)確的卻越來越低杭煎,這種現(xiàn)象叫“過度擬合”,這意味著訓(xùn)練的次數(shù)并不是越多越好卒落,而是會(huì)“過猶不及”羡铲,有時(shí)候訓(xùn)練迭代次數(shù)多了反而導(dǎo)致效果下降。從上圖我們看到儡毕,大概在第4個(gè)epoch的時(shí)候也切,校驗(yàn)數(shù)據(jù)的識(shí)別錯(cuò)誤率開始上升,因此我們將前面的代碼修改腰湾,把參數(shù)epochs修改成4才能達(dá)到最佳效果雷恃。

訓(xùn)練好網(wǎng)絡(luò)后,我們就可以用它來識(shí)別新數(shù)據(jù)费坊,我們把測試數(shù)據(jù)放入網(wǎng)絡(luò)進(jìn)行識(shí)別褂萧,代碼如下:

model = models.Sequential()model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))model.add(layers.Dense(16, activation='relu'))model.add(layers.Dense(1, activation='sigmoid'))model.compile(optimizer='rmsprop',? ? ? ? ? ? ? loss='binary_crossentropy',? ? ? ? ? ? ? metrics=['accuracy'])model.fit(x_train, y_train, epochs=4, batch_size=512)results = model.evaluate(x_test, y_test)

上面代碼運(yùn)行后結(jié)果如下:

這里寫圖片描述

results有兩個(gè)值,第二個(gè)表示的是判斷的準(zhǔn)確度葵萎,從結(jié)果我們可以看到,網(wǎng)絡(luò)經(jīng)過訓(xùn)練后唱凯,對(duì)新的影評(píng)文本羡忘,其對(duì)其中正能量和負(fù)能量的判斷準(zhǔn)確率達(dá)到88%。對(duì)于專業(yè)的項(xiàng)目實(shí)施磕昼,經(jīng)過巧妙的調(diào)優(yōu)卷雕,各種參數(shù)的調(diào)整,多增加網(wǎng)絡(luò)的層次等方法票从,準(zhǔn)確率可以達(dá)到95%左右漫雕。接著我們看看網(wǎng)絡(luò)對(duì)每一條測試文本得出它是正能量的幾率:

model.predict(x_test)

代碼運(yùn)行后結(jié)果如下:

這里寫圖片描述

網(wǎng)絡(luò)對(duì)每一篇影評(píng)給出了其是正能量的可能性。

我們的網(wǎng)絡(luò)還有不少可以嘗試改進(jìn)的地方峰鄙,例如在中間多增加兩層神經(jīng)元浸间,改變中間層神經(jīng)元的數(shù)量,將16改成32块饺,64等芦圾,嘗試使用其他損失函數(shù)等摔刁。

從整個(gè)項(xiàng)目流程我們看到婴洼,一個(gè)神經(jīng)網(wǎng)絡(luò)在實(shí)踐中的應(yīng)用需要完成以下幾個(gè)步驟:

1兜看,將原始數(shù)據(jù)進(jìn)行加工锥咸,使其變成數(shù)據(jù)向量以便輸入網(wǎng)絡(luò)。

2细移,根據(jù)問題的性質(zhì)選用不同的損失函數(shù)和激活函數(shù)搏予,如果網(wǎng)絡(luò)的目標(biāo)是將數(shù)據(jù)區(qū)分成兩類,那么損失函數(shù)最好選擇binary_crossentropy弧轧,輸出層的神經(jīng)元如果選用sigmoid激活函數(shù)雪侥,那么它會(huì)給出數(shù)據(jù)屬于哪一種類型的概率。

3劣针,選取適當(dāng)?shù)膬?yōu)化函數(shù)校镐,幾乎所有的優(yōu)化函數(shù)都以梯度下降法為主,只不過在更新鏈路權(quán)重時(shí)捺典,有些許變化鸟廓。

4,網(wǎng)絡(luò)的訓(xùn)練不是越多越好襟己,它容易產(chǎn)生“過度擬合”的問題引谜,導(dǎo)致訓(xùn)練的越多,最終效果就越差擎浴,所以在訓(xùn)練時(shí)要密切關(guān)注網(wǎng)絡(luò)對(duì)檢驗(yàn)數(shù)據(jù)的判斷準(zhǔn)確率员咽。

作者:望月從良

鏈接:http://www.reibang.com/p/be447ac804db

來源:簡書

簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處贮预。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贝室,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仿吞,更是在濱河造成了極大的恐慌滑频,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唤冈,死亡現(xiàn)場離奇詭異峡迷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)你虹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門绘搞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傅物,你說我怎么就攤上這事夯辖。” “怎么了挟伙?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵楼雹,是天一觀的道長模孩。 經(jīng)常有香客問我,道長贮缅,這世上最難降的妖魔是什么榨咐? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮谴供,結(jié)果婚禮上块茁,老公的妹妹穿的比我還像新娘。我一直安慰自己桂肌,他們只是感情好数焊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崎场,像睡著了一般佩耳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谭跨,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天干厚,我揣著相機(jī)與錄音,去河邊找鬼螃宙。 笑死蛮瞄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谆扎。 我是一名探鬼主播挂捅,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堂湖!你這毒婦竟也來了闲先?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤无蜂,失蹤者是張志新(化名)和其女友劉穎饵蒂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酱讶,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年彼乌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泻肯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慰照,死狀恐怖灶挟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毒租,我是刑警寧澤稚铣,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響惕医,放射性物質(zhì)發(fā)生泄漏耕漱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一抬伺、第九天 我趴在偏房一處隱蔽的房頂上張望螟够。 院中可真熱鬧,春花似錦峡钓、人聲如沸妓笙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寞宫。三九已至,卻和暖如春拉鹃,著一層夾襖步出監(jiān)牢的瞬間辈赋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工毛俏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炭庙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓煌寇,卻偏偏與公主長得像焕蹄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阀溶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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