简单易用NLP框架Flair发布新版本!(附教程)

Flair 是 Zalando Research 开发的一款简单易用的 Python NLP 库,近日,Flair 0.4 版发布!

Flair 具备以下特征:

  • 强大的 NLP 库。Flair 允许将当前最优自然语言处理(NLP)模型应用于文本,如命名实体识别(NER)、词性标注(PoS)、词义消歧和分类。

  • 多语言。在 Flair 社区的支持下,该框架支持的语言种类快速增长。目前,Flair 还包括「one model, many languages」tagger,即一个模型可以预测不同语言输入文本的 PoS 或 NER 标记。

  • 文本嵌入库。Flair 的接口简单,允许用户使用和结合不同的词嵌入和文档嵌入,包括 Flair 嵌入、BERT 嵌入和 ELMo 嵌入。

  • 基于 Pytorch 的 NLP 框架。该框架直接在 Pytorch 之上构建,方便用户训练自己的模型,以及使用 Flair 嵌入与类试验新方法。

Flair 0.4 版本集成了更多新模型、大量新语言、实验性多语言模型超参数选择方法、BERT 嵌入和 ELMo 嵌入等。

  • GitHub 链接:https://github.com/zalandoresearch/flair

  • Flair 0.4 版本功能简介:https://github.com/zalandoresearch/flair/releases

Flair 与其他最优方法的对比

Flair 在多项 NLP 任务上优于之前的最优方法:

近日,机器学习工程师 Tadej Magajna 撰文介绍了他使用 Flair 进行文本分类的过程,我们一起来看一下。

文本分类是将句子或文本文档分类为一或多个预定义类别的监督式机器学习方法。它是一种广泛使用的自然语言处理任务,在垃圾邮件过滤、情感分析、新闻篇章分类等问题中发挥重要作用。

目前主要的最优方法主要依赖于文本嵌入。它将文本转换成高维空间中的数值表征,允许文档、句子、单词、字符表示为该高维空间中的向量。

Zalando Research 近期发表的论文《Contextual String Embeddings for Sequence Labeling》提出了一种新方法,它持续优于之前的最优方法。这种方法基于 Flair 实现,并得到 Flair 的全力支持,该方法可用于构建文本分类器。

1. 准备

要安装 Flair,你需要先安装 Python 3.6。Python 3.6 安装指南:https://realpython.com/installing-python/

然后,运行以下命令安装 Flair:

pip install flair

这样就可以安装运行 Flair 所需全部包,包括 PyTorch。

2. 使用预训练分类模型

新发布的 Flair 0.4 版本包括两个预训练模型。一个是在 IMDB 数据集上训练的情感分析模型,另一个是「恶意语言检测」模型(目前仅支持德语)。

使用、下载和存储模型已被集成到一个方法中,这样使用预训练模型的过程更加直接便捷。

要使用情感分析模型,只需运行以下代码:

from flair.models import TextClassifier
from flair.data import Sentence
classifier = TextClassifier.load('en-sentiment')
sentence = Sentence('Flair is pretty neat!')
classifier.predict(sentence)
# print sentence with predicted labels
print('Sentence above is: ', sentence.labels)

第一次运行上述代码时,Flair 会下载该情感分析模型,并默认将其存储到主目录的.flair 子文件夹。该过程需要几分钟时间。

上述代码首先加载所需库,然后将情感分析模型加载到内存中,接下来在 0 到 1 的分数区间中预测句子「Flair is pretty neat!」的情感分数。最后的命令输出是:The sentence above is: [Positive (1.0)]。

现在你可以将代码整合到 REST api 中,这样就可以提供可与谷歌的 Cloud Natural Language API 情感分析相媲美的服务,而后者在应用于大量请求的生产过程中时较为昂贵。

3. 训练自定义文本分类

要训练自定义文本分类器,我们首先需要一个标注数据集。Flair 的分类数据集格式基于 Facebook 的 FastText 格式。该格式需要在每一行的开头用前缀 __label__ 定义一或多个标签。格式如下所示:

__label__<class_1> <text>
__label__<class_2> <text>

本文将基于 Kaggle 的 SMS Spam Detection 数据集用 Flair 构建垃圾邮件分类器。该数据集适合学习,因为它只包含 5572 行,足够小,可以在 CPU 上几分钟内完成模型训练。

该数据集中的 SMS 信息被标注为垃圾(spam)或非垃圾(ham)。

3.1 预处理:构建数据集

首先下载数据集,以获取 spam.csv。然后,在数据集所在目录中运行以下预处理代码段,将数据集分割成训练集、开发集和测试集。

确保你的计算机上安装了 Pandas。如果没有安装,先运行 pip install pandas。

import pandas as pd
data = pd.read_csv("./spam.csv", encoding='latin-1').sample(frac=1).drop_duplicates()
data = data[['v1', 'v2']].rename(columns={"v1":"label", "v2":"text"})

data['label'] = '__label__' + data['label'].astype(str)

data.iloc[0:int(len(data)*0.8)].to_csv('train.csv', sep='\t', index = False, header = False)
data.iloc[int(len(data)*0.8):int(len(data)*0.9)].to_csv('test.csv', sep='\t', index = False, header = False)
data.iloc[int(len(data)*0.9):].to_csv('dev.csv', sep='\t', index = False, header = False);

这样可以移除数据集中的重复项,打乱(shuffle)数据集,按 80/10/10 将数据分割成训练集、开发集和测试集。

运行成功,你会看到 FastText 格式的 train.csv、test.csv 和 dev.csv,可以直接用于 Flair。

3.2 训练自定义文本分类模型

在生成数据集的目录中运行以下代码:

from flair.data_fetcher import NLPTaskDataFetcher
from flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentLSTMEmbeddings
from flair.models import TextClassifier
from flair.trainers import ModelTrainer
from pathlib import Path

corpus = NLPTaskDataFetcher.load_classification_corpus(Path('./'), test_file='train.csv', dev_file='dev.csv', train_file='test.csv')
word_embeddings = [WordEmbeddings('glove'), FlairEmbeddings('news-forward-fast'), FlairEmbeddings('news-backward-fast')]
document_embeddings = DocumentLSTMEmbeddings(word_embeddings, hidden_size=512, reproject_words=True, reproject_words_dimension=256)

classifier = TextClassifier(document_embeddings, label_dictionary=corpus.make_label_dictionary(), multi_label=False)
trainer = ModelTrainer(classifier, corpus)
trainer.train('./', max_epochs=20)

首次运行上述代码时,Flair 将下载所需的全部嵌入模型,这需要几分钟时间。接下来的整个训练过程需要 5 分钟时间。

该代码段先将所需的库和数据集加载到 corpus 对象中。

接下来,我们创建嵌入列表(两个 Flair contextual string 嵌入和一个 GloVe 词嵌入)。然后将该嵌入列表作为文档嵌入对象的输入。堆叠和文档嵌入(stacked and document embedding)是 Flair 中最有趣的概念之一,提供了将不同嵌入结合起来的方法。你可以使用传统词嵌入(如 GloVeword2vec、ELMo)和 Flair contextual string 嵌入。上述例子使用基于 LSTM 的方法结合词嵌入和 contextual string 嵌入,以生成文档嵌入。

详见:https://github.com/zalandoresearch/flair/blob/master/resources/docs/TUTORIAL_5_DOCUMENT_EMBEDDINGS.md

最后,上述代码训练模型输出 final-model.pt 和 best-model.pt 文件,表示存储的训练好的模型。

3.3 使用训练好的模型进行预测

在相同目录中运行以下代码,使用导出的模型生成预测结果:

from flair.models import TextClassifier
from flair.data import Sentence

classifier = TextClassifier.load_from_file('./best-model.pt')
sentence = Sentence('Hi. Yes mum, I will...')
classifier.predict(sentence)
print(sentence.labels)

输出结果是 [ham (1.0)],表示该模型 100% 确定示例信息并非垃圾消息。

参考链接:https://towardsdatascience.com/text-classification-with-state-of-the-art-nlp-library-flair-b541d7add21f

工程Flair自然语言处理PyTorchNLP
5
相关数据
基于Transformer 的双向编码器表征技术

BERT是谷歌发布的基于双向 Transformer的大规模预训练语言模型,该预训练模型能高效抽取文本信息并应用于各种NLP任务,并刷新了 11 项 NLP 任务的当前最优性能记录。BERT的全称是基于Transformer的双向编码器表征,其中“双向”表示模型在处理某一个词时,它能同时利用前面的词和后面的词两部分信息。

词义消歧技术

在计算机语言学, 词义消歧(WSD) 是一个自然语言处理和本体论的开放问题 。 歧义与消歧是自然语言理解中最核心的问题,在词义、句义、篇章含义层次都会出现语言根据上下文语义不同的现象,消歧即指根据上下文确定对象语义的过程。 词义消歧即在词语层次上的语义消歧。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

GloVe技术

Stanford开发的用于词向量表示的一个库/工具

词嵌入技术

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

分类数据技术

一种特征,拥有一组离散的可能值。以某个名为 house style 的分类特征为例,该特征拥有一组离散的可能值(共三个),即 Tudor, ranch, colonial。通过将 house style 表示成分类数据,相应模型可以学习 Tudor、ranch 和 colonial 分别对房价的影响。 有时,离散集中的值是互斥的,只能将其中一个值应用于指定样本。例如,car maker 分类特征可能只允许一个样本有一个值 (Toyota)。在其他情况下,则可以应用多个值。一辆车可能会被喷涂多种不同的颜色,因此,car color 分类特征可能会允许单个样本具有多个值(例如 red 和 white)。

文本分类技术

该技术可被用于理解、组织和分类结构化或非结构化文本文档。文本挖掘所使用的模型有词袋(BOW)模型、语言模型(ngram)和主题模型。隐马尔可夫模型通常用于词性标注(POS)。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

词性标注技术

词性标注是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或其他词性的过程。

命名实体识别技术

命名实体识别(NER)是信息提取(Information Extraction)的一个子任务,主要涉及如何从文本中提取命名实体并将其分类至事先划定好的类别,如在招聘信息中提取具体招聘公司、岗位和工作地点的信息,并将其分别归纳至公司、岗位和地点的类别下。命名实体识别往往先将整句拆解为词语并对每个词语进行此行标注,根据习得的规则对词语进行判别。这项任务的关键在于对未知实体的识别。基于此,命名实体识别的主要思想在于根据现有实例的特征总结识别和分类规则。这些方法可以被分为有监督(supervised)、半监督(semi-supervised)和无监督(unsupervised)三类。有监督学习包括隐形马科夫模型(HMM)、决策树、最大熵模型(ME)、支持向量机(SVM)和条件随机场(CRF)。这些方法主要是读取注释语料库,记忆实例并进行学习,根据这些例子的特征生成针对某一种实例的识别规则。

word2vec技术

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。 训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。 Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。该算法渐渐被其他人所分析和解释。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

语言模型技术

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

暂无评论
暂无评论~