精华内容
下载资源
问答
  • 深度学习的多标签文本分类 该存储库是我的研究项目,也是对TensorFlow,深度学习(Fasttext,CNN,LSTM等)的研究。 该项目的主要目的是解决基于深度神经网络的多标签文本分类问题。 因此,根据这种问题的特征,...
  • 文本分类作为自然语言处理中一个基本任务,在20世纪50年代就已经对其算法进行了研究,现在单标签文本分类算法已经趋向成熟,但是对于多标签文本分类的研究还有很大的提升空间。介绍了多标签文本分类的基本概念以及...
  •      基于标签语义注意力的多标签...传统的多标签文本分类算法将标签视为没有语义信息的符号,然 而,在许多情况下,文本的标签是具有特定语义的,标签的语义信息和文档的内容信息是有对应关系的

    多标签文本分类研究进展概述

    1.多标签文本分类的研究还有很大的提升空间.

    2.多标签文本分类的基本流程,包括数据集获取、文本预处理、模型训练和预测结果;

    3.多标签文本分类的方法:传统机器学习的方法和基于深度学习的方法。传统机器学习方法主要包括问题转换方法和算法自适应方法。基于深度学习的方法是利用各种神经网络模型来处理多标签文本分类问题,根据模型结构,将其分为基于 CNN 结构、基于 RNN 结构和基于 Transformer 结构的多标签文本分类方法;

    4.未来的发展趋势进行了分析与展望。

    多标签文本分类定义

           一个样本与多个类别的标签相关,同时类别标签之间存在一定的依赖关系,称为多标签文本分类。

    多标签文本分类的任务

    将一个待分类的文本通过特定的分类器对该文本给定多个标签。假 定D={(xi,yi)}是训练集中的样本,利用设计的模型学习到一个映射f:X->Y,其中xi∈X,yi∈Y是实例 xi所对应的类别标签。该映射如图 1 来所示。
    在这里插入图片描述

    多标签文本分类的流程

           多标签文本分类的具体流程包括数据集获取、文本预处理、模型训练和预测结果,如图 2 所示。
    在这里插入图片描述
    (1)数据集
    一般分为训练集、测试集和验证集。收集了一些多在标签文本分类领域中常用的数据集,根据标签数量的多少可以将其分为小型数据集(标签数 0-10,000)、中型数据集(标签数 10,000-100,000)和大型数据集(标签数超过 100,000)
    在这里插入图片描述

    • Ren-CECps1.0: 一个多标签的中文情感语料库。它包含了37678 个中文博客的句子和 11 种情感标签,其中每句话被赋予一种或多种情感。
    • Reuters-21578:是路透社金融新闻服务进行分类的常用数据集,其中包含了 7769 个训练文本和 3019 个测试文本,其中包含多个标签和单个标签。
    • AAPD:从网络上收集了 55840 篇论文的摘要和相应学科类别,一篇学术论文属于一个或者多个学科,总共由 54个学科组成,目的是根据给定的摘要来预测学术论文相对应的学科。
    • RCV1-V2:共有 804414篇新闻,每篇新闻故事分配有多个主题,共有 103 个主题。
    • EUR-Lex:由欧盟法律组成的,里面包含了许多不同类型的文件,包括条约、立法、判例法和立法提案,共有 19314 个文档,3956 个分类。
    • AmazonCat-13K:该数据集是来自于亚马逊,其中包括评论(评分,文字,帮助性投票),产品元数据(描述,类别信息,价格,品牌和图像特征)和链接(也可以查看/购买的图表),在做多标签文本分类得时候主要考虑的是类别信息。
    • Amazon-670K:亚马逊商品的评论、产品的数据,和 AmazonCat-13K 的数据有类似之处,只是规模和商品不一样。
    • Amazon-3M:亚马逊,包含的是产品的信息,链接以及产品的评论。

    以上的 8 个数据集中只 有 Ren-CECps1.0 数据集是中文,其他的都是英文。大 部分都是来自于亚马逊网站,都是商品的评论,所以 适合用来做短文本分类。

    (2)文本预处理
    分词、词干提取、词性还原等。
    (3)文本表示
    预处理之后要进行向量化表示,文本表示的两类方法:

    • 离散表示
      One-hot 编码、词袋(Bag of Words, BOW)模型
    • 分布式表示
      共现矩阵、Word2Vec、Glove等,Word2Vec 和 Glove 是第一代预训练模型,通常采用的是浅层模型来学习词嵌入,新一代 预训练模型专注于学习上下文的词嵌入,如 ELMo、OpenAI、GPT和 BERT,新一代 预训练模型(Pre-trained Models,PTM)学习更合理的词表征,包括了上下文信息。

    (4)特征降维
            特征降维也称特征提取。通过文本向量化处理后得到的特征比较稀疏,维度较高。特征提取就是在保证文本语义表达完整的前提下,去除无用特征,保留有效特征,进行特征降维。常用方法TF-IDF、卡方检验、深度神经网络等。在预训练模型提出之后,大多数预训练模型采取Transformer 结构作为特征提取模块。
    (5)分类器和输出类别
           将预处理之后的文本(训练集)送入特定的分类器(模型)中进行训练,得到分类器模型。通过验证集和测试集进行输出类别的预测,利用 F1 值等相关指标来评判模型的优劣。

    多标签文本分类的方法

         基于深度学习方法是利用各种神经网络模型来处理多标签文本分类问题,根据模型结构,将其分为基于CNN 结构、基于 RNN 结构和基于 Transformer 结构的多标签文本分类方法。

    • TextCNN 模型
      Convolutional neural networks for sentence classification 2014,该方法首次将 CNN 结构用于文本分类,但是该模型无法避免使用 CNN 中固定窗口的缺点,因此无法建模更长的序列信息。(该缺点已解决)
    • TextRCNN模型
      Recurrent convolutional neural networks for text classification 2015,该方法主要针对传统分类方法存在着忽略上下文的问题以及针对 CNN 卷积窗口设置问题,结合了RNN 和 CNN 的优点提出了 RCNN 模型。
    • TextRNN 模型
      Recurrent neural network for text classification with multi-task learning 2016,
    • 分层注意力网络模型 HAN
      Hierarchical attention networks for document classification 2016,将 attention机制加入到 TextRNN 中,提出一个分层注意力网络模型 HAN,采用“词-句子-文章”的层次化结构来表示一篇文本,具有很好的可解释性。
    • BERT
      How to fine-tune bert for text classification? 2019,随着 transformer 和BERT 的提出,将 BERT 应用到文本分类中,介绍了一些调参以及改进的方法,进一步挖掘BERT 在文本分类中的应用。

    下面按照网络结构的不同,将基于深度学习的多标签文本分类算法分为三大类,包括基于 CNN、基于RNN 和基于 Transformer 的多标签文本分类。

    基于 CNN 的多标签文本分类

    在这里插入图片描述

    • Mark[提出了一种分别将 TextCNN 和 GRU 循环网络与 word2vec
      词向量使用的方法
      来解决大规模多标签文本分类问题。
    • Liu 等人基于 TextCNN 结构进行了改进提出了 XML-CNN
      模型,该模型使用了动态池化,改进了损失函数,采用了二元交叉熵损失函数,并在池化层和输出层之间加了一个隐藏层,能够将将高维标签映射到低维,以此来减少计算量。

          基于 CNN 的多标签文本分类方法都是对 CNN 结 构改进,以此来适应多标签文本分类,但是利用 CNN 的池化操作时,会造成语义信息的丢失,并且当文本过长时,CNN 不利于捕获前后文的关系而造成语义的偏差。

    基于 RNN 的多标签文本分类

    大多数输入都是序列数据,比如一个句子就是一个序列数据。RNN 类似于所有的深层架构,网络越深,梯度消失和梯度爆炸问题也就越明显,无法掌握长时间跨度非线性关系,因此在采用 RNN的时候往往会采用改进的 RNN 结构,包括长短时记忆网络(Long Short-Term Memory,LSTM)和 GRU(Gate Recurrent Unit)来解决长期依赖问题。这些深度神经网络处理的都是定长序列的问题,即输入和输出的大小是固定不变的。为了解决这个问题,Sutskever 等人提出了序列到序列(Sequence to Sequence,Seq2Seq)的结构。

    • Nam 等人利用 RNN 来代替分类器链,并使用基于 RNN 的 Seq2Seq 去建模,这种方法可以借助 RNN依次产生标签序列来捕获标签之间的相关性。这是首次将 Seq2Seq 模型应用在多标签文本分类上,在这之后,有更多的 Seq2Seq 模型提出来来处理多标签文本分类。
    • Chen 等人提出了一种 CNN 和 RNN 的融合机制,先将词向量送入到 CNN 中得到文本特征序列,然后将该特征输入到 RNN
      中得到相应的预测标签。但是该模型受训练集大小影响较大,如果训练集过小,可能会产生过拟合。
    • Yang 等人提出了引入注意力机制的 SGM 模型,也是一种 Seq2Seq 结构的模型,该模型将多标签分类任务视为序列生成问题以此来考虑标签之间的相关性,也是首次将序列生成的思想应用到多标签文本分类中。编码部分采用的是 Bi-LSTM 来获取单词的序列信息,并且提出了一种具有带注意力机制的解码器结构的序列生成模型,该解码器在预测的时候能够自动选择最有信息量的单词。
    • Lin 等人提出多级扩展卷积,是通过在原始编码器(LSTM)生成表示法的基础上,应用多层卷积神经网络通过捕获单词之间的局部相关性和长期依赖性来生成语义单元表示,进而增强 Seq2Seq 的效果,并且将高层的 Attention 和词级别的 Attention 做了整合,提出混合注意力(Hybrid Attention)来兼顾各个级别表示的信息。
    • You 等人提出了基于标签树的 Attention-XML 模型,该模型通过使用 Bi-LSTM 来捕获单词之间的长距离依赖关系以及使用多标签注意来捕获文本中与每个标签最相关的部分,针对长尾标签,提出了概率标签树(Probability Label Tree,PLT),能够高效的处理上百万级别的标签。

           基于 RNN 的多标签文本分类方法大多都是采用 Seq2Seq 结构来实现,利用序列生成来考虑标签间的关系,后一个标签往往是依赖于前一个标签的,因此 错误标签带来的影响往往就会叠加,虽然有一些方法 提出了改进,但还是存在着缺陷。并且利用这种结果 虽然提升了结果,但是能否很好的学习到标签之间的 相关性还有待商榷。

    基于 Transformer 的多标签文本分类

         Transformer 的提出给自然语言处理领域带来了极大的影响,之后的预训练模型 GPT-2 和 BERT 都是基于 Transformer 结构提出的,BERT的提出可以说是自然语言处理领域的里程碑,在多标签分类领域,也有很多用 Transformer 的模型被提出:

    • Yarullin 等人首次尝试 BERT 并探索其在多标签设置和分层文本分类中,提出应用在多标签文本分类领域的序列生成 BERT 模型。
    • Chang 等人提出 X-Transformer 模型,该模型是由三个部分组成,包括语义标签序列组件(SLI)、深度神经匹配组件和整体排名组件。
    • GONG 等人提出 HG-Transformer 的深度学习模型,该模型首先将文建模为一个图形结构,然后在单词,句子和图形级别使用具有多头注意机制的多层 transformer 结构以充分捕获文本的特征,最后利用标签的层次关系来生成标签的表示形式,并基于标签的语义距离设计加权损失函数。

           基于 Transformer 结构的多标签文本分类模型的 效果往往会优于基于 CNN 和基于 RNN 结构的模型, 但是基于 Transformer 结构的模型比起前两种结构来 说,参数量往往是巨大的,并且网络结构比较复杂, 在实际场景中难以应用。

          深度学习的方法可以自动提取特征,这也就大大减少了花费,也使得算法的鲁棒性更强,不过对于设备和硬件要求以及设备计算能力要求也大大提升,并且在数据规模上要求更大,深度学习在可解释性上不如机器学习,它能够给出一个结果,但是中间的过程相当于一个黑盒子;深度学习的算法虽然大大提高了多标签文本分类的效果,但还是有很大的提高空间。

    模型汇总(2019-2021)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    多标签文本分类性能评价

    在多标签文本分类中,常用的评价指标通常包括Hamming loss、Micro-F1 值。

    • Hamming loss
      衡量被错分的标签的比例大小,正确的标签没有被预测正确以及错误标签被预测的标
      签占比,简单来说就是两个标签集合的差别占比,汉明损失的值越小,预测结果就越好。计算公式如下:
      在这里插入图片描述
      其中 |D| 是样本的数量, |L |是标签的总数,xi 表示标签,yi 表示真实标签,XOR 是异或运算。
    • Micro-precision、Micro-recall 和 Micro-F1
      多标签文本分类将文本赋予多个标签,标签数量也 不 是 固 定 的 , 通 常 使 用 Micro-precision 和Micro-recall,考虑所有标签的整体精确率和召回率,在理想情况下是两者都越高越好,但实际情况往往会产生矛盾,因此,在多标签文本分类领域,采用的是Micro-F1 来评价,Micro-F1 是 Micro-precision 和Micro-recall 的调和平均。其计算公式如下所示(其中 L 代表类别标签总数):

    在这里插入图片描述

    结果分析

    多标签文本分类模型在 AAPD、RCV1-V2、EUR-Lex等数据集结果的总结。
    在这里插入图片描述通过模型在 AAPD、RCV1-V2、EUR-Lex 等数据集上的结果显示,F1 值逐渐提升,在 RCV1-V2 数据集上 F1 值从 0.7842 提升到 0.893,在 AAPD 数据集上F1 值从 0.674 提升到 0.725,提升效果明显。但还有很大的上升空间,特别是在预训练模型提出后,在各项任务上都取得了不错的效果,比如 BERT 的提出在11 项 NLP 任务中都取得了很好的效果。

    总结与展望

    多标签文本分类相较于单标签文本分类来说更加的复杂,还存在着很多的挑战,主要体现在以下几点:
    (1)特定领域的数据集缺失问题。

    (2)极端多标签文本分类问题。极端多标签文本分类的难点在于标签集的数目非常多,包含数十万、甚至成百上千万的标签。目前多标签文本分类模型的内存占用、模型大小都随着标签空间的变大而线性变大,在面对极端多的标签时,无法成功部署甚至训练。因此,如何设计出一个高效的模型来解决极端多标签文本分类问题是未来亟待解决的一个难点。

    (3)标签间的相关性研究问题。多标签文本分类标签之间是存在内在联系的,比如属于“人工智能”的文本往往跟“深度学习”是相关联的。传统的一些方法在处理多标签文本分类问题上,往往没有考虑标签之间的相关性,这也严重影响了模型的效率。Baker 等人提出了一种分层的多标签文本分类方法来得到标签间的共现关系,但只是考虑了标签之间浅层次的关系,忽略了标签之间深层次的关系。因此,如何高效捕捉标签间的关系也是多标签文本分类任务未来的一大研究重点。

    (4)数据集标签长尾问题
    对于多标签文本分类领域存在的数据集,都是由文本集和标签集构成的,对于标签集来说就会有分布不均衡的问题存在,部分标签与很多文本样本相关联,而还有的一些标签甚至不与文本样本相关联,可以理解为标签“长尾”的问题。用不平衡的数据训练出来的模型会导致样本少的种类预测性能很差,甚至无法预测。因此,如何解决标签长尾问题也是多标签文本分类领域一个重要的研究问题

    参考文献(2019-2021)

    • Attention is all you need 2017
    • 基于改进 seq2seq 模型的多标签文本分类研究.大连海事大学,2020. 刘心惠
    • BERT: pre-training of deep bidirectional transformers for language understanding.In NAACL-HLT, 2019
    • Pre-trained Models for Natural Language Processing: 2020.
    • MSCNN: A MonomericSiamese Convolutional Neural Network for Extremely Imbalanced Multi-label Text Classification(EMNLP). 2020
    • Adapting RNN sequence prediction model to multi-label set prediction 2019.
    • Attentionxml: Label tree-based attention-aware deep model for high-performance extreme multi-label text classification //Advances in Neural Information Processing Sys-tems. 2019
    • Hierarchical Sequence-to-Sequence Model for Multi-Label Text Classification IEEE 2019
    • BERT for Sequence-to-Sequence Multi-Label Text Classification 2019.
    • Taming Pretrained Transformers for Extreme Multi-label Text Classification (2020 the 26th ACM SIGKDD )
    • Hierarchical graph transformer-based deep learning model for large-scale multilabel text classification IEEE 2020
    • The Emerging Trends of Multi-Label Learning 2020.
    • Distribution-balanced loss for multi-label classification in long-tailed datasets (European Conference on Computer Vision. Springer, Cham, 2020)
    展开全文
  • 文本分类介绍,目前的文本分类模型,数据集和模型对应的代码链接,介绍文本分类的流程和发展史。给出多标签文本分类介绍和对应工具
  • 所以现在所提出的词向量,作为神经网络的输入使得文本分类等任务有了更好的效果。 本文提出CNN架构的一种模型。 二、introduction 先指出CBOW、TFIDF、ngram等传统方法,并且传统机器学习使用这些方法不能够表示词的...
  • Multi_Label_TextCNN textcnn多标签文本分类
  • 基于Amazon Product Review的多标签文本分类,找到该评论将记录到的主题/区域 确定亚马逊产品评论的关键方面 电子商务通过提供给客户和零售商的多种见解,彻底改变了零售体验。 顾客的评论被视为零售商对其产品和...
  • NeuralClassifier:开源神经分层多标签文本分类工具包 介绍 NeuralClassifier设计用于快速实现用于分层多标签分类任务的神经模型,这在实际情况下更具挑战性和普遍性。 一个突出的特点是NeuralClassifier当前提供了...
  • 多标签文本分类简介:链接 论文趋势分析-多标签文本分类1数据预处理1.1数据读取1.2文本提取1.3类别转换1.4将目标数据(论文大类)二值化2TF-IDF+机器学习分类器2.1分词2.2数据集划分2.3多分类贝叶斯模型2.4XGBoost...

    github地址:链接
    多标签文本分类简介:链接

    1数据预处理

    1.1数据读取

    • 为方便处理,随机抽样10%的数据进行分析
    import seaborn as sns #用于画图
    from bs4 import BeautifulSoup #用于爬取arxiv的数据
    import re #用于正则表达式,匹配字符串的模式
    import requests #用于网络连接,发送网络请求,使用域名获取对应信息
    import json #读取数据,我们的数据为json格式的
    import pandas as pd #数据处理,数据分析
    import matplotlib.pyplot as plt #画图工具
    
    def readArxivFile(path, columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi',
           'report-no', 'categories', 'license', 'abstract', 'versions',
           'update_date', 'authors_parsed'], count=None):
        '''
        定义读取文件的函数
            path: 文件路径
            columns: 需要选择的列
            count: 读取行数
        '''
        
        data  = []
        with open(path, 'r') as f: 
            for idx, line in enumerate(f): 
                if idx == count:
                    break
                    
                d = json.loads(line)
                d = {col : d[col] for col in columns}
                data.append(d)
    
        data = pd.DataFrame(data)
        return data
    
    data = readArxivFile('D:\code\Github\data\AcademicTrendsAnalysis/arxiv-metadata-oai-snapshot.json', 
                         ['id', 'title', 'categories', 'abstract'])
    
    data = data.sample(frac = 0.1)
    data.shape
    
    (179691, 5)
    

    1.2文本提取

    # 合并title和abtraact
    data['text'] = data['title'] + data['abstract']
    #将换行符替换位空格
    data['text'] = data['text'].str.replace('\n',' ')
    # 将大写全部转换成小写
    data['text'] = data['text'].str.lower()
    # 删除多余列
    data = data.drop(['abstract','title'],axis = 1) 
    

    1.3类别转换

    data['categories'] = data.categories.str.split(' ')
    data['categories_big'] = data.categories.apply(lambda x : [xx.split('.')[0] for xx in x])
    data.head(3)
    
    id title categories abstract categories_big
    0 0704.0001 Calculation of prompt diphoton production cros... [hep-ph] A fully differential calculation in perturba... [hep-ph]
    1 0704.0002 Sparsity-certifying Graph Decompositions [math.CO, cs.CG] We describe a new algorithm, the $(k,\ell)$-... [math, cs]
    2 0704.0003 The evolution of the Earth-Moon system based o... [physics.gen-ph] The evolution of Earth-Moon system is descri... [physics]

    1.4将目标数据(论文大类)二值化

    • MultiLabelBinarizer的使用方法链接

    • 类似于One-Hot编码,只不过自变量可以是元组或列表

    from sklearn.preprocessing import MultiLabelBinarizer
    mlb = MultiLabelBinarizer()
    data_label = mlb.fit_transform(data.categories_big)
    
    data_label.shape
    
    (179691, 38)
    

    2TF-IDF+机器学习分类器

    2.1分词

    • TfidfVectorizer简介:链接
    • 将原始句子转换成词频向量
    from sklearn.feature_extraction.text import TfidfVectorizer 
    vecter = TfidfVectorizer(max_features=4000)
    data_tfidf = vecter.fit_transform(data.text)
    

    2.2数据集划分

    ## 训练集划分  
    from sklearn.model_selection import train_test_split 
    
    X_train,X_test,y_train,y_test = train_test_split(data_tfidf,data_label)
    
    

    2.3多分类贝叶斯模型

    • MultiOutputClassifier将单类预测模型转换为多类模型,类似于一个模型只预测一个类
    # 构建多标签分类模型
    from sklearn.multioutput import MultiOutputClassifier
    from sklearn.naive_bayes import MultinomialNB
    clf = MultiOutputClassifier(MultinomialNB()).fit(X_train, y_train)
    

    训练结果 :

    • 平均预测精度只有0.53
    from sklearn.metrics import accuracy_score
    accuracy_score(y_test,clf.predict(X_test))
    
    0.5262782984217439
    

    2.4XGBoost模型

    • 训练太过耗时,未得出结果我就终止了训练
    • 因为每个y_train都是一个37维的向量,因此需要训练37个模型,加之训练集太大,导致训练时间非常长,而且如果要调参的话,时间就更长了
    from sklearn.pipeline import make_pipeline
    from sklearn.model_selection import GridSearchCV,KFold
    import xgboost as xgb 
    
    model = MultiOutputClassifier( xgb.XGBClassifier(n_jobs = -1))
    model.fit(X_train, y_train)
    accuracy_score(y_test,model.predict(X_test))
    

    3深度学习模型

    from sklearn.model_selection import train_test_split
    x_train, x_test, y_train, y_test = train_test_split(data['text'].iloc[:100000], data_label[:100000],test_size = 0.15,random_state = 1)
    

    3.1分词与embedding

    • Tokenizer使用方法:链接
      链接
    • 本文使用的tensorflow2.3.0版本
    # parameter
    max_features= 500#最大分词数
    max_len= 150#最大截取截取长度
    embed_size=100#
    batch_size = 128
    epochs = 5
    
    from tensorflow.keras.preprocessing.text import Tokenizer
    from tensorflow.keras.preprocessing import sequence
    tokens = Tokenizer(num_words = max_features)
    tokens.fit_on_texts(list(x_train))
    
    #y_train = data_label[:100000]
    x_sub_train = tokens.texts_to_sequences(x_train)
    x_sub_train = sequence.pad_sequences(x_sub_train, maxlen=max_len)
    
    
    
    • 将每个text都转换为了一个150维的向量
    x_sub_train.shape,x_train.shape
    
    ((85000, 150), (85000,))
    

    3.2定义模型并训练

    • 由于训练时间太长,因此训练完一个epoch就暂停了kernel
    from tensorflow.keras.layers import Dense,Input,LSTM,Bidirectional,Activation,Conv1D,GRU
    from tensorflow.keras.layers import Dropout,Embedding,GlobalMaxPooling1D, MaxPooling1D, Add, Flatten
    from tensorflow.keras.layers import GlobalAveragePooling1D, GlobalMaxPooling1D, concatenate, SpatialDropout1D# Keras Callback Functions:
    from tensorflow.keras.callbacks import Callback
    from tensorflow.keras.callbacks import EarlyStopping,ModelCheckpoint
    from tensorflow.keras import initializers, regularizers, constraints, optimizers, layers, callbacks
    from tensorflow.keras.models import Model
    from tensorflow.keras.optimizers import Adam
    
    sequence_input = Input(shape=(max_len, ))
    x = Embedding(max_features, embed_size, trainable=True)(sequence_input)
    x = SpatialDropout1D(0.2)(x)
    x = Bidirectional(GRU(128, return_sequences=True,dropout=0.1,recurrent_dropout=0.1))(x)
    x = Conv1D(64, kernel_size = 3, padding = "valid", kernel_initializer = "glorot_uniform")(x)
    avg_pool = GlobalAveragePooling1D()(x)
    max_pool = GlobalMaxPooling1D()(x)
    x = concatenate([avg_pool, max_pool]) 
    preds = Dense(38, activation="sigmoid")(x)
    
    model = Model(sequence_input, preds)
    model.compile(loss='binary_crossentropy',optimizer=Adam(lr=1e-3),metrics=['accuracy'])
    model.fit(x_sub_train, y_train, 
              batch_size=batch_size, 
              validation_split=0.2,
              epochs=epochs)
              
    
    Epoch 1/5
    532/532 [==============================] - 1139s 2s/step - loss: 0.1034 - accuracy: 0.4690 - val_loss: 0.0705 - val_accuracy: 0.6457
    Epoch 2/5
      7/532 [..............................] - ETA: 16:59 - loss: 0.0724 - accuracy: 0.6127
    
    
    
    展开全文
  • 胶囊网络在文本分类中效果显著,但也有实验更进一步表明,胶囊网络在多标签文本分类中,效果更佳。 论文《Investigating Capsule Networks with Dynamic Routing for Text Classifification 》 论文链接:论文下载点...

    胶囊网络在文本分类中效果显著,但也有实验更进一步表明,胶囊网络在多标签文本分类中,效果更佳。
    论文《Investigating Capsule Networks with Dynamic Routing for Text Classifification 》
    论文链接:论文下载点此处

    展开全文
  • NeuralClassifier - 一种开源神经分层多标签文本分类工具包
  • NLP(二十八)多标签文本分类

    千次阅读 2020-04-10 10:49:43
    多标签文本分类之从电影简介预测影片类型

      本文将会讲述如何实现多标签文本分类。

    什么是多标签分类?

      在分类问题中,我们已经接触过二分类和多分类问题了。所谓二(多)分类问题,指的是y值一共有两(多)个类别,每个样本的y值只能属于其中的一个类别。对于多标签问题而言,每个样本的y值可能不仅仅属于一个类别。
      举个简单的例子,我们平时在给新闻贴标签的时候,就有可能把一篇文章分为经济和文化两个类别。因此,多标签问题在我们的日常生活中也是很常见的。
      对于多标签问题,业界还没有很成熟的解决方法,主要是因为标签之间可能会存在复杂的依赖关系,这种依赖关系现阶段还没有成熟的模型来解决。我们在解决多标签问题的时候,一种办法是认为标签之间互相独立,然后把该问题转化为我们熟悉的二(多)分类问题。
      本文以 2020语言与智能技术竞赛:事件抽取任务 中的数据作为多分类标签的样例数据,借助多标签分类模型来解决。
      整个项目的结构如下图所示:
    项目结构图
      首先,让我们来看一下样例数据。

    数据分析

      首先,让我们来看一下样例数据的几个例子:

    司法行为-起诉|组织关系-裁员 最近,一位前便利蜂员工就因公司违规裁员,将便利蜂所在的公司虫极科技(北京)有限公司告上法庭。
    组织关系-裁员 思科上海大规模裁员人均可获赔100万官方澄清事实
    组织关系-裁员 日本巨头面临危机,已裁员1000多人,苹果也救不了它!
    组织关系-裁员|组织关系-解散 在硅谷镀金失败的造车新势力们:蔚来裁员、奇点被偷窃、拜腾解散

    从上面的例子中我们可以看出,同样的描述文本,有可能会属于多个事件类型。比如上面的在硅谷镀金失败的造车新势力们:蔚来裁员、奇点被偷窃、拜腾解散,该句话中包含了组织关系-裁员组织关系-解散两个事件类型。
      该数据集中的训练集一共有11958个样本,65个事件类型,我们对该训练集进行简单的数据分析,来看看多事件类型的个数和占比,以及每个事件类型的数量。数据分析的脚本如下:

    # -*- coding: utf-8 -*-
    # author: Jclian91
    # place: Pudong Shanghai
    # time: 2020-04-09 21:31
    
    from collections import defaultdict
    from pprint import pprint
    
    with open("./data/multi-classification-train.txt", "r", encoding="utf-8") as f:
        content = [_.strip() for _ in f.readlines()]
    
    # 每个事件类型的数量统计
    event_type_count_dict = defaultdict(int)
    
    # 多事件类型数量
    multi_event_type_cnt = 0
    
    for line in content:
        # 事件类型
        event_types = line.split(" ", maxsplit=1)[0]
    
        # 如果|在事件类型中,则为多事件类型
        if "|" in event_types:
            multi_event_type_cnt += 1
    
        # 对应的每个事件类型数量加1
        for event_type in event_types.split("|"):
            event_type_count_dict[event_type] += 1
    
    
    # 输出结果
    print("多事件类型的样本共有%d个,占比为%.4f。" %(multi_event_type_cnt, multi_event_type_cnt/len(content)))
    
    pprint(event_type_count_dict)
    

    输出结果如下:

    多事件类型的样本共有1121个,占比为0.0937。
    defaultdict(<class 'int'>,
                {'交往-会见': 98,
                 '交往-感谢': 63,
                 '交往-探班': 69,
                 '交往-点赞': 95,
                 '交往-道歉': 149,
                 '产品行为-上映': 286,
                 '产品行为-下架': 188,
                 '产品行为-发布': 1196,
                 '产品行为-召回': 287,
                 '产品行为-获奖': 139,
                 '人生-产子/女': 106,
                 '人生-出轨': 32,
                 '人生-分手': 118,
                 '人生-失联': 105,
                 '人生-婚礼': 59,
                 '人生-庆生': 133,
                 '人生-怀孕': 65,
                 '人生-死亡': 811,
                 '人生-求婚': 76,
                 '人生-离婚': 268,
                 '人生-结婚': 294,
                 '人生-订婚': 62,
                 '司法行为-举报': 98,
                 '司法行为-入狱': 155,
                 '司法行为-开庭': 105,
                 '司法行为-拘捕': 712,
                 '司法行为-立案': 82,
                 '司法行为-约谈': 266,
                 '司法行为-罚款': 224,
                 '司法行为-起诉': 174,
                 '灾害/意外-地震': 119,
                 '灾害/意外-坍/垮塌': 80,
                 '灾害/意外-坠机': 104,
                 '灾害/意外-洪灾': 48,
                 '灾害/意外-爆炸': 73,
                 '灾害/意外-袭击': 117,
                 '灾害/意外-起火': 204,
                 '灾害/意外-车祸': 286,
                 '竞赛行为-夺冠': 430,
                 '竞赛行为-晋级': 302,
                 '竞赛行为-禁赛': 135,
                 '竞赛行为-胜负': 1663,
                 '竞赛行为-退役': 95,
                 '竞赛行为-退赛': 141,
                 '组织关系-停职': 87,
                 '组织关系-加盟': 335,
                 '组织关系-裁员': 142,
                 '组织关系-解散': 81,
                 '组织关系-解约': 45,
                 '组织关系-解雇': 93,
                 '组织关系-辞/离职': 580,
                 '组织关系-退出': 183,
                 '组织行为-开幕': 251,
                 '组织行为-游行': 73,
                 '组织行为-罢工': 63,
                 '组织行为-闭幕': 59,
                 '财经/交易-上市': 51,
                 '财经/交易-出售/收购': 181,
                 '财经/交易-加息': 24,
                 '财经/交易-涨价': 58,
                 '财经/交易-涨停': 219,
                 '财经/交易-融资': 116,
                 '财经/交易-跌停': 102,
                 '财经/交易-降价': 78,
                 '财经/交易-降息': 28})
    

    模型训练

      我们利用sklearn模块中的MultiLabelBinarizer进行多标签编码,如果文本所对应的事件类型存在,则将该位置的元素置为1,否则为0。因此,y值为65维的向量,其中1个或多个为1,是该文本(x值)对应一个或多个事件类型。
      我们采用ALBERT对文本进行特征提取,最大文本长度为200,采用的深度学习模型如下:

    深度学习模型
      模型训练的脚本(model_trian.py)的代码如下:

    # -*- coding: utf-8 -*-
    # author: Jclian91
    # place: Pudong Shanghai
    # time: 2020-04-03 18:12
    
    import json
    import numpy as np
    from sklearn.preprocessing import MultiLabelBinarizer
    from keras.models import Model
    from keras.optimizers import Adam
    from keras.layers import Input, Dense
    from att import Attention
    from keras.layers import GRU, Bidirectional
    from tqdm import tqdm
    import matplotlib.pyplot as plt
    
    from albert_zh.extract_feature import BertVector
    
    with open("./data/multi-classification-train.txt", "r", encoding="utf-8") as f:
        train_content = [_.strip() for _ in f.readlines()]
    
    with open("./data/multi-classification-test.txt", "r", encoding="utf-8") as f:
        test_content = [_.strip() for _ in f.readlines()]
    
    # 获取训练集合、测试集的事件类型
    movie_genres = []
    
    for line in train_content+test_content:
        genres = line.split(" ", maxsplit=1)[0].split("|")
        movie_genres.append(genres)
    
    # 利用sklearn中的MultiLabelBinarizer进行多标签编码
    mlb = MultiLabelBinarizer()
    mlb.fit(movie_genres)
    
    print("一共有%d种事件类型。" % len(mlb.classes_))
    
    with open("event_type.json", "w", encoding="utf-8") as h:
        h.write(json.dumps(mlb.classes_.tolist(), ensure_ascii=False, indent=4))
    
    # 对训练集和测试集的数据进行多标签编码
    y_train = []
    y_test = []
    
    for line in train_content:
        genres = line.split(" ", maxsplit=1)[0].split("|")
        y_train.append(mlb.transform([genres])[0])
    
    for line in test_content:
        genres = line.split(" ", maxsplit=1)[0].split("|")
        y_test.append(mlb.transform([genres])[0])
    
    y_train = np.array(y_train)
    y_test = np.array(y_test)
    
    print(y_train.shape)
    print(y_test.shape)
    
    # 利用ALBERT对x值(文本)进行编码
    bert_model = BertVector(pooling_strategy="NONE", max_seq_len=200)
    print('begin encoding')
    f = lambda text: bert_model.encode([text])["encodes"][0]
    
    x_train = []
    x_test = []
    
    process_bar = tqdm(train_content)
    
    for ch, line in zip(process_bar, train_content):
        movie_intro = line.split(" ", maxsplit=1)[1]
        x_train.append(f(movie_intro))
    
    process_bar = tqdm(test_content)
    
    for ch, line in zip(process_bar, test_content):
        movie_intro = line.split(" ", maxsplit=1)[1]
        x_test.append(f(movie_intro))
    
    x_train = np.array(x_train)
    x_test = np.array(x_test)
    
    print("end encoding")
    print(x_train.shape)
    
    
    # 深度学习模型
    # 模型结构:ALBERT + 双向GRU + Attention + FC
    inputs = Input(shape=(200, 312, ), name="input")
    gru = Bidirectional(GRU(128, dropout=0.2, return_sequences=True), name="bi-gru")(inputs)
    attention = Attention(32, name="attention")(gru)
    num_class = len(mlb.classes_)
    output = Dense(num_class, activation='sigmoid', name="dense")(attention)
    model = Model(inputs, output)
    
    # 模型可视化
    # from keras.utils import plot_model
    # plot_model(model, to_file='multi-label-model.png', show_shapes=True)
    
    model.compile(loss='binary_crossentropy',
                  optimizer=Adam(),
                  metrics=['accuracy'])
    
    history = model.fit(x_train, y_train, validation_data=(x_test, y_test), batch_size=128, epochs=10)
    model.save('event_type.h5')
    
    
    # 训练结果可视化
    # 绘制loss和acc图像
    plt.subplot(2, 1, 1)
    epochs = len(history.history['loss'])
    plt.plot(range(epochs), history.history['loss'], label='loss')
    plt.plot(range(epochs), history.history['val_loss'], label='val_loss')
    plt.legend()
    
    plt.subplot(2, 1, 2)
    epochs = len(history.history['accuracy'])
    plt.plot(range(epochs), history.history['accuracy'], label='acc')
    plt.plot(range(epochs), history.history['val_accuracy'], label='val_acc')
    plt.legend()
    plt.savefig("loss_acc.png")
    

    训练过程输出内容如下:

    一共有65种事件类型。
    (11958, 65)
    (1498, 65)
    I:BERT_VEC:[graph:opt:128]:load parameters from checkpoint...
    I:BERT_VEC:[graph:opt:130]:freeze...
    I:BERT_VEC:[graph:opt:133]:optimize...
    I:BERT_VEC:[graph:opt:144]:write graph to a tmp file: ./tmp_graph11
    100%|██████████| 11958/11958 [02:47<00:00, 71.39it/s]
    100%|██████████| 1498/1498 [00:20<00:00, 72.54it/s]
    end encoding
    (11958, 200, 312)
    Train on 11958 samples, validate on 1498 samples
    

    在最终的epoch上,训练集上的acuuracy为0.9966,测试集上的acuuracy为0.9964。训练结果的loss和acc曲线如下:
    模型的训练效果
    从上述结果看,多标签分类的模型效果还是相当不错的。

    模型预测

      我们利用下面的模型预测脚本(model_predict.py)对新的测试集数据进行验证,脚本代码如下:

    # -*- coding: utf-8 -*-
    # author: Jclian91
    # place: Pudong Shanghai
    # time: 2020-04-03 21:50
    
    import json
    import numpy as np
    from keras.models import load_model
    
    from att import Attention
    from albert_zh.extract_feature import BertVector
    load_model = load_model("event_type.h5", custom_objects={"Attention": Attention})
    
    # 预测语句
    text = "北京时间6月7日,中国男足在广州天河体育场与菲律宾进行了一场热身赛,最终国足以2-0击败了对手,里皮也赢得了再度执教国足后的首场比赛胜利!"
    text = text.replace("\n", "").replace("\r", "").replace("\t", "")
    
    labels = []
    
    bert_model = BertVector(pooling_strategy="NONE", max_seq_len=200)
    
    # 将句子转换成向量
    vec = bert_model.encode([text])["encodes"][0]
    x_train = np.array([vec])
    
    # 模型预测
    predicted = load_model.predict(x_train)[0]
    
    indices = [i for i in range(len(predicted)) if predicted[i] > 0.5]
    
    with open("event_type.json", "r", encoding="utf-8") as g:
        movie_genres = json.loads(g.read())
    
    print("预测语句: %s" % text)
    print("预测事件类型: %s" % "|".join([movie_genres[index] for index in indices]))
    

    其中的几个样本的预测结果如下:

    预测语句: 北京时间6月7日,中国男足在广州天河体育场与菲律宾进行了一场热身赛,最终国足以2-0击败了对手,里皮也赢得了再度执教国足后的首场比赛胜利!
    预测事件类型: 竞赛行为-胜负

    预测语句: 巴西亚马孙雨林大火持续多日,引发全球关注。
    预测事件类型: 灾害/意外-起火

    预测语句: 19里加大师赛资格赛前两天战报 中国选手8人晋级6人遭淘汰2人弃赛
    预测事件类型: 竞赛行为-晋级

    预测语句: 日本电车卡车相撞,车头部分脱轨并倾斜,现场起火浓烟滚滚
    预测事件类型: 灾害/意外-车祸

    预测语句: 截止到11日13:30 ,因台风致浙江32人死亡,16人失联。具体如下:永嘉县岩坦镇山早村23死9失联,乐清6死,临安区岛石镇银坑村3死4失联,临海市东塍镇王加山村3失联。
    预测事件类型: 人生-失联|人生-死亡

    预测语句: 定位B端应用,BeBop发布Quest专属版柔性VR手套
    预测事件类型: 产品行为-发布

    预测语句: 8月17日。凌晨3点20分左右,济南消防支队领秀城中队接到指挥中心调度命令,济南市中区中海环宇城往南方向发生车祸,有人员被困。
    预测事件类型: 灾害/意外-车祸

    预测语句: 注意!济南可能有雷电事故|英才学院14.9亿被收购|八里桥蔬菜市场今日拆除,未来将建新的商业综合体
    预测事件类型: 财经/交易-出售/收购

    预测语句: 昨天18:30,陕西宁强县胡家坝镇向家沟村三组发生山体坍塌,5人被埋。当晚,3人被救出,其中1人在医院抢救无效死亡,2人在送医途中死亡。今天凌晨,另外2人被发现,已无生命迹象。
    预测事件类型: 人生-死亡|灾害/意外-坍/垮塌

    总结

      本项目已经上传至Github项目,网址为:https://github.com/percent4/multi-label-classification-4-event-type
      后续有机会再给大家介绍更多多标签分类相关的问题,欢迎大家关注~

    展开全文
  • 文本分类 如何训练监督分类器进行多标签文本分类的示例 博客文章代码:
  • 针对一些多标签文本分类算法没有考虑文本—术语相关性和准确率不高的问题,提出一种结合旋转森林和AdaBoost分类器的集成多标签文本分类方法。首先,通过旋转森林算法对样本集进行分割,通过特征变换将各样本子集映射...
  • 多标签文本分类多标签文本分类简介三种神经网络结构网络模型文本分类网络模型多标签文本分类网络模型 多标签文本分类简介 NLP(自然语言处理),即让计算机去理解人类的自然语言(文本、语音等),进而完成各种各样...
  • 笔者利用hugging face的Transformers实现多标签文本分类。笔者的tensorflow版本为2.4.0,transformers的版本为4.2.0 数据处理 利用transformers中的BertTokenizer对数据进行Tokenizer。代码如下: def get_model_...
  • 喜p是用于多标签文本分类的深度学习工具。 它在训练语料库上学习将标签分配给任意文本,并可用于预测未知数据上的标签。 它是由CERN开发的,用于将主题类别分配给高能物理摘要,并从中提取关键字。 简短介绍 >>> ...
  • 多标签文本分类,在训练第一轮过程中成功,在第一轮完成后,evaluate 阶段报错。 文件 : Kashgari/kashgari/tasks/classification/base_model.py 第70~76行:这里 tensor 包含两部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,172
精华内容 468
关键字:

多标签文本分类