當前位置:
首頁 > 科技 > fastText、TextCNN這有一套NLP文本分類方法庫

fastText、TextCNN這有一套NLP文本分類方法庫

GIF/1.7M

圖:pixabay

原文來源:GitHub

「機器人圈」編譯:嗯~阿童木呀、多啦A亮

這個庫的目的是探索用深度學習進行NLP文本分類的方法。

它具有文本分類的各種基準模型。

它還支持多標籤分類,其中多標籤與句子或文檔相關聯。

雖然這些模型很多都很簡單,可能不會讓你在這項文本分類任務中遊刃有餘,但是這些模型中的其中一些是非常經典的,因此它們可以說是非常適合作為基準模型的。

每個模型在模型類型下都有一個測試函數。

我們還探討了用兩個seq2seq模型(帶有注意的seq2seq模型,以及transformer:attention is all you need)進行文本分類。同時,這兩個模型也可以用於生成序列和其他任務。如果你的任務是多標籤分類,那麼你就可以將問題轉化為序列生成。

我們實現了一個記憶網路:循環實體網路(recurrent entity network):追蹤世界的狀態。它用鍵值對塊(blocks of key-value pairs)作為記憶,並行運行,從而獲得新的狀態。它可以用於使用上下文(或歷史)來回答建模問題。例如,你可以讓模型讀取一些句子(作為文本),並提出一個問題(作為查詢),然後請求模型預測答案;如果你像查詢一樣向其提供故事,那麼它就可以進行分類任務。

如果你想了解更多關於文本分類,或這些模型可以應用的任務的數據集詳細信息,可以點擊鏈接進行查詢,我們選擇了一個:https://biendata.com/competition/zhihu/

模型:

1.fastText

2.TextCNN

3.TextRNN

4.RCNN

5.分層注意網路(Hierarchical Attention Network)

6.具有注意的seq2seq模型(seq2seq with attention)

7.Transformer("Attend Is All You Need")

8.動態記憶網路(Dynamic Memory Network)

9.實體網路:追蹤世界的狀態

其他模型:

1.BiLstm Text Relation;

2.Two CNN Text Relation;

3.BiLstm Text Relation Two RNN

性能

(多標籤標籤預測任務,要求預測能夠達到前5,300萬訓練數據,滿分:0.5)

10.注意:「HierAtteNetwork」是指Hierarchical Attention Network

用途:

1.模型在xxx_model.py中

2.運行python xxx_train.py來訓練模型

3.運行python xxx_predict.py進行推理(測試)。

每個模型在模型下都有一個測試方法。你可以先運行測試方法來檢查模型是否能正常工作。

環境:

python 2.7+tensorflow 1.1

(tensorflow 1.2也是可以應用的;大多數模型也應該在其他tensorflow版本中正常應用,因為我們使用非常少的特徵來將其結合到某些版本中;如果你使用的是python 3.5,只要更改print / try catch函數的話,它也會運行得很好。)

註:

一些util函數是在data_util.py中的;典型輸入如:「x1 x2 x3 x4 x5 label 323434」,其中「x1,x2」是單詞,「323434」是標籤;它具有一個將預訓練的單詞載入和分配嵌入到模型的函數,其中單詞嵌入在word2vec或fastText中進行預先訓練。

模型細節:

1.快速文本(fast Text)

《用於高效文本分類的技巧》(Bag of Tricks for Efficient Text Classification)論文的實現(https://arxiv.org/abs/1607.01759)

1.使用bi-gram 或者tri-gram。

2.使用NCE損失,加速我們的softmax計算(不使用原始論文中的層次softmax)結果:性能與原始論文中的一樣好,速度也非常快。

查看:p5_fastTextB_model.py

2.文本卷積神經網路(Text CNN)

《卷積神經網路進行句子分類》(Convolutional Neural Networks for Sentence Classification)論文的實現

結構:降維---> conv ---> 最大池化 --->完全連接層--------> softmax

查看:p7_Text CNN_model.py

為了能夠使用TextCNN獲得非常好的結果,你還需要仔細閱讀此論文「用於句子分類的卷積神經網路靈敏度分析(和從業者指南)」(A Sensitivity Analysis of (and Practitioners" Guide to) Convolutional Neural Networks for Sentence Classification),它可以幫助你了解一些影響性能的相關見解。當然,你還需要根據具體任務來更改某些設置。

3.文本循環神經網路(Text RNN)

結構:降維--->雙向lstm ---> concat輸出--->平均 -----> softmax

查看:p8_Text RNN_model.py

4.雙向長短期記憶網路文本關係(BiLstm Text Relation)

結構與Text RNN相同。但輸入是被特別設計的。例如:輸入「這台電腦多少錢?筆記本電腦的股票價格(how much is the computer? EOS price of laptop)」。「EOS」是一個特殊的標記,將問題1和問題2分開。

查看:p9_BiLstm Text Relation_model.py

5.兩個卷積神經網路文本關係(two CNN Text Relation)

結構:首先用兩個不同的卷積來提取兩個句子的特徵,然後連接兩個功能,使用線性變換層將投影輸出到目標標籤上,然後使用softmax。

查看:p9_two CNN Text Relation_model.py

6.雙長短期記憶文本關係雙循環神經網路(BiLstm Text Relation Two RNN)

結構:一個句子的一個雙向lstm(得到輸出1),另一個句子的另一個雙向lstm(得到輸出2)。那麼:softmax(輸出1 M輸出2)

查看:p9_BiLstm Text Relation Two RNN_model.py

有關更多詳細信息,你可以訪問:《Deep Learning for Chatbots》的第2部分—在Tensorflow中實現一個基於檢索的模型(Implementing a Retrieval-Based Model in Tensorflow)

7.循環卷積神經網路(RCNN)

用於文本分類的循環卷積神經網路。

《用於文本分類的循環卷積神經網路》(Recurrent Convolutional Neural Network for Text Classification)論文的實現。

結構:1)循環結構(卷積層)2)最大池化3)完全連接層+ softmax

它用左側文本和右側文本學習句子或文檔中的每個單詞的表示:

表示當前單詞= [left_side_context_vector,current_word_embedding,right_side_context_vecotor]。

對於左側文本,它使用一個循環結構,前一個單詞的非線性轉換和左側上一個文本;類似於右側文本。

查看:p71_TextRCNN_model.py

8. 分層注意網路(Hierarchical Attention Network)

《用於文檔分類的分層注意網路》(Hierarchical Attention Networks for Document Classification)論文的實現。

結構:

1)降維

2.詞編碼器:詞級雙向GRU,以獲得豐富的辭彙表徵

3.次注意:詞級注意在句子中獲取重要信息

4.句子編碼器:句子級雙向GRU,以獲得豐富的句子表徵

5.句子注意:句級注意以獲得句子中的重點句子

6.FC + Softmax

數據輸入:

一般來說,這個模型的輸入應該是幾個句子,而不是一個句子。形式是:[None,sentence_lenght]。其中None意味著batch_size。

在我的訓練數據中,對於每個樣本來說,我有四個部分。每個部分具有相同的長度。我將四個部分形成一個單一的句子。該模型將句子分為四部分,形成一個形狀為:[None,num_sentence,sentence_length]的張量。其中num_sentence是句子的個數(在我的設置中,其值等於4)。

查看:p1_HierarchicalAttention_model.py

9. 具有注意的Seq2seq模型

具有注意的Seq2seq模型的實現是通過《共同學習排列和翻譯的神經機器翻譯》來實現的。

一、結構:

1)降維

2)bi-GRU也從源語句(向前和向後)獲取豐富的表示。

3)具有注意的解碼器。

二、數據輸入:

使用三種輸入中的兩種:

1)編碼器輸入,這是一個句子;

2)解碼器輸入,是固定長度的標籤列表;

3)目標標籤,它也是一個標籤列表。

例如,標籤是:「L1 L2 L3 L4」,則解碼器輸入將為:[_ GO,L1,L2,L2,L3,_PAD];目標標籤為:[L1,L2,L3,L3,_END,_PAD]。長度固定為6,任何超出標籤將被截斷,如果標籤不足以填補,將填充完整。

三、注意機制:

1.傳輸編碼器輸入列表和解碼器的隱藏狀態

2. 計算每個編碼器輸入隱藏狀態的相似度,以獲得每個編碼器輸入的可能性分布。

3. 基於可能性分布的編碼器輸入的加權和。

通過RNN Cell使用這個權重和解碼器輸入以獲得新的隱藏狀態

四、Vanilla E編碼解碼工作原理:

在解碼器中,源語句將使用RNN作為固定大小向量(「思想向量」)進行編碼:

當訓練時,將使用另一個RNN嘗試通過使用這個「思想向量」作為初始化狀態獲取一個單詞,並從每個時間戳的解碼器輸入獲取輸入。解碼器從特殊指令「_GO」開始。在執行一步之後,新的隱藏狀態將與新輸入一起獲得,我們可以繼續此過程,直到我們達到特殊指令「_END」。我們可以通過計算對數和目標標籤的交叉熵損失來計算損失。logits是通過隱藏狀態的投影層(對於解碼器步驟的輸出,在GRU中,我們可以僅使用來自解碼器的隱藏狀態作為輸出)。

當測試時,沒有標籤。所以我們應該提供我們從以前的時間戳獲得的輸出,並繼續進程直到我們到達「_END」指令。

五、注意事項:

這裡我使用兩種辭彙。 一個是由編碼器使用的單詞; 另一個是用於解碼器的標籤。

對於辭彙表,插入三個特殊指令:「_ GO」,「_ END」,「_ PAD」; 「_UNK」不被使用,因為所有標籤都是預先定義的。

10. Transformer(「Attention Is All You Need」)

狀態:完成主要部分,能夠在任務中產生序列的相反順序。你可以通過在模型中運行測試功能來檢查它。然而,我還沒有在實際任務中獲得有用的結果。我們在模型中也使用並行的style.layer規範化、殘餘連接和掩碼。

對於每個構建塊,我們在下面的每個文件中包含測試函數,我們已經成功測試了每個小塊。

帶注意的序列到序列是解決序列生成問題的典型模型,如翻譯、對話系統。大多數時候,它使用RNN完成這些任務。直到最近,人們也應用卷積神經網路進行序列順序問題。但是,Transformer,它僅僅依靠注意機制執行這些任務,是快速的、實現新的最先進的結果。

它還有兩個主要部分:編碼器和解碼器。看以下文章:

編碼器:

共6層,每個層都有兩個子層。第一是多向自我注意機制;第二個是位置的全連接前饋網路。對於每個子層使用LayerNorm(x + Sublayer(x)),維度= 512。

解碼器:

1.解碼器由N = 6個相同層的堆疊組成。

2.除了每個編碼器層中的兩個子層之外,解碼器插入第三子層,其在編碼器堆棧的輸出上執行多向注意。

3.與編碼器類似,我們採用圍繞每個子層的殘餘連接,然後進行層歸一化。我們還修改解碼器堆棧中的自我注意子層,以防止位置參與到後續位置。這種掩蔽與輸出嵌入偏移一個位置的事實相結合確保了位置i的預測只能取決於位於小於i的位置的已知輸出。

主要從這個模型中脫穎而出:

1.多向自我注意:使用自我注意,線性變換多次獲取關鍵值的投影,然後開始注意機制

2.一些提高性能的技巧(剩餘連接、位置編碼、前饋、標籤平滑、掩碼以忽略我們想忽略的事情)。

有關模型的詳細信息,請查看:a2_transformer.py

11.循環實體網路(Recurrent Entity Network)

輸入:

1.故事:它是多句話,作為上下文。

2.問題:一個句子,這是一個問題。

3. 回答:一個單一的標籤。

型號結構:

1.輸入編碼:使用一個詞來編碼故事(上下文)和查詢(問題);通過使用位置掩碼將位置考慮在內。

通過使用雙向rnn編碼故事和查詢,性能從0.392提高到0.398,增長了1.5%。

2.動態記憶:

a. 通過使用鍵的「相似性」,輸入故事的值來計算門控。

b. 通過轉換每個鍵,值和輸入來獲取候選隱藏狀態。

c. 組合門和候選隱藏狀態來更新當前的隱藏狀態。

3. 輸出(使用注意機制):

a. 通過計算查詢和隱藏狀態的「相似性」來獲得可能性分布。

b. 使用可能性分布獲得隱藏狀態的加權和。

c. 查詢和隱藏狀態的非線性變換獲得預測標籤。

這個模型的關鍵點:

1.使用彼此獨立的鍵和值塊,可以並行運行。

2.上下文和問題一起建模。使用記憶來追蹤世界的狀態,並使用隱性狀態和問題(查詢)的非線性變換進行預測。

3.簡單的型號也可以實現非常好的性能。簡單的編碼作為詞的使用包。

有關模型的詳細信息,請查看:a3_entity_network.py

在這個模型下,它包含一個測試函數,它要求這個模型計算故事(上下文)和查詢(問題)的數字,但故事的權重小於查詢。

12.動態記憶網路

模塊:Outlook

1.輸入模塊:將原始文本編碼為向量表示。

2.問題模塊:將問題編碼為向量表示。

3.獨特的記憶模塊:通過輸入,通過注意機制選擇哪些部分輸入、將問題和以前的記憶考慮在內====>它將產生「記憶」向量。

4.答案模塊:從最終的記憶向量生成答案。

詳情:

1.輸入模塊:

一個句子:使用gru獲取隱藏狀態b.list的句子:使用gru獲取每個句子的隱藏狀態。例如 [隱藏狀態1,隱藏狀態2,隱藏狀態...,隱藏狀態n]。

2.問題模塊:使用gru獲取隱藏狀態。

3.記憶模塊:

使用注意機制和循環網路來更新其記憶。

a.需要多集===>傳遞推理。

e.g. ask where is the football? it will attend to sentence of "john put down the football"), then in second pass, it need to attend location of john.

b.注意機制:

two-layer feed forward nueral network.input is candidate fact c,previous memory m and question q. feature get by take: element-wise,matmul and absolute distance of q with c, and q with m.

c.記憶更新機制:h = f(c,h_previous,g)。 最後一個隱藏狀態是應答模塊的輸入。

4. 答案模塊

要做的事情:

1.文本分類的字元級卷積網路

2.文本分類的卷積神經網路:淺詞級與深字元級

3.文本分類的深度卷積網路

4.半監督文本分類的對抗訓練方法

參考:

1. 《用於高效文本分類的技巧》Bag of Tricks for Efficient Text Classification

2.《語音分類的卷積神經網路》Convolutional Neural Networks for Sentence Classification

3.《卷積神經網路對句子分類的敏感性分析(和使用指南)》A Sensitivity Analysis of (and Practitioners" Guide to) Convolutional Neural Networks for Sentence Classification

5.《文本分類的複雜卷積神經網路》Recurrent Convolutional Neural Network for Text Classification

6.《文檔分類的分層注意網路》Hierarchical Attention Networks for Document Classification

7. 《共同學習對齊排列和翻譯的神經機器翻譯》Neural Machine Translation by Jointly Learning to Align and Translate

8. Attention Is All You Need

9. 《問我任何事情:自然語言處理的動態記憶網路》Ask Me Anything:Dynamic Memory Networks for Natural Language Processing

10.《用循環實體網路跟蹤世界的狀況》Tracking the state of world with recurrent entity networks


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

2017中國增材製造大會暨展覽會在杭州開幕
突破機器學習計算瓶頸,看神經元硬體如何提高神經網路魯棒性!
那個懟小扎的「鋼鐵俠」,到底懂不懂AI?
人工神經網路如何模擬人類大腦?實例分析ANN到底如何應用?
全新強化學習演算法詳解,看貝葉斯神經網路如何進行策略搜索

TAG:機器人圈 |

您可能感興趣

jQuery UI API 類別-方法重載(Method Overrides)
jQuery UI API 類別-方法(Methods)
CodeWarrior IDE使用Tips-使用burner將elf文件轉換生成HEX和BIN文件的方法和步驟詳解
受AlphaGo啟發,AI重建量子系統新方法登上Nature Physics
Unit 5 Geophysical Methods of Exploration 地球物理勘探方法
jQuery UI 小部件(Widget)方法調用
絕地求生大逃殺BattlEye Launcher 998解決方法
JSON編程的parse() 方法
PhotoShop做一個福字,PS做福字的方法
撲朔迷離的黑色版本OFF-WHITE x Nike Air Force 1迎來官方發售!入手方法告訴你!
DeepMind於Nature子刊發文提出非對稱博弈的降維方法
python開發利器,python shell和vim中都需要的tab補全方法
Whelen案例,六西格瑪設計DMADV方法
教程 | 5種快速易用的Python Matplotlib數據可視化方法
PPT/Word/Excel 協同使用,相互轉換的方法其實非常簡單!
Acta Neuropathol Commun:科學家們開發出診斷神經退行性疾病的新方法
iPhone X 添加Hoem鍵方法簡單方便!
4 種方法識別Linux系統 USB 設備
iPhone iOS 9系統源碼已被泄露至GitHub 越獄者或可找到新方法
解決Electra越獄顯示Error:topanga錯誤的方法!