本文先容了flair的利用方法,Flair是最近开源的一个基于Pytorch的NLP框架,它是一个功能强大的NLP库。
Flair许可您将最前辈的自然措辞处理(NLP)模型运用于文本,例如命名实体识别(NER),词性标注(PoS),意义消歧和分类。

简介

Flair是最近开源的一个基于Pytorch的NLP框架,据官方github先容,它具有以下特点:

一个功能强大的NLP库。
Flair许可您将最前辈的自然措辞处理(NLP)模型运用于您的文本,例如命名实体识别(NER),词性标注(PoS),意义消歧和分类。

文本嵌入库。
Flair具有大略的界面,许可您利用和组合不同的单词和文档嵌入,包括作者提出的高下笔墨符串嵌入(文章:COLING2018-Contextual String Embeddings for Sequence Labeling)。

初学者  还没听过flair吗

Pytorch NLP框架。
框架直接在Pytorch上构建,使得可以轻松地演习自己的模型,并利用Flair嵌入和类来考试测验新方法。

GitHub地址:https://github.com/zalandoresearch/flair

实战

1.安装

# 安装环境:官网说目前对linux支持较好,以下为我在winodw上测试环境

# windows 10

# PyTorch 0.4+

# Python 3.6+

# pip install flair

这个库包含两种类型:SentenceToken, Sentence类型包含我们想要处理的一个句,是Token类型的凑集:

from flair.data import Sentence

sentence = Sentence('The grass is green .')

# 输出显示这个句子由5个Token组成

print(sentence)

Sentence: \"大众The grass is green .\"大众 - 5 Tokens

可以通过Token ID或其索引访问句子的Token:

# 利用 token id

print(sentence.get_token(4))

# 利用索引

print(sentence[3])

Token: 4 green

Token: 4 green

# 迭代输出token

for token in sentence:

print(token)

Token: 1 The

Token: 2 grass

Token: 3 is

Token: 4 green

Token: 5 .

Tokenization:一些情形下,文本未Tokenization

from flair.data import Sentence

# 设置use_tokenizer参数

sentence = Sentence('The grass is green.', use_tokenizer=True)

print(sentence)

Sentence: \"大众The grass is green .\公众 - 5 Tokens

Adding Tags to Tokens(为token打标签)

# token具有用于措辞注释的字段,如lemmas、词性标记或命名实体标记。
可以通过指定标签类型和标签值来添加标签。

# 给句子中某个词加标签

sentence[3].add_tag('ner', 'color')

# 可以看到,输出green后面带有命名实体标签'color'

print(sentence.to_tagged_string())

The grass is green <color> .

Adding Labels to Sentences(给句子打标签)

# 句子可以具有一个或多个标签,例如,这些标签可用于文本分类任务。

sentence = Sentence('France is the current world cup winner.')

# 给句子增加一个sports标签

sentence.add_label('sports')

print(sentence.labels)

[sports (1.0)]

# 给句子增加多个标签

sentence = Sentence('France is the current world cup winner.')

sentence.add_labels(['sports', 'world cup'])

print(sentence.labels)

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

2.利用词向量教程

# Flair供应了很多Class,可以通过很多方法得到词/句子嵌入。
词嵌入类都继续自TokenEmbeddings类,并实现embed()方法,您须要调用该方法来嵌入文本。

# 天生的所有嵌入都是Pytorch向量,因此它们可以立即用于演习和微调。

# 经典的词嵌入是静态的和单词级的,这意味着每个不同的单词只能得到一个预先打算的嵌入。
大多数词嵌入都属于这一类,包括盛行的GloVe或Komnios嵌入。

# 高下笔墨符嵌入是一类强大的词嵌入,能够更好的捕获潜在的语法语义信息。

# Stacked Embeddings(堆叠嵌入)是此库中最主要的观点之一。
您可以利用它们将不同的嵌入组合在一起。

Classic Word Embeddings

from flair.embeddings import WordEmbeddings

# c:\users\yuquanle\anaconda3\envs\python36\lib\site-packages\gensim\utils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warnings.warn(\"大众detected Windows; aliasing chunkize to chunkize_serial\公众)

# 载入glove词向量,须要下载预演习模型(我网速太差好久没下载下来)

# glove_embedding = WordEmbeddings('glove')

# 转换在Glove官网下载的词向量

# 看这里:https://github.com/zalandoresearch/flair/issues/4

import gensim

vectors = gensim.models.KeyedVectors.load_word2vec_format('wiki-news-300d-1M.vec', binary=False)

vectors.save('fasttext_gensim')

# 载入转换后的glove词向量

embeddings = WordEmbeddings('fasttext_gensim')

from flair.data import Sentence

sentence = Sentence('the grass is green .')

for token in sentence:

print(token)

print(token.embedding)

# c:\users\yuquanle\anaconda3\envs\python36\lib\site-packages\gensim\utils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warnings.warn(\公众detected Windows; aliasing chunkize to chunkize_serial\公众)

Contextual String Embeddings

from flair.embeddings import CharLMEmbeddings

charlm_embedding_forward = CharLMEmbeddings('news-forward-fast')

sentence = Sentence('The grass is green .')

# charlm_embedding_forward.embed(sentence)

for token in sentence:

print(token)

print(token.embedding)

Token: 1 The

tensor([ 0.0021, -0.0000, -0.0057, ..., -0.0000, -0.0001, 0.0163])

Token: 2 grass

tensor([-0.0009, -0.0000, 0.0248, ..., -0.0000, 0.0006, 0.0057])

Token: 3 is

tensor([ 0.0018, -0.0002, 0.0298, ..., -0.0000, 0.0000, 0.0003])

Token: 4 green

tensor([-0.0004, -0.0000, 0.0046, ..., -0.0000, -0.0001, 0.0345])

Token: 5 .

tensor([ 0.0008, -0.0000, 0.0050, ..., -0.0000, -0.0000, 0.0021])

Character Embeddings

from flair.embeddings import CharacterEmbeddings

embedding = CharacterEmbeddings()

sentence = Sentence('The grass is green .')

for token in sentence:

print(token)

print(token.embedding)

Stacked Embeddings

from flair.embeddings import WordEmbeddings, CharLMEmbeddings

# c:\users\yuquanle\anaconda3\envs\python36\lib\site-packages\gensim\utils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warnings.warn(\公众detected Windows; aliasing chunkize to chunkize_serial\"大众)

# init GloVe embedding

glove_embedding = WordEmbeddings('fasttext_gensim')

# init CharLM embeddings

charlm_embedding_forward = CharLMEmbeddings('news-forward')

#charlm_embedding_backward = CharLMEmbeddings('news-backward')

from flair.embeddings import StackedEmbeddings

stacked_embeddings = StackedEmbeddings(

embeddings=[glove_embedding, charlm_embedding_forward])

for token in sentence:

print(token)

print(token.embedding)

flair工具是非常强大的,如果想更多的理解用法,github上有更多的教程,包括:

代码已上传:1.https://github.com/yuquanle/StudyForNLP/blob/master/NLPtools/FlairDemo1.ipynb

2.https://github.com/yuquanle/StudyForNLP/blob/master/NLPtools/FlairDemo3.ipynb