“达观杯”文本智能处理挑战赛,季军带你飞
來自AI小白入門
前段時間和朋友何從慶(AI算法之心)等隊友一起組隊參加了這個比賽,本來以為小比賽人少,沒想到參加的人會有幾千人。最后我們隊伍取得季軍(4st/3131),雖有些許遺憾,但是也很榮幸認識了更多的大佬。在此和隊友整理總結了一波,放出答辯PPT以及開源了部分代碼,希望對剛接觸這個領域的小白新手能有些幫助~~~
競賽背景
2018年人工智能的發展在運算智能和感知智能已經取得了很大的突破和優于人類的表現。而在以理解人類語言為入口的認知智能上,目前達觀數據自然語言處理技術已經可以實現文檔自動解析、關鍵信息提取、文本分類審核、文本智能糾錯等一定基礎性的文字處理工作,并在各行各業得到充分應用。
自然語言處理一直是人工智能領域的重要話題,而人類語言的復雜性也給 NLP 布下了重重困難等待解決。長文本的智能解析就是頗具挑戰性的任務,如何從紛繁多變、信息量龐雜的冗長文本中獲取關鍵信息,一直是文本領域難題。隨著深度學習的熱潮來臨,有許多新方法來到了 NLP 領域,給相關任務帶來了更多優秀成果,也給大家帶來了更多應用和想象的空間。
此次比賽,達觀數據提供了一批長文本數據和分類信息,希望選手動用自己的智慧,結合當下最先進的NLP和人工智能技術,深入分析文本內在結構和語義信息,構建文本分類模型,實現精準分類。未來文本自動化處理的技術突破和應用落地需要人工智能從業者和愛好者的共同努力,相信文本智能處理技術因為你的算法,變得更加智能!
比賽網址
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
詳細解決方案
對于這個比賽,我們嘗試了很多方法,最后我們發現了一些對解決這個賽題很不錯的解決方案(當然,對于其他任務也可以起到不錯的效果)。總結如下:
通過對于詞向量做一個增強,即利用word2vec與glove的差異性,構建一個魯棒性更高的詞語向量表征。具體而言,我們對于每個詞通過word2vec以及glove分別訓練出兩個200維度的詞量,兩種向量相結合,表征出更強的語義信息,從而得到一個 400維度的詞向量。大家也可以word2vec+glove+faxttext的組合,對于我來說,效果并不是很好,我覺得可能的原因是faxttext與word2vec的相似性很高,弱化了glove的向量表征,同時,對于glove單獨的詞向量我也沒有嘗試過,大家也可以嘗試一下。
對于模型的話,選擇了一個比較簡單的模型,兩個雙向的GRU模型,然后分別平均池化和最大池化,最后接到FC層。
訓練的方式:訓練模型我們固定了100個epoch,然后使用早停的策略,根據驗證集上的性能,選擇驗證數據集上具有最佳準確率分數的模型作為最終模型,并評估其在測試數據集上的性能。
代碼如下
1. 導入各個算法庫,導入數據集,數據集路徑根據自己的路徑設置。
test=pd.read_csv("../input/test_set.csv")
2.?詞向量維度選取以及句子長度截斷一般方法。
對于句子長度選擇:統計下每條句子的長度,一般可以看置信區間在90,95,98的句子長度,比如有三條句子,句子中分別有2000,1800,1900個詞。因此,基于此代碼np.percentile([2000,1800,1900],95),可以得到置信區間在95的句子長度為1990。
對于詞向量的維度:可以嘗試100,200,300等,對于不同的維度,測試模型的效果,從而選擇一個相對較好的維度。
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
#詞向量訓練代碼可以在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. 模型構建
本次開源一個比較簡單的模型,利用雙層的BiGRU模型來學習文本的上下文表征,然后通過池化操作,分別提取每一個時間戳的最大池化和平均池化。最后通過FC層的訓練,構建文本分類模型,實現精準分類。
????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. 模型訓練
對于模型的訓練,我們采用10折交叉進行訓練,為了減少時間,可以進行5折交叉進行訓練。訓練模型我們固定了100個epoch,然后使用早停的策略,根據驗證集上的性能,選擇驗證數據集上具有最佳準確率分數的模型作為最終模型,并評估其在測試數據集上的性能。
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)
寫在后面
本項目主要利用“達觀杯”文本比賽的數據,介紹了長文本分類問題的解決方法。我們通過利用兩層的BiGRU捕捉長文本的上下文信息,然后通過池化層捕捉最關鍵的文本特征,接著兩層的全連接層對文本的關鍵特征進行訓練,從而構建文本分類模型,實現精準分類。另外,我們通過10折交叉的方式,測試集線上的分數可以達到0.798,僅僅這個單模型可以達到線上前10的效果(在線上賽時)。另外,為了節省運行時間,可以將10折交叉變成5折交叉,減少運行時間。同時,也可以將BiGRU減少一層。
完整可運行代碼以及PPT可以在作者的github找到:
https://github.com/yuquanle/2018-daguan-competition-rank4
你點的每個贊,我都認真當成了喜歡
總結
以上是生活随笔為你收集整理的“达观杯”文本智能处理挑战赛,季军带你飞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的研究生这三年(含腾讯AI Lab实习
- 下一篇: 李沐等将目标检测绝对精度提升 5%,不牺