您的位置:首页 > 大数据 > 人工智能

[深度学习工具]基于PyTorch的NLP框架Flair

2019-01-19 15:58 393 查看

 

一个非常简单的框架,用于最先进的NLP。由Zalando Research开发。

Flair简介:

  • 一个功能强大的NLP库。Flair允许您将最先进的自然语言处理(NLP)模型应用于您的文本,例如命名实体识别(NER),词性标注(PoS),意义消歧和分类。

  • 多种语言。感谢Flair社区,我们支持快速增长的语言数量。我们现在还包括“ 一个模型,多种语言 ”标记器,即单个模型,用于预测各种语言的输入文本的PoS或NER标记。

  • 文本嵌入库。Flair具有简单的界面,允许您使用和组合不同的文字和文档嵌入,包括我们提出的Flair嵌入,BERT嵌入和ELMo嵌入。

  • Pytorch NLP框架。我们的框架直接在Pytorch构建,使您可以轻松地训练自己的模型,并使用Flair嵌入和类来尝试新方法。

与现有技术的比较:

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。

快速开始

要求和安装(Windows10 PyTorch==1.0 Python==3.6 测试成功)

该项目基于PyTorch 0.4+和Python 3.6+,因为方法签名和类型提示很漂亮。如果您没有Python 3.6,请先安装它。然后,在您最喜欢的虚拟环境中,只需:

[code]pip install flair
[/code]

示例用法

让我们对一个例句运行命名实体识别(NER)。您需要做的就是创建一个

Sentence
,加载预先训练的模型并使用它来预测句子的标签:

[code]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
目前拥有实体的注解。打印句子以查看标记器找到的内容。

[code]print(sentence)
print('The following NER tags are found:')

# iterate over entities and print
for entity in sentence.get_spans('ner'):
print(entity)

这应该打印:

[code]Sentence: "I love Berlin ." - 4 Tokens

The following NER tags are found:

LOC-span [3]: "Berlin"

教程

我们提供了一套快速教程来帮助您开始使用该库:

这些教程解释了基本NLP类如何工作,如何加载预先训练的模型来标记文本,如何使用不同的单词或文档嵌入嵌入文本,以及如何训练自己的语言模型,序列标记模型和文本分类模型。如果有什么不清楚,请告诉我们。

还有很好的第三方文章和帖子说明了如何使用Flair:

引用天赋

使用Flair时请引用以下文章:

[code]@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:NLP基本类型

这是本教程的第1部分,其中我们将介绍此库中使用的一些基本类型。

创造一个句子

有两种类型的对象是这个库的核心,即

Sentence
Token
对象。A 
Sentence
持有一个文本句子,基本上是一个列表
Token

让我们从

Sentence
为一个例句创建一个对象开始。

[code]# 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)

这应该打印:

[code]Sentence: "The grass is green ." - 5 Tokens

打印输出告诉我们该句子由5个令牌组成。您可以通过令牌ID或索引访问句子的标记:

[code]# using the token id
print(sentence.get_token(4))
# using the index itself
print(sentence[3])

在两种情况下都应该打印

[code]Token: 4 green

此打印输出包括令牌ID(4)和令牌的词汇值(“绿色”)。您还可以在句子中迭代所有标记。

[code]for token in sentence:
print(token)

这应该打印:

[code]Token: 1 The
Token: 2 grass
Token: 3 is
Token: 4 green
Token: 5 .

符号化

在某些用例中,您可能没有将文本标记为已标记化。对于这种情况,我们使用轻量级segtok库添加了一个简单的tokenizer 。

use_tokenizer
Sentence
使用未加密的字符串实例化时,只需使用该标志:

[code]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)

这应该打印:

[code]Sentence: "The grass is green ." - 5 Tokens

将标签添加到令牌

Token
具有语言注释的字段,例如词条,词性标签或命名实体标签。您可以通过指定标记类型和标记值来添加标记。在此示例中,我们将“color”类型的NER标记添加到“green”一词中。这意味着我们已将此单词标记为颜色类型的实体。

[code]# 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())

这应该打印:

[code]The grass is green <color> .

每个标签都是类

Label
,其值旁边有一个表示置信度的分数。像这样打印:

[code]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}"')

这应该打印:

[code]"Token: 4 green" is tagged as "color" with confidence score "1.0"

我们的彩色标签得分为1.0,因为我们手动添加了它。如果我们的序列标记器预测了标签,则评分值将指示分类器置信度。

为句子添加标签

Sentence
可以具有一个或多个标签,例如可以用于文本分类任务。例如,下面的示例显示了我们如何在句子中添加标签“sports”,从而将其标记为属于体育类别。

[code]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
同类产品。所以,你可以像这样打印一个句子的标签:

[code]sentence = Sentence('France is the current world cup winner.', labels=['sports', 'world cup'])

print(sentence)
for label in sentence.labels:
print(label)

这应该打印:

[code]sports (1.0)
world cup (1.0)

这表明该句子属于这两个类,每个类的置信度得分为1.0。

下一个

现在,让我们看看如何使用预先训练的模型标记您的文本。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐