精华内容
下载资源
问答
  • 信息类文本指什么
    千次阅读
    2019-08-13 23:54:07
    文本挖掘与文本分类的概念

    文本挖掘(Text Mining)是从一个非机构化文本信息中获取用户感兴趣或者有用的模式过程。文本挖掘的 7 个主要领域如下:

    • 搜索和信息检索:存储和文本文档的检索,包括搜索引擎和文档的检索。
    • 文本聚类:使用聚类方法,对词汇、片段、段落或文件进行分组或分类。
    • 文本分类:对片段、段落或文件进行分组和归类,在使用数据挖掘分类的方法基础上,经过训练地标记示例模型。
    • Web 挖掘:在互联网上进行数据和文本挖掘,并特别关注网络的规模和相互联系。
    • 信息抽取:从非结构化文本中识别与提取有关的事实和关系;从非结构化或半结构化文本中抽取结构化数据的关系。
    • 自然语言处理:将语言作为一种有意义、有规则的符号系统,在底层解析和理解语言的任务(如,词性标注);目前的技术主要从语法、语义的角度发现语言最本质的结构和所表达的意义。
    • 概念提取:把单词和短语按语义分成有意义相似的组。


      目前,主要存在两种文本分类方法:
    • 一、基于模式系统(通过运用知识工程技术)
    • 二、分类模型(通过使用统计和/或机器学习技术)
    文本分类项目

    文本分类步骤:
    1)预处理:去除文本的噪声信息,例如 HTML 标签、文本格式转换、检测句子边界。
    2)中文分词:使用中文分词器为文本分词,并去除停用词。
    3)构建词向量空间:统计文本词频,生成文本的词向量空间。
    4)权重策略 ——TF-IDF 方法:使用 TF-IDF 发现特征词,并抽取为反应文档主题的特征。
    5)分类器:使用算法训练器分类。
    6)评价分类结果:分类器的测试结果分析。

    文本预处理

    1. 选择处理的文本范围
    选择适当的范围取决于文本挖掘任务的目标:对于分类或聚类的任务,往往把整个文档作为处理单位;对于情感分析、文档自动文摘或信息检索,段落或章节可能更合适。
    2.建立分类文本语料库
    1)训练集语料
    复旦大学谭松波中文文本分类语料库
    搜狗新闻分类语料库
    相对于搜狗新闻分类而言,复旦大学的中文文本语料库小一些,但质量很高,是用于学习教育比较专业的语料。
    2)测试语料集
    所谓测试集就是待分类的文本语料,可以是训练集的一部分,也可以是外部来源的文本语料。待分类文本资源的获取方式有很多,如公司、图书馆、商业公司、互联网。
    3)文本格式转换
    不同格式的文本不论采用哪种处理方式,都要统一转换为纯文本文件,例如,网页文本、Word 或 PDF 文件都要转换为纯文本格式。
    一般 Python 去除 HTML 标签,较多使用 lxml 库,这是一个 C 语言编写的 XML 扩展库,比使用 re 正则表达式库的标签去除方式性能高得多,适用于海量的网络文本格式转换。
    样例代码:

    from lxml import html
    
    path = 'data/1.html'
    content = open(path,'rb').read()
    page = html.document_fromstring(content)
    text = page.text_content()
    print(text)
    

    4)检测句子边界:标记句子结束
    句子边界检测时分解整个文档,并转换成单独句子的过程,对于中文文本,它就是寻找“。”、“?”、“!”的过程,英文中有 “.” 等。

    中文分词介绍

    中文分词指的是将一个汉字序列切分成一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。
    中文分词难点:
    一个著名的例子:“鸡蛋”、“牛肉”、“下雨”是词吗?如果是,那么“鸭蛋”、“驴肉”、“下雪”、“鸟蛋”、“鱼肉”、“下雾”也应该是词,按照这样的规则组合下去,会产生很多令人费解的结论,如果不是,这些字符串在我们日常生活中使用的频率非常高,而且都有独立的意义。
    一般像这种到最后谁也想不明白的问题,最终都交给概率论。
    分词是自然语言处理中最基本、最底层的模块,分词精度对后续应用模块影响很大。目前,文本的结构化表示简单分为四大类:词向量空间模型、主题模型、依存句法的树表示、RDF的图表示。
    jieba 分词系统支持的分词模式包括默认切分、全切分、搜索引擎切分几种。中文文本分词之后,连续的字序列就变成了以词为单位的向量。向量中的每个分量都是一个有独立意义的词。通过分词,中文文本实现了最基础的结构化。
    在实际应用中,为了后续生成词向量空间模型方便,还要引入 Scikit-Learn 库的 Bunch 数据结构将分词后的文本信息转换为文本向量信息并对象化。

    from sklearn.datasets.base import Bunch # 导入Bunch类
    import os
    import pickle
    # Bunch 类提供一种 Key,value的对象形式
    # target_name:所有分类集名称列表
    # label:每个文件的分类标签列表
    # filenames:文件路径
    # contents:分词后文件词向量形式
    
    def savefile(savepath,content): # 保存至文件
        fp = open(savepath,"wb")
        fp.write(content)
        fp.close()
    
    def readfile(path): # 读取文件
        fp = open(path,"rb")
        content = fp.read()
        fp.close()
        return content
        
    bunch = Bunch(target_name=[],label=[],filenames=[],contents=[])
    wordbag_path = "train_word_bag/train_set.dat" # 分词语料 Bunch 对象持久化文件路径
    seg_path = "train_corpus_seg/" # 分词后分类语料库路径
    
    catelist = os.listdir(seg_path)
    bunch.target_name.extend(catelist) # 将类别信息保存到 Bunch 对象中
    for mydir in catelist:
        class_path = seg_path + mydir +"/"
        file_list = os.listdir(class_path)
        for file_path in file_list:
            fullname = class_path + file_path
            bunch.label.append(mydir) # 保存当前文件的分类标签
            bunch.filenames.append(fullname) # 保存当前文件的文件路径
            bunch.contents.append(readfile(fullname).strip()) # 保存文件词向量
            
        # Bunch 对象持久化
        file_obj = open(wordbag_path,"wb")
        pickle.dump(bunch,file_obj)
        file_obj.close()
        
        print("构建文本对象结束")
    

    这样就在目录下生成了一个 train_set.dat 文件。此文件保存所有训练文件的所有分类信息,以及每个文件的文件名、文件所属分类信息和词向量。

    Scikit-Learn 库简介

    Scikit-Learn 首页

    1 .模块分类

    • 分类和回归算法:广义线性模型,线性和二次判别分析,岭回归,支持向量机,随机梯度下降,KNN,高斯过程,交叉分解,朴素贝叶斯,决策树,集成方法,多细粒度的算法,特征选择,半监督,保序回归,概率标准。
    • 聚类算法:K-means,仿射传播,均值漂移,谱聚类,分层聚类,DBSCAN,Birch。
    • 维度约简:PCA,潜在语义分析(截断奇异值分析),字典学习,因子分析,ICA,非负矩阵分解。
    • 模型选择:交叉验证,评价估计性能,网格搜索,搜索参数估计,模型的预测质量的量化评价,模型的持久化,验证曲线,绘制分数评价模型。
    • 数据预处理:标准化,去除均值率和方差缩放,正规化,二值化,编码分类特征,缺失值的插补。

    2 . 主要特点

    • 操作简单,高效的数据挖掘和数据分析。
    • 无访问限制,在任何情况下可重复使用。
    • 建立在 Numpy、SciPy 和 Matplotlib 基础上。
    • 使用商业开源协议 —— BSD 许可证。
    向量空间模型

           文本分类的结构化方法就是向量空间模型。虽然越来越多的实践证明,这种模型存在着局限性,但是迄今为止,它仍是在文本分类中应用最广泛、最为流行的数据结构,也是很多相关技术的基础,例如推荐系统、搜索引擎。
      向量空间模型把文本表示为一个向量,该向量的每个特征表示为文本中出现的词。通常,把训练集中出现的每个不同的字符串都作为一个维度,包括停用词、专有词、词组和其他类型模式串,如电子邮件地址和 URL 。目前,大多数文本挖掘系统都把文本存储为向量空间表示,因为他便于运用机器学习算法。这类算法适用并能有效处理高维空间文本的情况。
      由于文本在存储为向量空间时维度比较高,为节省存储空间和提高存储效率,在文本分类之前会自动过滤掉某些字或词,这些字或词即被称为停用词。这类词一般都是意义模糊的常用词,还有一些语气助词,通常它们对文本起不了分类特征的意义。这些停用词都是人工输入,非自动化生成的,生成后的停用词会形成一张停用词表。可以下载停用词表
      读取停用词列表代码:

    #读取文件
    # 1. 读取停用词表
    stopword_path = "train_word_bag/hlt_stop_words.txt"
    stpwrdlst = readfile(stopword_path).splitines()
    

    权重策略:TF-IDF 方法
    • 文本1:My dog ate my homework .
    • 文本2:My cat ate the sandwich.
    • 文本3:A dolphin ate the homework.

    生成的词袋中不重复的词 9 个,这里增加词频信息:a(1),ate(3),cat(1),dolphin(1),dog(1),homework(2),my(3),sandwich(1),the(2).
    二元表示法:

    • 文本1:0,1,0,0,1,1,1,0,0(尽管 “my” 出现了两次,但二元向量表示中仍然是 “1”)。
    • 文本2:0,1,1,0,0,0,1,1,1。
    • 文本3:1,1,0,1,0,1,0,0,1。

    采用这种方式的忽略了一个句子中出现多个相同词的词频信息,采用整数型计数方式的词向量表示:

    • 文本1:0,1,0,0,1,1,2,0,0(“my” 在句子中出现了两次)。
    • 文本2:0,1,1,0,0,0,1,1,1。
    • 文本3:1,1,0,1,0,1,0,0,1。

    接下来,对整数型计数方式进行归一化。归一化可以避免句子长度不一致的问题,便于算法计算。而且对于基于概率的算法,词频信息就变为了概率分布,这就是文档的 TF 信息。

    • 文本1:0,1/5,0,0,1/5,1/5,2/5,0,0。
    • 文本2:0,1/5,1/5,0,0,0,1/5,1/5,1/5。
    • 文本3:1/5,1/5,0,1/5,0,1/5,0,0,1/5。

    词条的文档频率:a(1/3),ate(3/3),cat(1/3),dolphin(1/3),dog(1/3),homework(2/3),my(3/3),sandwich(1/3),the(2/3).

    词袋模型的 IDF 权重:
    a log(3/1), ate log(3/3), cat log(3/1), dolphin log(3/1), dog log(3/1), homework log(3/2), my log(3/2), sandwich log(3/1), the log(3/2)。

    1. TF-IDF权重策略
      计算文本的权重向量,应该选择一个有效的权重方案。最流行的方案是 TF-IDF 权重策略。TF-IDF 的含义是词频逆文档频率,其含义是:如果某个词或短语在一篇文章中出现的频率高,并且在其他文档中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
      “my” 这个词在文本中是经常出现的词汇之一。它不仅多次出现在单一的文本中,而且几乎出现在每个文档中。逆文档频率就是使用词条的文档频率来抵消该词的词频对权重的影响,从而得到一个较低的权重。
      词频(Term Frequency, TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(Term Count)的归一化,以防止它偏向长的文件。它的重要性可表示为:


    T F i j = n i , j ∑ k n k , j TF_{ij}=\frac{n_{i,j}}{\displaystyle\sum_k{n_{k,j}}} TFij=knk,jni,j

      分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和.   逆向文件频率(Inverse Document Frequency, IDF)是一个词普遍重要性的度量.某一特定词语的 IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到.

    公式为:


    I D F i = log ⁡ ∣ D ∣ { j : t i ∈ d j } IDF_i=\log\frac{|D|}{\{j:t_i\in d_j\}} IDFi=log{j:tidj}D

      其中,
    • ∣ D ∣ : |D|: D: 语料库中的文件总数。

    • j : j: j: 包含词语的文件数目。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1 + ∣ { d ∈ D : t ∈ d } ∣ 1+|\{d\in D:t\in d\}| 1+{dD:td}

      然后再计算 T F TF TF I D F IDF IDF 的乘积。
      某一特定文件内的高词频率,以及该词语在整个文件集合中的低文件频率( T F I D F i j = T F i j I × I D F i j TFIDF_{ij}=TF_{ij}I\times IDF_{ij} TFIDFij=TFijI×IDFij),可以产生出高权重的 T F − I D F TF-IDF TFIDF 。因此, T F − I D F TF-IDF TFIDF 倾向于过滤掉常见的词语,保留重要的词语。

        import sys
        import os
        from sklearn.datasets.base import Bunch # 引入 Bunch 类
        import pickle # 引入持久化类
        from sklearn import feature_extraction
        from sklearn.feature_extraction.text import TfidfTransformer # TF-IDF 向量转换类
        from sklearn.feature_extraction.text import TfidfVectorizer # TF-IDF 向量生成类
        
        # 读取 Bunch 对象
        def readbunchobj(path):
            file_obj = open(path,"rb")
            bunch = pickle.load(file_obj)
            file_obj.close()
            return bunch
        
        # 写入 Bunch 对象
        def writebunchobj(path,bunchobj):
            file_obj = open(path,"wb")
            pickle.dump(bunchobj,file_obj)
            file_obj.close()
        
        
        def savefile(savepath, content):  # 保存至文件
            fp = open(savepath, "wb")
            fp.write(content)
            fp.close()
        
        
        def readfile(path):  # 读取文件
            fp = open(path, "rb")
            content = fp.read()
            fp.close()
            return content
        
        # 从训练集生成 TF-IDF 向量词袋
        # 导入分词后的词向量 Bunch 对象
        path = "train_word_bag/train_set.dat" # 词向量空间保存路径
        bunch = readbunchobj(path)
        
        #读取停用词表
        stopword_path = "train_word_bag/hlt_stop_words.txt"
        stpwrdlst = readfile(stopword_path).splitines()
        
        # 构建 TF-IDF 词向量对象
        tfidfspace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames, tdm=[], vocabulary={})
        
        # 使用 TfidfVectorizer
        vectorizer = TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5)
        transformer = TfidfTransformer() # 该类会统计每个词语的 TF-IDF 权值
        
        # 文本转为词频矩阵,单独保存字典文件
        tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
        tfidfspace.vocabulary = vectorizer.vocabulary_
        
        # 持久化 TF-IDF 向量词袋
        space_path = "train_word_bag/tfdifspace.dat" # 词向量词袋保存路径
        writebunchobj(space_path,tfidfspace)
      

    使用朴素贝叶斯分类模块

    最常用的文本分类方法有 KNN 最近邻算法、朴素贝叶斯算法和支持向量机算法。一般而言,KNN 最近邻的算法原理最简单,分类精度尚可,但是速度最慢;朴素贝叶斯算法对于短文本分类效果最好,精度较高;支持向量机的算法的优势是支持线性不可分的情况,精度上取中。
      测试步骤与训练集相同,首先是分词,之后生成文件词向量文件,直至生成词向量模型。不同的是,在训练词向量模型时,需要加载训练集词袋,将测试集产生的词向量映射到训练集词袋的词典中,生成向量空间模型。

    代码如下:

    # 导入分词后的词向量 Bunch 对象
    path = "test_word_bag/test_set.dat" # 词向量空间保存路径
    bunch = readbunchobj(path)
    
    # 构建测试集 TF-IDF 向量空间
    testspace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames,tdm=[],vocabulary={})
    
    # 导入训练集的词袋
    trainbunch = readbunchobj("tarin_word_bag/tfdifspace.dat")
    
    # 使用 TfidfVectorizer 初始化向量空间模型
    vectorizer = TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5,vocabulary=tarinbunch.vocabulary) # 使用训练集词袋向量
    transformer = TfidfTransformer()
    testspace.tdm = vectorizer.fit_transform(bunch.contents)
    testspace.vocabulary = trainbunch.vocabulary
    
    # 创建词袋的持久化
    space_path = "test_word_bag/testsapce.dat" # 词向量空间保存路径
    writebunchobj(space_path,testspace)
    
    # 导入多项式贝叶斯算法包
    from sklearn.naive_bayes import MultinomialNB
    
    # 执行预测
    # 导入训练集向量空间
    trainpath = "train_word_bag/tfdifspace.dat"
    train_set = readbunchobj(trainpath)
    
    # 导入测试集向量空间
    testspath = "test_word_bag/testspace.bat"
    test_set = readbunchobj(testspath)
    
    # 应用朴素贝叶斯算法
    # alpha:0.001 alpha 越小,迭代次数越多,精度越高
    clf = MultinomialNB(alpha=0.001).fit(train_set.tdm,train_set.label)
    
    # 预测分类结果
    predicted = clf.prdict(test_set.tdm)
    total = len(predicted);rate=0
    for flabel,file_name,expect_cate in zip(test_set.label,test_set.filenames,predicted):
        if flabel != expect_cate:
            rate += 1
            print(file_name,":实际类别:",flabel,"-->预测类别:",expect_cate)
        # 精度
        print("error rate:",float(rate)*100/float(total),"%")
    

    分类结果评估

    机器学习领域的算法评估有三个基本的指标。

    1)召回率(Recall Rate,也叫查全率):是检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检查系统的查全率。


    召回率(Recall)= 系统检索到的相关文件 / 系统所有相关的文件总数

    2)准确率(Precision,也称为精度):是检索出的相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率。
    准确率(Precision)= 系统检索到的相关文件 / 系统所有检索到的文件总数

    注意:准确率和召回率是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下准确率高,召回率就低;召回率高,准确率就低。

    3) F β − M e a s u r e F_{\beta}-Measure FβMeasure(又称为 F-Score):是机器学习领域常用的评价标准,计算公式为:


    F β = ( β 2 + 1 ) P R β 2 P + R F_{\beta}=\frac{(\beta^2+1)PR}{\beta^2P+R} Fβ=β2P+R(β2+1)PR

    其中, β \beta β 是参数, P P P 是准确率, R R R 是召回率
    β = 1 \beta=1 β=1 时,就是最常见的 F 1 − M e a s u r e F_1-Measure F1Measure 了。


    F 1 = 2 P R P + R F_1=\frac{2PR}{P+R} F1=P+R2PR

    文本分类项目的分类结果评估,代码如下。

    import numpy as np
    from sklearn import metrics
    
    # 定义分类精度函数
    def metrics_result(actual, predict):
        print("精度:{0:.3f}".format(metrics.precision_score(actual,predict)))
        print("召回:{0:0.3f}".format(metrics.recall_score(actual,predict)))
        print("f1-score:{0:.3f}".format(metrics.f1_score(actual,predict)))
        
    metrics_result(test_set.label,predicted)
    
    更多相关内容
  • 自然语言处理—文本分类综述/什么文本分类

    千次阅读 多人点赞 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.

    展开全文
  • python实现文本分类

    千次阅读 2020-12-24 16:38:02
    一、中文文本分类流程:1. 预处理2. 中文分词3. 结构化表示-构建词向量空间4.权重策略-TF-IDF5. 分类器6. 评价二、具体细节1.预处理1.1. 得到训练集语料库本文采用复旦中文文本分类语料库,下载链接:...

    一、中文文本分类流程:

    1. 预处理

    2. 中文分词

    3. 结构化表示-构建词向量空间

    4.权重策略-TF-IDF

    5. 分类器

    6. 评价

    二、具体细节

    1.预处理

    1.1. 得到训练集语料库

    本文采用复旦中文文本分类语料库,下载链接:https://download.csdn.net/download/laobai1015/10431543

    1.2 得到测试集语料库

    同样采用复旦中文文本分类语料库,下载链接:https://download.csdn.net/download/laobai1015/10431564

    2. 中文分词

    第1小节预处理中的语料库都是没有分词的原始语料(即连续的句子,而后面的工作需要我们把文本分为一个个单词),现在需要对这些文本进行分词,只有这样才能在基于单词的基础上,对文档进行结构化表示。

    中文分词有其特有的难点,最终完全解决中文分词的算法是基于概率图模型的条件随机场(CRF)。中文分词的工具有很多,但是比较著名的几个都是基于java的,这里推荐python的第三方库jieba(所采用的算法就是条件随机场)。

    通过pip安装jieba:打开cmd,切换到Python所在目录下,执行命令:pip install jieba

    然后通过Python编程,将训练语料库和测试语料库进行分词,分词后保存的路径可以自己设置。#!/usr/bin/env python

    # -*- coding: UTF-8 -*-

    import sys

    import os

    import jieba

    # 配置utf-8输出环境

    reload(sys)

    sys.setdefaultencoding('utf-8')

    # 保存至文件

    def savefile(savepath, content):

    with open(savepath, "wb") as fp:

    fp.write(content)

    '''''

    上面两行是python2.6以上版本增加的语法,省略了繁琐的文件close和try操作

    2.5版本需要from __future__ import with_statement

    '''

    # 读取文件

    def readfile(path):

    with open(path, "rb") as fp:

    content = fp.read()

    return content

    def corpus_segment(corpus_path, seg_path):

    '''''

    corpus_path是未分词语料库路径

    seg_path是分词后语料库存储路径

    '''

    catelist = os.listdir(corpus_path) # 获取corpus_path下的所有子目录

    '''''

    其中子目录的名字就是类别名,例如:

    train_corpus/art/21.txt中,'train_corpus/'是corpus_path,'art'是catelist中的一个成员

    '''

    # 获取每个目录(类别)下所有的文件

    for mydir in catelist:

    '''''

    这里mydir就是train_corpus/art/21.txt中的art(即catelist中的一个类别)

    '''

    class_path = corpus_path + mydir + "/" # 拼出分类子目录的路径如:train_corpus/art/

    seg_dir = seg_path + mydir + "/" # 拼出分词后存贮的对应目录路径如:train_corpus_seg/art/

    if not os.path.exists(seg_dir): # 是否存在分词目录,如果没有则创建该目录

    os.makedirs(seg_dir)

    file_list = os.listdir(class_path) # 获取未分词语料库中某一类别中的所有文本

    '''''

    train_corpus/art/中的

    21.txt,

    22.txt,

    23.txt

    ...

    file_list=['21.txt','22.txt',...]

    '''

    for file_path in file_list: # 遍历类别目录下的所有文件

    fullname = class_path + file_path # 拼出文件名全路径如:train_corpus/art/21.txt

    content = readfile(fullname) # 读取文件内容

    '''''此时,content里面存贮的是原文本的所有字符,例如多余的空格、空行、回车等等,

    接下来,我们需要把这些无关痛痒的字符统统去掉,变成只有标点符号做间隔的紧凑的文本内容

    '''

    content = content.replace("\r\n", "") # 删除换行

    content = content.replace(" ", "")#删除空行、多余的空格

    content_seg = jieba.cut(content) # 为文件内容分词

    savefile(seg_dir + file_path, " ".join(content_seg)) # 将处理后的文件保存到分词后语料目录

    print "中文语料分词结束!!!"

    '''''

    if __name__=="__main__":

    简单来说如果其他python文件调用这个文件的函数,或者把这个文件作为模块

    导入到你的工程中时,那么下面的代码将不会被执行,而如果单独在命令行中

    运行这个文件,或者在IDE(如pycharm)中运行这个文件时候,下面的代码才会运行。

    即,这部分代码相当于一个功能测试。

    '''

    if __name__=="__main__":

    #对训练集进行分词

    corpus_path = "D:/work/train/train/" # 未分词分类语料库路径

    seg_path = "D:/work/train/train/train_corpus_seg/" # 分词后分类语料库路径

    corpus_segment(corpus_path,seg_path)

    #对测试集进行分词

    corpus_path = "D:/work/test/test/" # 未分词分类语料库路径

    seg_path = "D:/work/test/test/test_corpus_seg/" # 分词后分类语料库路径

    corpus_segment(corpus_path,seg_path)

    3. 结构化表示-构建词向量空间

    现在我们得到了分词后的训练集语料库和测试集语料库,下面我们要把这两个数据集表示为变量,从而为下面的程序调用提供服务。采用Scikit-Learn库中的Bunch数据结构来表示这两个数据集。

    Bunch就相当于python中的字典。你往里面传什么,它就存什么。就相当于python中的字典。你往里面传什么,它就存什么。

    我们的数据集(训练集)有哪些信息:1,类别,也就是所有分类类别的集合,即我们./train_corpus_seg/和./test_corpus_seg/下的所有子目录的名字。我们在这里不妨把它叫做target_name(这是一个列表)

    2,文本文件名。例如./train_corpus_seg/art/21.txt,我们可以把所有文件名集合在一起做一个列表,叫做filenames

    3,文本标签(就是文本的类别),不妨叫做label(与2中的filenames一一对应)例如2中的文本“21.txt”在./train_corpus_seg/art/目录下,则它的标签就是art。文本标签与1中的类别区别在于:文本标签集合里面的元素就是1中类别,而文本标签集合的元素是可以重复的,因为./train_corpus_seg/art/目录下有好多文本,不是吗?相应的,1中的类别集合元素显然都是独一无二的类别。

    4,文本内容(contens)。上一步代码我们已经成功的把文本内容进行了分词,并且去除掉了所有的换行,得到的其实就是一行词袋。

    那么,用Bunch表示,就是:

    from sklearn.datasets import base

    bunch = base.Bunch(target_name=[], label=[], filenames=[], contents=[])

    我们在Bunch对象里面创建了有4个成员:

    target_name:是一个list,存放的是整个数据集的类别集合。

    label:是一个list,存放的是所有文本的标签。

    filenames:是一个list,存放的是所有文本文件的名字。

    contents:是一个list,分词后文本文件(一个文本文件只有一行)

    如果你还没有明白,看一下下面这个图,你总该明白了:

    Bunch:

    下面,我们将文本文件转为Bunch类型:#!/usr/bin/env python

    # -*- coding: UTF-8 -*-

    import sys

    reload(sys) # Python2.5 初始化后删除了 sys.setdefaultencoding 方法,我们需要重新载入

    sys.setdefaultencoding('utf-8')

    import os#python内置的包,用于进行文件目录操作,我们将会用到os.listdir函数

    import cPickle as pickle#导入cPickle包并且取一个别名pickle

    '''''

    事实上python中还有一个也叫作pickle的包,与这里的名字相同了,无所谓

    本文件代码下面会用到cPickle中的函数cPickle.dump

    '''

    from sklearn.datasets import base #一定是这样写的,下面注释的一行是错误示范

    #from sklearn.datasets.base import Bunch

    def _readfile(path):

    '''''读取文件'''

    #函数名前面带一个_,是标识私有函数

    # 仅仅用于标明而已,不起什么作用,

    # 外面想调用还是可以调用,

    # 只是增强了程序的可读性

    with open(path, "rb") as fp:#with as句法前面的代码已经多次介绍过,今后不再注释

    content = fp.read()

    return content

    def corpus2Bunch(wordbag_path,seg_path):

    catelist = os.listdir(seg_path)# 获取seg_path下的所有子目录,也就是分类信息

    #创建一个Bunch实例

    bunch = base.Bunch(target_name=[], label=[], filenames=[], contents=[])

    bunch.target_name.extend(catelist)

    '''''

    extend(addlist)是python list中的函数,意思是用新的list(addlist)去扩充

    原来的list

    '''

    # 获取每个目录下所有的文件

    for mydir in catelist:

    class_path = seg_path + mydir + "/" # 拼出分类子目录的路径

    file_list = os.listdir(class_path) # 获取class_path下的所有文件

    for file_path in file_list: # 遍历类别目录下文件

    fullname = class_path + file_path # 拼出文件名全路径

    bunch.label.append(mydir)

    bunch.filenames.append(fullname)

    bunch.contents.append(_readfile(fullname)) # 读取文件内容

    '''''append(element)是python list中的函数,意思是向原来的list中添加element,注意与extend()函数的区别'''

    # 将bunch存储到wordbag_path路径中

    with open(wordbag_path, "wb") as file_obj:

    pickle.dump(bunch, file_obj)

    print "构建文本对象结束!!!"

    wordbag_path = "D:/work/train/train_word_bag/train_set.dat" # Bunch存储路径

    seg_path = "D:/work/train/train_corpus_seg/" # 分词后分类语料库路径

    corpus2Bunch(wordbag_path, seg_path)

    # 对测试集进行Bunch化操作:

    wordbag_path = "D:/work/test/test_word_bag/test_set.dat" # Bunch存储路径

    seg_path = "D:/work/test/test_corpus_seg/" # 分词后分类语料库路径

    corpus2Bunch(wordbag_path, seg_path)

    接下来我们要做的,就是把所有这些词统一到同一个词向量空间中。

    为了节省空间,我们首先将训练集中每个文本中一些垃圾词汇去掉。所谓的垃圾词汇,就是指意义模糊的词,或者一些语气助词,标点符号等等,通常他们对文本起不了分类特征的意义。这些垃圾词汇我们称之为停用词。把所有停用词集合起来构成一张停用词表格,这样,以后我们处理文本时,就可以从这个根据表格,过滤掉文本中的一些垃圾词汇了。

    你可以从这里下载停用词表:https://download.csdn.net/download/laobai1015/10431705

    存放在这里路径中:train_word_bag/hlt_stop_words.txt

    4.权重策略-TF-IDF

    下面的程序,目的就是要将训练集所有文本文件统一到同一个词向量空间中。

    下面的一节主要目标是希望得到两个东西:

    1.词典(单词和单词对应的序号)

    2.权重矩阵tdm,其中,权重矩阵是一个二维矩阵,tdm[i][j]表示,第j个词(即词典中的序号)在第i个类别中的IF-IDF值(下文有讲解)。

    事实上,tdm的每一列都是一个单词在各个类别中的全职。我们把这每一列当作词向量。

    #!/usr/bin/env python

    # -*- coding: UTF-8 -*-

    import sys

    reload(sys)

    sys.setdefaultencoding('utf-8')

    from sklearn.datasets.base import Bunch

    import cPickle as pickle

    from sklearn.feature_extraction.text import TfidfVectorizer

    def _readfile(path):

    with open(path, "rb") as fp:

    content = fp.read()

    return content

    def _readbunchobj(path):

    with open(path, "rb") as file_obj:

    bunch = pickle.load(file_obj)

    return bunch

    def _writebunchobj(path, bunchobj):

    with open(path, "wb") as file_obj:

    pickle.dump(bunchobj, file_obj)

    def vector_space(stopword_path,bunch_path,space_path,train_tfidf_path=None):

    stpwrdlst = _readfile(stopword_path).splitlines()

    bunch = _readbunchobj(bunch_path)

    tfidfspace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames, tdm=[], vocabulary={})

    if train_tfidf_path is not None:

    trainbunch = _readbunchobj(train_tfidf_path)

    tfidfspace.vocabulary = trainbunch.vocabulary

    vectorizer = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf=True, max_df=0.5,vocabulary=trainbunch.vocabulary)

    tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)

    else:

    vectorizer = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf=True, max_df=0.5)

    tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)

    tfidfspace.vocabulary = vectorizer.vocabulary_

    _writebunchobj(space_path, tfidfspace)

    print "if-idf词向量空间实例创建成功!!!"

    if __name__ == '__main__':

    stopword_path = "D:/work/train/train_word_bag/hlt_stop_words.txt"

    bunch_path = "D:/work/train/train_word_bag/train_set.dat"

    space_path = "D:/work/train/train_word_bag/tfdifspace.dat"

    vector_space(stopword_path,bunch_path,space_path)

    bunch_path = "D:/work/test/test_word_bag/test_set.dat"

    space_path = "D:/work/test/test_word_bag/testspace.dat"

    train_tfidf_path="D:/work/train/train_word_bag/tfdifspace.dat"

    vector_space(stopword_path,bunch_path,space_path,train_tfidf_path)

    5. 分类器

    这里我们采用的是朴素贝叶斯分类器#!/usr/bin/env python

    # -*- coding: UTF-8 -*-

    import sys

    reload(sys)

    sys.setdefaultencoding('utf-8')

    import cPickle as pickle

    from sklearn.naive_bayes import MultinomialNB # 导入多项式贝叶斯算法

    # 读取bunch对象

    def _readbunchobj(path):

    with open(path, "rb") as file_obj:

    bunch = pickle.load(file_obj)

    return bunch

    # 导入训练集

    trainpath = "D:/work/train/train_word_bag/tfdifspace.dat"

    train_set = _readbunchobj(trainpath)

    # 导入测试集

    testpath = "D:/work/test/test_word_bag/testspace.dat"

    test_set = _readbunchobj(testpath)

    # 训练分类器:输入词袋向量和分类标签,alpha:0.001 alpha越小,迭代次数越多,精度越高

    clf = MultinomialNB(alpha=0.001).fit(train_set.tdm, train_set.label)

    # 预测分类结果

    predicted = clf.predict(test_set.tdm)

    for flabel,file_name,expct_cate in zip(test_set.label,test_set.filenames,predicted):

    if flabel != expct_cate:

    print file_name,": 实际类别:",flabel," -->预测类别:",expct_cate

    print "预测完毕!!!"

    # 计算分类精度:

    from sklearn import metrics

    def metrics_result(actual, predict):

    print '精度:{0:.3f}'.format(metrics.precision_score(actual, predict,average='weighted'))

    print '召回:{0:0.3f}'.format(metrics.recall_score(actual, predict,average='weighted'))

    print 'f1-score:{0:.3f}'.format(metrics.f1_score(actual, predict,average='weighted'))

    metrics_result(test_set.label, predicted)

    6.评价与小结

    在实际操作过程中可以通过调节TF-IDF的阈值提高精确度或者使用其他的分类算法

    整个工程的完整代码下载:https://github.com/baixiaoyanvision/text_classify

    展开全文
  • 综述(有不同算法在各数据集上的性能对比): Deep Learning Based Text Classification:A Comprehensive Review(20.04) A Survey on Text Classification: From Shallow to Deep Learning(20.08) 复现: ...

    基础普及: https://zhuanlan.zhihu.com/p/25928551
    综述类(有不同算法在各数据集上的性能对比):
      Deep Learning Based Text Classification:A Comprehensive Review(20.04)
      A Survey on Text Classification: From Shallow to Deep Learning(20.08)
    复现: https://github.com/wellinxu/nlp_store

    总体步骤:输入文档 -> 预处理 -> 文本表示 -> 分类器 -> 类别输出

    主要流程:预处理模型的文本数据;
    浅层学习模型通常需要通过人工方法获得良好的样本特征,然后使用经典的机器学习算法对其进行分类,其有效性在很大程度上受到特征提取的限制;
    而深度学习通过学习一组非线性变换将特征工程直接集成到输出中,从而将特征工程集成到模型拟合过程中。
    在这里插入图片描述
    浅层学习仍然需要进行耗时又昂贵的功能设计,还通常会忽略文本数据中的自然顺序结构或上下文信息,使学习单词的语义信息变得困难,适用于小数据集。
    深度学习方法避免了人工设计规则和功能,并自动为文本挖掘提供了语义上有意义的表示形式,文本分类只是其下游NLP任务之一。它是数据驱动的方法,具有很高的计算复杂性,较浅层模型难以解释其原因和工作方式。需提高其语义表示能力和鲁棒性。
    在这里插入图片描述
    常见应用:垃圾邮件识别、情感分类(SA)、新闻分类(NC)、主题分析(TL)、
    问答(QA)、对话行为分类(DAC)、自然语言推理(NLI)、事件预测(EP)

    类别:二分类、多分类、多标签分类;机器学习、深度学习

    一、预处理

    分词、去停用词(中文)、词性标注(多省略)、数据清理和数据统计

    分析输入数据集,对其进行分类(如单标签,多标签,无监督,不平衡的数据集,多章,短文本,跨语言,多标签,少样本文本,包含术语词汇)

    分词方法:基于字符串匹配、基于理解、
    基于统计:N元文法模型(N-gram),最大熵模型(ME),
    隐马尔可夫模型(Hidden Markov Model ,HMM),
    条件随机场模型(Conditional Random Fields,CRF)等
    在这里插入图片描述
    句子化为等长:对于不同长度的文本,太短的就补空格,太长的就截断(利用pad_sequence 函数,也可以自己写代码pad)

    数据增强:分为shuffle和drop两种,前者打乱词顺序,后者随机的删除掉某些词。有助于提升数据的差异性,对基于词word的模型有一定提升,但对于基于字char的模型可能起副作用。

    二、文本表示

    文本向量化 -> 向量空间模型(vecto rspace model,VSM)

    • 文档、项/特征项、项的权重

    向量的相似性度量(similarity)

    • 相似系数Sim(D1,D2)指两个文档内容的相关程度(degree of relevance)
    • 可借助n维空间中两个向量之间的某种距离来表示,常用的方法是使用向量之间的内积。如果考虑向量的归一化,则可使用两个向量夹角的余弦值来表示。

    文本特征选择(常用方法)

    • 基于文档频率(document frequency, DF)的特征提取法
    • 信息增益(information gain, IG)法(依据为分类提供的信息量来衡量重要程度)
    • χ2统计量(CHI)法(越高,与该类之间的相关性越大,携带的类别信息越多)
    • 互信息(mutual information, MI)方法(越大,特征和类别共现的程度越大)

    特征权重计算方法

    • 一般方法是利用文本的统计信息,主要是词频,给特征项赋予一定的权重。
    • 倒排文档频度(inverse document frequency, IDF)法、TF-IDF法(变种:TFC法和ITC法)、TF-IWF(inverse word frequency)法

    在这里插入图片描述
    文本表示方法:One-hot、Bag of Words(BOW)、N-gram、TF-IDF
    BOW的核心是用字典大小的向量表示每个文本,向量的单个值表示对应于其在文本中固有位置的词频;
    与BOW相比,N-gram考虑相邻单词的信息,并通过考虑相邻单词来构建字典;
    TF-IDF使用单词频率并反转文档频率来对文本建模。

    • 词袋特征方法:特征表示通常是极其稀疏的
      Naive版本、考虑词频、考虑词的重要性(TF-IDF)
    • TF-IDF
      TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
      IDF(t)= log_e(文档总数 / (出现该词语的文档总数+1))
      # 在实际工作中,可能先有词表,再处理文档语料,该词有可能不存在任何文档中

    基于embedding: 通过词向量计算文本的特征(主要针对短文本)

    • 取平均、网络特征
    • word2vec:使用本地上下文信息来获取单词向量。
    • GloVe:具有局部上下文和全局统计功能;训练单词-单词共现矩阵中的非零元素。

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

    其他方法

    • NN Model(end2end实现模型的训练和测试,无需手工提取特征,如CNN、RNN)
    • 任务本身(通过对数据的观察和感知,手工提取特征)
    • 特征融合(GDBT, XGBoost等非线性模型、LR等线性模型)
    • 主题特征(文档话题 LDA、文档潜在语义 LSI)

    文档特征表征
    在这里插入图片描述

    三、机器学习分类器

    • XGBoost、LightGBM
    • 基于支持向量机(support vector machines, SVM)的分类器
    • k-最近邻法(k-nearest neighbor, kNN)
    • 线性最小平方拟合(linear least-squares fit, LLSF)
    • Rocchio分类方法
    • 基于投票的分类方法(Bagging算法、Boosting算法->AdaBoost方法)
    • 决策树分类法(decision tree)、随机森林模型(RF)
    • 朴素的贝叶斯分类法(naΪve Bayesian classifier)(工业用于识别垃圾邮件)
    • 模糊分类法(fuzzy classifier)
    • 神经网络法(neural network, NNet)时间开销大且效果不佳

    四、深度学习分类模型

    与之前的表示方法不同,深度学习也可以用于文本表示,还可以将其映射到一个低纬空间。其中比较典型的例子有:FastText、Word2Vec(GloVe)和Bert

    基本思路:文本 -> Embedding -> CNN/RNN/Inception -> Classifier -> 标签个数维向量
    词(或者字)经过embedding层之后,利用CNN/RNN等结构,提取局部信息、全局信息或上下文信息,利用分类器进行分类,分类器的是由两层全连接层组成的。

    tips:模型分数不够高,试着把模型变得更深更宽更复杂;当模型复杂到一定程度时,不同模型的分数差距很小,继续变复杂难以继续提升分数。

    HAN:使用词和句子两层Attention,当数据中看不出句子,只用一层word时,效果不好。
    RCNN:同时用到RNN和CNN的思想,训练时间很长,但效果与单独的RNN和CNN差不多。
    FastText:通过Average抽象出概括性语义信息
    TextCNN:仿照n-gram捕捉局部语义信息
    TextRNN:提取序列语义信息

    (1) 前馈神经网络FNN

    结构简单,但在很多文本分类任务上有较高的准确性,如DAN模型、FastText模型。思路是将文本看作词袋,为每一个词学习一个向量表示(类似word2vec,Glove),然后取所有向量的和或者平均,传递给前向传播层(也叫多层感知机MLP),最后输入分类器进行分类。

    fastTextBag of Tricks for Efficient Text Classification(2016.7)
    句子中所有的词向量进行平均(某种意义上可以理解为只有一个avg pooling的特殊CNN),然后直接连接一个 softmax 层进行分类。
    在这里插入图片描述
    doc2vec:使用非监督方法,学习一段文本(句子、段落或篇章)的向量表示。结构跟CBOW模型相似,并增加了一个段落token。用前三个词和结构文档向量预测第四个词,文档向量可以作为文档主题记忆。在训练之后,文档向量可以用作分类。

    (2) 卷积神经网络CNN

    跨空间识别模型

    DCNN:最先使用CNN做文本分类的模型之一,动态进行k维最大池化(k根据语句长度与卷积层次进行动态选择);输入是词向量,然后交替使用宽卷积层和动态池化层,该结构可以捕获词语与短语间的长短期关系。
    在这里插入图片描述
    TextCNN:fastText 中的网络结果是完全没有考虑词序信息的,而TextCNN利用CNN,来提取句子中类似 n-gram 的关键信息。
    CNN最大的问题是固定 filter_size 的视野,一方面无法建模更长的序列信息,另一方面 filter_size 的超参调节也很繁琐。相比DCNN,TextCNN的结构更简单,只使用一层卷积,然后将整个文本序列的每一个卷积核的结果池化成一个值,拼接所有池化结果进行最终预测。
    在这里插入图片描述在这里插入图片描述
    字符级别的CNN:以固定长度字符为输入,通过6层带池化的卷积层和3层全连接层进行预测。
    在这里插入图片描述
    VDCNN:受VGG与ResNets的影响,直接处理字符输入,且只用小卷积跟池化操作,深度增加,效果提升。改进 -> 将模型大小压缩了10到20倍,精度只损失了0.4%-0.3%。

    tips:当文本以字符序列作为输入的时候,深层模型比浅层模型表现更好;若用词作为输入,浅且宽的模型(如DenseNet)比深层模型效果更好。而使用非静态的词向量(word2vec、Glove)与最大池化操作可以获得更优的结果。

    (3) 循环神经网络RNN

    跨时间识别模式;将文本看作词序列,通过获取词之间的依赖以及文本结构信息进行分类。

    LSTM:缓解了RNN梯度消失的问题。Tree-LSTM 是LSTM的树型结构扩展,可以学到更丰富的语义表示,在情感分析与句子相似性判断任务上证明了其有效性。
    在这里插入图片描述
    MT-LSTM:用记忆网络替代LSTM中的单个记忆单元,能够给长距离词关系建模,通过获取不同时间尺度上的信息来给长文本建模;将标准LSTM模型中隐藏状态分成多个组,每组会在不同的时间阶段激活并更新。

    TopicRNN:结合RNN与主题模型的优点,前者获取局部句法信息,后者获取全局语义信息。

    TextRNN:Bi-directional RNN(实际使用的是双向LSTM)从某种意义上可以理解为可以捕获变长且双向的 “n-gram” 信息。分类的时候不是只使用最后一个隐藏元的输出,而是把所有隐藏元的输出做K-MaxPooling再分类。
    在这里插入图片描述
    TextRCNN(TextRNN + CNN):利用前向和后向RNN得到每个词的前向和后向上下文的表示;词的表示变成词向量和前向后向上下文向量连接起来的形式;再接跟TextCNN相同卷积层(pooling层即可),唯一不同的是卷积层 filter_size = 1即可,无需更大 filter_size 以获得更大视野,这里词的表示也可以只用双向RNN输出。
    在这里插入图片描述

    (4) 注意力机制

    语言模型中的注意力可看作一组重要性权重的向量。

    层次注意力网络 进行文本分类的两个特点:反映了文档的层次结构,在词级别与句子级别分别使用了注意力机制,模型在6个文本分类任务上都取得了较大进步。
    在这里插入图片描述
    注意力池化(AP)方法:用于配对排序跟匹配任务。可以让池化层知道当前输入对,来自两个输入的信息一定程度上可以直接影响对方的表示结果。它是一种独立于底层表示学习的框架,也可以应用在CNN、RNN等模型上。
    在这里插入图片描述
    还可将文本分类问题看作是标签-文本的匹配问题,通过注意力框架与cosine相似度度量文本序列与标签之间的向量相似度。
    在这里插入图片描述
    TextRNN + Attention
    注意力(Attention)机制是nlp领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献,基本为Seq2Seq模型的标配。而文本分类可以理解为一种特殊的Seq2Seq,所以考虑引入Attention机制。
    加入Attention之后最大的好处:能够直观地解释各个句子和词对分类类别的重要性。
    在这里插入图片描述

    (5) Transformers

    不像RNN类模型在处理序列问题时需要很大的计算资源,通过使用self-attention来并行计算序列中每一个词跟其他所有词的关系。基于Transformers的预训练语言模型(PLM),一般具有很深的神经网络结构,并且会在非常大的语料上进行预训练(通过语言模型等任务来学习文本表示)。使用PLM进行微调,在很多下游NLP任务上都取得了SOTA的效果。大体可以分为两类:自回归与自编码模型。
    在这里插入图片描述
    自回归模型有 OpenGPT,从左到右(或从右到左)在文本序列上一个词一个词预测的单向模型;包含12层Transformer,每一个由遮蔽的多头attention与全连接层组成,其中每一层都会加上残差并做层标准化操作。文本分类任务可以作为其下游任务,使用相关的线性分类器并在具体任务数据上微调即可。
    在这里插入图片描述
    自编码预训练模型有 BERT,使用遮蔽语言模型来做训练,随机遮蔽句子中的token,然后用双向的Transformers根据上下文给遮蔽的token进行编码,从而预测被遮蔽的token。改进包括:RoBERTa在更大的训练集上进行训练,使用动态遮蔽方式,并丢弃下一句预测任务,具有更鲁棒的效果;ALBERT降低模型的大小,提高训练速度;DistillBERT在预训练过程使用知识蒸馏方式,使模型大小减少40%,并保留99%的精度,推断速度提高60%;SpanBERT能更好表示与预测文本span。此类模型在QA、文本分类、NLI等NLP任务上都取得了很好的结果。

    结合自回归模型与自编码模型优点的有 XLNet,在预训练过程中,使用排序操作来同时获取上下文信息。引入了双流self-attention模式来处理排序语言模型,包含两个attention,内容attention(a)即标准的attention结构,查询attention(b)则不能看到当前的token语义信息,只有当前token的位置信息。
    在这里插入图片描述
    UniLM(Unified language Model):使用3种语言模型任务来进行预训练:单向、双向和seq2seq预测。通过共享Transformers网络来实现,其中以特定的self-attention遮蔽来控制预测条件的上下文。
    在这里插入图片描述

    (6) 胶囊神经网络(CapsNets)

    CNN中的池化层会丢失一些信息。

    一个胶囊是一组神经元,神经元中的向量表示实体的不同属性,向量的长度表示实体存在的概率,方向表示实体的属性。与池化操作不同,胶囊使用路由的方式,从底层的各个胶囊上路由到上层的父胶囊上,路由可以通过按协议动态路由或者EM等不同算法来实现。

    包含一个n-gram卷积层,一个胶囊层,一个卷积胶囊层,一个全连接胶囊层。两种胶囊网络,Capsule-A跟CapsNet比较类似,Capsule-B使用了带有不同窗口大小过滤器的三个并行网络,试图学习更全面的文本表示,实验中B的效果更好。
    在这里插入图片描述
    相比较于图像,物体在文本中可以更加随意地组合在一起,比如一些语句的顺序改变,文本的语义还可以保持一致,而人脸图像,五官的位置变换,就不能认为是脸了。由此提出一种静态路由模式,在文本分类任务上,取得了优于动态路由的效果。

    (7) 记忆增强网络 NSE(Neural Semantic Encoder)

    在编码过程中注意力模型里保存的隐藏向量可认为是模型的内部记忆;记忆增强网络结合了神经网络与外部记忆(模型可以读出与写入),可以用于文本分类与QA任务。
    它具有一个大小可变的编码记忆存储器,随着时间进行改变,并通过读入、生成、写入操作来保存对输入序列的理解。
    在这里插入图片描述
    针对QA任务,将一系列的状态(记忆实体)提供给模型,作为对问题的支持事实,模型会学习如何根据问题与历史检索记忆来检索实体;该模型拓展可为端到端的形式,通过注意力机制来实现实体检索。

    (8) 图神经网络GNN

    虽然文本是以序列的形式展现,但其中也包含了图结构,如句法和语义树。

    TextRank:NLP中最早的图模型之一,将文本看作一个图,各种类型的文本单位(如单词、搭配、整个句子)看作节点,节点之间的各种关系(如词法或语义关系、上下文重叠)看作边。

    GCN(Graph Convolutional Network)及其变体:有效且高效,是最流行的结构,在很多应用上都取得了SOTA的效果。
    在这里插入图片描述
    基于graph-CNN模型:首先将文本转换成词图,然后用图卷积操作来处理词图,实验表明,词图的表示能够获取文本中的非连续和长距离语义,并且CNN可以学习到不同层次的语义信息。
    在这里插入图片描述
    GCNN方式:通过词贡献关系与文档-词关系,将整个语料构建成一个单一的图。词与文档为节点,随机初始化节点表示;后用已知标签的文档进行有监督训练,从而学到词跟文档的向量。
    在这里插入图片描述
    tips:在大量文本上使用GNN代价较大,一般会通过降低模型复杂度或者改变模型训练策略来减少成本。前者有SGC(Simple Graph Convolution),它移除了连续层之间的非线性转换操作;后者对文档层次进行构建图,而不对整个语料构图。

    (9) 孪生神经网络S2Net

    S2Net或者其变体DSSM(Deep Structured Semantic Model)主要针对文本匹配问题。

    DSSM(或者S2Net):包含了一对DNN结构(f1、f2),将x、y分别映射到一个低纬语义空间,然后根据cosine距离(或其他方法)计算其相似度。S2Net中假设f1与f2具有一样的结果甚至一样的参数,但在DSSM中这两个可以根据实际情况具有不同的结构。因为文本以序列的形式展现,所以通常会用RNN类的结构来实现f1、f2,后来也有人使用CNN等其他结构,在BERT出现之后,也有不少基于BERT的模型,比如SBERT、TwinBERT等。
    在这里插入图片描述

    (10) 混合模型(模型融合和多任务)

    很多混合模型都会结合LSTM与CNN结构来获取局部特征与全局特征,如C-LSTM与DSCNN。

    C-LSTM(Convolutional LSTM):先用CNN提取文本短语(n-gram)表示,然后输入LSTM获取句子表示;
    DSCNN(Dependency Sensitive CNN):先用LSTM获取学习句向量,然后输入CNN生成文本表示。
    在这里插入图片描述
    SAN模型(Stochastic Answer Network):针对阅读理解中的多步推理;包含很多结构,如记忆网络、注意力机制、LSTM、CNN。其中Bi-LSTM组件来获取问题与短文的内容表示,再用基于问题感知的注意力机制学习短文表示。
    在这里插入图片描述
    “高速公路”网络:可以解决基于梯度训练的网络随着模型深度的增加变得更加困难的问题;它允许信息在多个层上无阻地流动,有点类似于ResNet;是一种基于字符的语言模型,先用CNN获取词表示,再输入到“高速公路”网络,然后接LSTM模型,最后用softmax来预测每个词的概率。
    在这里插入图片描述

    (11) 非监督学习

    • 自编码的无监督学习:跟词向量类似,通过优化一些辅助目标,如自编码器的重构loss,可以用非监督的形式学习句子的表示。
    • 对抗训练:是提高分类器泛化能力的一种方法,通过扰动输入数据生成对抗样本,提高模型的鲁棒性。
    • 强化学习:是训练代理根据策略执行某些动作的方法,通常用最大化奖励来进行训练。

    五、其他

    文本分类评测指标

    • 准确度、错误率
    • 召回率、正确率、F-测度值、微平均和宏平均
    • 平衡点(break-even point)、11点平均正确率(11-point average precision)
    • 精确匹配(EM)、平均倒数排序(MRR)
    • NAP、ACU等

    数据集

    • 情感分析数据集:Yelp、IMDB、SST、MPQA、Amazon、其他
    • 新闻分类数据集:AG News、20 Newsgroups、Sougo News、Reuters news、其他
    • 主题分类数据集:DBpedia、Ohsumed、EUR-Lex、WOS、PubMed、其他
    • 问答数据集:SQuAD、MS MARCO、TREC-QA、WikiQA、Quora、其他
    • 自然语言推理数据集:SNLI、Multi-NLI、SICK、MSRP、其他

    短文本分类:隐马尔可夫、最小熵MEMM、条件随机场CRF、LSTM循环神经网络

    深度学习经验

    • 模型不是最重要的:要理解数据、超参调节 深度学习网络调参技巧 - 知乎专栏
    • 关注迭代质量:记录和分析你的每次实验
    • 一定要用 dropout:除非数据量特别小,或用了更好的正则方法如bn;默认情况下设置为0.5
    • fine-tuning 是必选的:不能只使用word2vec训练的词向量作为特征表示
    • 未必一定要 softmax loss:若任务是多个类别间非互斥,可尝试训练多个二分类器
    • 类目不均衡问题:可尝试类似 booststrap 方法,调整 loss 中样本权重方式
    • 避免训练震荡:增加随机采样因素、默认shuffle机制、调整学习率或 mini_batch_size

    模型融合:依靠差异性(改变输入->字/词;人为定义不同的偏差计算方式);加权融合

    • 利用预训练好的单模型初始化复杂模型的某一部分参数:
      模型过拟合很严重,难以学习到新的东西(单模型在训练集上的分数逼近理论上的极限分数)-> 采用较高的初始学习率从过拟合点拉出来,使得模型在训练集上的分数迅速降低到0.4左右,然后再降低学习率,缓慢学习,提升模型的分数。
    • 共享embedding(这种做法更优):
      能够一定程度上抑制模型过拟合,减少参数量。虽然CNN/RNN等模型的参数过拟合,但是由于相对应的embedding没有过拟合,所以模型一开始分数就会下降许多,然后再缓慢提升。
    展开全文
  • 自然语言处理——文本分类概述

    万次阅读 多人点赞 2018-11-05 19:50:59
    内容提要分类概述分类流程数据采集爬虫技术页面处理文本预处理英文处理中文处理停用词去除文本表示特征选择 分类概述   分类(Classification)是自动对数据进行标注。人们在日常生活中通过经验划分类别。但是要...
  • NLP系列之文本分类

    千次阅读 2019-01-18 19:30:24
    本篇博客主要是记录自然语言处理中的文本分类任务中常见的基础模型的使用及分析。Github上brightmart大佬已经整理出很完整的一套文本分类任务的基础模型及对应的模型代码实现。网上也有部分博客将brightmart写的模型...
  • NLP之文本分类

    万次阅读 多人点赞 2018-09-26 15:08:07
    文本自动分类简称文本分类(text categorization),是模式识别与自然语言处理密切结合的研究课题。传统的文本分类是基于文本内容的,研究如何将文本自动划分成政治的、经济的、军事的、体育的、娱乐的等各种类型。 ...
  • python 中文文本分类

    万次阅读 多人点赞 2017-02-06 11:31:21
    写这篇博文用了很多时间和精力,如果这...即已经分好文本资料(例如:语料库里是一系列txt文章,这些文章按照主题归入到不同分类的目录中,如 .\art\21.txt) 推荐语料库:复旦中文文本分类语料库,下载链接: ...
  • 文本分类(一) | (1) 任务定义

    千次阅读 2019-12-19 17:56:26
    近年来,文本的数量呈指数增长,为了能在许多应用中准确地对文本进行分类,需要对机器学习方法有更深入的了解。许多机器学习方法在自然语言处理方面都取得了突破性的结果。这些学习算法的成功取决于其拟合数据中存在...
  •   在2017年9到12月份参加了kaggle平台上的一个文本分类比赛:Spooky author identification,这个比赛会给出三个恐怖小说作家作品里的一些英文句子。参赛者所要做的是用训练数据训练出合适的模型,让模型在测试...
  • 自然语言处理实战:新闻文本分类(附代码)

    万次阅读 多人点赞 2020-08-13 18:06:15
    自然语言处理实战:新闻文本分类 ——本文比赛来源于天池零基础入门NLP - 新闻文本分类。 目录自然语言处理实战:新闻文本分类一、赛题理解1、学习目标2、赛题数据3、数据标签4、评测指标5、数据读取6、解题思路二...
  • XGBoost文本分类实战

    千次阅读 2019-07-16 08:56:25
    一、将收集到的语料进行文本预处理 1)train.txt预处理为train.csv,格式为id,内容,标签 使用excel打开train.txt然后选择分隔符为英文逗号,这样内容在一列,然后再为他们添加id,从1-900,接着添加标签,0,1,...
  • 文本分类——算法性能评估

    万次阅读 2018-11-06 20:04:08
      语料库经科学取样和加工的大规模电子文本库。借助计算机分析工具,研究者可开展相关的语言理论及应用研究。语料库中存放的是在语言的实际使用中真实出现过的语言材料;语料库是以电子计算机为...
  • 文本是以文字和各种专用符号表达的信息形式;图像是多媒体软件中最重要的信息表现形式之一;动画是快速播放一系列连续运动变化的图形图像;视频影像具有时序性与丰富的信息内涵。本教程操作环境:windows10系统、...
  • Bert文本分类实战(附代码讲解)

    千次阅读 多人点赞 2022-03-23 10:52:46
    BERT全称是Bidirectional Encoder Representations from Transformers,是google最新提出的NLP预训练方法,在大型文本语料库(如维基百科)上训练通用的“语言理解”模型,然后将该模型用于我们关心的下游NLP任务...
  • 文本格式是什么意思

    千次阅读 2021-07-27 08:05:06
    一般来说,计算机可以分为文本文件和二进制文件两文本,是书面语言的表现形式,从文学角度说,通常是具有完整、系统含义(Message)的一个句子或多个句子的组合。一个文本可以是一个句子(...
  • 文本主题分类(TFIDF-朴素贝叶斯分类) ** 大纲 List item 背景介绍: 贝叶斯讲的是一种”逆向概率“,当我们没有上帝视角时,无法准确的预知一个事物本质的时候,可以依靠和事物本质相关的事件来进行推断。一个...
  • 人工智能-自然语言处理(NLP)-应用场景:知识抽取/信息抽取(Information Extraction)
  • 文本分类中的文本特征表示

    万次阅读 2018-01-11 16:49:45
    目前,针对文本话题分类的研究还是很热的,主要包括微博,知乎等大型话题社区,论坛网站。之前知乎针对该问题在著名的机器学习比赛网上,还开展了比赛,有关技术和code有很多。文本话题分析主要是应用是对文本进行...
  • 文本分类入门理论

    千次阅读 2021-11-21 23:24:01
    多模态情感分析——文本分类入门实战 环境:Python3.8 此项目为2021年软件杯赛题,挂个赛题链接(http://www.cnsoftbei.com/plus/view.php?aid=599)可以查看具体题目要求。 因为当时是个菜鸡,bert参数传不进去怎么也...
  • 文本分类的14种算法(1)

    千次阅读 2019-07-08 20:30:03
    文本分类的14种算法 k临近算法 k临近算法即对于待预测数据,依据与其最相似(接近)的k个点中的占大多数的分类,对其进行分类。 这里的最近/最相似可以转化为高维空间中的距离最短来处理:假设一组数据有n个度量...
  • fastText原理和文本分类实战,看这一篇就够了

    万次阅读 多人点赞 2019-03-19 11:19:48
    fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点: 1、fastText在保持高精度的情况下加快了训练速度和测试速度 2、fastText不需要预训练好的词向量,fastText会自己训练词向量 3、fastText...
  • 聚类分析是一种无监督机器学习(训练样本的标记信息是未知的)算法,它的目标是将相似的对象归到同一个簇中,将不相似的对象归到不同的簇中。如果要使用聚类分析算法对一堆文本分类,关键要解决这几个问题: 如何...
  • 第四周.01.GCN文本分类及RGCN模型讲解

    千次阅读 2021-06-25 16:30:11
    主要参考的文章是:Graph Convolutional Networks for Text Classification,是2019 AAAI(Association for the Advancement of Artificial Intelligence)(CCF A会议)发表的一篇文章 另外一篇2018 AAAI的文章是
  • python中文文本分类

    千次阅读 2019-01-07 09:27:31
    一,中文文本分类流程: 预处理 中文分词 结构化表示-构建词向量空间 权重策略—TF-IDF 分类器 评价. 二,具体实现 1. 预处理 1.1 打标签: 对评论数据打好标签,这里将汽车...
  • 文本分类六十年

    千次阅读 2020-11-27 19:29:08
    作者| Lucy出品 | AI科技大本营文本分类是自然语言处理中最基本而且非常有必要的任务,大部分自然语言处理任务都可以看作是个分类任务。近年来,深度学习所取得的前所未有的成功,使得该...
  • NLP之文本分类方法之基础知识

    千次阅读 2018-01-05 15:39:17
    一:文本分类的处理大致分为文本预处理、...因为研究表明特征粒度为词粒度远远好于字粒度,其大部分分类算法不考虑词序信息,基于字粒度的损失了过多的n-gram信息。 中文分词主要分为两方法:基于词典的中文分词和
  • 文本分析是: 从文本中抽取特征词进行量化以表示文本信息文本一般文字。 它是自然语言处理的一个小分支,自然语言处理还包括语音识别(常见的)等。 目的: 先决条件:将无结构化的原始文本转化为结构化的,...
  • 文本分类

    千次阅读 2016-11-01 12:38:39
    文本分类: 预处理 特征选择 DF (Document Frequency) 信息增益 (Information Gain, IG) 熵 (Entropy) 相对熵 (Relative Entropy) χ² 统计量 (Chi-Square) 互信息 (Mutual Information) Robertson & Sparck Jones...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 290,042
精华内容 116,016
热门标签
关键字:

信息类文本指什么