介绍

文本分类是一种监督机器学习方法,用于将句子或文本文档归类为一个或多个已定义好的类别。它是一个被广泛应用的自然语言处理方法,在垃圾邮件过滤、情感分析、新闻稿件分类以及与许多其它业务相关的问题中发挥着重要作用。

目前绝大多数最先进的方法都依赖于一种被称为文本嵌入的技术。它将文本转换成高维空间中的数值表示方式。它可以将文档、语句、单词、字符(取决于我们所嵌入的形式)表示为这个高维空间中的一个向量。

Flair之所以对NLP来说是一个令人兴奋的消息,是因为Zalando Research最近发表的一篇论文《Contextual String Embeddings for Sequence Labelling(用于序列标注的上下文相关字符串的嵌入)》,其中涵盖了一种始终优于以前最先进方案的方法。该算法在Flair中得到了完整的支持和实现,可以用来构建文本分类器。

1、准备

安装Flair需要Python 3.6,如果你还没有,请点击这里查看安装向导。然后执行pip命令安装即可:

pip install flair

上面的命令将安装运行Flair所需的所有依赖包,当然也包括了PyTorch。

2、使用一个预训练的分类模型

最新的0.4版本包含了两个预训练的模型,还有一个基于IMDB数据集上训练的情感分析模型和“攻击性语言检测”模型(当前仅支持德语)。

使用、下载和存储模型都被整合到了一个单一的方法中,这使得使用预训练模型的整个过程都非常简单。

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

fromflair.models import TextClassifier
from flair.data import Sentenceclassifier = 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将下载情感分析模型,默认情况下将其存储到home目录下的.flair子目录中,这大概得需要几分钟。

上面的代码首先加载必需的库,然后将情感分析模型加载到内存中(必要时先进行下载),接下来可以预测句子“Flair is pretty neat!”的情感数值,按0到1的区间赋值。最后命令的输出结果是:

The sentence above is: [Positive (1.0)]

就是这么简单!例如,现在你可以将上述代码合并在一个REST API中,并提供一个与Google的云自然语言API的情感分析类似的服务,当在有大量请求的生产环境中使用时,这种分析的成本将会非常的高。

3、训练一个自定义文本分类器

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

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

在本文中,我们将利用Kaggle的Spam Detection数据集通过Flair构建一个垃圾/非垃圾的分类器。这个数据集比较适合我们的学习任务,因为它足够小,并且仅包含5572行的数据,可以在一个CPU上只花几分钟就可以完成一个模型的训练。

3.1 预处理-构建数据集

我们首先从Kaggle上的这个链接下载数据集来获得spam.csv文件。然后,在与数据集相同的目录中,我们运行下面的预处理代码片段,该代码将执行一些预处理,并将数据集拆分为训练集、开发集和测试集三个部分。

确保安装了Pandas。如果还没有,请先运行命令:

pip install pandasimport 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);

上面的代码将从数据集中删除一些重复数据,并对其进行无序处理(随机化行),并按照80/10/10的比例将数据拆分为训练集、开发集和测试集。

如果运行成功,你将会得到FastText格式的三个数据文件:train.csv、test.csv和dev.csv,它们可以与Flair一起使用。

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

请在生成数据集的目录中运行以下代码片段用以训练模型:

fromflair.data_fetcher import NLPTaskDataFetcher
from flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentLSTMEmbeddings
from flair.models import TextClassifier
from flair.trainers import ModelTrainer
from pathlib import Pathcorpus = NLPTaskDataFetcher.load_classification_corpus(Path('./'), test_file='test.csv', dev_file='dev.csv', train_file='train.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=10)

第一次运行上述代码时,Flair将会自动下载需要的所有嵌入模型,这可能需要几分钟,然后接下来的整个培训过程还需要大约5分钟。

程序首先将所需的库和数据集加载到一个corpus对象中。

接下来,我们创建一个嵌入列表,包含两个Flair上下文的字符串嵌入和一个GloVe单词嵌入。然后将此列表作为文档嵌入对象的输入。堆叠和文档嵌入是Flair中最有趣的概念之一,提供了将不同的嵌入整合在一起的方法。你可以同时使用传统的单词嵌入(如GloVe, word2vec, ELMo)和Flair上下文的字符串嵌入。在上面的例子中,我们使用了一种基于LSTM(Long Short-Term Memory,长短期记忆网络)的方法,将单词和上下文的字符串嵌入结合起来以生成文档嵌入。想要了解更多,请点击这里。

最后,上述代码进行模型训练并生成了final-model.pt和best-model.pt两个文件,它们表示我们存储的训练模型。

3.3 用训练过的模型进行预测

我们现在可以从同一目录通过运行以下代码,使用导出的模型来生成预测结果:

fromflair.models import TextClassifier
from flair.data import Sentenceclassifier = TextClassifier.load_from_file('./best-model.pt')sentence = Sentence('Hi. Yes mum, I will...')classifier.predict(sentence)print(sentence.labels)

这段代码会输出“[ham(1.0)]”,这意味着该模型100%确定我们的示例消息不是垃圾邮件。

与其它框架相比表现如何?

与Facebook的FastText甚至谷歌的AutoML自然语言平台不同,使用Flair进行文本分类仍然是一项底层的工作。我们可以通过设置诸如学习率、批量大小、退火因子(anneal factor)、损失函数、优化选择等参数来完全控制文本嵌入和训练的方式…为了获得最佳表现,需要调整这些超参数。Flair为我们提供了一个有名的超参数调优库Hyperopt的封装器,我们可以使用它来对超参数进行调优以获得最佳的性能。

在本文中,为了简单起见,我们使用了默认的超参数。在大多数默认参数下,我们的Flair模型在10个训练周期后获得了0.973的f1-score。

为了进行对比,我们使用FastText和AutoML自然语言平台训练了一个文本分类模型。首先我们使用默认参数运行FastText,并获得了0.883的f1-score,这意味着模型在很大程度上优于FastText。然而,FastText只需要几秒钟的训练时间,而我们训练的Flair模型则需要5分钟。

我们将结果与在谷歌的AutoML自然语言平台上获得的结果进行了比较。平台首先需要20分钟来解析数据集。之后,我们开始了训练过程,这几乎花了3个小时完成,但却获得了99.211的f1-score——这比我们自己训练的模型稍微好一点。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

用最新NLP库Flair做文本分类 1相关推荐

  1. 用最新NLP库Flair做文本分类

    摘要: Flair是一个基于PyTorch构建的NLP开发包,它在解决命名实体识别(NER).部分语音标注(PoS).语义消歧和文本分类等NLP问题达到了当前的最高水准.它是一个建立在PyTorch之 ...

  2. Flair实战文本分类

    2019独角兽企业重金招聘Python工程师标准>>> Flair是一个基于PyTorch构建的NLP开发包,它在解决命名实体识别(NER).语句标注(POS).文本分类等NLP问题 ...

  3. bert使用做文本分类_使用BERT进行深度学习的多类文本分类

    bert使用做文本分类 Most of the researchers submit their research papers to academic conference because its ...

  4. NLP实战-中文新闻文本分类

    目录 1.思路 2.基于paddle的ERINE模型进行迁移学习训练 3.分步实现 3.1 获取数据 (1)数据解压 (2)将文本转成变量,这里为了好计算,我只选了新闻标题做文本分类 3.2 中文分词 ...

  5. Word Averaging模型做文本分类 稳定效果好模型简单

    利用WORDAVG模型做文本分类   模型简单 效果号 简单思想就是  将每个词向量在 句子维度进行求平均  可以用avgpool来做平均池化 然后用平均后的向量作为句子向量 进行文本分类 后面我们还 ...

  6. bert模型可以做文本主题识别吗_GitHub - jkszw2014/TextClassify_with_BERT: 使用BERT模型做文本分类;面向工业用途...

    TextClassify_with_BERT 使用BERT模型做文本分类:面向工业用途 自己研究了当前开源的使用BERT做文本分类的许多存储库,各有各的缺点.通病就是面向学术,不考虑实际应用. 使用t ...

  7. 使用CNN做文本分类——将图像2维卷积换成1维

    使用CNN做文本分类from __future__ importdivision, print_function, absolute_importimporttensorflow as tfimpor ...

  8. tf第十二讲:TextCNN做文本分类的实战代码

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  9. 贝叶斯分类器做文本分类案例

    贝叶斯分类器做文本分类 文本分类是现代机器学习应用中的一大模块,更是自然语言处理的基础之一.我们可以通过将文字数据处理成数字数据,然后使用贝叶斯来帮助我们判断一段话,或者一篇文章中的主题分类,感情倾向 ...

最新文章

  1. 创业公司如何巧用工具提高团队生产力——豌豆荚创始人王俊煜讲述团队背后的“利器”...
  2. Cordova应用的JavaScript代码和自定义插件代码的调试
  3. mysql性能调整三板斧
  4. C# socket nat 映射 网络 代理 转发
  5. delphi.指针.应用----应用重要 多看 多练
  6. Fastjson反序列化泛型类型时候的一个问题
  7. 移动端touch事件的处理
  8. CSDN Markdown 文本居中、右对齐、左对齐
  9. mybatis generator 中文注释_Mybatis提供的逆向工程
  10. 凌云ERP解析企业如何选择合适的ERP系统
  11. 单元三:阻抗匹配(电容电感,变压器,传输线变压器,附带硬件电路)
  12. JAVA我的世界怎么做成就_我的世界:又一人解锁100%成就!这几项公认最难任务,你能完成吗...
  13. 小程序源码:笑话段子手-多玩法安装简单
  14. OSPF中LSA相关内容
  15. 应届生什么专业方向就业面广?
  16. 手游联运平台是什么?
  17. 怎么用计算机算出出生日期,算农历出生日期计算器,根据出生日期怎么算年龄?...
  18. 分享:实时语音通讯,可广域网实时通讯,音质清晰流畅!
  19. 操作系统的发展历程及linux的发展
  20. “链上政务”三管齐下,效率、监管、企业服务成关键词

热门文章

  1. python类实例覆盖_避免类实例覆盖默认值
  2. python判断密码强度_python实现密码强度校验
  3. python123数值运算_python123中 Hello World的条件输出 和数值运算
  4. mysql scws_apache+mysql+php+scws+myft_scws编译安装全程记录
  5. python 10个100以内随机整数编辑_你要偷偷的学Python,然后惊呆所有人(第五天) - python阿喵
  6. redis一般缓存什么样数据_SpringBoot+Redis轻松实现数据缓存
  7. 计算机校本培训心得,个人校本培训心得体会3篇
  8. 旋转矩阵公式生成器_坐标变换(8)—复特征值与旋转
  9. 年仅26岁!这位双一流大学的特任教授,攻克世界数学难题
  10. 比欧拉公式更美的公式!