Keras螞蟻金服大賽實(shí)戰(zhàn)——自然語言處理技術(shù)(4)

之前在自然語言處理技術(shù)系列的第一篇NER實(shí)戰(zhàn)的結(jié)語中介紹過:序列標(biāo)注(分詞攘滩,NER)祠挫,文本分類(情感分析)汉嗽,句子關(guān)系判斷(語意相似判斷)歼秽,句子生成(機(jī)器翻譯)是NLP領(lǐng)域的四大任務(wù)腌零,之后我又陸續(xù)簡單介紹了情感分析實(shí)戰(zhàn),和Seq2Seq生成對聯(lián)梯找。今天我們來到這個(gè)系列的終章篇——語義相似判斷。語義相似判斷就是判斷兩個(gè)句子是否具有相同的語義益涧,其應(yīng)用場景多用于問答系統(tǒng):

  • 判斷兩個(gè)問句是否具有相同的語義锈锤。
  • 判斷問題和檢索出的答案是否匹配。

當(dāng)然也可以用于其他場景比如判斷兩幅圖片是否是一樣——人臉識別闲询,所以從廣義上來說久免,就是語義相識判斷就是判斷兩個(gè)東西是否具有某種相似度的任務(wù)。

語義相似判斷任務(wù)簡介

語義相似可以轉(zhuǎn)化為一個(gè)分類問題扭弧。給模型輸入兩個(gè)句子,然后希望模型判斷出兩個(gè)句子語義是否相似阎姥。具體輸入輸出細(xì)節(jié)如下:
輸入:

  • 1.為何我無法申請開通花唄信用卡收款
  • 2.支付寶開通信用卡花唄收款不符合條件怎么回事

輸出:1
如果輸出0表示不相似,輸出1表示相似鸽捻。

語義相似判斷算法簡介

語義相似還是NLP中的老問題呼巴,如何將句子映射到到向量空間中同時(shí)保持語義泽腮,然后我們就可以通過各種距離去衡量句子的相似程度。

  • 上古時(shí)期的方式是通過bag of words衣赶,tf-idf這種詞袋模型去映射句子诊赊。
  • 之后出現(xiàn)了word2vector技術(shù),我們就可以將一句話中每個(gè)詞的的詞向量求平均來表示句子向量府瞄,后面又出現(xiàn)了借用word2vector的思路實(shí)現(xiàn)的sen2vector技術(shù)碧磅。
  • 最近比較火的當(dāng)然就是使用深度學(xué)習(xí)技術(shù)將句子映射到向量空間。
    這里我簡要的介紹一下我在實(shí)戰(zhàn)中使用的深度學(xué)習(xí)模型Siamese Network架構(gòu)遵馆。
    Siamese在英語中是“孿生”鲸郊、“連體”的意思,而Siamese Network货邓,如下圖所示就是兩個(gè)共享參數(shù)的神經(jīng)網(wǎng)絡(luò)秆撮,其中神經(jīng)網(wǎng)絡(luò)部分可以任意構(gòu)建,使用CNN逻恐,RNN之類的都可以像吻。通過同一網(wǎng)絡(luò)將兩個(gè)輸入映射到向量空間,然后在去計(jì)算它們的相似性复隆,相似性度量可以通過:
  • 歐式距離拨匆,
  • 余弦距離,
  • 或者給數(shù)據(jù)打上標(biāo)簽挽拂,通過神經(jīng)網(wǎng)絡(luò)去判斷相似性等惭每。


    Siamese Network

    本次實(shí)戰(zhàn)就是采用的Siamese-BiLSTM,意思就是用雙向的LSTM做共享參數(shù)的network部分亏栈。

螞蟻金服大賽實(shí)戰(zhàn)

讀入數(shù)據(jù)

數(shù)據(jù)格式如下台腥,每條數(shù)據(jù)都是兩個(gè)句子和一個(gè)標(biāo)簽。


data

執(zhí)行下方代碼讀入數(shù)據(jù)绒北。

import pandas as pd
train_data = pd.read_csv("./huabei/train.csv",encoding="utf-8",header=None,sep="\t")
val_data = pd.read_csv("./huabei/val.csv",encoding="utf-8",header=None,sep="\t")
train_data[1] = train_data[1].apply(lambda x : [char for char in x])
train_data[2] = train_data[2].apply(lambda x : [char for char in x])
train_data

生成字典

執(zhí)行下方代碼黎侈,為后續(xù)的文本轉(zhuǎn)ID構(gòu)建一個(gè)字典。

from itertools import chain
train_data_1 = list(chain.from_iterable(train_data[1]))
train_data_2 = list(chain.from_iterable(train_data[2]))
all_words = set(train_data_1 + train_data_2)
print(len(all_words))
vocab = { j:i+1 for i, j in enumerate(all_words)}
vocab["unk"] = 0

數(shù)據(jù)預(yù)處理

做一些簡單的文本轉(zhuǎn)ID闷游,然后padding峻汉,之后方便喂給模型。

from keras.preprocessing.sequence import pad_sequences
import numpy as np
train_data[1] = train_data[1].apply(lambda x:[vocab.get(i,0) for i in x])
train_data[2] = train_data[2].apply(lambda x:[vocab.get(i,0) for i in x])
Sens_1 = pad_sequences(train_data[1],maxlen=100)
Sens_2 = pad_sequences(train_data[2],maxlen=100)
labels = np.array(train_data[3])
labels = labels.reshape(*labels.shape,1)

構(gòu)建模型

下面定義了一個(gè)構(gòu)建模型的function脐往。

def SiameseBiLSTM(vocab,max_length):
    K.clear_session()
    embedding = Embedding(input_dim = len(vocab),output_dim = 200, input_length=max_length)
    bilstm = Bidirectional(LSTM(128))

    sequence_input1 = Input(shape=(max_length,))
    embedded_sequences_1 = embedding(sequence_input1)
    x1 = bilstm(embedded_sequences_1)

    sequence_input2 = Input(shape=(max_length,))
    embedded_sequences_2 = embedding(sequence_input2)
    x2 = bilstm(embedded_sequences_2)

    merged = concatenate([x1, x2])
    merged = BatchNormalization()(merged)
    merged = Dropout(0.5)(merged)
    merged = Dense(100, activation="relu")(merged)
    merged = BatchNormalization()(merged)
    merged = Dropout(0.5)(merged)
    preds = Dense(1, activation='sigmoid')(merged)
    model = Model(inputs=[sequence_input1,sequence_input2], outputs=preds)
    model.compile(loss='binary_crossentropy', optimizer='adam')
    model.summary()
    return model

model = SiameseBiLSTM(vocab,100)

執(zhí)行上方代碼休吠,從Keras的模型架構(gòu)可視化輸出可以清楚的看到embedding_1和bidirectional_1這輛層會被兩個(gè)輸入共享。


keras模型可視化

其架構(gòu)示意圖如下业簿,兩個(gè)輸入通過BiLSTM編碼成兩個(gè)向量之后瘤礁,直接將他們拼接一下,喂給下游的全連結(jié)層去做相識度判斷梅尤。


Siamese BiLSTM Network

訓(xùn)練模型

model.fit([Sens_1,Sens_2],labels,batch_size=32,epochs=5,validation_split=0.2)

構(gòu)建完模型后柜思,將要判斷相似度的句子岩调,和標(biāo)簽喂給模型,定義好赡盘,batch_size,和訓(xùn)練輪數(shù)epoch誊辉,就讓它跑起來,其模型訓(xùn)練過程如下圖亡脑。


train

模型預(yù)測

model.predict([sen_pre_1,sen_pre_2])

通過上述代碼就可以進(jìn)行預(yù)測了,sen_pre_1和sen_pre_2是經(jīng)過數(shù)據(jù)預(yù)處理邀跃,padding后的100維向量霉咨,模型會輸出一個(gè)(0,1)之間的值拍屑,你可以定義一個(gè)閾值將這個(gè)值轉(zhuǎn)換為[0,1]標(biāo)簽途戒。

結(jié)語

至此,四大任務(wù)的自然語言處理(NLP)技術(shù)實(shí)戰(zhàn)全部完結(jié)僵驰。任務(wù)看起來都很有趣喷斋,keras用起來也簡單易上手,baseline的構(gòu)建也不是很難蒜茴。但是想要做好星爪,還有大量工作要做。
這四個(gè)任務(wù)粉私,還有很多可以優(yōu)化的地方顽腾,比如

  • 在輸入部分,我很少預(yù)訓(xùn)練詞向量(除了情感分析實(shí)戰(zhàn))诺核,對于模型的輸入我也是以字為單位抄肖,要知道中文以詞為單位時(shí)其表達(dá)才準(zhǔn)確;
  • 在模型上的使用窖杀,我基本上全用的LSTM或者GRU漓摩,沒有加任何attention,也沒使用更復(fù)雜的網(wǎng)絡(luò)入客;(需要扎實(shí)的領(lǐng)域知識和腦洞)
  • 模型訓(xùn)練部分管毙,超參數(shù)的調(diào)優(yōu)和模型的evaluation我基本上沒做。(極其耗時(shí)耗力)

四個(gè)任務(wù)的flow都不是特別完美痊项。筆者希望通過這個(gè)系列讓大家感受到深度學(xué)習(xí)做NLP的樂趣锅风。若想成為大神,從好奇鞍泉,喜愛開始皱埠,然后苦讀論文,多思考咖驮,勤做實(shí)驗(yàn)边器,多創(chuàng)新训枢,這個(gè)過程就很枯燥了,堅(jiān)持下去忘巧,才能有所建樹恒界。(后會有期)

參考:
https://github.com/amansrivastava17/lstm-siamese-text-similarity
http://www.reibang.com/p/92d7f6eaacf5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市砚嘴,隨后出現(xiàn)的幾起案子十酣,更是在濱河造成了極大的恐慌,老刑警劉巖际长,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耸采,死亡現(xiàn)場離奇詭異,居然都是意外死亡工育,警方通過查閱死者的電腦和手機(jī)虾宇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來如绸,“玉大人嘱朽,你說我怎么就攤上這事≌樱” “怎么了搪泳?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扼脐。 經(jīng)常有香客問我森书,道長,這世上最難降的妖魔是什么谎势? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任凛膏,我火速辦了婚禮,結(jié)果婚禮上脏榆,老公的妹妹穿的比我還像新娘猖毫。我一直安慰自己,他們只是感情好须喂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布吁断。 她就那樣靜靜地躺著,像睡著了一般坞生。 火紅的嫁衣襯著肌膚如雪仔役。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天是己,我揣著相機(jī)與錄音又兵,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沛厨,可吹牛的內(nèi)容都是我干的宙地。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逆皮,長吁一口氣:“原來是場噩夢啊……” “哼宅粥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起电谣,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秽梅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剿牺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體风纠,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年牢贸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐捧。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潜索,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出懂酱,到底是詐尸還是另有隱情竹习,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布列牺,位于F島的核電站整陌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞎领。R本人自食惡果不足惜泌辫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望九默。 院中可真熱鬧震放,春花似錦、人聲如沸驼修。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乙各。三九已至墨礁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耳峦,已是汗流浹背恩静。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹲坷,地道東北人蜕企。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓咬荷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轻掩。 傳聞我的和親對象是個(gè)殘疾皇子幸乒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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