Flair:一個非常簡單的pytorch框架,用於最先進的NLP
為什麼這對NLP來說是個大新聞? Flair在解決NLP問題方面提供"最"先進的效能,例如命名實體識別(NER)、詞性標註(PoS)、詞義消歧和文字分類。這是一個建立在PyTorch之上的NLP框架。
本文介紹如何使用現有的文字分類器並使用Flair構建自定義文字分類器。
介紹
文字分類是一種有監督的機器學習方法,用於將句子或文字文件分類為一個或多個定義的類別。它是一種廣泛使用的自然語言處理任務,在垃圾郵件過濾、情感分析、新聞文章分類和許多其他業務相關問題中發揮著重要作用。
大多數現有技術方法依賴於稱為文字嵌入的技術。它將文字轉換為高維空間中的數字表示。它允許在這個高維空間中將文件、句子、單詞、字元(取決於我們使用的嵌入)表示為向量。
Flair為NLP帶來令人興奮的訊息的原因是因為Zalando Research最近發表的用於序列標記的文章字串嵌入包含了一種始終優於以前最先進解決方案的方法。它在Flair中得到了實現和完全支援,可以用來構建文字分類器。
1.做好準備
要安裝Flair,您將需要Python 3.6。如果你還沒有,這裡有一個如何做到這一點的指南。(https://realpython.com/installing-python/)然後,要安裝Flair,請執行:
這將安裝執行Flair所需的所有必需軟體包。它還將包括基於PyTorch的Flair。
2.使用預先訓練的分類模型
新版本0.4附帶兩個預先訓練的模型。在IMDB資料集上訓練的情緒分析模型和“攻擊性語言檢測”模型(目前僅支援德語)。
使用、下載和儲存模型已經整合到一個方法中,使得使用預訓練模型的整個過程非常簡單。
要使用情緒分析模型,只需執行:
首次執行時,Flair將下載情緒分析模型,預設情況下將其儲存到主目錄的.flair子資料夾中。這可能需要幾分鐘時間。
上面的程式碼首先載入所需的庫,然後將情緒分析模型載入到記憶體中(如果需要,首先下載它),然後在0到1的刻度範圍內預測句子“Flair is pretty neat!”的情緒分數。最後通過命令輸出:上面的句子是:[Positive(1.0)]。
現在,您可以將程式碼合併到REST API中,並提供與Google的Cloud Natural Language API的情緒分析相媲美的服務,這種分析在生產中用於大量請求時可能會非常昂貴。
3.訓練自定義文字分類器
要訓練自定義文字分類器,我們首先需要一個帶標籤的資料集。 Flair的分類資料集格式基於Facebook的FastText格式。格式要求在每行開頭定義一個或多個標籤,以字首label開頭。格式如下:
對於本文,我們將使用Kaggle的SMS垃圾郵件檢測資料集來使用Flair構建垃圾郵件/非垃圾郵件分類器。該資料集適合學習,因為它只包含5572行,並且足夠小,可以在幾分鐘內在CPU上訓練模型。
3.1預處理 - 構建資料集
我們首先從Kaggle上的這個連結下載資料集以獲取spam.csv。然後,在與我們的資料集相同的目錄中,執行下面的預處理片段,它將進行一些預處理並將我們的資料集拆分為train,dev和test set。
確保安裝了Pandas。如果沒有,請先執行pip install pandas。
這將從我們的資料集中刪除一些重複項,將其隨機化(隨機行)並使用80/10/10拆分,將資料拆分為train、dev和test sets。
如果執行成功,您將獲得以快速文字格式格式化的train.csv、test.csv和dev.csv,以便與Flair一起使用。
3.2訓練自定義文字分類模型
要訓練模型,請將此片段與生成的資料集放在同一目錄中。
首次執行此程式碼時,Flair將下載所有必須的嵌入模型,這可能需要幾分鐘時間。整個訓練過程將再花5分鐘。
此程式碼段首先將所需的庫和資料集載入到語料庫物件中。
接下來,我們建立一個嵌入列表(兩個Flair上下文sting嵌入和一個GloVe單詞嵌入)。然後將此列表用作文件嵌入物件的輸入。堆疊和文件嵌入是Flair最有趣的概念之一。它們提供了將不同嵌入組合在一起的方法。您可以將傳統的單詞嵌入(如GloVe,word2vec,ELMo)與Flair上下文sting嵌入一起使用。在上面的示例中,我們使用基於LSTM的方法來組合單詞和上下文sting嵌入以生成文件嵌入。
最後,該片段訓練模型,該模型生成final-model.pt和best-model.pt檔案,這些檔案代表我們儲存的經過訓練的模型。
3.3使用訓練模型進行預測
我們現在可以使用匯出的模型通過從同一目錄執行以下程式碼段來生成預測:
該程式碼片段輸出'[ham(1.0)]',意味著該模型100%確定我們的示例訊息不是垃圾郵件。
與其他框架相比,它的表現如何?
與Facebook的FastText甚至谷歌的AutoML自然語言平臺不同,使用Flair進行文字分類仍然是一項相對較低級別的任務。我們可以通過選擇設定引數來完全控制文字嵌入和訓練,例如學習速率、批量大小、退火因子,損失函式,優化器選擇......為了獲得最佳效能,需要調整這些超引數。 Flair為我們提供了一個眾所周知的超引數調優庫Hyperopt(在此描述)的包裝器,我們可以使用它來調整我們的超引數以獲得最佳效能。
在本文中,為簡單起見,我們使用預設的超引數。主要是預設引數,我們的Flair模型在20個epoch後獲得了0.973的f1分數。
為了比較,我們使用FastText和AutoML自然語言平臺訓練了文字分類模型。首先使用預設引數執行FastText並獲得0.883的f1分數,這意味著我們的模型大大優於FastText。然而,FastText僅需要幾秒鐘的時間來訓練,而我們的定製Flair模型需要5分鐘。
然後我們還將結果與在Google的AutoML自然語言平臺上獲得的結果進行了比較。該平臺首先需要20分鐘才能解析資料集。之後我們開始訓練過程,花了將近3個小時才完成(花費近10美元的免費積分),但獲得了99.211的f1分數,比我們定製的Flair模型略勝一籌。