一个非常简单的框架,用于最先进的NLP。由Zalando Research开发。
Flair在一系列NLP任务上优于以前的最佳方法:
任务 | 语言 | 数据集 | Flair | 以前最好的 |
---|---|---|---|---|
命名实体识别 | 英语 | Conll-03 | 93.09(F1) | 92.22 (Peters等,2018) |
命名实体识别 | 英语 | Ontonotes | 89.71(F1) | 86.28 (Chiu等,2016) |
新兴实体检测 | 英语 | WNUT-17 | 50.20(F1) | 45.55 (Aguilar等,2018) |
词性标注 | 英语 | WSJ | 97.85 | 97.64 (崔,2016) |
分块 | 英语 | Conll-2000 | 96.72(F1) | 96.36 (Peters et al。,2017) |
命名实体识别 | 德语 | Conll-03 | 88.32(F1) | 78.76 (Lample等,2016) |
命名实体识别 | 德语 | Germeval | 84.65(F1) | 79.08 ( Hänig 等,2014) |
命名实体识别 | 抛光 | PolEval-2018 | 86.6(F1)(Borchmann等,2018) | 85.1 (PolDeepNer) |
以下是使用Flair 重现这些数字的方法。您还可以在我们的论文中找到详细的评估和讨论:
用于序列标记的上下文字符串嵌入。Alan Akbik,Duncan Blythe和Roland Vollgraf。第27届计算语言学国际会议,COLING 2018。
该项目基于PyTorch 0.4+和Python 3.6+,因为方法签名和类型提示很漂亮。如果您没有Python 3.6,请先安装它。然后,在您最喜欢的虚拟环境中,只需:
pip install flair
让我们对一个例句运行命名实体识别(NER)。您需要做的就是创建一个Sentence
,加载预先训练的模型并使用它来预测句子的标签:
from flair.data import Sentence
from flair.models import SequenceTagger
# make a sentence
sentence = Sentence('I love Berlin .')
# load the NER tagger
tagger = SequenceTagger.load('ner')
# run NER over sentence
tagger.predict(sentence)
完成!在Sentence
目前拥有实体的注解。打印句子以查看标记器找到的内容。
print(sentence)
print('The following NER tags are found:')
# iterate over entities and print
for entity in sentence.get_spans('ner'):
print(entity)
这应该打印:
Sentence: "I love Berlin ." - 4 Tokens
The following NER tags are found:
LOC-span [3]: "Berlin"
我们提供了一套快速教程来帮助您开始使用该库:
这些教程解释了基本NLP类如何工作,如何加载预先训练的模型来标记文本,如何使用不同的单词或文档嵌入嵌入文本,以及如何训练自己的语言模型,序列标记模型和文本分类模型。如果有什么不清楚,请告诉我们。
还有很好的第三方文章和帖子说明了如何使用Flair:
使用Flair时请引用以下文章:
@inproceedings{akbik2018coling,
title={Contextual String Embeddings for Sequence Labeling},
author={Akbik, Alan and Blythe, Duncan and Vollgraf, Roland},
booktitle = {{COLING} 2018, 27th International Conference on Computational Linguistics},
pages = {1638--1649},
year = {2018}
}
请将您的问题或意见通过电子邮件发送给Alan Akbik。
感谢您对贡献的兴趣!有很多方法可以参与其中; 从我们的贡献者指南开始,然后针对特定任务检查这些未解决的问题。
对于希望深入了解API的贡献者,我们建议克隆存储库并检查单元测试以获取如何调用方法的示例。几乎所有的类和方法都有记录,因此希望找到适合代码的方法很容易。
麻省理工学院许可证(MIT)
Flair根据以下MIT许可证获得许可:MIT许可证(MIT)版权所有©2018 Zalando SE,https: //tech.zalando.com
特此授予任何获得本软件和相关文档文件(“软件”)副本的人免费许可,以无限制地交易本软件,包括但不限于使用,复制,修改,合并的权利根据以下条件,出版,分发,再许可和/或出售本软件的副本,并允许向其提供本软件的人员这样做:
上述版权声明和本许可声明应包含在本软件的所有副本或实质部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性,特定用途的适用性和不侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔,损害或其他责任承担任何责任,无论是在合同,侵权行为还是其他方面,由本软件引起或与之相关,或者与本软件的使用或其他交易有关。软件。
这是代码演变的一个很酷的可视化
https://www.youtube.com/watch?v=PsbaD9MZ4Xk
这是本教程的第1部分,其中我们将介绍此库中使用的一些基本类型。
有两种类型的对象是这个库的核心,即Sentence
和Token
对象。A Sentence
持有一个文本句子,基本上是一个列表Token
。
让我们从Sentence
为一个例句创建一个对象开始。
# The sentence objects holds a sentence that we may want to embed or tag
from flair.data import Sentence
# Make a sentence object by passing a whitespace tokenized string
sentence = Sentence('The grass is green .')
# Print the object to see what's in there
print(sentence)
这应该打印:
Sentence: "The grass is green ." - 5 Tokens
打印输出告诉我们该句子由5个令牌组成。您可以通过令牌ID或索引访问句子的标记:
# using the token id
print(sentence.get_token(4))
# using the index itself
print(sentence[3])
在两种情况下都应该打印
Token: 4 green
此打印输出包括令牌ID(4)和令牌的词汇值(“绿色”)。您还可以在句子中迭代所有标记。
for token in sentence:
print(token)
这应该打印:
Token: 1 The
Token: 2 grass
Token: 3 is
Token: 4 green
Token: 5 .
在某些用例中,您可能没有将文本标记为已标记化。对于这种情况,我们使用轻量级segtok库添加了一个简单的tokenizer 。
use_tokenizer
在Sentence
使用未加密的字符串实例化时,只需使用该标志:
from flair.data import Sentence
# Make a sentence object by passing an untokenized string and the 'use_tokenizer' flag
sentence = Sentence('The grass is green.', use_tokenizer=True)
# Print the object to see what's in there
print(sentence)
这应该打印:
Sentence: "The grass is green ." - 5 Tokens
A Token
具有语言注释的字段,例如词条,词性标签或命名实体标签。您可以通过指定标记类型和标记值来添加标记。在此示例中,我们将“color”类型的NER标记添加到“green”一词中。这意味着我们已将此单词标记为颜色类型的实体。
# add a tag to a word in the sentence
sentence[3].add_tag('ner', 'color')
# print the sentence with all tags of this type
print(sentence.to_tagged_string())
这应该打印:
The grass is green <color> .
每个标签都是类Label
,其值旁边有一个表示置信度的分数。像这样打印:
from flair.data import Label
tag: 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,因为我们手动添加了它。如果我们的序列标记器预测了标签,则评分值将指示分类器置信度。
A Sentence
可以具有一个或多个标签,例如可以用于文本分类任务。例如,下面的示例显示了我们如何在句子中添加标签“sports”,从而将其标记为属于体育类别。
sentence = Sentence('France is the current world cup winner.')
# add a label to a sentence
sentence.add_label('sports')
# a sentence can also belong to multiple classes
sentence.add_labels(['sports', 'world cup'])
# you can also set the labels while initializing the sentence
sentence = 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。
现在,让我们看看如何使用预先训练的模型标记您的文本。