一个非常简单的框架,用于最先进的NLP。由Zalando Research开发。
Flair简介:
一个功能强大的NLP库。Flair允许您将最先进的自然语言处理(NLP)模型应用于您的文本,例如命名实体识别(NER),词性标注(PoS),意义消歧和分类。
多种语言。感谢Flair社区,我们支持快速增长的语言数量。我们现在还包括“一个模型,多种语言”标记器,即单个模型,用于预测各种语言的输入文本的PoS或NER标记。
文本嵌入库。Flair具有简单的界面,允许您使用和组合不同的文字和文档嵌入,包括我们提出的Flair嵌入,BERT嵌入和ELMo嵌入。
Pytorch NLP框架。我们的框架直接在Pytorch上构建,使您可以轻松地训练自己的模型,并使用Flair嵌入和类来尝试新方法。
与现有技术的比较:
Flair在一系列NLP任务上优于以前的最佳方法:
以下是使用Flair重现这些数字的方法。您还可以在我们的论文中找到详细的评估和讨论:
用于序列标记的上下文字符串嵌入。Alan Akbik,Duncan Blythe和Roland Vollgraf。第27届计算语言学国际会议,COLING 。
快速开始
要求和安装(Windows10 PyTorch==1.0 Python==3.6 测试成功)
该项目基于PyTorch 0.4+和Python 3.6+,因为方法签名和类型提示很漂亮。如果您没有Python 3.6,请先安装它。然后,在您最喜欢的虚拟环境中,只需:
pip install flair
示例用法
让我们对一个例句运行命名实体识别(NER)。您需要做的就是创建一个Sentence
,加载预先训练的模型并使用它来预测句子的标签:
from flair.data import Sentencefrom flair.models import SequenceTagger# make a sentencesentence = Sentence('I love Berlin .')# load the NER taggertagger = SequenceTagger.load('ner')# run NER over sentencetagger.predict(sentence)
完成!在Sentence
目前拥有实体的注解。打印句子以查看标记器找到的内容。
print(sentence)print('The following NER tags are found:')# iterate over entities and printfor entity in sentence.get_spans('ner'):print(entity)
这应该打印:
Sentence: "I love Berlin ." - 4 TokensThe following NER tags are found: LOC-span [3]: "Berlin"
教程
我们提供了一套快速教程来帮助您开始使用该库:
教程1:基础知识教程2:标记文本教程3:使用Word嵌入教程4:使用BERT,ELMo和Flair嵌入教程5:使用文档嵌入教程6:加载自己的语料库教程7:训练自己的模型教程8:优化您自己的模型教程9:训练自己的Flair嵌入
这些教程解释了基本NLP类如何工作,如何加载预先训练的模型来标记文本,如何使用不同的单词或文档嵌入嵌入文本,以及如何训练自己的语言模型,序列标记模型和文本分类模型。如果有什么不清楚,请告诉我们。
还有很好的第三方文章和帖子说明了如何使用Flair:
如何使用Flair构建文本分类器如何使用Flair和Flask构建微服务Flair的码头图像
引用天赋
使用Flair时请引用以下文章:
@inproceedings{akbikcoling,title={Contextual String Embeddings for Sequence Labeling},author={Akbik, Alan and Blythe, Duncan and Vollgraf, Roland},booktitle = {{COLING} , 27th International Conference on Computational Linguistics},pages= {1638--1649},year= {}}
联系
请将您的问题或意见通过电子邮件发送给Alan Akbik。
特约
感谢您对贡献的兴趣!有很多方法可以参与其中;从我们的贡献者指南开始,然后针对特定任务检查这些未解决的问题。
对于希望深入了解API的贡献者,我们建议克隆存储库并检查单元测试以获取如何调用方法的示例。几乎所有的类和方法都有记录,因此希望找到适合代码的方法很容易。
执照
麻省理工学院许可证(MIT)
Flair根据以下MIT许可证获得许可:MIT许可证(MIT)版权所有© Zalando SE,https://
特此授予任何获得本软件和相关文档文件(“软件”)副本的人免费许可,以无限制地交易本软件,包括但不限于使用,复制,修改,合并的权利根据以下条件,出版,分发,再许可和/或出售本软件的副本,并允许向其提供本软件的人员这样做:
上述版权声明和本许可声明应包含在本软件的所有副本或实质部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性,特定用途的适用性和不侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔,损害或其他责任承担任何责任,无论是在合同,侵权行为还是其他方面,由本软件引起或与之相关,或者与本软件的使用或其他交易有关。软件。
代码可视化:
这是代码演变的一个很酷的可视化
/watch?v=PsbaD9MZ4Xk
教程1:NLP基本类型
这是本教程的第1部分,其中我们将介绍此库中使用的一些基本类型。
创造一个句子
有两种类型的对象是这个库的核心,即Sentence
和Token
对象。ASentence
持有一个文本句子,基本上是一个列表Token
。
让我们从Sentence
为一个例句创建一个对象开始。
# The sentence objects holds a sentence that we may want to embed or tagfrom flair.data import Sentence# Make a sentence object by passing a whitespace tokenized stringsentence = Sentence('The grass is green .')# Print the object to see what's in thereprint(sentence)
这应该打印:
Sentence: "The grass is green ." - 5 Tokens
打印输出告诉我们该句子由5个令牌组成。您可以通过令牌ID或索引访问句子的标记:
# using the token idprint(sentence.get_token(4))# using the index itselfprint(sentence[3])
在两种情况下都应该打印
Token: 4 green
此打印输出包括令牌ID(4)和令牌的词汇值(“绿色”)。您还可以在句子中迭代所有标记。
for token in sentence:print(token)
这应该打印:
Token: 1 TheToken: 2 grassToken: 3 isToken: 4 greenToken: 5 .
符号化
在某些用例中,您可能没有将文本标记为已标记化。对于这种情况,我们使用轻量级segtok库添加了一个简单的tokenizer。
use_tokenizer
在Sentence
使用未加密的字符串实例化时,只需使用该标志:
from flair.data import Sentence# Make a sentence object by passing an untokenized string and the 'use_tokenizer' flagsentence = Sentence('The grass is green.', use_tokenizer=True)# Print the object to see what's in thereprint(sentence)
这应该打印:
Sentence: "The grass is green ." - 5 Tokens
将标签添加到令牌
AToken
具有语言注释的字段,例如词条,词性标签或命名实体标签。您可以通过指定标记类型和标记值来添加标记。在此示例中,我们将“color”类型的NER标记添加到“green”一词中。这意味着我们已将此单词标记为颜色类型的实体。
# add a tag to a word in the sentencesentence[3].add_tag('ner', 'color')# print the sentence with all tags of this typeprint(sentence.to_tagged_string())
这应该打印:
The grass is green <color> .
每个标签都是类Label
,其值旁边有一个表示置信度的分数。像这样打印:
from flair.data import Labeltag: Label = sentence[3].get_tag('ner')print(f'"{sentence[3]}" is tagged as "{tag.value}" with confidence score "{tag.score}"')
这应该打印:
"Token: 4 green" is tagged as "color" with confidence score "1.0"
我们的彩色标签得分为1.0,因为我们手动添加了它。如果我们的序列标记器预测了标签,则评分值将指示分类器置信度。
为句子添加标签
ASentence
可以具有一个或多个标签,例如可以用于文本分类任务。例如,下面的示例显示了我们如何在句子中添加标签“sports”,从而将其标记为属于体育类别。
sentence = Sentence('France is the current world cup winner.')# add a label to a sentencesentence.add_label('sports')# a sentence can also belong to multiple classessentence.add_labels(['sports', 'world cup'])# you can also set the labels while initializing the sentencesentence = Sentence('France is the current world cup winner.', labels=['sports', 'world cup'])
标签也属于Label
同类产品。所以,你可以像这样打印一个句子的标签:
sentence = Sentence('France is the current world cup winner.', labels=['sports', 'world cup'])print(sentence)for label in sentence.labels:print(label)
这应该打印:
sports (1.0)world cup (1.0)
这表明该句子属于这两个类,每个类的置信度得分为1.0。
下一个
现在,让我们看看如何使用预先训练的模型标记您的文本。