FLAIR是一个NLP的综合框架,旨在为研究人员提供用于各种文本分析任务的灵活高效的工具集
FLAIR的特点是强调尖端的序列标记(cutting-edge sequence labeling)、文本分类(text categorization)和语言建模(language modeling)
FLAIR由两个主要部分组成:FLAIR Library和FLAIR Embedding
FLAIR模型图说明了通过FLAIR不同组件的信息流,提供了如何处理和分析文本的可视化表示,该图显示了以下组件:
FLAIR 中的Contextual String Embedding是文本中word或token的表示,它们根据周围的上下文捕获其含义。这些embedding通过考虑整个句子或单词出现的标记序列来编码单个单词的语义和句法信息。这种上下文信息对于 NLP 中的序列标记任务至关重要,例如命名实体识别 (NER) 和词性 (POS) 标记。
"The cat sat on the mat."例如,单词"mat"可以指代地板覆盖物,而单词"cat"可能指代猫科哺乳动物。
在FLAIR中,Contextual String Embedding通常基于BERT或RoBERTa,它会考虑句子中每个单词的上下文,并为该单词生成对应的向量表示或Embedding
在图中,输入句子 "The cat sat on the mat"被输入到Contextual String Embedding组件中,该组件将句子作为一个整体进行处理,Contextual String Embedding为句子中的每个单词生成对应的向量表示,捕获它们的上下文含义
然后,这些Contextual String Embedding将用作Sequence Labeling的输入,例如命名实体识别 (NER) 或词性 (POS) 标记。Sequence Labeling组件根据上下文和手头的任务将特定标签应用于句子中的每个单词
例如,在命名实体识别任务中,Sequence Labeling组件可以将"cat"识别和分类为 "ANIMAL"类型的实体,将"mat"识别为"OBJECT"类型的实体。
Contextual String Embedding通过利用句子中单词的上下文信息,在提高Sequence Labeling任务的性能方面发挥着至关重要的作用。它们使模型能够根据周围的单词做出更准确的预测,从而提高准确性和对文本的理解。
情感分析涉及确定一段文本中表达的情感,无论是积极的、消极的还是中性的。 FLAIR 的模型可以准确分析社交媒体帖子、客户评论和在线讨论中的情绪。
命名实体识别(NER)旨在识别和分类文本中的命名实体,例如人名、组织名称、位置和日期。 FLAIR 的Sequence Labeling模型在 NER 任务中表现出色,可为信息提取提供准确的结果。
文本分类涉及将文档分类为预定义的类别或主题。 FLAIR 提供了强大的文本分类模型,支持垃圾邮件检测、主题建模和文档组织等任务
对语境的了解打破了阻碍NLP技术进步的障碍
至今为止,单词要么表示为稀疏矩阵,要么表示为嵌入式词语,如GLoVe,Bert和ELMo
Flair是由Zalando Research开发的一个简单的自然语言处理(NLP)库。 Flair的框架直接构建在PyTorch上,PyTorch是最好的深度学习框架之一。 Zalando Research团队还为以下NLP任务发布了几个预先训练的模型:
Flair库中包含了许多强大的功能,以下是最突出的一些方面:
在处理NLP任务时,上下文语境非常重要。通过先前字符预测下一个字符,这一学习过程构成了序列建模的基础。
Contextual String Embedding是通过熟练利用字符语言模型的内部状态,来产生一种新的嵌入类型。简单来说,它通过字符模型中的某些内部原则,使单词在不同的句子中可以具有不同的含义
注意:语言和字符模型是单词/字符的概率分布,因此每个新单词或新字符都取决于前面的单词或字符。
有两个主要因素驱动了Contextual String Embedding:
让我们看个例子来理解这个意思:
说明:
使用flair中的TransformerWordEmbeddings来实现将文本映射到向量空间中:
from flair.data import Sentence
from flair.embeddings import TransformerWordEmbeddings
# init embedding
embedding = TransformerWordEmbeddings("./model/bert-base-chinese")
# create a sentence
sentence = Sentence("今天天气真好")
# embed words in sentence
embedding.embed(sentence)
for token in sentence:
print(f"{token}: {token.embedding}")
from flair.data import Sentence
from flair.embeddings import TransformerDocumentEmbeddings
# init embedding
document_embedding=TransformerDocumentEmbeddings("./model/bert-base-chinese")
# create a sentence
document_sentence=Sentence("今天天气真好")
# embed words in sentence
document_embedding.embed(document_sentence)
print(f"{document_sentence}: {document_sentence.embedding}")
我们可以使用Flair将embedding组合成"embedding stacks",当不进行微调时,使用embedding组合通常会给出最佳结果
使用StackedEmbedding类并通过传递希望组合的embedding列表来实例化它
Flair 支持各种基于 Transformer 的架构,例如 HuggingFace 的 BERT 或 XLNet,有两个类 TransformerWordEmbeddings(用于嵌入单词)和 TransformerDocumentEmbeddings(用于嵌入文档)。
加载BERT模型:
from flair.embeddings import TransformerWordEmbeddings
# init embedding
embedding = TransformerWordEmbeddings('bert-base-uncased')
# create a sentence
sentence = Sentence('The grass is green .')
# embed words in sentence
embedding.embed(sentence)
加载RoBERTa模型:
from flair.embeddings import TransformerWordEmbeddings
# init embedding
embedding = TransformerWordEmbeddings('roberta-base')
# create a sentence
sentence = Sentence('The grass is green .')
# embed words in sentence
embedding.embed(sentence)
要将整个句子作为一个整体(而不是句子中的每个单词),只需要使用TransformerDocumentEmbedding即可:
from flair.embeddings import TransformerDocumentEmbeddings
# init embedding
embedding = TransformerDocumentEmbeddings('roberta-base')
# create a sentence
sentence = Sentence('The grass is green .')
# embed words in sentence
embedding.embed(sentence)
初始化 TransformerWordEmbeddings 和 TransformerDocumentEmbeddings 类时可以设置多个选项:
Argument | Default |
---|---|
model | bert-base-uncased |
layers | all |
subtoken_pooling | first |
layer_mean | True |
fine_tune | False |
layers参数控制Transformer层用于嵌入,如果将此值设置为 “-1、-2、-3、-4”,则使用前 4 层进行嵌入。如果将其设置为 “-1”,则仅使用最后一层。如果将其设置为"all",则使用所有图层。
这会影响embedding的长度,因为层只是连接起来的
from flair.data import Sentence
from flair.embeddings import TransformerWordEmbeddings
sentence = Sentence('The grass is green.')
# use only last layers
embeddings = TransformerWordEmbeddings('bert-base-uncased', layers='-1', layer_mean=False)
embeddings.embed(sentence)
print(sentence[0].embedding.size())
sentence.clear_embeddings()
# use last two layers
embeddings = TransformerWordEmbeddings('bert-base-uncased', layers='-1,-2', layer_mean=False)
embeddings.embed(sentence)
print(sentence[0].embedding.size())
sentence.clear_embeddings()
# use ALL layers
embeddings = TransformerWordEmbeddings('bert-base-uncased', layers='all', layer_mean=False)
embeddings.embed(sentence)
print(sentence[0].embedding.size())
"""
torch.Size([768])
torch.Size([1536])
torch.Size([9984])
"""
大多数基于Transformer的模型(Transformer-XL除外)都使用subword tokenization。例如,以下token puppeteer可以标记(tokenization)为subwords:pupp、##ete 和 ##er。
我们对这些subwords实现不同的池化操作来生成最终的token表示:
# use first and last subtoken for each word
embeddings = TransformerWordEmbeddings('bert-base-uncased', subtoken_pooling='first_last')
embeddings.embed(sentence)
print(sentence[0].embedding.size())
基于 Transformer 的模型具有一定数量的层,可以设置 layer_mean=True 对所有选定图层进行平均,所得向量将始终具有与单层相同的维度:
from flair.embeddings import TransformerWordEmbeddings
# init embedding
embedding = TransformerWordEmbeddings("roberta-base", layers="all", layer_mean=True)
# create a sentence
sentence = Sentence("The Oktoberfest is the world's largest Volksfest .")
# embed words in sentence
embedding.embed(sentence)
"""
tensor([-0.0323, -0.3904, -1.1946, ..., 0.1305, -0.1365, -0.4323],
device='cuda:0', grad_fn=<CatBackward>)
对embedding进行微调时,在TransformerWordEmbedding中设置卡fine_tune=True。微调时,也应该只使用最顶层,所以最好设置layers=“-1”
# use first and last subtoken for each word
embeddings = TransformerWordEmbeddings('bert-base-uncased', fine_tune=True, layers='-1')
embeddings.embed(sentence)
print(sentence[0].embedding)
Contextual String Embedding是一种强大的嵌入,可以捕获超出标准Word Embedding的潜在语义信息。主要区别是:
使用Flair只需要实例化适当的embedding类即可使用:
from flair.embeddings import FlairEmbeddings
# init embedding
flair_embedding_forward = FlairEmbeddings('news-forward')
# create a sentence
sentence = Sentence('The grass is green .')
# embed words in sentence
flair_embedding_forward.embed(sentence)
建议结合前向和后向Flair embedding,根据任务,还建议在组合中添加标准word embedding。因此,对于大多数英语任务,我们推荐的StackedEmbedding是:
from flair.embeddings import WordEmbeddings, FlairEmbeddings, StackedEmbeddings
# create a StackedEmbedding object that combines glove and forward/backward flair embeddings
stacked_embeddings = StackedEmbeddings([
WordEmbeddings('glove'),
FlairEmbeddings('news-forward'),
FlairEmbeddings('news-backward'),
])
sentence = Sentence('The grass is green .')
# just embed a sentence using the StackedEmbedding as you would with any single embedding.
stacked_embeddings.embed(sentence)
# now check out the embedded tokens.
for token in sentence:
print(token)
print(token.embedding)
使用三种不同embedding的组合来实现word embedding,这样的组合往往可以实现最先进的精度
经典的Word Embedding是静态的、单词级的,这意味着每个不同的单词都会得到一个预先计算的embedding。
只要实例化WordEmbeddings类并传入相应的模型名称即可:
from flair.embeddings import WordEmbeddings
# init embedding
glove_embedding = WordEmbeddings('glove')
# create sentence.
sentence = Sentence('The grass is green .')
# embed a sentence using glove.
glove_embedding.embed(sentence)
# now check out the embedded tokens.
for token in sentence:
print(token)
print(token.embedding)
将适当的 id 字符串传递给 WordEmbeddings 类的构造函数来选择加载那些预训练的embedding。
如果要加载自定义embedding,需要确保自定义embedding的格式为gensim
可以使用以下代码片段经FastText embedding转换为gensim
import gensim
word_vectors = gensim.models.KeyedVectors.load_word2vec_format('/path/to/fasttext/embeddings.txt', binary=False)
1、Hugging Face-FLAIR
2、Flair:一款简单但技术先进的NLP库
3、Everything about FLAIR: A Framework for NLP
4、Transformer embeddings
5、Embeddings
6、Flair embeddings