“达观杯”文本智能处理挑战赛,季军带你飞
來自AI小白入門
前段時(shí)間和朋友何從慶(AI算法之心)等隊(duì)友一起組隊(duì)參加了這個(gè)比賽,本來以為小比賽人少,沒想到參加的人會(huì)有幾千人。最后我們隊(duì)伍取得季軍(4st/3131),雖有些許遺憾,但是也很榮幸認(rèn)識(shí)了更多的大佬。在此和隊(duì)友整理總結(jié)了一波,放出答辯PPT以及開源了部分代碼,希望對(duì)剛接觸這個(gè)領(lǐng)域的小白新手能有些幫助~~~
競賽背景
2018年人工智能的發(fā)展在運(yùn)算智能和感知智能已經(jīng)取得了很大的突破和優(yōu)于人類的表現(xiàn)。而在以理解人類語言為入口的認(rèn)知智能上,目前達(dá)觀數(shù)據(jù)自然語言處理技術(shù)已經(jīng)可以實(shí)現(xiàn)文檔自動(dòng)解析、關(guān)鍵信息提取、文本分類審核、文本智能糾錯(cuò)等一定基礎(chǔ)性的文字處理工作,并在各行各業(yè)得到充分應(yīng)用。
自然語言處理一直是人工智能領(lǐng)域的重要話題,而人類語言的復(fù)雜性也給 NLP 布下了重重困難等待解決。長文本的智能解析就是頗具挑戰(zhàn)性的任務(wù),如何從紛繁多變、信息量龐雜的冗長文本中獲取關(guān)鍵信息,一直是文本領(lǐng)域難題。隨著深度學(xué)習(xí)的熱潮來臨,有許多新方法來到了 NLP 領(lǐng)域,給相關(guān)任務(wù)帶來了更多優(yōu)秀成果,也給大家?guī)砹烁鄳?yīng)用和想象的空間。
此次比賽,達(dá)觀數(shù)據(jù)提供了一批長文本數(shù)據(jù)和分類信息,希望選手動(dòng)用自己的智慧,結(jié)合當(dāng)下最先進(jìn)的NLP和人工智能技術(shù),深入分析文本內(nèi)在結(jié)構(gòu)和語義信息,構(gòu)建文本分類模型,實(shí)現(xiàn)精準(zhǔn)分類。未來文本自動(dòng)化處理的技術(shù)突破和應(yīng)用落地需要人工智能從業(yè)者和愛好者的共同努力,相信文本智能處理技術(shù)因?yàn)槟愕乃惴?#xff0c;變得更加智能!
比賽網(wǎng)址
http://www.dcjingsai.com/common/cmpt/%E2%80%9C%E8%BE%BE%E8%A7%82%E6%9D%AF%E2%80%9D%E6%96%87%E6%9C%AC%E6%99%BA%E8%83%BD%E5%A4%84%E7%90%86%E6%8C%91%E6%88%98%E8%B5%9B_%E7%AB%9E%E8%B5%9B%E4%BF%A1%E6%81%AF.html
答辯PPT
詳細(xì)解決方案
對(duì)于這個(gè)比賽,我們嘗試了很多方法,最后我們發(fā)現(xiàn)了一些對(duì)解決這個(gè)賽題很不錯(cuò)的解決方案(當(dāng)然,對(duì)于其他任務(wù)也可以起到不錯(cuò)的效果)。總結(jié)如下:
通過對(duì)于詞向量做一個(gè)增強(qiáng),即利用word2vec與glove的差異性,構(gòu)建一個(gè)魯棒性更高的詞語向量表征。具體而言,我們對(duì)于每個(gè)詞通過word2vec以及glove分別訓(xùn)練出兩個(gè)200維度的詞量,兩種向量相結(jié)合,表征出更強(qiáng)的語義信息,從而得到一個(gè) 400維度的詞向量。大家也可以word2vec+glove+faxttext的組合,對(duì)于我來說,效果并不是很好,我覺得可能的原因是faxttext與word2vec的相似性很高,弱化了glove的向量表征,同時(shí),對(duì)于glove單獨(dú)的詞向量我也沒有嘗試過,大家也可以嘗試一下。
對(duì)于模型的話,選擇了一個(gè)比較簡單的模型,兩個(gè)雙向的GRU模型,然后分別平均池化和最大池化,最后接到FC層。
訓(xùn)練的方式:訓(xùn)練模型我們固定了100個(gè)epoch,然后使用早停的策略,根據(jù)驗(yàn)證集上的性能,選擇驗(yàn)證數(shù)據(jù)集上具有最佳準(zhǔn)確率分?jǐn)?shù)的模型作為最終模型,并評(píng)估其在測試數(shù)據(jù)集上的性能。
代碼如下
1. 導(dǎo)入各個(gè)算法庫,導(dǎo)入數(shù)據(jù)集,數(shù)據(jù)集路徑根據(jù)自己的路徑設(shè)置。
test=pd.read_csv("../input/test_set.csv")
2.?詞向量維度選取以及句子長度截?cái)嘁话惴椒ā?/span>
對(duì)于句子長度選擇:統(tǒng)計(jì)下每條句子的長度,一般可以看置信區(qū)間在90,95,98的句子長度,比如有三條句子,句子中分別有2000,1800,1900個(gè)詞。因此,基于此代碼np.percentile([2000,1800,1900],95),可以得到置信區(qū)間在95的句子長度為1990。
對(duì)于詞向量的維度:可以嘗試100,200,300等,對(duì)于不同的維度,測試模型的效果,從而選擇一個(gè)相對(duì)較好的維度。
tokenizer.fit_on_texts(list(df_train[col].values)+list(df_test[col].values))
train_?=?sequence.pad_sequences(tokenizer.texts_to_sequences(df_train[col].values),?maxlen=maxlen_)
test_?=?sequence.pad_sequences(tokenizer.texts_to_sequences(df_test[col].values),?maxlen=maxlen_)
word_index?=?tokenizer.word_index
#詞向量訓(xùn)練代碼可以在github上面查看,下面是生成詞向量嵌入矩陣
embedding_word2vec_matrix?=?np.zeros((len(word_index)?+?1,?victor_size))
for?word,?i?in?word_index.items():
????embedding_vector?=?model[word]?if?word?in?model?else?None
????if?embedding_vector?is?not?None:
????????count?+=?1
????????embedding_word2vec_matrix[i]?=?embedding_vector
????else:
????????unk_vec?=?np.random.random(victor_size)?*?0.5
????????unk_vec?=?unk_vec?-?unk_vec.mean()
????????embedding_word2vec_matrix[i]?=?unk_vec
3. 模型構(gòu)建
本次開源一個(gè)比較簡單的模型,利用雙層的BiGRU模型來學(xué)習(xí)文本的上下文表征,然后通過池化操作,分別提取每一個(gè)時(shí)間戳的最大池化和平均池化。最后通過FC層的訓(xùn)練,構(gòu)建文本分類模型,實(shí)現(xiàn)精準(zhǔn)分類。
????print("get_text_gru3")
????content?=?Input(shape=(sent_length,),?dtype='int32')
????embedding?=?Embedding(
????????name="word_embedding",
????????input_dim=embeddings_weight.shape[0],
????????weights=[embeddings_weight],
????????output_dim=embeddings_weight.shape[1],
????????trainable=False)
????????
????x?=?SpatialDropout1D(0.2)(embedding(content))
????x?=?Bidirectional(CuDNNGRU(200,?return_sequences=True))(x)
????x?=?Bidirectional(CuDNNGRU(200,?return_sequences=True))(x)
????avg_pool?=?GlobalAveragePooling1D()(x)
????max_pool?=?GlobalMaxPooling1D()(x)
????conc?=?concatenate([avg_pool,?max_pool])
????x?=?Dropout(0.2)(Activation(activation="relu")(BatchNormalization()(Dense(1000)(conc))))
????x?=?Activation(activation="relu")(BatchNormalization()(Dense(500)(x)))
????output?=?Dense(class_num,?activation="softmax")(x)
????model?=?Model(inputs=content,?outputs=output)
????model.compile(loss='categorical_crossentropy',?optimizer='adam',?metrics=['accuracy'])
????return?model
4. 模型訓(xùn)練
對(duì)于模型的訓(xùn)練,我們采用10折交叉進(jìn)行訓(xùn)練,為了減少時(shí)間,可以進(jìn)行5折交叉進(jìn)行訓(xùn)練。訓(xùn)練模型我們固定了100個(gè)epoch,然后使用早停的策略,根據(jù)驗(yàn)證集上的性能,選擇驗(yàn)證數(shù)據(jù)集上具有最佳準(zhǔn)確率分?jǐn)?shù)的模型作為最終模型,并評(píng)估其在測試數(shù)據(jù)集上的性能。
early_stopping?=?EarlyStopping(monitor='val_acc',?patience=6)
plateau?=?ReduceLROnPlateau(monitor="val_acc",?verbose=1,?mode='max',?factor=0.5,?patience=3)
checkpoint?=?ModelCheckpoint('../cache/model.hdf5',?monitor='val_acc',?verbose=2,?save_best_only=True,?mode='max',save_weights_only=True)
model.fit(X_train,?y_train,
??????????epochs=100,
??????????batch_size=args.batch_size,
??????????validation_data=(X_valid,?y_valid),
??????????callbacks=[early_stopping,?plateau,?checkpoint],
??????????verbose=2)
寫在后面
本項(xiàng)目主要利用“達(dá)觀杯”文本比賽的數(shù)據(jù),介紹了長文本分類問題的解決方法。我們通過利用兩層的BiGRU捕捉長文本的上下文信息,然后通過池化層捕捉最關(guān)鍵的文本特征,接著兩層的全連接層對(duì)文本的關(guān)鍵特征進(jìn)行訓(xùn)練,從而構(gòu)建文本分類模型,實(shí)現(xiàn)精準(zhǔn)分類。另外,我們通過10折交叉的方式,測試集線上的分?jǐn)?shù)可以達(dá)到0.798,僅僅這個(gè)單模型可以達(dá)到線上前10的效果(在線上賽時(shí))。另外,為了節(jié)省運(yùn)行時(shí)間,可以將10折交叉變成5折交叉,減少運(yùn)行時(shí)間。同時(shí),也可以將BiGRU減少一層。
完整可運(yùn)行代碼以及PPT可以在作者的github找到:
https://github.com/yuquanle/2018-daguan-competition-rank4
你點(diǎn)的每個(gè)贊,我都認(rèn)真當(dāng)成了喜歡
總結(jié)
以上是生活随笔為你收集整理的“达观杯”文本智能处理挑战赛,季军带你飞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的研究生这三年(含腾讯AI Lab实习
- 下一篇: 互联网黑话指南!