如何使用Flair创建一个NLP应用程序

345 阅读13分钟

如何使用Flair创建一个NLP应用程序

Flair是一个简单的自然语言处理(NLP)库,由Zalando Research开发并开放源代码。它被用来构建用于文本分类和语音识别的机器学习模型。

Flair可用于建立语言翻译应用和语音识别中使用的模型。它还能将语音转换为文本,反之亦然。

Flair有一个简单的界面,允许你使用和组合不同的词和界面。

在本教程中,我们将讨论Flair的基础知识,然后为文本分类建立一个简单的自然语言处理模型。

前提条件

  1. 你必须有良好的[Python]和[机器学习建模]知识
  2. 你需要在你的机器上安装Python。
  3. 你必须对[Pandas]和[Numpy]有一些了解。

在本教程中,我们将使用Google Colab 来建立我们的模型。

注意:所使用的数据集是一个冒犯性和非冒犯性词语的集合。

如何安装Flair

由于我们使用的是谷歌Colab,所以使用以下命令来安装Flair。

pip install flair

加载Flair包

为了将Flair加载到我们的Colab中,我们使用以下命令。

import flair

探索Flair

探索Flair使我们能够看到可用的方法和属性。这些组件用于建立我们的文本分类模型。

我们使用下面的命令来做这件事。

dir(flair)

输出可用的方法和属性。

['AnnealOnPlateau',
 'Path',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '__version__',
 'cache_root',
 'data',
 'datasets',
 'device',
 'embedding_storage_mode',
 'embeddings',
 'file_utils',
 'logger',
 'logging',
 'models',
 'nn',
 'optim',
 'os',
 'tokenization',
 'torch',
 'trainers',
 'training_utils',
 'visual']

上面显示的方法,如embeddings,data,models, 和trainers ,将被用于建立我们的模型。

embeddings- 我们使用这种方法来进行词嵌入。models- 我们用这个方法来指定我们要建立的模型的类型。trainers- 这个方法被用来训练我们的模型。

对于数据准备,我们需要导入探索性数据分析包(EDA)。

导入探索性数据分析(EDA)包

EDA包包括[Pandas]和[Numpy]。

Pandas 是一个快速、强大、灵活和易于使用的开源数据分析和操作工具。

Numpy和Pandas将被用来读取和分析我们的数据。

让我们把pandasnumpy 到我们的Colab中。

import pandas as pd
import numpy as np

数据集

所用的[数据集]包括一个冒犯性和非冒犯性的词语集合。这个数据集被用来训练我们的模型,预测一个文本是否具有攻击性。

请从上面的链接中下载数据集,并将下载的文件重命名为offensive_and_non_offensive_dataset.csv

使用Pandas来读取数据集

我们将使用Pandas 来读取我们的数据集并将其加载到我们的工作目录中,如下图所示。

df = pd.read_csv("offensive_and_non_offensive_dataset.csv")

为了查看我们的数据集的结构(行和列),我们使用下面的命令。

df.head()

df.head() 命令返回我们数据集的前五行,如下图所示。

Dataset structure

检查值的数量

这将使我们能够检查我们的数据集中所有可用的冒犯性和非冒犯性词语的集合。

df['class'].value_counts()

输出结果。

1    3850
0     821
Name: class, dtype: int64

在我们的数据集中,总共有3850 冒犯性词语和821 非冒犯性词语。

格式化我们的CSV文件

为了使用我们的数据集进行文本分类,我们首先需要将数据集重新格式化为CSV 格式。这使得它易于理解和使用。

我们首先检查我们的数据集中的可用列。数据集是由三列组成的。clean_tweet,classlabels

  • clean_tweet 列是我们数据集中的实际文本。
  • class 列表示0 ,表明该词是非攻击性的,1 表示攻击性的词。
  • labels 列表示两个标签,进攻性和非进攻性。这就是预测过程中的实际输出。

下面的命令将显示我们数据集中的列。

df.columns

输出结果显示。

Index(['Unnamed: 0', 'clean_tweet', 'class', 'labels'], dtype='object')

Dataset Columns

删除一列

我们必须通过删除我们不需要的列来格式化我们的数据。这可以确保我们的模型在训练过程中使用的是正确的数据集。

使用下面的命令来删除class 列。

df1 = df[['clean_tweet','labels']]

数据集将只保留两列:clean_tweetlabels ,如图所示。

Remaining columns

重命名列

我们必须将剩下的两列重命名为简单的名字,以便于理解和使用。

df1.columns  = ['text','labels']

新的列名将是textlabels ,如下图所示。

New Columns

分割数据集

在本节中,我们将数据集分成三部分。Train set,test set, 和validation/dev set

  1. 培训集它是在学习和培训过程中使用的。在我们的案例中,我们将使用60% 的数据作为训练集。

  2. 测试集它被用来衡量我们模型的性能和评估我们是如何训练它的。我们将使用20% 的数据作为测试集。

  3. 验证/开发集这是用于优化我们模型性能的数据集。我们将使用20% 的数据作为开发集。

我们将使用Pandas来分割我们的数据集。这使得我们在分割数据集时可以进行数学运算。

Pandas允许我们指定正确的百分比来分割我们的三个数据集。

如下图所示,我们使用split() 方法,并传递数据分割的比例。

train,test,dev = np.split(df1,[int(.6*len(df1)),int(.8*len(df1))])

上述命令允许我们将数据集分成三份,其中60%的数据集是训练集,20%将是测试集,剩下的20%将是设计集。

检查训练集、测试集和开发集

分割后,我们需要检查这三个数据集的大小。

print(df1.shape)
print(train.shape)
print(test.shape)
print(dev.shape)

这可以让我们看到我们的训练集、测试集和开发集的大小。

输出结果突出显示在下面。

(4671, 2)
(2802, 2)
(934, 2)
(935, 2)

在上面的输出中,我们的数据集有4671 字。如果我们把它分成训练集、测试集和开发集,那么训练集将有总共2802 ,测试集将有934 ,而开发集将有935

该数据集有2 列,如图所示。

将数据分成三组后,你需要将数据存储在一个文件夹中。

创建一个文件夹

让我们创建一个文件夹,在那里我们可以存储我们的三组数据。由于我们使用的是谷歌Colab,以下命令将为我们创建一个名为data_fst 的文件夹。

mkdir -p data_fst

然后,我们需要将这三组数据保存到创建的文件夹中。这些数据集将以CSV格式保存。

train.to_csv("data_fst/train.csv")
test.to_csv("data_fst/test.csv")
dev.to_csv("data_fst/dev.csv")

建立语料库

语料库是一组大型的、结构化的机器可读文本的集合,它代表了用于建立模型的数据集。

它由对应于训练、测试和验证数据集的句子列表组成。

它是任何NLP相关应用的最关键和最基本的构建块。它为我们提供了用于建立NLP应用的定量数据。我们还可以使用部分数据来测试和挑战我们对一种语言的想法和直觉。

在本节中,我们将使用CSVClassificationCorpusCSVClassificationCorpus ,允许我们使用本教程中早期创建的CSV文件格式建立语料库。

我们首先导入CorpusCSVClassificationCorpus

import CSVClassificationCorpus from flair.datasets
import Corpus from flair.data

然后我们创建列映射以显示哪一列是标签和文本。如前所示,我们的CSV数据集有两列:labelstext

我们使用以下命令将第一列映射为'标签_主题',第二列映射为'文本'"

column_name_map = {2:"label_topic",1:"text"}

映射列名将提高我们建立模型时的效率,因为模型将知道哪一列作为label ,哪一列作为feature

我们现在需要指定我们的数据集的位置。

data_folder = 'data_fst/'

我们现在可以使用CSVClassificationCorpus 来创建我们的语料库。由于我们使用的是CSV文件格式,我们将我们的delimiter 指定为,

corpus_csv: Corpus = CSVClassificationCorpus(data_folder,column_name_map=column_name_map,skip_header=True,delimiter=',')

我们的输出如图所示。

2021-08-08 14:34:26,410 Reading data from data
2021-08-08 14:34:26,414 Train: data_fst/train.csv
2021-08-08 14:34:26,416 Dev: data_fst/dev.csv
2021-08-08 14:34:26,417 Test: data_fst/test.csv

创建标签字典

标签使我们的模型在进行预测时能够理解可能的输出。它通过识别文本和添加有意义的信息来提供背景,机器学习模型可以从中学习。

我们使用make_label_dictionary() 方法来制作我们的标签字典。我们的数据集中的两个标签是offensivenon_offensive

label_dict_csv = corpus_csv.make_label_dictionary()

输出结果如图所示。

2021-08-08 14:35:29,419 Computing label dictionary. Progress:
100%|██████████| 3736/3736 [00:02<00:00, 1383.38it/s]2020-10-04 13:59:46,550 [b'offensive', b'non_offensive']

带有Flair的词嵌入

词嵌入提供了不同的方法和功能,使我们能够以不同的方式组合单词和文档。

在本教程中,词嵌入将帮助我们建立作为系统输入的特征。

我们将使用FlairEmbeddingsWordEmbeddings ,和DocumentLSTMEmbeddings ,因为它们相当强大。它们都使用一个词的语法和语义信息。

让我们来导入它们。

from flair.embeddings import FlairEmbeddings,WordEmbeddings,DocumentLSTMEmbeddings

在导入各种嵌入类型后,我们现在可以使用它们来创建我们的词嵌入。我们将把我们的嵌入器命名为word_embeddings ,并使用FlairEmbeddings 来创建它。

word_embeddings = [FlairEmbeddings('news-forward-fast'),FlairEmbeddings('news-backward-fast')]

这将下载我们的预训练的FlairEmbeddings ,这将在建立我们的分类模型时使用,如下图所示。

2021-08-08 14:40:32,332 https://flair.informatik.hu-berlin.de/resources/embeddings/flair/lm-news-english-forward-1024-v0.2rc.pt not found in cache, downloading to /tmp/tmpoq0qzh98
100%|██████████| 19689779/19689779 [00:00<00:00, 37035937.62B/s]2021-08-08 14:40:32,930 copying /tmp/tmpoq0qzh98 to cache at /root/.flair/embeddings/lm-news-english-forward-1024-v0.2rc.pt
2021-08-08 14:40:32,977 removing temp file /tmp/tmpoq0qzh98

2021-08-08 13:40:10,619 https://flair.informatik.hu-berlin.de/resources/embeddings/flair/lm-news-english-backward-1024-v0.2rc.pt not found in cache, downloading to /tmp/tmpr4dnpuah
100%|██████████| 19689779/19689779 [00:00<00:00, 36642750.83B/s]2021-08-08 13:40:11,225 copying /tmp/tmpr4dnpuah to cache at /root/.flair/embeddings/lm-news-english-backward-1024-v0.2rc.pt
2021-08-08 14:40:52,255 removing temp file /tmp/tmpr4dnpuah

在执行FlairEmbeddings ,也就是嵌入单个单词之后,我们现在使用DocumentEmbeddings ,嵌入整个文本或句子。

为了执行DocumentEmbedding ,我们使用DocumentRNNEmbeddings ,它为我们提供了一种更复杂的嵌入整个句子的方法。

DocumentRNNEmbeddings 提供额外的参数,如 , 和 。它确保每个句子都被分析。hidden_size reproject_words``reproject_words_dimension

这些嵌入在一个句子的所有单词上运行一个RNN 。然后它使用RNN 的最终状态作为整个文档的嵌入。

要使用DocumentRNNEmbeddings ,你需要通过向它解析一个token embeddings 的列表来初始化它们。

document_embeddings = DocumentRNNEmbeddingss(word_embeddings,hidden_size=512,reproject_words=True,reproject_words_dimension=256)

在我们执行了FlairEmbeddingsDocumentEmbeddings ,我们现在可以开始建立和训练我们的模型。

构建和训练模型

在这一部分,我们开始使用处理过的数据建立我们的模型,并进行预测。

首先,我们开始从Flair导入我们的自然语言处理工具。

from flair.models import TextClassifier
from flair.trainers import ModelTrainer

TextClassifier 将被用来建立我们的模型,以便它能够进行文本分类。

ModelTrainer 是用于训练我们的模型的一个重要软件包。

在导入这两个包之后,我们现在可以将我们的TextClassifier模型初始化为clf ,并将我们创建的document_embedingslabel_dictionary 作为参数传给我们,用于创建文本分类器模型。

clf = TextClassifier(document_embeddings,label_dictionary=label_dict_csv)

现在让我们初始化我们的ModelTrainer 方法。

训练我们的模型

我们使用导入的ModelTrainer 包和我们创建的corpus_csv 数据集,将我们的模型初始化为trainer

trainer = ModelTrainer(clf,corpus_csv)

我们使用我们在本教程早期创建的corpus_csv ,训练我们的模型。我们可以添加number of epochs ,在其中训练我们的模型。

我们将指定epochs的数量为2 。Flair将在训练期间对我们的数据集进行两次迭代。

trainer.train('data_fst/',max_epochs=2)

我们使用train() 方法来训练我们的模型,同时指定我们在data_fst 文件夹中存储我们的模型。它应该是我们的数据集所在的同一位置。

two epochs之后,我们将训练好我们的模型,它将以.pt 为扩展名保存,这个文件就是我们要用来进行预测的。

使用我们的模型进行预测

Data model.

如上所示,我们有两个保存的模型:best-model.ptfinal-model.pt ,我们将使用best-model.pt 来进行预测。

为了开始进行预测,我们必须指定我们将使用哪个模型。让我们使用load() 方法加载我们的最佳模型。

new_clf = TextClassifier.load('data_fst/best-model.pt')

输出如图所示。

2021-08-08 16:19:05,861 loading file data_fst/best-model.pt

在加载我们的模型后,我们可以开始进行预测。我们通过导入我们希望预测的句子来完成这一工作。

from flair.data import Sentence

创建一个样本句子

让我们创建样本句子,我们希望我们的模型能将其归类为offensivenon-offensive

pred1 = Sentence("That girl is stupid")
pred2 = Sentence("This is a good material")

应用我们的模型来进行预测

我们必须应用我们的new_clf ,该模型被保存为最佳模型,以进行预测,然后使用predict() 方法。

new_clf.predict(pred1)

下面的命令将预测标记的输出是offensive 还是non_offensive

pred1.labels

其输出结果如图所示。

[offensive (0.8136)]

在第一个例子中,输出是进攻性的。

让我们试着预测第二个句子的输出,看看它的输出。

new_clf.predict(pred2)
pred2.labels

输出结果如图所示。

[non_offensive (0.8278)]

在第二个例子中,输出结果为非攻击性。

经过这两次测试,我们可以看到,我们的模型给出的预测准确率为0.8136和0.8278。这意味着我们的模型训练有素。

总结

本教程对任何有兴趣使用Flair探索自然语言处理的人都有帮助。在本教程中,我们首先探索了Flair,它是一个很好的自然语言处理软件包。.

然后,我们将数据集准备成CSV格式,以便我们的模型可以轻松使用。这有助于数据处理,然后我们将数据分成三组:测试组、训练组和开发组。

最后,我们训练了我们的模型并做出了准确的预测。