今天,給大家帶來幾種NLP基礎理論與方法,我們將使用實例+解決方法的方式為大家逐步講解。
實例說明1.nlp-getting-started 是kaggle入門機器學習競賽之一
(https://www.kaggle.com/c/nlp-getting-started)
對於希望開始使用自然語言處理的數據科學家而言,這一特殊挑戰是完美的。比賽數據集不是太大,即使你沒有太多的個人計算能力,則可以完成所有的工作。最好是有一臺Jupyter Notebook。感興趣的可以去官網自行嘗試。2.預測推特是否與自然災害相關,屬於文本分類(二分類)問題接下來我們將主要以這個實例為例,介紹NLP案例的基本解決方法。首先讓我們看看kaggle官方給的關於這個比賽的資料:
1.DATA
train.csv- 訓練集
test.csv- 測試集
sample_submission.csv- 格式正確的樣本提交文件
2.詳細描述
id- 每個推文的唯一標識符
text- 推文
location- 發送推文的位置(可以為空白)
keyword- 推文中的特定關鍵字(可以為空白)
target- 僅在train.csv中,這表示某條推文是否與真正的災難有關1(0)
3.目的 :預測哪些推文是關於真實災難的,哪些不是 預測給定的推文是否是一場真正的災難。如果是這樣,請預測一個1。如果不是,請預測0。數據 這是train當中的數據,test中和這個一樣。
俗話說,數據與特徵工程決定了模型的上限,改進算法只不過是逼近這個上限。所以我們先來分析分析這個比賽的數據吧。
據分析,訓練樣本當中真實較多,有4000多個,假的有3000多個。
字符數比較:
可以看出,兩者的分布似乎幾乎相同。推文中120到140個字符是最常見的。
下面,我們將使用多種方法來完成這次競賽!
1.特徵提取
TfidfVectorizer:在詞頻的基礎上使用文本頻率加權,基本思想是出現在眾多文本中的詞缺乏區分性 2.定義模型並進行訓練:LogisticRegression第二種:基於RNN/CNN的方法——詞嵌入將詞表示成高維向量的方法,基本思想是利用海量語料庫對詞進行特徵提取,使得相似的詞具有相似的向量表示解決具體任務時,可以從頭訓練詞嵌入,但是通常使用預訓練的詞嵌入
google: https://code.google.com/archive/p/word2vecglove: https://nlp.stanford.edu/projects/glovefasttext: https://fasttext.cc/docs/en/english-vectors.htmlkeras實現:
tf.keras.layers.Embedding
Input shape: 2D tensor with shape: (batch_size, input_length),每個單詞的index
Output shape: 3D tensor with shape: (batch_size, input_length, embeddi
ELMo:對相同的詞在不同的上下文中生成不同的詞向量處理文本數據(即單詞序列)的常用方法
基本思想是遍歷所有時刻(單詞序列),在每個時刻(單詞)考慮當前時刻(單詞)的輸入以及上一時刻(單詞)的輸出
LSTM:為了解決梯度消失導致的無法學習長期依賴的問題,LSTM在普通RNN的基礎上引入cell state存儲長期依賴信息,以遺忘門,輸入門,輸出門控制cell state
2.GRU:簡化版的LSTM,通常效果與LSTM相似,參數更少,不容易過擬合
實踐結果:
基於CNN的方法——CNN
1.通過一維卷積層能夠識別序列中的局部模式
2.keras卷積層實現:
tf.keras.layers.Conv1D
Input shape: 3D tensor with shape: (batch_size, input_length, embedding_size),每個單詞的向量表示,通常通過詞嵌入得到
Output shape: 3D tensor with shape: (batch_size, output_length, num_filters),每個部分的向量表示
3.keras池化層實現:
tf.keras.layers.GlobalMaxPool1D
tf.keras.layers.GlobalAveragePooling1D
Input shape: 3D tensor with shape: (batch_size
input_length, num_filters),每個部分的向量表示
Output shape: 3D tensor with shape: (batch_size,
num_filters),每個句子的向量表示
實踐結果:
第三種:基於transformer的方法google提供預訓練模型(可以看作transformer的encoder部分)解決具體任務時,首先需要需要根據bert的要求構造輸入,然後需要利用bert的輸出構造模型,最後進行訓練(fine tune)keras實現(transformer庫)transformer.TFBertModel
Input shape: 2D tensor with shape: (batch_size, input_length),每個單詞的index,以及相應的attention_mask和token_type_ids
Output shape: 3D tensor with shape: (batch_size,input_length, hidden_size),每個時刻的hidden
state以及2D tensor with shape: (batch_size, hidden_size),每個句子的向量表示,即第一個時刻的hidden state
GPU顯存消耗巨大,需要根據可用的計算資源設置
sequence_length和batch_size,另外可以考慮gradient accumulation
RoBERTa,DistilBERT,ALBERT:bert的優化版本(例如優化超參數,優化參數數量)
實踐結果:
最終結果對比:
本期分享結束,想了解更多更前沿的人工智慧比賽和算法,快關注我們吧!
關注公眾號:數競之家
學習更多kaggle+天池競賽方案,競賽算法
關注公眾號:北美科研之家
了解最新國內外留學科研信息