初學者|還沒聽過flair嗎

  • 2019 年 10 月 10 日
  • 筆記

本文介紹了flair的使用方法,Flair是最近開源的一個基於Pytorch的NLP框架,它是一個功能強大的NLP庫。Flair允許您將最先進的自然語言處理(NLP)模型應用於文本,例如命名實體識別(NER),詞性標註(PoS),意義消歧和分類。

簡介

Flair是最近開源的一個基於Pytorch的NLP框架,據官方github介紹,它具有以下特點:

一個功能強大的NLP庫。Flair允許您將最先進的自然語言處理(NLP)模型應用於您的文本,例如命名實體識別(NER),詞性標註(PoS),意義消歧和分類。

文本嵌入庫。Flair具有簡單的界面,允許您使用和組合不同的單詞和文檔嵌入,包括作者提出的上下文字符串嵌入(文章:COLING2018-Contextual String Embeddings for Sequence Labeling)。

Pytorch NLP框架。框架直接在Pytorch上構建,使得可以輕鬆地訓練自己的模型,並使用Flair嵌入和類來嘗試新方法。

GitHub地址:https://github.com/zalandoresearch/flair

實戰

1.安裝

# 安裝環境:官網說目前對linux支持較好,以下為我在winodw上測試環境  # windows 10  # PyTorch 0.4+  # Python 3.6+  # pip install flair

這個庫包含兩種類型:SentenceToken, Sentence類型包含我們想要處理的一個句,是Token類型的集合:

from flair.data import Sentence  sentence = Sentence('The grass is green .')  # 輸出顯示這個句子由5個Token組成  print(sentence)    Sentence: "The grass is green ." - 5 Tokens

可以通過Token ID或其索引訪問句子的Token:

# 使用 token id  print(sentence.get_token(4))  # 使用索引  print(sentence[3])    Token: 4 green  Token: 4 green    # 迭代輸出token  for token in sentence:   print(token)    Token: 1 The  Token: 2 grass  Token: 3 is  Token: 4 green  Token: 5 .

Tokenization:一些情況下,文本未Tokenization

from flair.data import Sentence  # 設置use_tokenizer參數  sentence = Sentence('The grass is green.', use_tokenizer=True)  print(sentence)    Sentence: "The grass is green ." - 5 Tokens

Adding Tags to Tokens(為token打標籤)

# token具有用於語言注釋的字段,如lemmas、詞性標記或命名實體標記。可以通過指定標籤類型和標籤值來添加標籤。  # 給句子中某個詞加標籤  sentence[3].add_tag('ner', 'color')  # 可以看到,輸出green後面帶有命名實體標籤'color'  print(sentence.to_tagged_string())    The grass is green <color> .

Adding Labels to Sentences(給句子打標籤)

# 句子可以具有一個或多個標籤,例如,這些標籤可用於文本分類任務。  sentence = Sentence('France is the current world cup winner.')  # 給句子增加一個sports標籤  sentence.add_label('sports')  print(sentence.labels)    [sports (1.0)]    # 給句子增加多個標籤  sentence = Sentence('France is the current world cup winner.')  sentence.add_labels(['sports', 'world cup'])  print(sentence.labels)    [sports (1.0), world cup (1.0)]

2.使用詞向量教程

# Flair提供了很多Class,可以通過很多方法獲得詞/句子嵌入。詞嵌入類都繼承自TokenEmbeddings類,並實現embed()方法,您需要調用該方法來嵌入文本。  # 生成的所有嵌入都是Pytorch向量,因此它們可以立即用於訓練和微調。  # 經典的詞嵌入是靜態的和單詞級的,這意味着每個不同的單詞只能獲得一個預先計算的嵌入。大多數詞嵌入都屬於這一類,包括流行的GloVe或Komnios嵌入。  # 上下文字符嵌入是一類強大的詞嵌入,能夠更好的捕獲潛在的語法語義信息。  # Stacked Embeddings(堆疊嵌入)是此庫中最重要的概念之一。您可以使用它們將不同的嵌入組合在一起。

Classic Word Embeddings

from flair.embeddings import WordEmbeddings  # c:usersyuquanleanaconda3envspython36libsite-packagesgensimutils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warnings.warn("detected Windows; aliasing chunkize to chunkize_serial")  # 載入glove詞向量,需要下載預訓練模型(我網速太差好久沒下載下來)  # glove_embedding = WordEmbeddings('glove')  # 轉換在Glove官網下載的詞向量  # 看這裡:https://github.com/zalandoresearch/flair/issues/4  import gensim  vectors = gensim.models.KeyedVectors.load_word2vec_format('wiki-news-300d-1M.vec', binary=False)  vectors.save('fasttext_gensim')  # 載入轉換後的glove詞向量  embeddings = WordEmbeddings('fasttext_gensim')  from flair.data import Sentence  sentence = Sentence('the grass is green .')  for token in sentence:   print(token)   print(token.embedding)  # c:usersyuquanleanaconda3envspython36libsite-packagesgensimutils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warnings.warn("detected Windows; aliasing chunkize to chunkize_serial")

Contextual String Embeddings

from flair.embeddings import CharLMEmbeddings  charlm_embedding_forward = CharLMEmbeddings('news-forward-fast')  sentence = Sentence('The grass is green .')  # charlm_embedding_forward.embed(sentence)  for token in sentence:   print(token)   print(token.embedding)    Token: 1 The  tensor([ 0.0021, -0.0000, -0.0057, ..., -0.0000, -0.0001, 0.0163])  Token: 2 grass  tensor([-0.0009, -0.0000, 0.0248, ..., -0.0000, 0.0006, 0.0057])  Token: 3 is  tensor([ 0.0018, -0.0002, 0.0298, ..., -0.0000, 0.0000, 0.0003])  Token: 4 green  tensor([-0.0004, -0.0000, 0.0046, ..., -0.0000, -0.0001, 0.0345])  Token: 5 .  tensor([ 0.0008, -0.0000, 0.0050, ..., -0.0000, -0.0000, 0.0021])

Character Embeddings

from flair.embeddings import CharacterEmbeddings  embedding = CharacterEmbeddings()  sentence = Sentence('The grass is green .')  for token in sentence:   print(token)   print(token.embedding)

Stacked Embeddings

from flair.embeddings import WordEmbeddings, CharLMEmbeddings  # c:usersyuquanleanaconda3envspython36libsite-packagesgensimutils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warnings.warn("detected Windows; aliasing chunkize to chunkize_serial")  # init GloVe embedding  glove_embedding = WordEmbeddings('fasttext_gensim')  # init CharLM embeddings  charlm_embedding_forward = CharLMEmbeddings('news-forward')  #charlm_embedding_backward = CharLMEmbeddings('news-backward')  from flair.embeddings import StackedEmbeddings  stacked_embeddings = StackedEmbeddings(   embeddings=[glove_embedding, charlm_embedding_forward])  for token in sentence:   print(token)   print(token.embedding)

flair工具是非常強大的,如果想更多的了解用法,github上有更多的教程,包括:

代碼已上傳:1.https://github.com/yuquanle/StudyForNLP/blob/master/NLPtools/FlairDemo1.ipynb

2.https://github.com/yuquanle/StudyForNLP/blob/master/NLPtools/FlairDemo3.ipynb

The End