當前位置:
首頁 > 新聞 > 簡單易用NLP框架Flair發布新版本!(附教程)

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

機器之心編輯,參與:路。


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=" ", index = False, header = False)
data.iloc[int(len(data)*0.8):int(len(data)*0.9)].to_csv("test.csv", sep=" ", index = False, header = False)
data.iloc[int(len(data)*0.9):].to_csv("dev.csv", sep=" ", 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 中最有趣的概念之一,提供了將不同嵌入結合起來的方法。你可以使用傳統詞嵌入(如 GloVe、word2vec、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

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

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


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

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?
Geoff Hinton:我反對谷歌軍事項目,論文評審機制正在阻礙創新

TAG:機器之心 |