文本分类 订阅
文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。 展开全文
文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。
信息
定    义
基于分类体系的自动分类
方    法
朴素贝叶斯、支持向量机、K邻近法、决策树
中文名
文本分类
类    别
处理方式
文本分类定义
基于分类体系的自动分类基于资讯过滤和用户兴趣(Profiles)的自动分类所谓分类体系就是针对词的统计来分类关键字分类,全文检索词的正确切分不易分辨(白痴造句法)学习人类对文本分类的知识和策略从人对文本和类别之间相关性判断来学习文件用字和标记类别之间的关联
收起全文
精华内容
下载资源
问答
  • 文本分类
    千次阅读
    2022-03-31 23:39:16

    改文章转载于作者:weixin_40001805
    仅供学习参考!!!

    在这里插入图片描述
    之前用bert一直都是根据keras-bert封装库操作的,操作非常简便(可参考苏剑林大佬博客当Bert遇上Keras:这可能是Bert最简单的打开姿势),这次想要来尝试一下基于pytorch的bert实践。

    最近pytorch大火,而目前很少有博客完整的给出pytorch-bert的应用代码,本文从最简单的中文文本分类入手,一步一步的给出每段代码~ (代码简单清晰,读者有兴趣可上手实践)

    • 首先安装pytorch-bert库, 即:pip install pytorch_pretrained_bert;
    • 然后下载预训练模型权重,这里下载的是 chinese_roberta_wwm_ext_pytorch
      ,下载链接为中文BERT-wwm系列模型 (这里可选择多种模型);
    • 数据集选择的THUCNews,整理出18w条数据,10类新闻文本的中文分类问题(10分类),每类新闻数据量相等,为1.8w条,数据集来自train.txt(只选择了网址里的train.txt),
      数据集的具体格式如下。
      下面进入代码阶段。(训练环境为Google Colab)

    1.导入必要的库

    # coding: UTF-8
    import torch
    import time 
    import torch.nn as nn
    import torch.nn.functional as F 
    from pytorch_pretrained_bert import BertModel, BertTokenizer, BertConfig, BertAdam
    import pandas as pd 
    import numpy as np 
    from tqdm import tqdm 
    from torch.utils.data import *
     
    path = "data/"
    bert_path = "chinese_roberta_wwm_ext_pytorch/"
    tokenizer = BertTokenizer(vocab_file=bert_path + "vocab.txt")  # 初始化分词器
    

    2.预处理数据集

    input_ids = []     # input char ids
    input_types = []   # segment ids
    input_masks = []   # attention mask
    label = []         # 标签
    pad_size = 32      # 也称为 max_len (前期统计分析,文本长度最大值为38,取32即可覆盖99%)
     
    with open(path + "train.txt", encoding='utf-8') as f:
        for i, l in tqdm(enumerate(f)): 
            x1, y = l.strip().split('t')
            x1 = tokenizer.tokenize(x1)
            tokens = ["[CLS]"] + x1 + ["[SEP]"]
            
            # 得到input_id, seg_id, att_mask
            ids = tokenizer.convert_tokens_to_ids(tokens)
            types = [0] *(len(ids))
            masks = [1] * len(ids)
            # 短则补齐,长则切断
            if len(ids) < pad_size:
                types = types + [1] * (pad_size - len(ids))  # mask部分 segment置为1
                masks = masks + [0] * (pad_size - len(ids))
                ids = ids + [0] * (pad_size - len(ids))
            else:
                types = types[:pad_size]
                masks = masks[:pad_size]
                ids = ids[:pad_size]
            input_ids.append(ids)
            input_types.append(types)
            input_masks.append(masks)
    #         print(len(ids), len(masks), len(types)) 
            assert len(ids) == len(masks) == len(types) == pad_size
            label.append([int(y)])
    

    输出:180000it [00:26, 6728.85it/s] (26秒,速度较快)

    3.切分训练集和测试集

    # 随机打乱索引
    random_order = list(range(len(input_ids)))
    np.random.seed(2020)   # 固定种子
    np.random.shuffle(random_order)
    print(random_order[:10])
     
    # 4:1 划分训练集和测试集
    input_ids_train = np.array([input_ids[i] for i in random_order[:int(len(input_ids)*0.8)]])
    input_types_train = np.array([input_types[i] for i in random_order[:int(len(input_ids)*0.8)]])
    input_masks_train = np.array([input_masks[i] for i in random_order[:int(len(input_ids)*0.8)]])
    y_train = np.array([label[i] for i in random_order[:int(len(input_ids) * 0.8)]])
    print(input_ids_train.shape, input_types_train.shape, input_masks_train.shape, y_train.shape)
     
    input_ids_test = np.array([input_ids[i] for i in random_order[int(len(input_ids)*0.8):]])
    input_types_test = np.array([input_types[i] for i in random_order[int(len(input_ids)*0.8):]])
    input_masks_test = np.array([input_masks[i] for i in random_order[int(len(input_ids)*0.8):]])
    y_test = np.array([label[i] for i in random_order[int(len(input_ids) * 0.8):]])
    print(input_ids_test.shape, input_types_test.shape, input_masks_test.shape, y_test.shape)
    

    得到结果
    在这里插入图片描述

    4.加载到高效的DataLoader

    BATCH_SIZE = 16
    train_data = TensorDataset(torch.LongTensor(input_ids_train), 
                               torch.LongTensor(input_types_train), 
                               torch.LongTensor(input_masks_train), 
                               torch.LongTensor(y_train))
    train_sampler = RandomSampler(train_data)  
    train_loader = DataLoader(train_data, sampler=train_sampler, batch_size=BATCH_SIZE)
     
    test_data = TensorDataset(torch.LongTensor(input_ids_test), 
                              torch.LongTensor(input_types_test), 
                             torch.LongTensor(input_masks_test),
                              torch.LongTensor(y_test))
    test_sampler = SequentialSampler(test_data)
    test_loader = DataLoader(test_data, sampler=test_sampler, batch_size=BATCH_SIZE)
    

    5.定义bert模型

    class Model(nn.Module):
        def __init__(self):
            super(Model, self).__init__()
            self.bert = BertModel.from_pretrained(bert_path)  # /bert_pretrain/
            for param in self.bert.parameters():
                param.requires_grad = True  # 每个参数都要 求梯度
            self.fc = nn.Linear(768, 10)   # 768 -> 2
     
        def forward(self, x):
            context = x[0]  # 输入的句子   (ids, seq_len, mask)
            types = x[1]
            mask = x[2]  # 对padding部分进行mask,和句子相同size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]
            _, pooled = self.bert(context, token_type_ids=types, 
                                  attention_mask=mask, 
                                  output_all_encoded_layers=False) # 控制是否输出所有encoder层的结果
            out = self.fc(pooled)   # 得到10分类
            return out
    

    可以发现,bert模型的定义由于高效简易的封装库存在,使得定义模型较为容易,如果想要在bert之后加入cnn/rnn等层,可在这里定义。

    6.实例化bert模型

    DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model = Model().to(DEVICE)
    print(model) 
    

    得到结果
    在这里插入图片描述

    bert模型结构,未完整输出,可根据这个输出学习bert的内部结构

    7.定义优化器

    param_optimizer = list(model.named_parameters())  # 模型参数名字列表
    no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']
    optimizer_grouped_parameters = [
        {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01},
        {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}]
     
    NUM_EPOCHS = 3
    optimizer = BertAdam(optimizer_grouped_parameters,
                         lr=2e-5,
                         warmup=0.05,
                         t_total=len(train_loader) * NUM_EPOCHS
                        )
     
    # optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)   # 简单起见,可用这一行代码完事
    

    8.定义训练函数和测试函数

    def train(model, device, train_loader, optimizer, epoch):   # 训练模型
        model.train()
        best_acc = 0.0 
        for batch_idx, (x1,x2,x3, y) in enumerate(train_loader):
            start_time = time.time()
            x1,x2,x3, y = x1.to(device), x2.to(device), x3.to(device), y.to(device)
            y_pred = model([x1, x2, x3])  # 得到预测结果
            model.zero_grad()             # 梯度清零
            loss = F.cross_entropy(y_pred, y.squeeze())  # 得到loss
            loss.backward()
            optimizer.step()
            if(batch_idx + 1) % 100 == 0:    # 打印loss
                print('Train Epoch: {} [{}/{} ({:.2f}%)]tLoss: {:.6f}'.format(epoch, (batch_idx+1) * len(x1), 
                                                                               len(train_loader.dataset),
                                                                               100. * batch_idx / len(train_loader), 
                                                                               loss.item()))  # 记得为loss.item()
     
    def test(model, device, test_loader):    # 测试模型, 得到测试集评估结果
        model.eval()
        test_loss = 0.0 
        acc = 0 
        for batch_idx, (x1,x2,x3, y) in enumerate(test_loader):
            x1,x2,x3, y = x1.to(device), x2.to(device), x3.to(device), y.to(device)
            with torch.no_grad():
                y_ = model([x1,x2,x3])
            test_loss += F.cross_entropy(y_, y.squeeze())
            pred = y_.max(-1, keepdim=True)[1]   # .max(): 2输出,分别为最大值和最大值的index
            acc += pred.eq(y.view_as(pred)).sum().item()    # 记得加item()
        test_loss /= len(test_loader)
        print('nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)'.format(
              test_loss, acc, len(test_loader.dataset),
              100. * acc / len(test_loader.dataset)))
        return acc / len(test_loader.dataset)
    

    9.开始训练和测试

    best_acc = 0.0 
    PATH = 'roberta_model.pth'  # 定义模型保存路径
    for epoch in range(1, NUM_EPOCHS+1):  # 3个epoch
        train(model, DEVICE, train_loader, optimizer, epoch)
        acc = test(model, DEVICE, test_loader)
        if best_acc < acc: 
            best_acc = acc 
            torch.save(model.state_dict(), PATH)  # 保存最优模型
        print("acc is: {:.4f}, best acc is {:.4f}n".format(acc, best_acc))  
    

    输出:(训练时间较长,这里只训练了一个epoch,测试集得到0.9407的accuracy)
    在这里插入图片描述

    10.加载最优模型进行测试

    model.load_state_dict(torch.load("roberta_model.pth"))
    acc = test(model, DEVICE, test_loader)
     
    # 如果打比赛的话,下面代码也可参考
    """
    # 测试集提交
    PATH = "roberta_model.pth"
    model.load_state_dict(torch.load(PATH))
    def test_for_submit(model, device, test_loader):    # 测试模型
        model.eval()
        preds = []
        for batch_idx, (x1,x2,x3) in tqdm(enumerate(test_loader)):
            x1,x2,x3 = x1.to(device), x2.to(device), x3.to(device)
            with torch.no_grad():
                y_ = model([x1,x2,x3])
            pred = y_.max(-1, keepdim=True)[1].squeeze().cpu().tolist()   
            # .max() 2输出,分别为最大值和最大值的index
            preds.extend(pred) 
        return preds 
    preds = test_for_submit(model, DEVICE, test_loader)
    """
    

    得到结果
    在这里插入图片描述


    经过以上10步,即可建立起较为完整的pytorch-bert文本分类体系,代码也较为简单易懂,对读者有帮助记得点个赞呀~

    完结-

    更多相关内容
  • 基于LSA和SVM的文本分类模型的研究,本文提出了一种基于标题类别语义识别的文本分类算法
  • 基于attention文本分类代码基于attention文本分类代码基于attention文本分类代码
  • BERT文本分类数据

    2021-01-11 21:27:54
    BERT文本分类代码对应的数据
  • 自然语言处理动手学Bert文本分类,本套课程基于Pytorch最新1.4版本来实现利用Bert实现中文文本分类任务,延续动手学系列课程风格,全程手敲代码,跟着杨博一行一行代码撸起来。
  • CNN 中文文本挖掘 文本分类 python 深度学习 机器学习 CNN 中文文本挖掘 文本分类 python 深度学习 机器学习
  • 头条新闻文本分类数据集,包括11个类别,近50万条数据,文本内容为新闻标题+提取的关键词,分为训练数据和验证数据两个文件
  • 这是一个关于机器学习文本分类的PPT,针对这个PPT,有一个我的博客是我这个PPT中代码的实现,博客链接:https://blog.csdn.net/qq_28626909/article/details/80382029
  • 新闻栏目中文文本分类,新闻栏目一共有: 体育 5000 时政 5000 房产 5000 家居 5000 财经 5000 时尚 5000 科技 5000 教育 5000 娱乐 5000 游戏 5000 每个新闻栏目拥有5000条新闻,通过对新闻内容作为样本训练模型,...
  • 中文文本分类语料(复旦)-训练集和测试集 这个链接是训练集,本语料库由复旦大学李荣陆提供。test_corpus为测试语料,共9833篇文档;train_corpus为训练语料,共9804篇文档,两个预料各分为20个相同类别。训练语料...
  • 复旦大学中文文本分类语料.xlsx
  • 基于CNN的文本分类

    2018-01-04 16:57:40
    该文本内容详细介绍了CNN算法和文本分类的相互关系 我觉得挺好的 希望大家喜欢
  • 分类好的新闻文本数据,内含十个类别,财经、股票、教育、科技、社会、游戏等等,共约10W篇文本,是一个非常好的数据集。
  • 复旦大学谭松波中文文本分类语料库 中文文本分类语料(复旦大学)-训练集和测试集。测试语料共9833篇文档;训练语料共9804篇文档。
  • 文本分类技术作为文本数据处理的一种重要手段,如何提高文本分类的效率具有重大的意义。基于传统的文本分类技术采用TFIDF算法计算权重没有考虑特征项在类别间的分布情况而影响了文本分类效果。本文通过对TFIDF提出了...
  • 文本分类介绍,目前的文本分类模型,数据集和模型对应的代码链接,介绍文本分类的流程和发展史。给出多标签文本分类介绍和对应工具
  • 基于tensorflow实现CNN文本分类 目前文本分类问题主要使用的RNN/LSTM,但是本身具有时序性强、速度慢等局限性。而CNN的主要特点是速度快,主要用于计算机图像的核心部分GPU的硬件层实现。
  • 大数据时代,文本分类是文本数据挖掘和文本价值探索领域的重要工作。传统的文本分类系统存在特征提取能力弱、分类准确率不高的问题。相对于传统的文本分类技术,深度学习技术具有准确率高、特征提取有效等诸多优势,...
  • 文本分类搜狗语料库

    2016-06-20 09:56:40
    搜狗文本分类语料库
  • 自然语言处理—文本分类综述/什么是文本分类

    千次阅读 多人点赞 2021-11-22 15:11:42
    最近在学习文本分类,读了很多博主的文章,要么已经严重过时(还在一个劲介绍SVM、贝叶斯),要么就是机器翻译的别人的英文论文,几乎看遍全文,竟然没有一篇能看的综述,花了一个月时间,参考了很多文献,特此写下此...

    最近在学习文本分类,读了很多博主的文章,要么已经严重过时(还在一个劲介绍SVM、贝叶斯),要么就是机器翻译的别人的英文论文,几乎看遍全文,竟然没有一篇能看的综述,花了一个月时间,参考了很多文献,特此写下此文。

    思维导图

    https://www.processon.com/mindmap/61888043e401fd453a21e978

    文本分类简介

    文本分类(Text Classification 或 Text Categorization,TC),又称自动文本分类(Automatic Text Categorization),是指计算机将载有信息的一篇文本映射到预先给定的某一类别或某几类别主题的过程,实现这一过程的算法模型叫做分类器。文本分类问题算是自然语言处理领域中一个非常经典的问题。

    根据预定义的类别不同,文本分类分两种:二分类多分类,多分类可以通过二分类来实现。
    从文本的标注类别上来讲,文本分类又可以分为单标签多标签,因为很多文本同时可以关联到多个类别。

    文本分类词云一览

    这张图真的是太棒了:

    image.png

    文本分类历史

    文本分类最初是通过专家规则(Pattern)进行分类,利用知识工程建立专家系统,这样做的好处是比较直观地解决了问题,但费时费力,覆盖的范围和准确率都有限。
    后来伴随着统计学习方法的发展,特别是 90 年代后互联网在线文本数量增长和机器学习学科的兴起,逐渐形成了一套解决大规模文本分类问题的经典做法,也即特征工程 + 浅层分类模型。又分为传统机器学习方法深度学习文本分类方法

    文本分类应用场景

    文本分类的主流应用场景有:

    • 情感分析:sentiment analysis ( SA)
    • 话题标记:topic labeling(TL)
    • 新闻分类:news classification (NC)
    • 问答系统:question answering(QA)
    • 对话行为分类:dialog act classification (DAC)
    • 自然语言推理:natural language inference (NLD),
    • 关系分类:relation classification (RC)
    • 事件预测:event prediction (EP)

    🌟 文本分类流程

    这里讨论的文本分类流程指的是基于机器学习/深度学习的文本分类,专家系统已经基本上淘汰了。

    文本分类系统流程如下图所示:

    image.png

    其中,先具体来看浅层学习(Shallow Learning)的具体过程,如下:

    image.png

    如果不考虑训练集,整个文本分类问题就拆分成了特征工程分类器两部分。其实最后还应该有一个性能检验的步骤来评估模型。

    获取训练集

    数据采集是文本挖掘的基础,主要包括爬虫技术和页面处理两种方法。先通过网络爬虫获取到原始 web 网页数据,然后通过页面处理去除掉多余的页面噪声,将 Web 页面转化成为纯净统一的文本格式和元数据格式。

    文本特征工程(针对浅层学习)

    文本预处理

    文本要转化成计算机可以处理的数据结构,就需要将文本切分成构成文本的语义单元。这些语义单元可以是句子、短语、词语或单个的字。
    通常无论对于中文还是英文文本,统一将最小语义单元称为“词组”。

    英文文本预处理

    英文文本的处理相对简单,因为单词之间有空格或标点符号隔开。如果不考虑短语,仅以单词作为唯一的语义单元的话,只需要分割单词,去除标点符号、空格等

    英文还需要考虑的一个问题是大小写转换,一般认为大小写意义是相同的,这就要求将所有单词都转换成小写/大写。

    英文文本预处理更为重要的问题是词根的还原,或称词干提取。词根还原的任务就是将属于同一个词干(Stem)的派生词进行归类转化为统一形式
    例如,把“computed”, “computer”, “computing”可以转化为其词干 “compute”。通过词干还原实现使用一个词来代替一类中其他派生词,可以进一步增加类别与文档中的词之间匹配度。词根还原可以针对所有词进行,也可以针对少部分词进行。

    因为大家都是中国人,所以主要讨论的还是中文文本预处理方法。

    中文文本预处理

    和英文文本处理分类相比,中文文本预处理是更为重要和关键,相对于英文来说,中文的文本处理相对复杂。中文的字与字之间没有间隔,并且单个汉字具有的意义弱于词组。一般认为中文词语为最小的语义单元,词语可以由一个或多个汉字组成。所以中文文本处理的第一步就是分词
    中文文本处理中主要包括文本分词和去停用词两个阶段。

    分词

    研究表明中文文本特征粒度为词粒度远远好于字粒度,因为大部分分类算法不考虑词序信息,如果基于字粒度就会损失了过多的 n-gram 信息。

    目前常用的中文分词算法可分为三大类:基于词典的分词方法、基于理解的分词方法和基于统计的分词方法。

    • 基于词典的中文分词(字符串匹配)
      核心是首先建立统一的词典表,当需要对一个句子进行分词时,首先将句子拆分成多个部分,将每一个部分与字典一一对应,如果该词语在词典中,分词成功,否则继续拆分匹配直到成功。字典,切分规则和匹配顺序是核心。

    • 基于统计的中文分词方法
      统计学认为分词是一个概率最大化问题,即拆分句子,基于语料库,统计相邻的字组成的词语出现的概率,相邻的词出现的次数多,就出现的概率大,按照概率值进行分词,所以一个完整的语料库很重要。

    • 基于理解的分词方法
      基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。
      它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。
      这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。

    image.png

    去停用词

    “在自然语言中,很多字词是没有实际意义的,比如:【的】【了】【得】等,因此要将其剔除。”

    停用词(Stop Word)是一类既普遍存在又不具有明显的意义的词,在英文中例如:“the”、“of”、“for”、“with”、“to”等,在中文中例如:“啊”、“了”、“并且”、“因此”等。
    由于这些词的用处太普遍,去除这些词,对于文本分类来说没有什么不利影响,相反可能改善机器学习效果。停用词去除组件的任务比较简单,只需从停用词表中剔除定义为停用词的常用词就可以了。

    文本特征提取(特征选择)

    nlp 任务非常重要的一步就是特征提取(对应机器学习中的特征工程步骤,也叫做降维),在向量空间模型中,文本的特征包括字、词组、短语等多种元素表示 。在文本数据集上一般含有数万甚至数十万个不同的词组,如此庞大的词组构成的向量规模惊人,计算机运算非常困难。

    进行特征选择,对文本分类具有重要的意义。特征选择就是要想办法选出那些最能表征文本含义的词组元素 。特征选择不仅可以降低问题的规模,还有助于分类性能的改善,选取不同的特征对文本分类系统的性能有非常重要的影响。

    向量空间模型文本表示方法的特征提取分为特征项选择和特征权重计算两部分。但实际中区分的并没有那么严格。

    特征选择的基本思路是根据某个评价指标独立地对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余的特征项。常用的评价有文档频率、互信息、信息增益、 X 2 X^2 X2 统计量等。

    “特征工程详细介绍及 sklearn 实战”

    #词袋模型#

    词袋模型是最原始的一类特征集,忽略掉了文本的语法和语序,用一组无序的单词序列来表达一段文字或者一个文档 。可以这样理解,把整个文档集的所有出现的词都丢进袋子里面,然后 无序去重 地排出来(去掉重复的)。对每一个文档,按照词语出现的次数来表示文档 。例如:

    句子1:我/有/一个/苹果
    
    句子2:我/明天/去/一个/地方
    
    句子3:你/到/一个/地方
    
    句子4:我/有/我/最爱的/你
    

    把所有词丢进一个袋子:我,有,一个,苹果,明天,去,地方,你,到,最爱的。这 4 句话中总共出现了这 10 个词。

    现在我们建立一个无序列表:我,有,一个,苹果,明天,去,地方,你,到,最爱的。并根据每个句子中词语出现的次数来表示每个句子。

    此处输入图片的描述

    总结一下特征:

    • 句子 1 特征: ( 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 )
    • 句子 2 特征: ( 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 )
    • 句子 3 特征: ( 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 )
    • 句子 4 特征: ( 2 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 )

    词袋模型生成的特征叫做词袋特征,该特征的缺点是词的维度太大,导致计算困难,且每个文档包含的词语远远数少于词典的总词语数,导致文档稀疏。仅仅考虑词语出现的次数,没有考虑句子词语之间的顺序信息,即语义信息未考虑。

    #TF-IDF 模型#

    这种模型主要是用词汇的统计特征来作为特征集,TF-IDF 由两部分组成:TF(Term frequency,词频),**IDF(Inverse document frequency,逆文档频率)**两部分组成,利用 TF 和 IDF 两个参数来表示词语在文本中的重要程度。TF 和 IDF 都很好理解,我们直接来说一下他们的计算公式:

    1. TF

    TF 是词频,指的是一个词语在一个文档中出现的频率,一般情况下,每一个文档中出现的词语的次数越多词语的重要性更大(当然要先去除停用词),例如 BOW 模型直接用出现次数来表示特征值。
    问题在于在 长文档中的词语次数普遍比短文档中的次数多,导致特征值偏向差异情况,所以不能仅仅使用词频作为特征。

    TF 体现的是词语在文档内部的重要性。

    t f i j = n i j ∑ k n k j tf_{ij} = \frac{n_{ij}}{\sum_{k}n_{kj}} tfij=knkjnij

    其中分子 n i j n_{ij} nij 表示词 i i i 在文档 j j j 中出现的频次。分母则是文档 j j j 中所有词频次的总和,也就是文档 j j j 中所有词的个数。举个例子:

    句子1:上帝/是/一个/女孩
    
    句子2:桌子/上/有/一个/苹果
    
    句子3:小明/是/老师
    
    句子4:我/有/我/最喜欢/的/
    

    每个句子中词语的 TF :

    此处输入图片的描述

    2. IDF

    i d f i = l o g ( ∣ D ∣ 1 + ∣ D i ∣ ) idf_{i} = log\left ( \frac{\left | D \right |}{1+\left | D_{i} \right |} \right ) idfi=log(1+DiD)

    其中 ∣ D ∣ \left | D \right | D 代表文档的总数,分母部分 ∣ D i ∣ \left | D_{i} \right | Di 则是代表文档集中含有 i i i 词的文档数
    原始公式是分母没有 + 1 +1 +1 的,这里 + 1 +1 +1 是采用了拉普拉斯平滑,避免了有部分新的词没有在语料库中出现而导致分母为零的情况出现。

    IDF 是体现词语在文档间的重要性。如果某个词语仅出现在极少数的文档中,说明该词语对于文档的区别性强,对应的特征值高,很明显 ∣ D i ∣ \left | D_{i} \right | Di 值越小,IDF 的值越大。

    用 IDF 计算公式计算上面句子中每个词的 IDF 值:

    TF-IDF 方法的主要思路是一个词在当前类别的重要度与在当前类别内的词频成正比,与所有类别出现的次数成反比。可见 TF 和 IDF 一个关注文档内部的重要性,一个关注文档外部的重要性,最后结合两者,把 TF 和 IDF 两个值相乘就可以得到 TF-IDF 的值。即:

    t f ∗ i d f ( i , j ) = t f i j ∗ i d f i = n i j ∑ k n k j ∗ l o g ( ∣ D ∣ 1 + ∣ D i ∣ ) tf*idf(i,j)=tf_{ij}*idf_{i}= \frac{n_{ij}}{\sum_{k}n_{kj}} *log\left ( \frac{\left | D \right |}{1+\left | D_{i} \right |} \right ) tfidf(i,j)=tfijidfi=knkjnijlog(1+DiD)

    上面每个句子中,词语的 TF-IDF 值:

    此处输入图片的描述

    把每个句子中每个词的 TF-IDF 值 添加到向量表示出来就是每个句子的 TF-IDF 特征。

    例如句子 1 的特征:
    ( 0.25 ∗ l o g ( 2 ) , 0.25 ∗ l o g ( 1.33 ) , 0.25 ∗ l o g ( 1.33 ) , 0.25 ∗ l o g ( 2 ) , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ( 0.25 * log(2) , 0.25 * log(1.33) , 0.25 * log(1.33) , 0.25 * log(2) , 0 ,0 ,0 ,0 , 0 , 0 , 0 , 0 , 0 ) (0.25log(2),0.25log(1.33),0.25log(1.33),0.25log(2),0,0,0,0,0,0,0,0,0)

    卡方特征选择(基于卡方检验的特征选择)

    对于文本分类的词向量中许多常用单词对分类决策的帮助不大,比如汉语的一些虚词和标点符号等,也可能有一些单词在所有类别的文档中均匀出现。
    为了消除这些单词的影响,一方面可以用停用词表,另一方面可以用卡方非参数检验(Chi-squaredtest,X2)来过滤掉与类别相关程度不高的词语。

    卡方检验(χ2 test),是一种常用的特征选择方法,尤其是在生物和金融领域。χ2 用来描述两个事件的独立性或者说描述实际观察值与期望值的偏离程度。χ2 值越大,则表明实际观察值与期望值偏离越大,也说明两个事件的相互独立性越弱。

    特征选择之卡方检验

    基于词向量的特征提取模型

    该模型通常基于大量的文本语料库,通过类似神经网络模型训练,将每个词语映射成一个定维度的向量,维度在几十维到百维之间,每个向量就代表着这个词语,词语的语义和语法相似性和通过向量之间的相似度来判断

    常用的 word2vec 主要是 CBOW 和 skip-gram 两种模型,由于这两个模型实际上就是一个三层的深度神经网络,其实 NNLM 的升级,去掉了隐藏层,由输入层、投影层、输出层三层构成,简化了模型和提升了模型的训练速度,其在时间效率上、语法语义表达上效果明显都变好。word2vec 通过训练大量的语料最终用定维度的向量来表示每个词语,词语之间语义和语法相似度都可以通过向量的相似度来表示。
    [NLP] 秒懂词向量 Word2vec 的本质

    一文看懂 word2vec

    文本表示

    文本是一种非结构化的数据信息,是不可以直接被计算的。文本表示的作用就是将这些非结构化的信息转化为计算机可以理解的结构化的信息 ,这样就可以针对文本信息做计算,来完成后面的任务。

    image.png

    文本表示的方法有很多种,传统做法常用上面提到词袋模型(BOW, Bag Of Words)或向量空间模型(CSM, Vector Space Model),除此之外还有基于词嵌入的的独热编码(one-hot representation)、整数编码、词嵌入(wordembeding)等方法,我们简单说几种重要的:

    • 词袋模型
      上面已经提到过,就是把所有文本的词汇都放在一个特别特别大的向量中,一个文本有该词就标为 1,非常原始且缺点很多,已经基本淘汰。

    • 向量空间模型
      是目前文本处理应用领域使用最多且效果较好的文本表示法,简单说就是在词向量中给每个词一定的权重(这个权重可以是简单的词频,也可以是 TF-IDF 等等,非常灵活)。
      定义

      • 给定文档 D = ( t 1 , w 1 ; t 2 , w 2 ; . . . ; t n , w n ) D=(t_1,w_1;t2,w_2;...;t_n,w_n) D=(t1,w1;t2,w2;...;tn,wn) ,其中 t k ( 1 ⩽ k ⩽ n ) t_k(1\leqslant k\leqslant n) tk(1kn) 是组成文本的词元素, w k w_k wk 是词元素 t k t_k tk 的权重,可以理解为在文本中的某种重要程度。

      性质,向量空间模型满足以下两条性质::

      • 互异性:各词组元素间属于集合元素关系,即若 i ≠ j i≠j i=j ,则 t i   ≠ t j t_i~ ≠t_j ti =tj
      • 无关性:各词组元素间无顺序关系和相互联系,即对于文本 D D D,若 i ≠ j i≠j i=j ,交换 t i t_i ti t j t_j tj 的位置,仍表示文档 D D D。词组与词组之间不含任何关系。

      可以把词组 t 1 , t 2 , … , t n t_1 , t_2 ,…,t_n t1,t2,,tn 看成 n 维坐标空间,而权重 w 1 , w 2 , … , w n w_1 , w_2 ,…,w_n w1,w2,,wn 为相应坐标值。因此,一个文本可以表示为一个 n 维向量。

    文本表示这一步往往同上一步(文本特征提取)联系非常紧密,实际应用中往往一并完成了,所以你会看到有些方法同时并属于两者。

    分类器(分类算法模型)

    文本分类方法模型主要分为两个大类,一类是传统的机器学习方法(具体可以再分为四类),另一类是新兴的深度学习模型。由于每个算法其实都非常复杂,在此我们仅做简单介绍,建议需要使用时一定要再深入学习理解。

    文本分类算法历史

    从 1961 到 2020 文本分类算法的发展历史:

    image.png

    图上黄色代表浅层学习模型,绿色代表深层学习模型。可以看到,从 1960 年代到 2010 年代,基于浅层学习的文本分类模型占主导地位。自 2010 年代以来,文本分类已逐渐从浅层学习模型变为深层学习模型。

    传统机器学习方法(浅层学习模型)

    1. 基于规则的模型
      基于规则的分类模型相对简单,易于实现。它在特定领域的分类往往能够取得较好的效果。相对于其它分类模型来说,基于规则的分类模型的优点就是时间复杂度低、运算速度快。在基于规则的分类模型中,使用许多条规则来表述类别。类别规则可以通过领域专家定义,也可以通过计算机学习获得。
      决策树就是一种基于训练学习方法获取分类规则的常见分类模型,它建立对象属性与对象值之间的一种映射。通过构造决策树来对未标注文本进行分类判别。常用的决策树方法包括 CART 算法、ID3、C4.5、CHAID 等。
      决策树的构建过程一般是自上而下的,决策树可以是二叉树也可以是多叉树,剪枝的方法也有多种,但是具有一致目标,即对目标文本集进行最优分割。
      image.png

    2. 基于概率的模型
      假设未标注文档为 d d d ,类别集合为 C = { c 1 , c 2 , … , c m } C=\{c_1 ,c_2 ,…,c_m\} C={c1,c2,,cm} ,概率模型分类是对 1 ≤ i ≤ n 1≤i≤n 1in 求条件概率模型 P ( c i ∣ d ) P(c_i |d) P(cid)(即 d d d 属于 c i c_i ci 类别的概率) ,将与文档 d d d 条件概率最大的那个类别作为该文档的输出类别。其中朴素贝叶斯分类器(naive Bayes)是应用最为广泛且最简单常用的一种概率分类模型。朴素贝叶斯法基于贝叶斯定理将联合概率转化为条件概率,然后利用特征条件独立假设简化条件概率的计算。
      image.png
      朴素贝叶斯分类的基本思想是利用词组与类别的联合概率来估计给定文档的类别概率。概率 P ( d ∣ c i ) P(d|c_i) P(dci) 计算相对复杂,它首先基于一个贝叶斯假设:文档 d d d 为词组元素的集合,集合中词组(元素)之间相互独立。由于前面的步骤使得文档表示简化了,所以这也就是朴素的由来之一。事实上,词组之间并不是相互独立的。虽然这是一种假设独立性,但是朴素贝叶斯还是能够在分类任务中表现出很好的分类效果和鲁棒性。这一假设简化了联合概率的计算,它允许条件概率的乘积来表示联合概率。 P ( d ∣ c i ) P(d|c_i) P(dci) 的计算式:
      P ( d ∣ c i ) = Π k = 1 n P ( t k ∣ c i ) P\left( d|c_{i}\right) =\Pi^{n}_{k=1} P\left( t_{k}|c_{i}\right) P(dci)=Πk=1nP(tkci)

      其中, t k t_k tk 表示含有 n n n 项词组的词组表 v i v_i vi 中的一个词组。因此,估计概率 P ( d ∣ c i ) P(d|c_i) P(dci) 转化为了估计词组表 v v v 中的每一个词组在每一个类别下的概率 P ( t k ∣ c i ) P(t_k|c_i) P(tkci)
      概率的估计与分类结果非常依赖于事件空间的选择,下面简单介绍两种事件空间模型,并说明相应的 P ( t k ∣ c i ) P(t_k |c_i) P(tkci) 是如何估计的。

      1. 多重伯努利(Multiple-Bernoulli)事件空间是一种布尔独立模型的事件空间,为每一个词组 tk 建立一个二值随机变量,最简单的方式就是使用最大似然估计来估计概率。但缺点在于多重伯努利模型仅仅考虑词组是否出现,而没有考虑出现的多少,而词频也是一个重要分类信息。下面介绍加入词频信息的多项式模型。
      2. 多项式(Multinomial)事件空间与多重伯努利事件空间类似,但是多项式事件空间假设词组的出现次数是零次或多次,而不是出现与否。实际应用中,多项式模型已经表明优于多重伯努利模型。
    3. 基于几何学的模型
      使用向量空间模型表示文本,文本就被表示为一个多维的向量,那么它就是多维空间的一个点。通过几何学原理构建一个超平面将不属于同一个类别的文本区分开。最典型的基于几何学原理的分类器是"支持向量机"(SVM),其分类效果较为不错,几乎可以说是传统机器学习算法中最好的了。
      image.png
      SVM 之所以能够取得比较好的分类效果,其优点在于:

      • SVM 是一种针对有限样本条件下的分类算法,其目标是得到当前训练集下的最优解而不是样本数趋于无穷大时的最优值,该算法最终将问题转化成二次线性规划寻求最优解问题。从理论上来讲,它得到的是全局最优解,能够避免局部极值问题。
      • 该方法将实际问题通过核函数技巧将线性不可分空间映射到高维线性可分空间,在高维空间中构造线性决策函数来实现原线性不可分空间的决策函数。这保证了 SVM 具有较好的推广能力,计算的复杂度不再取决于空间维数,而是取决于训练集样本数量。
      • SVM 方法能够很好的处理稀疏数据,更好的捕捉了数据的内在特征,准确率较高。

      SVM 虽然有许多优点,但是固有的缺点是不可避免的。其缺点包括:

      • SVM 算法时间和空间复杂度较高,随着训练样本数和类别的增加,分类时间和空间代价很高。
      • 核函数空间变换会增加训练集空间的维数,使得 SVM 对时间和空间需求加大,又进一步降低了分类的效率。
      • SVM 算法一般含有较多参数,并且参数随着训练样本的不同,呈现较大的差异,调整参数以获得最优分类效果相对困难。而且参数的不同对分类结果的显示出较大的差异性。
    4. 基于统计的模型
      基于统计的机器学习方法已经成为自然语言研究领域里面的一个主流研究方法。事实上无论是朴素贝叶斯分类模型,还是支持向量机分类模型,也都采用了统计的方式。文本分类算法中一种最典型的基于统计的分类模型就是 k 近邻(k-Nearest Neighbor,kNN)模型,是比较好的文本分类算法之一。
      image.png
      kNN 分类模型的主要思想:通过给定一个未标注文档 d d d,分类系统在训练集中查找与它距离最接近的 k k k 篇相邻(相似或相同)标注文档,然后根据这 k k k 篇邻近文档的分类标注来确定文档 d d d 的类别。分类实现过程:

      1. 将训练集样本转化为向量空间模型表示形式并计算每一特征的权重
      2. 采用类似步骤 1 的方式转化未标注文档 d d d 并计算相应词组元素的权重
      3. 计算文档 d d d 与训练集样本中每一样本的距离(或相似度);
      4. 找出与文档 d d d 距离最小(或相似度最大)的 k k k 篇训练集文本;
      5. 统计这个 k k k 篇训练集文本的类别属性,一般将文档 d d d 的类归为 k k k 中最多的样本类别。

      KNN 分类模型是一种“懒学习”算法,实质上它没有具体的训练学习过程。分类过程只是将未标注文本与每一篇训练集样本进行相似度计算, kNN 算法的时间和空间复杂度较高。因而随着训练集样本的增加,分类的存储资源消耗大,时间代价高。一般不适合处理训练样本较大的分类应用。

    关于上面这些模型的具体原理性质参见:文本分类——常见分类模型

    ⭐️ 深度学习方法

    上文介绍了传统的机器学习文本分类,后起的神经网络虽然可以横扫一切,但其实一开始却不擅长对文本数据的处理(其实神经网络虽然在各种 NLP 任务中虽然准确率非常好看,但实际应用中并不明显)。主要问题是,文本本表示高维度高稀疏,但特征表达能力却很弱,神经网络还需要人工进行特征工程,成本高昂。

    自 2010 年代以来,文本分类逐渐从浅层学习模式向深度学习模式转变。与基于浅层学习的方法相比,深度学习方法避免了人工设计规则和特征,并自动提供文本挖掘的语义意义表示。与浅层模型不同,深度学习通过学习一组直接将特征映射到输出的非线性转换,将特征工程集成到模型拟合过程中。目前的几乎所有研究都是基于 DNN。

    下面是目前文本分类算法在最近的一些主流任务上的排行榜:

    image.png

    可以看到已经不见了传统算法的影子,目前的主流研究方向也都是神经网络的方向,但是对于一些小数据量、低成本的任务还是推荐使用传统算法。

    而深度学习最初之所以在图像和语音取得巨大成功,一个很重要的原因是图像和语音原始数据是连续和稠密的,有局部相关性。应用深度学习解决大规模文本分类问题最重要的是解决文本表示,再利用 CNN/RNN 等网络结构自动获取特征表达能力,去掉繁杂的人工特征工程,端到端的解决问题。例如新提出的 BERT 模型。

    文本分类深度学习概述

    前馈神经网络和递归神经网络是用于文本分类任务的前两种深度学习方法,与浅层学习模型相比,它们可以提高性能。然后,将 CNN,RNN 和注意力机制用于文本分类。许多研究人员通过改进 CNN,RNN 和注意力,或模型融合和多任务方法,提高了针对不同任务的文本分类性能。

    可以生成上下文化词向量的 BERT 的出现,是文本分类和其他 NLP 技术发展的重要转折点,该模型在包括文本分类在内的多个 NLP 任务具有更好的性能。此外,一些研究人员研究了基于 GNN 的文本分类技术,以捕获文本中的结构信息,这是其他方法无法替代的。

    根据结构对文本分类的 DNN 算法可分为几大类:

    image.png

    1. 基于递归神经网络的方法(ReNN-based methods)

    递归神经网络(ReNN)可以自动递归学习文本的语义和语法树结构,无需特征设计。递归自动编码器(RAE)用来预测每个输入句子的情感标签分布,并学习多词短语的表示。为了学习每个输入文本的成分向量表示,矩阵向量递归神经网络(MV-RNN)引入了 ReNN 模型来学习短语和句子的表示。

    image.png

    看图中的例子。首先,将输入文本中的每个单词作为模型结构的叶节点,然后通过权重矩阵将所有节点合并为父节点。权重矩阵在整个模型中共享。每个父节点与所有叶节点具有相同的维度。最后,将所有节点递归聚合为根节点,以表示预测标签的输入文本

    2. 基于多层感知机的方法(MLP-based methods)

    多层感知器(MLP, multilayer perceptron),俗称”vanilla”神经网络,是一种用于自动捕获特征的简单神经网络结构。

    image.png

    看图中例子,我们给出了一个三层 MLP 模型。它包含一个输入层、一个对应所有节点带有激活函数隐藏层,一个输出层。每个节点都连接一个具有一定权重的 wi。它将每个输入文本视为一个词袋(bagsofword)

    一些研究小组提出了一些基于 MLP 的文本分类方法。段落向量(Paragraph-vec)是最流行和使用最广泛的方法,它类似于 CBOW。采用无监督算法得到不同输入长度文本的固定长度特征表示。

    3. 基于循环神经网络的方法(RNN-based methods)

    循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN 就能够很好地解决这类问题。

    image.png

    看图中例子。首先,利用词嵌入技术(word embedding),将输入的每个词用一个特定的向量表示。然后,将嵌入词向量逐个输入 RNN 单元。RNN 单元的输出与输入向量的维数相同,并馈入下一隐含层。RNN 在模型的不同部分共享参数,并且对每个输入词具有相同的权重。最后,隐藏层的最后一层输出可以预测输入文本的标签。

    基于循环神经网络的方法:长短期记忆(LSTM)

    在 RNN 的反向传播过程中,权值是通过导数的连续乘法来计算的梯度来调整的。如果导数非常小,连续乘法可能会导致梯度消失问题。长短期记忆(Long short-term memory, LSTM)是一种特殊的 RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的 RNN,LSTM 能够在更长的序列中有更好的表现。

    它由记忆任意时间间隔值的单元和控制信息流的三个门结构组成。门结构包括输入门(input gate)、遗忘门(forget gates)和输出门(ouput gates)。LSTM 分类方法可以更好地捕获上下文特征词之间的连接,利用遗忘门结构过滤无用信息,有利于提高分类器的总体捕获能力。

    LSTM 结构(图右)和普通 RNN 的主要输入输出区别如下所示。

    image.png

    具体参见:人人都能看懂的 LSTM

    4. 基于卷积神经网络的方法(CNN-based methods)

    卷积神经网络(Convolutional neural networks, CNNs)起初用于图像分类,卷积滤波器(convolving filters)可以提取图像的特征。与 RNN 不同,CNN 可以同时将不同核定义的卷积应用于序列的多个块。因此,CNN 用于许多自然语言处理任务,包括文本分类。对于文本分类,需要将文本表示为类似于图像表示的向量,可以从多个角度对文本特征进行过滤。

    image.png

    看图中例子。首先,将输入文本的词向量拼接成一个矩阵。然后将矩阵输入卷积层(Conv),卷积层包含几个不同维度的滤波器。最后,卷积层的结果经过池化层(Pooling),并将池化结果连接起来(Concat),得到文本的最终向量表示。类别由最终输出向量预测。

    5. 基于注意力机制的方法(Attention-based methods)

    CNN 和 RNN 在文本分类相关的任务上提供了很好的结果,但缺点在于,这些模型不够直观,可解释性较差,特别是对于一些分类错误,由于隐藏数据的不可读性,无法解释。因此提出了注意力模型。

    注意力模型(Attentional mechanism, AM)最初被用于机器翻译,现在已成为神经网络领域的一个重要概念。注意力机制借鉴了人类的注意力机制。

    例如,视觉注意力机制是人类视觉所特有的大脑信号处理机制。我们的视觉系统倾向于关注图像中辅助判断的部分信息,并忽略掉不相关的信息。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。

    图中例子形象化展示了人类在看到一副图像时是如何高效分配有限的注意力资源的,其中红色区域表明视觉系统更关注的目标。很明显人们会把注意力更多投入到人的脸部、文本的标题、文章首句以及更具有感情色彩的词汇等位置。

    image.png

    深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。同样,在涉及语言或视觉的问题中,输入的某些部分可能会比其他部分对决策更有帮助。例如,在翻译和总结任务中,输入序列中只有某些单词可能与预测下一个单词相关。

    在人工智能领域,注意力已成为神经网络结构的重要组成部分,并在自然语言处理、统计学习、语音和计算机等领域有着大量的应用。

    基于注意力机制的方法:HAN

    HAN 包括两个编码器(encoders)和两个层次的注意层(attention layers)。注意机制让模型对特定的输入给予不同的注意。它先将关键词聚合成句子向量,再将关键句子向量聚合成文本向量。通过这两个层次的注意,可以了解每个单词和句子对分类判断贡献多少,有利于应用和分析。

    image.png

    6. 基于 Transformer 的方法(Transformer-based methods)

    Transformer 是一种预训练的语言模型,可以有效地学习全局语义表示,并显著提高包括文本分类在内的 NLP 任务。通常使用无监督的方法自动挖掘语义知识,然后构造预训练目标,使机器能够学习理解语义。Transformer 可以在不考虑连续信息(sequential information)的情况下并行计算,适用于大规模数据集,因此在 NLP 任务中很受欢迎。

    基于 Transformer 的方法最著名的有以下三个模型:

    image.png

    ELMo 是一个深度上下文化的词表示模型,它很容易集成到模型中。 它可以模拟词汇的复杂特征,学习不同语境下的不同表征。该算法利用双向 LSTM 算法,根据上下文单词学习每个单词的嵌入。

    GPT 的核心思想是先通过无标签的文本去训练生成语言模型,再根据具体的 NLP 任务(如文本蕴涵、QA、文本分类等),来通过有标签的数据对模型进行 fine-tuning。

    BERT(Bidirectional Encoder Representation from Transformers),是一个预训练的语言表征模型。它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的 masked language model(MLM),以致能生成深度的双向语言表征。

    具体参考:什么是 BERT?

    基于图神经网络的方法(GNN-based methods)

    尽管传统的深度学习方法在提取结构空间(欧式空间)数据的特征方面取得了巨大的成功,但许多实际应用场景中的数据是从非结构空间生成的,传统的深度学习方法在处理非结构空间数据上的表现难以令人满意。例如,在推荐系统中,一个基于图的学习系统能够利用用户和产品之间的交互来做出非常准确的推荐。

    图神经网络(GNN,Graph Neural Network),是一个可用于学习大规模相互连接的图结构信息数据的模型。基于 GNN 的模型可以学习句子的句法结构,也可以进行文本分类。

    image.png

    如图中例子所示。首先,将四个输入文本和文本中的单词定义为节点,构造成图结构。图节点由黑体边连接,黑体边表示文档—单词边和单词—单词边。每个词的权重通常是指它们在语料库中的共现频率。然后,通过隐藏层表示单词和文本。最后,可以用图预测所有输入文本的标签。


    文本分类技术挑战

    众所周知,在 DNN 中输入的有益信息越多,其性能越好。因此,增加外部知识(知识库或知识图)是提高模型性能的有效途径,由于投入规模的限制,仍然是一个挑战。

    算法模型:如何权衡数据和计算资源以及预测性能。

    虽然一些新的文本分类模型不断地提高了大多数分类任务的准确性指标,但并不能像人类一样从语义层面“理解”文本。此外,对于噪声样本,小样本噪声可能导致决策置信度发生较大变化,甚至导致决策逆转。以词向量为代表的预先训练的语义表示模型通常可以提高下游 NLP 任务的性能。现有的关于无语境词向量(context-free
    word vectors)迁移策略的研究还处于相对初级的阶段。从数据,模型和性能的角度得出结论,文本分类主要面临以下挑战:

    image.png

    数据层面

    对于文本分类任务,无论是浅层学习还是深度学习方法,数据对于模型性能都是必不可少的。研究的文本数据主要包括多章,短文本,跨语言,多标签,少样本文本。对于这些数据的特征,现有的技术挑战如下:

    • 零次学习/少量学习(zero-shot/Few-shot learning)
      是指对无标注、或很少标注的文本进行分类。然而,目前的模型过于依赖大量的标记数据。
    • 外部知识。
      深度学习模型是大数据喂出来的,输入的信息越多,DNN 的性能就越好。所以,添加外部知识(知识库或知识图)是提高模型性能的有效途径。然而,如何添加以及添加什么仍然是一个问题。
    • 多标签文本分类任务
      多标签文本分类需要充分考虑标签之间的语义关系,并且模型的嵌入和编码是有损压缩的过程。因此,如何减少训练过程中层次语义的丢失以及如何保留丰富而复杂的文档语义信息仍然是一个亟待解决的问题。
    • 具有许多术语词汇的特殊领域
      特定领域的文本(例如金融和医学文本)包含许多特定的单词或领域专家,可理解的语,缩写等,这使现有的预训练单词向量难以使用。

    模型层面

    现有的算法模型,浅层和深度学习已经都尝试应用于文本分类,包括集成方法(integration methods)。横空出世的 BERT 学习了一种语言表示法,可以用来对许多 NLP 任务进行 fine-tune。但想提高模型准确率,最主要的方法是仍然是增加数据,如何在增加数据和计算资源,和预测性能之间权衡是值得研究的。

    性能评估层面

    浅层模型和深层模型可以在大多数文本分类任务中取得良好的性能,但是需要提高其结果的抗噪声能力。如何实现对深度模型的合理评估也是一个技术挑战。

    • 模型的语义鲁棒性
      近年来,研究人员设计了许多模型来增强文本分类模型的准确性。但是,如果数据集中有一些对抗性样本,则模型的性能会大大降低。因此,如何提高模型的鲁棒性是当前研究的热点和挑战。
    • 模型的可解释性
      DNN 在特征提取和语义挖掘方面具有独特的优势,并且已经完成了出色的文本分类任务。但是,深度学习是一个黑盒模型,训练过程难以重现,隐式语义和输出可解释性很差。它对模型进行了改进和优化,丢失了明确的准则。此外,我们无法准确解释为什么该模型可以提高性能。

    总结

    本文主要介绍了现有的从浅学习到深学习的文本分类任务模型。首先,介绍了一些主要的浅学习模型和深度学习模型,并给出了总结表。浅层模型主要通过改进特征提取方案和分类器设计来提高文本分类性能。

    相比之下,深度学习模型通过改进表示学习方法、模型结构以及增加数据和知识来提高性能。然后,我们引入了带有摘要表和评价指标的数据集,用于单标签和多标签任务。在此基础上,给出了经典文本分类数据集在不同应用的摘要表中领先模型的定量结果。

    最后,总结了文本分类未来可能面临的研究挑战。

    参考文章

    参考博文

    中文文本挖掘预处理流程总结

    自然语言处理(NLP)语义分析–文本分类、情感分析、意图识别

    自然语言处理 4:文本分类

    自然语言处理——文本分类概述

    文本分类——常见分类模型

    《文本分类大综述:从浅层到深度学习》

    最新文本分类综述 2020-《A Survey on Text Classification: From Shallow to Deep Learning》

    参考文献

    [1] X. Zhu, P. Sobhani, and H. Guo, " Long short-term memory over recursive structures, in Proc. ICML, 2015, pp. 1604-1612, 201
    [2] K. S. Tai, R. Socher, and C. D. Manning, "Improved semantic representations from tree-structured long short-term memory networks, in Proc.ACL,2015,pp.1556-1566,2015.
    [3]K. Kowsari, K. J. Meimandi, M. Heidarysafa, S. Mendu, L. E. Barnes, and D. E. Brown, “Text classifification algorithms: A survey,” Information, vol. 10, no. 4, p. 150, 2019.
    [4]K. Schneider, “A new feature selection score for multinomial naive bayes text classifification based on kl-divergence,” in Proc. ACL, 2004,2004.
    [5]W. Dai, G. Xue, Q. Yang, and Y. Yu, “Transferring naive bayesclassifiers for text classification,” in Proc. AAAI, 2007, pp. 540–545,2007.
    [6]K. Yi and J. Beheshti. A hidden markov model-based text classification of medical documents, “J. Inf. Sci., vol.35, no. 1, pp.67-81, 2009
    [7]T. M. Cover and P. E. Hart, “Nearest neighbor pattern classifification,” IEEE Trans. Inf. Theory, vol. 13, no. 1, pp. 21–27, 1967.
    [8]P. Soucy and G. W. Mineau, “A simple KNN algorithm for text categorization,” in Proc. ICDM, 2001, pp. 647–648, 2001.
    [9]S. Tan, “Neighbor-weighted k-nearest neighbor for unbalanced text corpus,” Expert Syst. Appl., vol. 28, no. 4, pp. 667–671, 2005.
    [10]C. Cortes and V. Vapnik, “Support-vector networks,” Mach. Learn., vol. 20, no. 3, pp. 273–297, 1995.
    [11]T. Joachims, “Text categorization with support vector machines: Learning with many relevant features,” in Proc. ECML, 1998, pp. 137–142, 1998.
    [12]T. Joachims, “A statistical learning model of text classification for support vector machines,” in Proc. SIGIR, 2001, pp. 128–136, 2001.
    [13]P. Vateekul and M. Kubat, “Fast induction of multiple decision trees in text categorization from large scale, imbalanced, and multi-label data,”in Proc. ICDM Workshops, 2009, pp. 320–325, 2009.
    [14]R. Socher, J. Pennington, E. H. Huang, A. Y. Ng, and C. D. Manning, “Semi-supervised recursive autoencoders for predicting sentiment distributions,” in Proc. EMNLP, 2011, pp. 151–161, 2011.
    [15]R. Socher, B. Huval, C. D. Manning, and A. Y. Ng, “Semantic compositionality through recursive matrix-vector spaces,” in Proc.EMNLP, 2012, pp. 1201–1211, 2012.
    [16]M. k. Alsmadi, K. B. Omar, S. A. Noah, and I. Almarashdah, “Performance comparison of multi-layer perceptron (back propagation, delta rule and perceptron) algorithms in neural networks,” in 2009 IEEE International Advance Computing Conference, pp. 296–299, 2009.
    [17]Q. V. Le and T. Mikolov, “Distributed representations of sentences and documents,” in Proc. ICML, 2014, pp. 1188–1196, 2014.
    [18]B. Felbo, A. Mislove, A. Søgaard, I. Rahwan, and S. Lehmann, “Using millions of emoji occurrences to learn any-domain representations for detecting sentiment, emotion and sarcasm,” in Proc. EMNLP, 2017, pp. 1615–1625, 2017.
    [19]T. Miyato, S. Maeda, M. Koyama, and S. Ishii, “Virtual adversarial training: a regularization method for supervised and semi-supervised learning,” CoRR, vol. abs/1704.03976, 2017.
    [20]T. Miyato, A. M. Dai, and I. J. Goodfellow, “Adversarial training methods for semi-supervised text classification,” in Proc. ICLR, 2017, 2017. [21]Li Q, Peng H, Li J, et al. A survey on text classification: From shallow to deep learning[J]. arXiv preprint arXiv:2008.00364, 2020.

    展开全文
  • SVM实现文本分类代码

    2019-01-14 20:47:17
    利用十大经典机器学习算法之一的SVM(支持向量机)算法,实现文本分类,用于自然语言处理。
  • 利用python,实现基于SVM的文本分类. 代码见 https://github.com/yangysc/Document-Classification
  • 文本分类算法LDA

    2015-02-09 21:34:28
    基于LDA文本分类的python实现版本
  • 文本分类

    千次阅读 2018-09-07 16:56:06
    一、传统文本分类方法  文本分类问题算是自然语言处理领域中一个非常经典的问题了,相关研究最早可以追溯到上世纪50年代,当时是通过专家规则(Pattern)进行分类,甚至在80年代初一度发展到利用知识工程建立专家...

    一、传统文本分类方法 
    文本分类问题算是自然语言处理领域中一个非常经典的问题了,相关研究最早可以追溯到上世纪50年代,当时是通过专家规则(Pattern)进行分类,甚至在80年代初一度发展到利用知识工程建立专家系统,这样做的好处是短平快的解决top问题,但显然天花板非常低,不仅费时费力,覆盖的范围和准确率都非常有限。

    后来伴随着统计学习方法的发展,特别是90年代后互联网在线文本数量增长和机器学习学科的兴起,逐渐形成了一套解决大规模文本分类问题的经典玩法,这个阶段的主要套路是人工特征工程+浅层分类模型。训练文本分类器过程见下图: 
    这里写图片描述 
    整个文本分类问题就拆分成了特征工程和分类器两部分,玩机器学习的同学对此自然再熟悉不过了

    1.1 特征工程

    特征工程在机器学习中往往是最耗时耗力的,但却极其的重要。抽象来讲,机器学习问题是把数据转换成信息再提炼到知识的过程,特征是“数据–>信息”的过程,决定了结果的上限,而分类器是“信息–>知识”的过程,则是去逼近这个上限。然而特征工程不同于分类器模型,不具备很强的通用性,往往需要结合对特征任务的理解。

    文本分类问题所在的自然语言领域自然也有其特有的特征处理逻辑,传统分本分类任务大部分工作也在此处。文本特征工程分位文本预处理、特征提取、文本表示三个部分,最终目的是把文本转换成计算机可理解的格式,并封装足够用于分类的信息,即很强的特征表达能力。 
    1)文本预处理

    文本预处理过程是在文本中提取关键词表示文本的过程,中文文本处理中主要包括文本分词和去停用词两个阶段。之所以进行分词,是因为很多研究表明特征粒度为词粒度远好于字粒度,其实很好理解,因为大部分分类算法不考虑词序信息,基于字粒度显然损失了过多“n-gram”信息。

    具体到中文分词,不同于英文有天然的空格间隔,需要设计复杂的分词算法。传统算法主要有基于字符串匹配的正向/逆向/双向最大匹配;基于理解的句法和语义分析消歧;基于统计的互信息/CRF方法。近年来随着深度学习的应用,WordEmbedding + Bi-LSTM+CRF方法逐渐成为主流,本文重点在文本分类,就不展开了。而停止词是文本中一些高频的代词连词介词等对文本分类无意义的词,通常维护一个停用词表,特征提取过程中删除停用表中出现的词,本质上属于特征选择的一部分。

    经过文本分词和去停止词之后淘宝商品示例标题变成了下图“ / ”分割的一个个关键词的形式:

    夏装 / 雪纺 / 条纹 / 短袖 / t恤 / 女 / 春 / 半袖 / 衣服 / 夏天 / 中长款 / 大码 / 胖mm / 显瘦 / 上衣 / 夏 
    2)文本表示和特征提取

    文本表示:

    文本表示的目的是把文本预处理后的转换成计算机可理解的方式,是决定文本分类质量最重要的部分。传统做法常用词袋模型(BOW, Bag Of Words)或向量空间模型(Vector Space Model),最大的不足是忽略文本上下文关系,每个词之间彼此独立,并且无法表征语义信息。词袋模型的示例如下:

     ( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)
    
    • 1
    • 2

    一般来说词库量至少都是百万级别,因此词袋模型有个两个最大的问题:高纬度、高稀疏性。词袋模型是向量空间模型的基础,因此向量空间模型通过特征项选择降低维度,通过特征权重计算增加稠密性。 
    特征提取: 
    向量空间模型的文本表示方法的特征提取对应特征项的选择和特征权重计算两部分。特征选择的基本思路是根据某个评价指标独立的对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余的特征项。常用的评价有文档频率、互信息、信息增益、χ²统计量等。 
    特征权重主要是经典的TF-IDF方法及其扩展方法,主要思路是一个词的重要度与在类别内的词频成正比,与所有类别出现的次数成反比。 
    3)基于语义的文本表示 
    传统做法在文本表示方面除了向量空间模型,还有基于语义的文本表示方法,比如LDA主题模型、LSI/PLSI概率潜在语义索引等方法,一般认为这些方法得到的文本表示可以认为文档的深层表示,而word embedding文本分布式表示方法则是深度学习方法的重要基础,下文会展现。 
    1.2 分类器 
    分类器基本都是统计分类方法了,基本上大部分机器学习方法都在文本分类领域有所应用,比如朴素贝叶斯分类算法(Naïve Bayes)、KNN、SVM、最大熵和神经网络等等,传统分类模型不是本文重点,在这里就不展开了。 
    二、深度学习文本分类方法 
    上文介绍了传统的文本分类做法,传统做法主要问题的文本表示是高纬度高稀疏的,特征表达能力很弱,而且神经网络很不擅长对此类数据的处理;此外需要人工进行特征工程,成本很高。而深度学习最初在之所以图像和语音取得巨大成功,一个很重要的原因是图像和语音原始数据是连续和稠密的,有局部相关性。应用深度学习解决大规模文本分类问题最重要的是解决文本表示,再利用CNN/RNN等网络结构自动获取特征表达能力,去掉繁杂的人工特征工程,端到端的解决问题。接下来会分别介绍: 
    2.1 文本的分布式表示:词向量(word embedding) 
    分布式表示(Distributed Representation)其实Hinton 最早在1986年就提出了,基本思想是将每个词表达成 n 维稠密、连续的实数向量,与之相对的one-hot encoding向量空间只有一个维度是1,其余都是0。分布式表示最大的优点是具备非常powerful的特征表达能力,比如 n 维向量每维 k 个值,可以表征 n^k个概念。事实上,不管是神经网络的隐层,还是多个潜在变量的概率主题模型,都是应用分布式表示。下图是03年Bengio在 A Neural Probabilistic Language Model 的网络结构 
    这里写图片描述 
    这篇文章提出的神经网络语言模型(NNLM,Neural Probabilistic Language Model)采用的是文本分布式表示,即每个词表示为稠密的实数向量。NNLM模型的目标是构建语言模型: 
    这里写图片描述 
    词的分布式表示即词向量(word embedding)是训练语言模型的一个附加产物,即图中的Matrix C 
    尽管Hinton 86年就提出了词的分布式表示,Bengio 03年便提出了NNLM,词向量真正火起来是google Mikolov 13年发表的两篇word2vec的文章 Efficient Estimation of Word Representations in Vector Space 和 Distributed Representations of Words and Phrases and their Compositionality,更重要的是发布了简单好用的word2vec工具包,在语义维度上得到了很好的验证,极大的推进了文本分析的进程。下图是文中提出的CBOW 和 Skip-Gram两个模型的结构,基本类似于NNLM,不同的是模型去掉了非线性隐层,预测目标不同,CBOW是上下文词预测当前词,Skip-Gram则相反。 
    这里写图片描述 
    除此之外,提出了Hierarchical Softmax 和 Negative Sample两个方法,很好的解决了计算有效性,事实上这两个方法都没有严格的理论证明,有些trick之处,非常的实用主义。详细的过程不再阐述了,有兴趣深入理解word2vec的,推荐读读这篇很不错的paper:word2vec Parameter Learning Explained。额外多提一点,实际上word2vec学习的向量和真正语义还有差距,更多学到的是具备相似上下文的词,比如“good”“bad”相似度也很高,反而是文本分类任务输入有监督的语义能够学到更好的语义表示,有机会后续系统分享下。

    至此,文本的表示通过词向量的表示方式,把文本数据从高纬度高稀疏的神经网络难处理的方式,变成了类似图像、语音的的连续稠密数据。深度学习算法本身有很强的数据迁移性,很多之前在图像领域很适用的深度学习算法比如CNN等也可以很好的迁移到文本领域了,下一小节具体阐述下文本分类领域深度学习的方法。 
    2.2 深度学习文本分类模型

    词向量解决了文本表示的问题,该部分介绍的文本分类模型则是利用CNN/RNN等深度学习网络及其变体解决自动特征提取(即特征表达)的问题。

    1)fastText

    fastText 是上文提到的 word2vec 作者 Mikolov 转战 Facebook 后16年7月刚发表的一篇论文 Bag of Tricks for Efficient Text Classification。把 fastText 放在此处并非因为它是文本分类的主流做法,而是它极致简单,模型图见下:

    这里写图片描述 
    原理是把句子中所有的词向量进行平均(某种意义上可以理解为只有一个avg pooling特殊CNN),然后直接接 softmax 层。其实文章也加入了一些 n-gram 特征的 trick 来捕获局部序列信息。文章倒没太多信息量,算是“水文”吧,带来的思考是文本分类问题是有一些“线性”问题的部分,也就是说不必做过多的非线性转换、特征组合即可捕获很多分类信息,因此有些任务即便简单的模型便可以搞定了。 
    2)TextCNN 
    本篇文章的题图选用的就是14年这篇文章提出的TextCNN的结构(见下图)。fastText 中的网络结果是完全没有考虑词序信息的,而它用的 n-gram 特征 trick 恰恰说明了局部序列信息的重要意义。卷积神经网络(CNN Convolutional Neural Network)最初在图像领域取得了巨大成功,CNN原理就不讲了,核心点在于可以捕捉局部相关性,具体到文本分类任务中可以利用CNN来提取句子中类似 n-gram 的关键信息。 
    这里写图片描述 
    TextCNN的详细过程原理图见下: 
    这里写图片描述 
    TextCNN详细过程:第一层是图中最左边的7乘5的句子矩阵,每行是词向量,维度=5,这个可以类比为图像中的原始像素点了。然后经过有 filter_size=(2,3,4) 的一维卷积层,每个filter_size 有两个输出 channel。第三层是一个1-max pooling层,这样不同长度句子经过pooling层之后都能变成定长的表示了,最后接一层全连接的 softmax 层,输出每个类别的概率。

    特征:这里的特征就是词向量,有静态(static)和非静态(non-static)方式。static方式采用比如word2vec预训练的词向量,训练过程不更新词向量,实质上属于迁移学习了,特别是数据量比较小的情况下,采用静态的词向量往往效果不错。non-static则是在训练过程中更新词向量。推荐的方式是 non-static 中的 fine-tunning方式,它是以预训练(pre-train)的word2vec向量初始化词向量,训练过程中调整词向量,能加速收敛,当然如果有充足的训练数据和资源,直接随机初始化词向量效果也是可以的。

    通道(Channels):图像中可以利用 (R, G, B) 作为不同channel,而文本的输入的channel通常是不同方式的embedding方式(比如 word2vec或Glove),实践中也有利用静态词向量和fine-tunning词向量作为不同channel的做法。

    一维卷积(conv-1d):图像是二维数据,经过词向量表达的文本为一维数据,因此在TextCNN卷积用的是一维卷积。一维卷积带来的问题是需要设计通过不同 filter_size 的 filter 获取不同宽度的视野。

    Pooling层:利用CNN解决文本分类问题的文章还是很多的,比如这篇 A Convolutional Neural Network for Modelling Sentences 最有意思的输入是在 pooling 改成 (dynamic) k-max pooling ,pooling阶段保留 k 个最大的信息,保留了全局的序列信息。比如在情感分析场景,举个例子:

    “ 我觉得这个地方景色还不错,但是人也实在太多了 ” 
    虽然前半部分体现情感是正向的,全局文本表达的是偏负面的情感,利用 k-max pooling能够很好捕捉这类信息。 
    3)TextRNN

    尽管TextCNN能够在很多任务里面能有不错的表现,但CNN有个最大问题是固定 filter_size 的视野,一方面无法建模更长的序列信息,另一方面 filter_size 的超参调节也很繁琐。CNN本质是做文本的特征表达工作,而自然语言处理中更常用的是递归神经网络(RNN, Recurrent Neural Network),能够更好的表达上下文信息。具体在文本分类任务中,Bi-directional RNN(实际使用的是双向LSTM)从某种意义上可以理解为可以捕获变长且双向的的 “n-gram” 信息。

    RNN算是在自然语言处理领域非常一个标配网络了,在序列标注/命名体识别/seq2seq模型等很多场景都有应用,Recurrent Neural Network for Text Classification with Multi-Task Learning文中介绍了RNN用于分类问题的设计,下图LSTM用于网络结构原理示意图,示例中的是利用最后一个词的结果直接接全连接层softmax输出了 
    这里写图片描述 
    4)TextRNN + Attention

    CNN和RNN用在文本分类任务中尽管效果显著,但都有一个不足的地方就是不够直观,可解释性不好,特别是在分析badcase时候感受尤其深刻。而注意力(Attention)机制是自然语言处理领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献,基本成了Seq2Seq模型的标配了。实际上文本分类从某种意义上也可以理解为一种特殊的Seq2Seq,所以考虑把Attention机制引入近来,研究了下学术界果然有类似做法。

    Attention机制介绍: 
    这里写图片描述
    这里写图片描述 
    Attention的核心point是在翻译每个目标词(或 预测商品标题文本所属类别)所用的上下文是不同的,这样的考虑显然是更合理的。 
    TextRNN + Attention 模型:

    我们参考了这篇文章 Hierarchical Attention Networks for Document Classification,下图是模型的网络结构图,它一方面用层次化的结构保留了文档的结构,另一方面在word-level和sentence-level。淘宝标题场景只需要 word-level 这一层的 Attention 即可。 
    这里写图片描述 
    加入Attention之后最大的好处自然是能够直观的解释各个句子和词对分类类别的重要性。

    5)TextRCNN(TextRNN + CNN) 
    我们参考的是中科院15年发表在AAAI上的这篇文章 Recurrent Convolutional Neural Networks for Text Classification 的结构: 
    这里写图片描述 
    利用前向和后向RNN得到每个词的前向和后向上下文的表示: 
    这里写图片描述 
    这样词的表示就变成词向量和前向后向上下文向量concat起来的形式了,即: 
    这里写图片描述 
    最后再接跟TextCNN相同卷积层,pooling层即可,唯一不同的是卷积层 filter_size = 1就可以了,不再需要更大 filter_size 获得更大视野,这里词的表示也可以只用双向RNN输出。 
    三、一点经验 
    理论和实践之间的Gap往往差异巨大,学术paper更关注的是模型架构设计的新颖性等,更重要的是新的思路;而实践最重要的是在落地场景的效果,关注的点和方法都不一样。这部分简单梳理实际做项目过程中的一点经验教训。

    模型显然并不是最重要的:不能否认,好的模型设计对拿到好结果的至关重要,也更是学术关注热点。但实际使用中,模型的工作量占的时间其实相对比较少。虽然再第二部分介绍了5种CNN/RNN及其变体的模型,实际中文本分类任务单纯用CNN已经足以取得很不错的结果了,我们的实验测试RCNN对准确率提升大约1%,并不是十分的显著。最佳实践是先用TextCNN模型把整体任务效果调试到最好,再尝试改进模型。

    理解你的数据:虽然应用深度学习有一个很大的优势是不再需要繁琐低效的人工特征工程,然而如果你只是把他当做一个黑盒,难免会经常怀疑人生。一定要理解你的数据,记住无论传统方法还是深度学习方法,数据 sense 始终非常重要。要重视 badcase 分析,明白你的数据是否适合,为什么对为什么错。

    关注迭代质量 - 记录和分析你的每次实验:迭代速度是决定算法项目成败的关键,学过概率的同学都很容易认同。而算法项目重要的不只是迭代速度,一定要关注迭代质量。如果你没有搭建一个快速实验分析的套路,迭代速度再快也只会替你公司心疼宝贵的计算资源。建议记录每次实验,实验分析至少回答这三个问题:为什么要实验?结论是什么?下一步怎么实验?

    超参调节:超参调节是各位调参工程师的日常了,推荐一篇文本分类实践的论文 A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification,里面贴了一些超参的对比实验,如果你刚开始启动文本分析任务,不妨按文章的结果设置超参,怎么最快的得到超参调节其实是一个非常重要的问题.

    一定要用 dropout:有两种情况可以不用:数据量特别小,或者你用了更好的正则方法,比如bn。实际中我们尝试了不同参数的dropout,最好的还是0.5,所以如果你的计算资源很有限,默认0.5是一个很好的选择。

    Fine-tuning 是必选的:上文聊到了,如果只是使用word2vec训练的词向量作为特征表示,我赌你一定会损失很大的效果。

    未必一定要 softmax loss: 这取决与你的数据,如果你的任务是多个类别间非互斥,可以试试着训练多个二分类器,也就是把问题定义为multi lable 而非 multi class,我们调整后准确率还是增加了>1%。

    类目不均衡问题:基本是一个在很多场景都验证过的结论:如果你的loss被一部分类别dominate,对总体而言大多是负向的。建议可以尝试类似 booststrap 方法调整 loss 中样本权重方式解决。

    避免训练震荡:默认一定要增加随机采样因素尽可能使得数据分布iid,默认shuffle机制能使得训练结果更稳定。如果训练模型仍然很震荡,可以考虑调整学习率或 mini_batch_size。

    转自https://blog.csdn.net/ch1209498273/article/details/78452452

    展开全文
  • 资源为新闻类的中文文本分类数据集,能够满足机器学习,文字分析方面的需求
  • 文本分类,语义学习都是机器学习和深度学习中比较重要的部分,本文档详细的介绍了文本分类这一思想,是一份非常值得学习的资料!
  • cnn用于文本分类

    2017-10-23 18:37:52
    该文献给出了用cnn进行文本分类的实现方法 该文献给出了用cnn进行文本分类的实现方法 该文献给出了用cnn进行文本分类的实现方法
  • 朴素贝叶斯文本分类的Python实现代码
  • 50000条新闻文本数据集,文本有9类。可用于文本分类模型训练。
  • 采用深度学习,cnn,rnn 两种方式对新闻类信息。进行分类预测。。。。仅供初学者练习使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 390,181
精华内容 156,072
关键字:

文本分类