FLAIR – NLP 框架
什么是天赋?
它是最先进的 NLP 的简单框架。这是一个非常强大的库,由 Zalando Research 开发。 Flair 框架建立在PyTorch 之上。
Flair 有哪些可用功能?
- Flair 支持许多用于执行 NLP 任务的词嵌入,例如 FastText、ELMo、GloVe、BERT 及其变体、XLM 和字节对嵌入,包括 Flair 嵌入。
- Flair Embedding 基于用于序列标签的上下文字符串嵌入的概念。
- 使用 Flair,您还可以将不同的词嵌入组合在一起以获得更好的结果。
- Flair 支持多种语言。
上下文字符串嵌入:
在这个词嵌入中,词中的每个字母都被发送到字符语言模型,然后从前向和后向 LSTM 中取出输入表示。
词“Washington”的输入表示是根据词“Washington”之前的上下文来考虑的。获取每个单词的第一个和最后一个字符状态以生成词嵌入。
您可以看到,对于“Washington”这个词,红色标记是前向 LSTM 输出,蓝色标记是后向 LSTM 输出。连接前向和后向上下文以获得单词“Washington”的输入表示。
获得输入表示后,它被馈送到前向和后向 LSTM 以获得您正在处理的特定任务。在提到的图表中,我们试图获得 NER。
Flair的安装:
您应该安装了PyTorch >=1.1和Python >=3.6 。要在 anaconda 上安装 PyTorch,请运行以下命令-
conda install -c pytorch pytorch
要安装天赋,请运行 -
pip install flair
工作天赋
1) 天赋数据类型:
Flair 提供两种类型的对象。他们是:
- 句子
- 代币
要获取句子中的标记数:
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 库有了一个大致的了解。