📜  FLAIR – NLP 框架

📅  最后修改于: 2022-05-13 01:55:45.916000             🧑  作者: Mango

FLAIR – NLP 框架

什么是天赋?

它是最先进的 NLP 的简单框架。这是一个非常强大的库,由 Zalando Research 开发。 Flair 框架建立在PyTorch 之上。

Flair 有哪些可用功能?

  1. Flair 支持许多用于执行 NLP 任务的词嵌入,例如 FastText、ELMo、GloVe、BERT 及其变体、XLM 和字节对嵌入,包括 Flair 嵌入。
  2. Flair Embedding 基于用于序列标签上下文字符串嵌入的概念。
  3. 使用 Flair,您还可以将不同的词嵌入组合在一起以获得更好的结果。
  4. Flair 支持多种语言。

上下文字符串嵌入:

在这个词嵌入中,词中的每个字母都被发送到字符语言模型,然后从前向和后向 LSTM 中取出输入表示。

词“Washington”的输入表示是根据词“Washington”之前的上下文来考虑的。获取每个单词的第一个和最后一个字符状态以生成词嵌入。

您可以看到,对于“Washington”这个词,红色标记是前向 LSTM 输出,蓝色标记是后向 LSTM 输出。连接前向和后向上下文以获得单词“Washington”的输入表示。

获得输入表示后,它被馈送到前向和后向 LSTM 以获得您正在处理的特定任务。在提到的图表中,我们试图获得 NER。

Flair的安装:

您应该安装了PyTorch >=1.1Python >=3.6 。要在 anaconda 上安装 PyTorch,请运行以下命令-

conda install -c pytorch pytorch

要安装天赋,请运行 -

pip install flair

工作天赋

1) 天赋数据类型:

Flair 提供两种类型的对象。他们是:

  1. 句子
  2. 代币

要获取句子中的标记数:

Python3
import flair
from flair.data import Sentence
  
# take a sentence
s= Sentence('GeeksforGeeks is Awesome.')
print(s)


Python3
import flair
from flair.data import Sentence
from flair.models import SequenceTagger
  
# input a sentence
s = Sentence('GeeksforGeeks is Awesome.')
  
# loading NER tagger
tagger_NER= SequenceTagger.load('ner')
  
# run NER over sentence
tagger_NER.predict(s)
print(s)
print('The following NER tags are found:\n')
  
# iterate and print
for entity in s.get_spans('ner'):
    print(entity)


Python3
import flair
from flair.data import Sentence
from flair.embeddings import WordEmbeddings
  
# using glove embedding
GloVe_embedding = WordEmbeddings('glove')
  
# input a  sentence
s = Sentence('Geeks for Geeks helps me study.')
  
# embed the sentence
GloVe_embedding.embed(s)
  
# print the embedded tokens
for token in s:
    print(token)
    print(token.embedding)


Python3
import flair
from flair.data import Sentence
from flair.embeddings import FlairEmbeddings
  
# using forward flair embeddingembedding
forward_flair_embedding= FlairEmbeddings('news-forward-fast')
  
# input the sentence
s = Sentence('Geeks for Geeks helps me study.')
  
# embed words in the input sentence
forward_flair_embedding.embed(s)
  
# print the embedded tokens
for token in s:
    print(token)
    print(token.embedding)


Python3
import flair
from flair.data import Sentence
from flair.embeddings import FlairEmbeddings, WordEmbeddings
from flair.embeddings import StackedEmbeddings
# flair embeddings
forward_flair_embedding= FlairEmbeddings('news-forward-fast')
backward_flair_embedding= FlairEmbeddings('news-backward-fast')
  
# glove embedding
GloVe_embedding = WordEmbeddings('glove')
  
# create a object which combines the two embeddings
stacked_embeddings = StackedEmbeddings([forward_flair_embedding,
                                        backward_flair_embedding,
                                        GloVe_embedding,])
  
# input the sentence
s = Sentence('Geeks for Geeks helps me study.')
                                          
# embed the input sentence with the stacked embedding
stacked_embeddings.embed(s)
  
# print the embedded tokens
for token in s:
    print(token)
    print(token.embedding)


Python3
import flair
from flair.data import Sentence
from flair.embeddings import WordEmbeddings, DocumentPoolEmbeddings
  
# init the glove word embedding
GloVe_embedding = WordEmbeddings('glove')
  
# init the document embedding
doc_embeddings = DocumentPoolEmbeddings([GloVe_embedding])
  
# input the sentence
s = Sentence('Geeks for Geeks helps me study.')
                                          
#embed the input sentence with the document embedding
doc_embeddings.embed(s)
  
# print the embedded tokens
print(s.embedding)


Python3
from flair.data import Corpus
from flair.datasets import TREC_6
from flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentRNNEmbeddings
from flair.models import TextClassifier
from flair.trainers import ModelTrainer
  
# load the corpus
corpus = TREC_6()
  
# create a label dictionary
label_Dictionary = corpus.make_label_dictionary()
  
# list of word embeddings to be used
word_embeddings = [WordEmbeddings('glove'),FlairEmbeddings('news-forward-fast')]
  
# init document embeddings and pass the word embeddings list
doc_embeddings = DocumentRNNEmbeddings(word_embeddings,hidden_size = 250)
  
# creating the text classifier
text_classifier = TextClassifier(doc_embeddings,label_dictionary = label_Dictionary)
  
# init the text classifier trainer
model_trainer = ModelTrainer(text_classifier,corpus)
  
# train your model
model_trainer.train('resources/taggers/trec',learning_rate=0.1,mini_batch_size=40,anneal_factor=0.5,patience=5,max_epochs=200)


Python3
from flair.data import Sentence
from flair.models import TextClassifier
c = TextClassifier.load('resources/taggers/trec/final-model.pt')
  
# input example sentence
s = Sentence('Who is the President of India ?')
  
# predict class and print
c.predict(s)
  
# print the labels
print(s.labels)


输出:

2)NER标签:

为了预测给定句子的标签,我们将使用预训练模型,如下所示:

蟒蛇3

import flair
from flair.data import Sentence
from flair.models import SequenceTagger
  
# input a sentence
s = Sentence('GeeksforGeeks is Awesome.')
  
# loading NER tagger
tagger_NER= SequenceTagger.load('ner')
  
# run NER over sentence
tagger_NER.predict(s)
print(s)
print('The following NER tags are found:\n')
  
# iterate and print
for entity in s.get_spans('ner'):
    print(entity)

输出:

3)词嵌入:

词嵌入为文本的每个词提供嵌入。如前所述,Flair 支持许多词嵌入,包括它自己的 Flair 嵌入。在这里,我们将看到如何实现其中的一些。

A) 经典词嵌入——这类词嵌入是静态的。在这种情况下,每个不同的词只被赋予一个预先计算的嵌入。大多数常见的词嵌入都属于这一类,包括 GloVe 嵌入。

蟒蛇3

import flair
from flair.data import Sentence
from flair.embeddings import WordEmbeddings
  
# using glove embedding
GloVe_embedding = WordEmbeddings('glove')
  
# input a  sentence
s = Sentence('Geeks for Geeks helps me study.')
  
# embed the sentence
GloVe_embedding.embed(s)
  
# print the embedded tokens
for token in s:
    print(token)
    print(token.embedding)

输出:

注意:您可以在此处看到单词“ Geeks ”的嵌入对于两次出现都是相同的。

B) 天赋嵌入——这适用于上下文字符串嵌入的概念。它捕获潜在的句法语义信息。词嵌入由它们周围的词上下文化。因此,它根据周围的文本为同一个词提供不同的嵌入。

蟒蛇3

import flair
from flair.data import Sentence
from flair.embeddings import FlairEmbeddings
  
# using forward flair embeddingembedding
forward_flair_embedding= FlairEmbeddings('news-forward-fast')
  
# input the sentence
s = Sentence('Geeks for Geeks helps me study.')
  
# embed words in the input sentence
forward_flair_embedding.embed(s)
  
# print the embedded tokens
for token in s:
    print(token)
    print(token.embedding)

输出:

注意:在这里我们看到,根据周围的上下文信息,“Geeks”这个词的嵌入对于这两次出现是不同的。

C) 堆叠嵌入——使用这些嵌入,您可以将不同的嵌入组合在一起。让我们看看如何结合 GloVe、前向和后向 Flair 嵌入:

蟒蛇3

import flair
from flair.data import Sentence
from flair.embeddings import FlairEmbeddings, WordEmbeddings
from flair.embeddings import StackedEmbeddings
# flair embeddings
forward_flair_embedding= FlairEmbeddings('news-forward-fast')
backward_flair_embedding= FlairEmbeddings('news-backward-fast')
  
# glove embedding
GloVe_embedding = WordEmbeddings('glove')
  
# create a object which combines the two embeddings
stacked_embeddings = StackedEmbeddings([forward_flair_embedding,
                                        backward_flair_embedding,
                                        GloVe_embedding,])
  
# input the sentence
s = Sentence('Geeks for Geeks helps me study.')
                                          
# embed the input sentence with the stacked embedding
stacked_embeddings.embed(s)
  
# print the embedded tokens
for token in s:
    print(token)
    print(token.embedding)

输出:

4) 文档嵌入:

, 与词嵌入不同,文档嵌入为整个文本提供单个嵌入。 Flair 中提供的文档嵌入是:

  • A) Transformer 文档嵌入
  • B) Sentence Transformer 文档嵌入
  • C)文档 RNN 嵌入
  • D)文档池嵌入

让我们来看看文档池嵌入是如何工作的——

文档池嵌入——这是一个非常简单的文档嵌入,它汇集了所有词嵌入并返回所有词的平均值。

蟒蛇3

import flair
from flair.data import Sentence
from flair.embeddings import WordEmbeddings, DocumentPoolEmbeddings
  
# init the glove word embedding
GloVe_embedding = WordEmbeddings('glove')
  
# init the document embedding
doc_embeddings = DocumentPoolEmbeddings([GloVe_embedding])
  
# input the sentence
s = Sentence('Geeks for Geeks helps me study.')
                                          
#embed the input sentence with the document embedding
doc_embeddings.embed(s)
  
# print the embedded tokens
print(s.embedding)

输出:

同样,您也可以使用其他文档嵌入。

5) 使用 Flair 训练文本分类模型:

我们将使用 Flair 中可用的“TREC_6”数据集。您也可以使用自己的数据集。为了训练我们的模型,我们将使用Document RNN Embeddings ,它在句子中的所有词嵌入上训练 RNN。我们将使用的词嵌入是GloVe 和前向天赋嵌入。

蟒蛇3

from flair.data import Corpus
from flair.datasets import TREC_6
from flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentRNNEmbeddings
from flair.models import TextClassifier
from flair.trainers import ModelTrainer
  
# load the corpus
corpus = TREC_6()
  
# create a label dictionary
label_Dictionary = corpus.make_label_dictionary()
  
# list of word embeddings to be used
word_embeddings = [WordEmbeddings('glove'),FlairEmbeddings('news-forward-fast')]
  
# init document embeddings and pass the word embeddings list
doc_embeddings = DocumentRNNEmbeddings(word_embeddings,hidden_size = 250)
  
# creating the text classifier
text_classifier = TextClassifier(doc_embeddings,label_dictionary = label_Dictionary)
  
# init the text classifier trainer
model_trainer = ModelTrainer(text_classifier,corpus)
  
# train your model
model_trainer.train('resources/taggers/trec',learning_rate=0.1,mini_batch_size=40,anneal_factor=0.5,patience=5,max_epochs=200)

训练结果:

该模型的准确率约为 95%。

预测:现在我们可以加载模型并进行预测——

蟒蛇3

from flair.data import Sentence
from flair.models import TextClassifier
c = TextClassifier.load('resources/taggers/trec/final-model.pt')
  
# input example sentence
s = Sentence('Who is the President of India ?')
  
# predict class and print
c.predict(s)
  
# print the labels
print(s.labels)

输出:

[HUM (1.0)]

现在您应该对如何使用 Flair 库有了一个大致的了解。