初学者|还没听过flair吗
- 2019 年 10 月 10 日
- 筆記

本文介绍了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)。
Pytorch NLP框架。框架直接在Pytorch上构建,使得可以轻松地训练自己的模型,并使用Flair嵌入和类来尝试新方法。
GitHub地址:https://github.com/zalandoresearch/flair
实战
1.安装
# 安装环境:官网说目前对linux支持较好,以下为我在winodw上测试环境 # windows 10 # PyTorch 0.4+ # Python 3.6+ # pip install flair
这个库包含两种类型:Sentence和Token, 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:usersyuquanleanaconda3envspython36libsite-packagesgensimutils.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:usersyuquanleanaconda3envspython36libsite-packagesgensimutils.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:usersyuquanleanaconda3envspython36libsite-packagesgensimutils.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
The End