性能优于BERT的FLAIR:一篇文章入门Flair模型

文章目录

  • What is FLAIR?
    • FLAIR Model
    • Contextual String Embedding for Sequence Labeling
      • example
    • FLAIR Application Area
      • Sentiment Analysis
      • Named Entity Recognition
      • Text Classification
  • FLAIR
    • 一、什么是FLAIR?
    • 二、FLAIR Library的优势是什么?
    • 三、用于Sequence Labeling的Contextual String Embedding
  • FLAIR算法实现
    • Embedding Words with Transformers
    • Embedding Documents with Transformers
    • How to Stack Embedding
    • Transformer Embedding
      • Embedding Words
      • Embedding Sentences
      • Arguments
        • Layers
        • Pooling Operation
        • Layer Mean
        • Fine-Tunealbe
    • Flair Embedding
    • Recommended Flair Usage
    • Classic Word Embedding
  • 参考文献

What is FLAIR?

FLAIR是一个NLP的综合框架,旨在为研究人员提供用于各种文本分析任务的灵活高效的工具集

FLAIR的特点是强调尖端的序列标记(cutting-edge sequence labeling)、文本分类(text categorization)和语言建模(language modeling)

FLAIR由两个主要部分组成:FLAIR Library和FLAIR Embedding

  1. FLAIR Library包含几种用于常见NLP任务的预配置模型和应用程序
  2. FLAIR Embedding提供了一个在巨大数据集上训练的Word Embedding和Contextual String Embedding

FLAIR Model

在这里插入图片描述
FLAIR模型图说明了通过FLAIR不同组件的信息流,提供了如何处理和分析文本的可视化表示,该图显示了以下组件:

  1. Word Embedding:使用Word2Vec和GloVe捕获给定文本中各个单词的语义和句法信息
  2. Character Embedding:结合Character Embedding来捕获单词的形态信息
  3. Contextual String Embedding:FLAIR利用Contextual String Embedding根据周围的上下文对单词的含义进行编码
  4. Sequence Labeling:FLAIR使用Sequence Labeling(例如LSTM)为文本中的各个token分配label,该组件对命名实体识别和词性标记等任务至关重要
  5. Text Classification:FLAIR使用卷积神经网络(CNN)和Self-Attention支持文本分类任务,该组件使模型能够将文档分类为不同的类别或预测情感
  6. Language Models:FLAIR结合了捕捉文本全局上下文的语言模型,这些模型(Transformer)是在大型语料库上进行训练的,并且可以生成上下文化的单词表示

Contextual String Embedding for Sequence Labeling

FLAIR 中的Contextual String Embedding是文本中word或token的表示,它们根据周围的上下文捕获其含义。这些embedding通过考虑整个句子或单词出现的标记序列来编码单个单词的语义和句法信息。这种上下文信息对于 NLP 中的序列标记任务至关重要,例如命名实体识别 (NER) 和词性 (POS) 标记。

example

"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 Application Area

Sentiment Analysis

情感分析涉及确定一段文本中表达的情感,无论是积极的、消极的还是中性的。 FLAIR 的模型可以准确分析社交媒体帖子、客户评论和在线讨论中的情绪。

Named Entity Recognition

命名实体识别(NER)旨在识别和分类文本中的命名实体,例如人名、组织名称、位置和日期。 FLAIR 的Sequence Labeling模型在 NER 任务中表现出色,可为信息提取提供准确的结果。

Text Classification

文本分类涉及将文档分类为预定义的类别或主题。 FLAIR 提供了强大的文本分类模型,支持垃圾邮件检测、主题建模和文档组织等任务

FLAIR

对语境的了解打破了阻碍NLP技术进步的障碍
至今为止,单词要么表示为稀疏矩阵,要么表示为嵌入式词语,如GLoVe,Bert和ELMo

一、什么是FLAIR?

Flair是由Zalando Research开发的一个简单的自然语言处理(NLP)库。 Flair的框架直接构建在PyTorch上,PyTorch是最好的深度学习框架之一。 Zalando Research团队还为以下NLP任务发布了几个预先训练的模型:

  1. 名称-实体识别(NER):它可以识别单词是代表文本中的人,位置还是名称。
  2. 词性标注(PoS):将给定文本中的所有单词标记为它们所属的“词性”。
  3. 文本分类:根据标准对文本进行分类(标签)。

二、FLAIR Library的优势是什么?

Flair库中包含了许多强大的功能,以下是最突出的一些方面:

  1. 它包括了最通用和最先进的单词嵌入方式,如GloVe,BERT,ELMo,字符嵌入等。凭借Flair API技术,使用起来非常容易
  2. Flair的界面允许我们组合不同的word embedding并使用词向量表示文档,显著优化了结果

三、用于Sequence Labeling的Contextual String Embedding

在处理NLP任务时,上下文语境非常重要。通过先前字符预测下一个字符,这一学习过程构成了序列建模的基础。

Contextual String Embedding是通过熟练利用字符语言模型的内部状态,来产生一种新的嵌入类型。简单来说,它通过字符模型中的某些内部原则,使单词在不同的句子中可以具有不同的含义
注意:语言和字符模型是单词/字符的概率分布,因此每个新单词或新字符都取决于前面的单词或字符
在这里插入图片描述
有两个主要因素驱动了Contextual String Embedding:

  1. 这些单词被理解为字符(没有任何单词的概念)。也就是说,它的工作原理类似于字符嵌入
  2. Embedding是通过其周围文本进行语境化的。这意味着根据上下文,相同的单词可以有不同的Embedding意义。很像自然的人类语言,不是吗?在不同的情况下,同一个词可能有不同的含义

让我们看个例子来理解这个意思:

  • 案例1:读一本书(Reading a book)
  • 案例2:请预订火车票(Please book a train ticket)

说明:

  • 在案例1中,book是一个名词
  • 在案例2中,book是动词

FLAIR算法实现

Embedding Words with Transformers

使用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}")

Embedding Documents with Transformers

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}")

How to Stack Embedding

我们可以使用Flair将embedding组合成"embedding stacks",当不进行微调时,使用embedding组合通常会给出最佳结果
使用StackedEmbedding类并通过传递希望组合的embedding列表来实例化它

Transformer Embedding

Flair 支持各种基于 Transformer 的架构,例如 HuggingFace 的 BERT 或 XLNet,有两个类 TransformerWordEmbeddings(用于嵌入单词)和 TransformerDocumentEmbeddings(用于嵌入文档)。

Embedding Words

加载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)

Embedding Sentences

要将整个句子作为一个整体(而不是句子中的每个单词),只需要使用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)

Arguments

初始化 TransformerWordEmbeddings 和 TransformerDocumentEmbeddings 类时可以设置多个选项:

ArgumentDefault
modelbert-base-uncased
layersall
subtoken_poolingfirst
layer_meanTrue
fine_tuneFalse
Layers

layers参数控制Transformer层用于嵌入,如果将此值设置为 “-1、-2、-3、-4”,则使用前 4 层进行嵌入。如果将其设置为 “-1”,则仅使用最后一层。如果将其设置为"all",则使用所有图层
这会影响embedding的长度,因为层只是连接起来的

from flair.data import Sentence
from flair.embeddings import TransformerWordEmbeddingssentence = 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])
"""
Pooling Operation

大多数基于Transformer的模型(Transformer-XL除外)都使用subword tokenization。例如,以下token puppeteer可以标记(tokenization)为subwords:pupp、##ete 和 ##er。
我们对这些subwords实现不同的池化操作来生成最终的token表示:

  • first:仅使用第一个subword的embedding
  • last:仅使用最后一个subword的embedding
  • first_last:第一个和最后一个subword的embedding被连接并使用
  • mean:计算并使用所有subword embedding的 torch.mean
# 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())
Layer Mean

基于 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>)
Fine-Tunealbe

对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)

Flair Embedding

Contextual String Embedding是一种强大的嵌入,可以捕获超出标准Word Embedding的潜在语义信息。主要区别是:

  1. 它们在没有任何明确的单词概念下进行训练,因此从根本上将单词建模为字符序列
  2. 它们通过周围的文本进行语境化,这意味着同一个单词将根据其上下文使用而具有不同的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)

Recommended Flair Usage

建议结合前向和后向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,这样的组合往往可以实现最先进的精度

Classic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/179780.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机电子秤-proteus仿真-源程序

一、系统方案 本设计采用52单片机作为主控器&#xff0c;液晶1602显示&#xff0c;HX711模块&#xff0c;按键设置单价&#xff0c;计算总价&#xff0c;超量程报警&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 I…

界面控件DevExpress WinForms Gauge组件 - 实现更高级别数据可视化

DevExpress WinForms控件包含了超过150个随时可用的仪表盘预设&#xff0c;包括圆形&#xff0c;数字&#xff0c;线性和状态指示器等&#xff0c;来帮助用户实现更高级的数据可视化。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业…

H5ke9

上次fetvh就一个参数url,,就是get请求 fetch还可以第二个参数对象,可以指定method:改为POST 请求头header :发送txt,servlet,json给客户端,,异步请求图片 1 这节客户端传到服务器端 2异步文件上传,两三行代码把文件传输 mouseover事件 .then()的使用 是Promise对象的一个方法…

HT6818 低 EMI 音频功率放大器

HT6818是一款具有低EMI、防削顶失真功能的立体声免输出滤波器D类音频功率放大器。AROC辐射和传导干扰抑Z电路使HT6818具有全带宽低辐射性能&#xff0c;在不加辅助滤波设计、输出喇叭线长20cm时的辐射水平远在FCC Part15Class B 标准之下。 HT6818的防削顶失真功能可检测并抑Z由…

C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)

懒大王感谢大家的关注和三连支持~ 目录 前言 一、UDP编程 UDP特点&#xff1a; UDP框架: UDP函数学习 发送端代码案例如下&#xff1a; 二、多路复用 前提讲述 select poll 三、图解如下 总结 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;…

C++定义一个 Student 类,在该类定义中包括:一个数据成员 score(分数)及两个静态数据 成员 total(总分)和学生人数 count

完整代码&#xff1a; /*声明一个Student类&#xff0c;在该类中包括一个数据成员score&#xff08;分数&#xff09;、两个静态数据成员total_score&#xff08;总分&#xff09;和count&#xff08;学生人数&#xff09;&#xff1b;还包括一个成员函数account&#xff08;&…

03、最长连续数列:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度

文章目录 1、题目描述1.1 移动所有零至数组末尾1.2 示例 2、解题思路2.1 思路讲解2.2 动画演示&#xff08; 待补充&#xff09; 3、答案3.1 Java 代码3.2 运行结果 4、视频讲解&#xff08; 待补充&#xff09; 1、题目描述 1.1 移动所有零至数组末尾 给定一个未排序的整数数…

离散数学实践(2)-编程实现关系性质的判断

*本文为博主本人校内的离散数学专业课的实践作业。由于实验步骤已经比较详细&#xff0c;故不再对该实验额外提供详解&#xff0c;本文仅提供填写的实验报告内容与代码部分&#xff0c;以供有需要的同学学习、参考。 -------------------------------------- 编程语言&#xff…

Hive On Spark 概述、安装配置、计算引擎更换、应用、异常解决

文章目录 Hadoop 安装Hive 安装Hive On Spark 与 Spark On Hive 区别Hive On SparkSpark On Hive 部署 Hive On Spark查询 Hive 对应的 Spark 版本号下载 Spark解压 Spark配置环境变量指定 Hadoop 路径在 Hive 配置 Spark 参数上传 Jar 包并更换引擎 测试 Hive On SparkYarn 资…

Windows Server 2016使用MBR2GPT.EXE教程!

什么是MBR2GPT.exe&#xff1f; MBR2GPT.exe是微软提供的专业工具&#xff0c;可在命令提示符下运行。使用该工具可以将引导磁盘从MBR转换为GPT分区样式&#xff0c;而无需修改或删除所选磁盘上的任何内容。 在Windows Server 2019和Windows 10&#xff08;1703…

【软著写作】软著写作过程记录

文章目录 整体流程图&#xff1a;写在前面&#xff1a;一、准备材料1 准备材料2 申请盖章 二、软件登记1 注册账号2 填报软著 整体流程图&#xff1a; 写在前面&#xff1a; 这两天填报了一篇软著&#xff0c;正好将以前第一次填报时&#xff0c;踩的一些坑和过程记录了一下&am…

IDEA远程调试代码

IDEA->RUN->Edit Configurations 端口随便选一个&#xff0c;选择调试模块&#xff0c;然后用IDEA生成的命令调试 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:8081 -jar backend-1.18.11.jar &

【教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数

3妹&#xff1a;呜呜&#xff0c;烦死了&#xff0c; 脸上长了一个痘 2哥 : 不要在意这些细节嘛&#xff0c;不用管它&#xff0c;过两天自然不就好了。 3妹&#xff1a;切&#xff0c;你不懂&#xff0c;影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊&#xff0c; 工作…

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…

AI智能语音识别模块(二)——基于Arduino的语音控制MP3播放器

文章目录 简介离线语音控制模块Mini MP3模块0.96寸 OLED模块实验准备安装库接线定义主要程序实验效果注意事项总结 简介 在前面一篇文章里我们对AI智能语音识别模块进行了介绍&#xff0c;并对离线语音模组下载固件的过程进行了一个简单描述&#xff0c;不知道大家还记不记得&…

日本it培训学费 想去日本做IT,需要具备哪些技术?

日本的IT行业历史比较悠久&#xff0c;业务以上层前端业务为主&#xff0c;如设计和构建软件。日本IT公司组织庞大&#xff0c;行业内部有着严格的分工和部署&#xff0c;工作会被细分化&#xff0c;分配给个人的工作量不会太大&#xff0c;难度也不会很高&#xff0c;所以日本…

Restful风格与Wesocket之间的关联

RESTful 风格和 WebSocket 本质上是两种不同的通信机制&#xff0c;它们在设计理念和用途上有明显的区别。 RESTful 是一种基于 HTTP 协议的架构风格&#xff0c;它使用标准的 HTTP 方法&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;来进行资源的操作&#xff0c;并倾…

1015. 摘花生

题目&#xff1a; 1015. 摘花生 - AcWing题库 思路&#xff1a;dp 代码&#xff1a; #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int N 110; typedef long long ll; int T, r, c; int num[N][N]; ll dp[N][N];//dp…

直播界很火的无线领夹麦克风快充方案 Type-C接口 PD快充+无线麦克风可同时进行

当前市场上流行一款很火的直播神器&#xff0c;无线领夹麦克风&#xff08;MIC&#xff09;&#xff0c;应用于网红直播&#xff0c;网课教学&#xff0c;采访录音&#xff0c;视频录制&#xff0c;视频会议等等场景。 麦克风对我们来说并不陌生&#xff0c;而且品类有很多。随…

GEE——提取制定多波段影像的属性值(按照制定属性名称和属性值)输出格式为矢量格式

简介: 这里我们很多时候,需要提取制定影像,或者多波段影像制定区域的值,这里有一个问题是我们一般输出的结果仅仅是一个字典类型的对象,而我们不知道如何按照一个矢量输入,这里我们首先要做的就是进行多波段值在制定区域的提取,随后就是分别对其新的字典的键、值的设定…