簡單易用NLP框架Flair釋出新版本!(附教程)

路雪發表於2018-12-27

Flair 是 Zalando Research 開發的一款簡單易用的 Python NLP 庫,近日,Flair 0.4 版釋出!

Flair 具備以下特徵:

  • 強大的 NLP 庫。Flair 允許將當前最優自然語言處理(NLP)模型應用於文字,如命名實體識別(NER)、詞性標註(PoS)、詞義消歧和分類。

  • 多語言。在 Flair 社群的支援下,該框架支援的語言種類快速增長。目前,Flair 還包括「one model, many languages」tagger,即一個模型可以預測不同語言輸入文字的 PoS 或 NER 標記。

  • 文字嵌入庫。Flair 的介面簡單,允許使用者使用和結合不同的詞嵌入和文件嵌入,包括 Flair 嵌入、BERT 嵌入和 ELMo 嵌入。

  • 基於 Pytorch 的 NLP 框架。該框架直接在 Pytorch 之上構建,方便使用者訓練自己的模型,以及使用 Flair 嵌入與類試驗新方法。

Flair 0.4 版本整合了更多新模型、大量新語言、實驗性多語言模型超引數選擇方法、BERT 嵌入和 ELMo 嵌入等。

  • GitHub 連結:https://github.com/zalandoresearch/flair

  • Flair 0.4 版本功能簡介:https://github.com/zalandoresearch/flair/releases

Flair 與其他最優方法的對比

Flair 在多項 NLP 任務上優於之前的最優方法:

簡單易用NLP框架Flair釋出新版本!(附教程)

近日,機器學習工程師 Tadej Magajna 撰文介紹了他使用 Flair 進行文字分類的過程,我們一起來看一下。

簡單易用NLP框架Flair釋出新版本!(附教程)

文字分類是將句子或文字文件分類為一或多個預定義類別的監督式機器學習方法。它是一種廣泛使用的自然語言處理任務,在垃圾郵件過濾、情感分析、新聞篇章分類等問題中發揮重要作用。

目前主要的最優方法主要依賴於文字嵌入。它將文字轉換成高維空間中的數值表徵,允許文件、句子、單詞、字元表示為該高維空間中的向量。

Zalando Research 近期發表的論文《Contextual String Embeddings for Sequence Labeling》提出了一種新方法,它持續優於之前的最優方法。這種方法基於 Flair 實現,並得到 Flair 的全力支援,該方法可用於構建文字分類器。

1. 準備

要安裝 Flair,你需要先安裝 Python 3.6。Python 3.6 安裝指南:https://realpython.com/installing-python/

然後,執行以下命令安裝 Flair:

pip install flair

這樣就可以安裝執行 Flair 所需全部包,包括 PyTorch。

2. 使用預訓練分類模型

新發布的 Flair 0.4 版本包括兩個預訓練模型。一個是在 IMDB 資料集上訓練的情感分析模型,另一個是「惡意語言檢測」模型(目前僅支援德語)。

使用、下載和儲存模型已被整合到一個方法中,這樣使用預訓練模型的過程更加直接便捷。

要使用情感分析模型,只需執行以下程式碼:

from flair.models import TextClassifier
from flair.data import Sentence
classifier = TextClassifier.load('en-sentiment')
sentence = Sentence('Flair is pretty neat!')
classifier.predict(sentence)
# print sentence with predicted labels
print('Sentence above is: ', sentence.labels)

第一次執行上述程式碼時,Flair 會下載該情感分析模型,並預設將其儲存到主目錄的.flair 子資料夾。該過程需要幾分鐘時間。

上述程式碼首先載入所需庫,然後將情感分析模型載入到記憶體中,接下來在 0 到 1 的分數區間中預測句子「Flair is pretty neat!」的情感分數。最後的命令輸出是:The sentence above is: [Positive (1.0)]。

現在你可以將程式碼整合到 REST api 中,這樣就可以提供可與谷歌的 Cloud Natural Language API 情感分析相媲美的服務,而後者在應用於大量請求的生產過程中時較為昂貴。

3. 訓練自定義文字分類

要訓練自定義文字分類器,我們首先需要一個標註資料集。Flair 的分類資料集格式基於 Facebook 的 FastText 格式。該格式需要在每一行的開頭用字首 __label__ 定義一或多個標籤。格式如下所示:

__label__<class_1> <text>
__label__<class_2> <text>

本文將基於 Kaggle 的 SMS Spam Detection 資料集用 Flair 構建垃圾郵件分類器。該資料集適合學習,因為它只包含 5572 行,足夠小,可以在 CPU 上幾分鐘內完成模型訓練。

該資料集中的 SMS 資訊被標註為垃圾(spam)或非垃圾(ham)。

3.1 預處理:構建資料集

首先下載資料集,以獲取 spam.csv。然後,在資料集所在目錄中執行以下預處理程式碼段,將資料集分割成訓練集、開發集和測試集。

確保你的計算機上安裝了 Pandas。如果沒有安裝,先執行 pip install pandas。

import pandas as pd
data = pd.read_csv("./spam.csv", encoding='latin-1').sample(frac=1).drop_duplicates()
data = data[['v1', 'v2']].rename(columns={"v1":"label", "v2":"text"})

data['label'] = '__label__' + data['label'].astype(str)

data.iloc[0:int(len(data)*0.8)].to_csv('train.csv', sep='\t', index = False, header = False)
data.iloc[int(len(data)*0.8):int(len(data)*0.9)].to_csv('test.csv', sep='\t', index = False, header = False)
data.iloc[int(len(data)*0.9):].to_csv('dev.csv', sep='\t', index = False, header = False);

這樣可以移除資料集中的重複項,打亂(shuffle)資料集,按 80/10/10 將資料分割成訓練集、開發集和測試集。

執行成功,你會看到 FastText 格式的 train.csv、test.csv 和 dev.csv,可以直接用於 Flair。

3.2 訓練自定義文字分類模型

在生成資料集的目錄中執行以下程式碼:

from flair.data_fetcher import NLPTaskDataFetcher
from flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentLSTMEmbeddings
from flair.models import TextClassifier
from flair.trainers import ModelTrainer
from pathlib import Path

corpus = NLPTaskDataFetcher.load_classification_corpus(Path('./'), test_file='train.csv', dev_file='dev.csv', train_file='test.csv')
word_embeddings = [WordEmbeddings('glove'), FlairEmbeddings('news-forward-fast'), FlairEmbeddings('news-backward-fast')]
document_embeddings = DocumentLSTMEmbeddings(word_embeddings, hidden_size=512, reproject_words=True, reproject_words_dimension=256)

classifier = TextClassifier(document_embeddings, label_dictionary=corpus.make_label_dictionary(), multi_label=False)
trainer = ModelTrainer(classifier, corpus)
trainer.train('./', max_epochs=20)

首次執行上述程式碼時,Flair 將下載所需的全部嵌入模型,這需要幾分鐘時間。接下來的整個訓練過程需要 5 分鐘時間。

該程式碼段先將所需的庫和資料集載入到 corpus 物件中。

接下來,我們建立嵌入列表(兩個 Flair contextual string 嵌入和一個 GloVe 詞嵌入)。然後將該嵌入列表作為文件嵌入物件的輸入。堆疊和文件嵌入(stacked and document embedding)是 Flair 中最有趣的概念之一,提供了將不同嵌入結合起來的方法。你可以使用傳統詞嵌入(如 GloVeword2vec、ELMo)和 Flair contextual string 嵌入。上述例子使用基於 LSTM 的方法結合詞嵌入和 contextual string 嵌入,以生成文件嵌入。

詳見:https://github.com/zalandoresearch/flair/blob/master/resources/docs/TUTORIAL_5_DOCUMENT_EMBEDDINGS.md

最後,上述程式碼訓練模型輸出 final-model.pt 和 best-model.pt 檔案,表示儲存的訓練好的模型。

3.3 使用訓練好的模型進行預測

在相同目錄中執行以下程式碼,使用匯出的模型生成預測結果:

from flair.models import TextClassifier
from flair.data import Sentence

classifier = TextClassifier.load_from_file('./best-model.pt')
sentence = Sentence('Hi. Yes mum, I will...')
classifier.predict(sentence)
print(sentence.labels)

輸出結果是 [ham (1.0)],表示該模型 100% 確定示例資訊並非垃圾訊息。

參考連結:https://towardsdatascience.com/text-classification-with-state-of-the-art-nlp-library-flair-b541d7add21f

相關文章