精华内容
下载资源
问答
  • LinkedIn前不久发布两篇文章分享了自主研发的文本分析平台及主题挖掘文本在机器学习和自然语言处理等领域,...主题挖掘的主要原因有两个:首先,文件数量迅速增长,已经依靠人工的方式实现对全部文本信息高效阅读和...

    LinkedIn前不久发布两篇文章分享了自主研发的

    文本分析平台及主题挖掘

    文本

    8a63f4a21d6d7b2be96f3f77f8607f77.png

    在机器学习和自然语言处理等领域,主题挖掘是寻找是主题模型,主题模型是用来在一系列文档中发现抽象主题的一种统计模型。如果一篇文章有一个中心思想,那么一些特定词语会更频繁的出现。简单而言,主题挖掘就是要找到表达文章中心思想的主题词。主题挖掘的主要原因有两个:首先,文件数量迅速增长,已经依靠人工的方式实现对全部文本信息高效阅读和理解,将该流程自动化已经势在必行。其次,主题挖掘可以提高文字重度依赖应用的使用效率和产出影响,比如搜索加索引、文本总结、聚类、分类和情感分析。

    从大量文字中找到主题是一个高度复杂的工作,不仅因为人的自然语言具有多层面特性,而且很难找到准确体现资料核心思想的词语。目前现有方案如:TF-IDF(Term Frequency–Inverse Document Frequency)、互信息(co-occurrence)和LDA(隐含狄利克雷分布Latent Dirichlet allocation);但是,这些算法要么是无法做到只提炼出重要主题,要么是不具高度扩展性和高效性。Voices的主题挖掘模块由LinkedIn自主研发,通过Hadoop和Spark实现,可以帮助LinkedIn规模化地进行用户反馈分析。

    实现主题挖掘的四个技术步骤

    Voices

    一. 词性标注(POS:Part-of-speech)

    句子被切割成单独的词语之后,需要为每个词语加上词性标注。常见的POS为名词、动词、形容词、副词等。我们使用Java实现了斯坦福日志-线性化词性标注。每一个被分析的文件,先被切割成句子,然后分别标上词性。POS标签采用的是英文宾州树库标记。譬如,“我昨天去过了华盛顿公园”分词之后变成“我/PRP 昨天/NN 去过了/VBD 华盛顿/NNP 公园/NN” 。

    二. POS模式匹配

    接下来的目标是根据预定义的分词词性模式,选择出符合的POS词性标注顺序。POS模式采用正则表达式的格式,表达式可能会包含一个可递归的名词短语、一个动宾短语或者一个主谓短语等。我们观察发现,客户的反馈中,最重要的主题都是由实体名词构成,比如“主页”、“简介”;或者是事件 – 由动词名词组成的短语或动作,比如“注销账户”、“同意付款”。这使得我们创立最佳模式去寻找类似的实体词或者事件短语。为了更好地匹配,LinkedIn创立了两种不同的POS模式。

    第一种适用于实体词,可递归的名词短语,名词前面可以加零或若干个修饰限定语。这样,“第二个账号”分词加标签之后为“第二个/JJ账号/NN”,最终模式匹配之后我们得到的两个短语“账号”、“第二个账号。

    第二种定义的是可递归的动词短语,即包含一个或者多个连续动词。比如,短语“已经通过”对应为“已经/VBZ通过/VBN”;该短语满足模式匹配可以得出两个短语“通过”、“已经通过”。

    基于上面模式对名词、动词短语的匹配方式,我们为两类不同的主题创建了下面的三种匹配模式。

    实体词主题:一个名词短语,比如“邮箱”、“信用卡”等。

    事件主题I:一个名词前面加一个动词的主谓结构。常见的关系到一个实体词的动作,如“申请失败”、“用户关闭”或者“上次交易失败”。

    事件主题II:一个动词后面加上若干限定词及若干名词,动宾结构表示一件事情。此种情况下,限定词及名词可以脱离动词存在。比如“合并我的账户”、“关闭我们的旧账户”。

    POS模式匹配会对所有句子的POS标签进行扫描,寻找是否有与上述三种模式匹配。每一个匹配的短语都会被当成一个候选主题。

    三. 主题抽取

    接下来,我们需要减少重复部分、去掉短语中无关紧要的词。主题抽取步骤如下:

    词干提取:这是信息提取和数据挖掘中的关键技术步骤。在LinkedIn的主题挖掘中,“查看简历(view profile)”、“查看所有简历(view profiles)”、“已查看简历(viewed profile)”会被分入到同一个候选主题“查看简历(view profile)”。LinkedIn采用的是Java实现Porter词干提取算法。在词干提取合并候选主题时,会选择词频较高的词语作为最终的主题。如“view”和“profile”组成view profile。

    去掉停止词:在选择候选主题时,还需要去掉停止词。比如文章常见的停止词:介词、代词、连词、小品词或其他辅助词语。如果最终“注销这个账户”“注销他的账户”都能被划入“注销账户”的候选主题中。LinkedIn采用的是Lextek标准版停止词。

    合并同类词:为了进一步简化候选主题的整理,LinkedIn还自行添加了234个特定领域的停止词。去掉那些不会给候选主题添加价值的词语,比如社交网络领域的停止词“附加信息”、“联系我们”、“原消息”、“同样问题”、“网站”、“其他站点”、“点击链接”和“com”等。

    合并语义相近的词条:最终,候选主题需要被提炼到没有同类或同义词。比如“邮箱地址”、“邮箱账号”需要被合并为一个共同主题。同样地,还可以借助WordNet之类的语库对词条进行合并,如“link”、“connection”、“association”、“partnership”和“relationship”等。LinkedIn手动添加了75组同义词。

    合并特定域同类词和语义相近词可以很好地帮助候选主题的提炼,可是大部分的主题提取系统都没有重视这两项候选主题的清理策略。

    四. 主题排序

    经过上述步骤,最终留下来的候选主题已经都最优化。接下来,需要一个标准进行主题排序,然后可以衍生出一套主题。LinkedIn通过两个步骤进行候选主题排序:

    我们计算每个文件中候选主题的TF-IDF值,然后根据我们的经验,我们会保留TF-IDF值最高的五个主题。TF-IDF是文件为单位的计算值,而没有考虑到文件所在的文件整个集合。

    需要为整个文件集合产生一个单独的主题列表。LinkedIn引入了文件频率这个参数来进行整个文件集合的主题TF-IDF值的计算。

    主题挖掘的业务价值

    乍眼一看,这套多模块的流水线处理系统中任何模块都可以单独工作,但会有人担心无预过滤的TF-IDF计算会产生干扰和不准确的主题;不过,LinkedIn使用该系统对论坛讨论、组信息更新、博客中的用户意见文本进行主题挖掘,实践效果很好。

    LinkedIn不需要人工的预览内容就可以简单地实现主题生成,同时根据文件来源的不同可以产生不同的主题。比如,账号使用者抱怨的主题可能有“主要账号”、“次要账号”、“合并账号”、“关闭账号”、“复制账号”等;简历浏览者可能关心的主题是“删除联系人”、“通讯录”、“导入联系人”、“发送邀请”和“待处理邀请”。最终,这些主题会以轮子视图的形式呈现出来,轮子内圈是实体词主题,外圈是每个实体词对应的动作。

    生成主题之后,对用户抱怨反馈按照这些主题进行分类,客户服务代表据此辨别整理主题的各种情绪,从而便于用户反馈的搜索或者内容总结的生成。

    此外,主题随时间的变化情况还可以用来开展趋势算法的研究。这样可以在网络媒体和社区反馈中获取重要信息。最后,还可以使用主题进行文本分类,从而降低信息维度、提高处理效率。

    来源:infoq

    链接:http://www.infoq.com/cn/news/2016/07/technical-details-for-topic

    本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。

    展开全文
  • 本文将详细讲解文本挖掘领域的词云热点分析和LDA主题分布分析。两万字基础文章,希望对您有所帮助。欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个...

    欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

    前一篇文章讲述了数据预处理、Jieba分词和文本聚类知识,这篇文章可以说是文本挖掘和自然语言处理的入门文章。本文将详细讲解文本挖掘领域的词云热点分析和LDA主题分布分析。两万字基础文章,希望对您有所帮助。

    近年来,词云热点技术和文档主题分布分析被更广泛地应用于数据分析中,通过词云热点技术形成类似云的彩色图片来聚集关键词,从视觉上呈现文档的热点关键词;通过文档主题分布识别文档库或知识语料中潜藏的主题信息,计算作者感兴趣的文档主题和每篇文档所涵盖的主题比例。本文主要介绍WordCloud技术的词云热点分布和LDA模型的主题分布,并结合真实的数据集进行讲解。

    下载地址:

    前文赏析:

    第一部分 基础语法

    第二部分 网络爬虫

    第三部分 数据分析和机器学习

    作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


    一.词云技术

    首先,读者可能会疑问什么是词云呢?词云又叫文字云,是对文本数据中出现频率较高的关键词在视觉上的突出呈现,出现频率越高的词显示得越大或越鲜艳,从而将关键词渲染成类似云一样的彩色图片,感知文本数据的主要主题及核心思想。

    1.词云

    “词云”就是对网络文本中出现频率较高的关键词,予以视觉上的突出,使浏览网页者只要一眼扫过文本就可以领略文本的主旨,主要利用文本挖掘和可视化技术。个性化词云既是研究分析内容的一种表现方式,又是广告传媒的一种“艺术品”。在Python中,通过安装WordCloud词云扩展包可以形成快速便捷的词云图片。词云可以使关键词可视化展现,更加直观、艺术。

    在这里插入图片描述

    图1是关于文学文章的词云分析结果。首先对一些文章进行词频统计,然后绘制对应的图形,其中“文学”、“小说”、“中国”、“历史”等字体显示较大,表示这类文章的出现频率较高;而“金融”、“绘画”、“悬疑”字体较小,表示它们出现的频率较小。图2是对某些编程技术文章的词云分析结果图,从图中词云分析可以看出这些技术文章的热点话题有图形学、算法、计算机、编译器等,热点技术有Android、Python、ReactOS、SQL等,同时该图呈现了一定的形状。

    在这里插入图片描述

    前面讲述了词云的效果图,由于其炫酷的效果,很多广告公司、传媒海报都利用该技术进行宣传。下面将讲解Python调用WordCloud库进行词云分析,图3是词云分析的算法流程,包括读取文件、中文分词、词云库导入、词云热点分析和可视化分析。

    在这里插入图片描述


    2.安装WordCloud

    安装WordCloud词云扩展包主要利用前文常见的pip工具包,同时Python处理中文语料需要调用Jieba结巴分词库进行中文分词处理,则需要安装Jieba扩展包。

    pip install WordCloud
    pip install jieba
    

    安装过程如图所示。

    在这里插入图片描述

    在这里插入图片描述

    注意:在安装WordCloud过程中,你可能遇到的一个错误“error: Microsoft Visual C++ 9.0 is required. Get it from http://asa.ms/vcpython27”,这时需要下载VCForPython27可执行文件并进行安装,在微软官网有相关软件(Microsoft Visual C++ Compiler for Python 2.7)供下载。

    在Python开发过程中,可能会遇到各种各样的问题,希望读者都能养成通过谷歌或百度等搜索引擎独立解决的习惯,这是非常宝贵的一种能力,并且将终生受益。


    二.WordCloud基本用法

    1.快速入门

    当WordCloud词云扩展包和Jieba分词工具安装完成以后,下面开始快速入门。假设存在下面test.txt的中文语料,这是前一篇文章讲解数据预处理的自定义语料,内容如下:

    贵州省 位于 中国 西南地区 简称 黔 贵
    走遍 神州大地 醉美 多彩 贵州
    贵阳市 贵州省 省会 林城 美誉
    数据分析 数学 计算机科学 相结合 产物
    回归 聚类 分类 算法 广泛应用 数据分析
    数据 爬取 数据 存储 数据分析 紧密 相关 过程
    甜美 爱情 苦涩 爱情
    一只 鸡蛋 可以 画 无数次 一场 爱情 能
    真 爱 往往 珍藏 平凡 普通 生活
    

    接下来执行文件,它将调用WordCloud扩展包绘制test.txt中文语料对应的词云,完整代码如下所示:

    # -*- coding: utf-8 -*- 
    #coding=utf-8
    #By:Eastmount CSDN
    import jieba  
    import sys  
    import matplotlib.pyplot as plt  
    from wordcloud import WordCloud  
    
    text = open('test.txt').read()  
    print(type(text)) 
    wordlist = jieba.cut(text, cut_all = True)  
    wl_space_split = " ".join(wordlist)  
    print(wl_space_split)   
    my_wordcloud = WordCloud().generate(wl_space_split)   
    plt.imshow(my_wordcloud)   
    plt.axis("off")  
    plt.show()
    

    输出结果如图所示,其中出现比较频繁的贵州省、数据、爱情显示较大。

    在这里插入图片描述

    代码详解如下:

    (1) 导入Python扩展包
    首先需要调用import和from import导入相关的函数包,Python的词云分析主要调用WordCloud包进行,调用jieba扩展包进行分词,调用matplotlib扩展包绘制图形。

    import jieba  
    import sys  
    import matplotlib.pyplot as plt  
    from wordcloud import WordCloud   
    

    (2) 调用jieba工具分词处理
    接下来调用open()函数读取爬取的语料“test.txt”文件,再调用jieba扩展包进行分词处理。核心代码如下:

    text = open('test.txt').read()  
    wordlist = jieba.cut(text, cut_all = True)  
    wl_space_split = " ".join(wordlist)  
    print(wl_space_split)
    

    其中,结巴分词调用函数jieba.cut(text, cut_all = True),参数“cut_all=True”表示设置为全模型。结巴中文分词支持的三种分词模式包括:

    • 精确模式:该模式将句子最精确地切开,适合做文本分析。
    • 全模式:将句子中所有可以成词的词语都扫描出来, 速度非常快,缺点是不能解决歧义问题。
    • 搜索引擎模式:在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

    代码示例如下:

    #coding=utf-8
    #By:Eastmount CSDN
    import jieba  
      
    #全模式  
    text = "我来到北京清华大学"  
    seg_list = jieba.cut(text, cut_all=True)  
    print("[全模式]: ", "/ ".join(seg_list))
    #[全模式]: 我 / 来到 / 北京 / 清华 / 清华大学 / 华大 /大学
      
    #精确模式  
    seg_list = jieba.cut(text, cut_all=False)  
    print("[精确模式]: ", "/ ".join(seg_list))
    #[精确模式]: 我 / 来到 / 北京 / 清华大学
      
    #默认是精确模式  
    seg_list = jieba.cut(text)  
    print("[默认模式]: ", "/ ".join(seg_list)) 
    #[默认模式]: 我 / 来到 / 北京 / 清华大学 
     
     #搜索引擎模式  
    seg_list = jieba.cut_for_search(text)   
    print("[搜索引擎模式]: ", "/ ".join(seg_list))
    #[搜索引擎模式]: 我 / 来到 / 北京 / 清华 / 华大 / 大学 / 清华大学 
    

    代码wl_space_split = " ".join(wordlist)表示将中文分词的词序列按照空格连接,并生成分词后的字符串,赋值给wl_space_split变量。

    (3) 调用WordCloud函数生成词云热点词频
    调用WordCloud()函数生成词云,其中该函数核心参数包括设置背景颜色、设置背景图片、最大实现词数、字体最大值、颜色种类数。借用Python强大的第三方扩展包对该语料进行词云分析,其中核心代码如下:

    # 读取mask/color图片  
    d = path.dirname(__file__)  
    nana_coloring = imread(path.join(d, "1.jpg")) 
     
    # 对分词后的文本生成词云  
    my_wordcloud = WordCloud( background_color = 'white', #背景颜色  
                        mask = nana_coloring,    #设置背景图片  
                        max_words = 2000,        #设置最大现实的字数  
                        stopwords = STOPWORDS,   #设置停用词  
                        max_font_size = 200,     #设置字体最大值  
                        random_state = 30,       #设置有多少种随机生成状态,即有多少种配色方案    
                        )  
    # generate word cloud   
    my_wordcloud.generate(wl_space_split) 
    

    上述示例代码主要使用WordCloud()函数,并省略了参数。

    • my_wordcloud = WordCloud().generate(wl_space_split)

    (4) 调用imshow扩展包进行可视化分析
    接下来调用plt.imshow(my_wordcloud)代码显示语料的词云,词频变量为my_wordcloud;调用plt.axis(“off”)代码是否显示x轴、y轴下标,最后通过plt.show()代码展示词云。

    plt.imshow(my_wordcloud)   
    plt.axis("off")  
    plt.show()  
    

    总之,词云分析可以广泛的应用于词频分析,可以直观的给出文章的主题词等内容,接下来讲解的CSDN技术论坛分析实例很好地利用了该技术。


    2.中文编码问题

    如果语料是中文,在词云分析中可能出现中文乱码的情况,如图所示,在绘制的词云中,其中文关键词均错误的显示为方框,而英文字母组成的关键词能够显示。

    在这里插入图片描述

    其解决方法是在WordCloud安装的目录下找到wordcloud.py文件,对该文件中的源码进行修改,下图为wordcloud.py源文件。

    在这里插入图片描述

    编辑wordcloud.py,找到FONT_PATH,将DroidSansMono.ttf修改成msyh.ttf。这个msyh.ttf表示微软雅黑中文字体。

    在这里插入图片描述

    注意,此时运行代码还是报错,因为需要在同一个目录下放置msyh.ttf字体文件供程序调用,如图所示,这是原来的字体DroidSansMono.ttf文件。

    在这里插入图片描述

    此时的运行结果如下所示,这是分析CSDN多篇博客所得到的词云,其中“阅读”和“评论”出现的比较多,因为每篇文章都有对应的阅读数和评论数,所以该关键字显示较为突出。下图通过词云图形清晰地显示了热点词汇。

    在这里插入图片描述

    同时,也可以通过另一种方法解决中文乱码的错误,在py文件中增加一行代码。

    • wordcloud = WordCloud(font_path = ‘MSYH.TTF’).fit_words(word)

    3.词云形状化

    前面我们看到的词云图形都是有形状的,比如下面关于R语言描述语料形成的词云,整个形状也是呈“R”的,同时“统计”、“数据分析”、“大数据”是相关词汇。

    在这里插入图片描述

    那么,怎么形式这种词云呢?
    调用Python扩展包scipy.misc的imread()函数可以绘制指定图形的词云,下图是分析作者和女朋友近期微信聊天记录的词云图,完整代码如下所示:

    #coding=utf-8
    #By:Eastmount CSDN
    from os import path  
    from scipy.misc import imread    
    import jieba  
    import sys  
    import matplotlib.pyplot as plt  
    from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator    
      
    # 打开本体TXT文件  
    text = open('data-fenci.txt').read()  
      
    # 结巴分词 cut_all=True 设置为全模式   
    wordlist = jieba.cut(text)     #cut_all = True  
      
    # 使用空格连接 进行中文分词  
    wl_space_split = " ".join(wordlist)  
    print(wl_space_split)
      
    # 读取mask/color图片  
    d = path.dirname(__file__)  
    nana_coloring = imread(path.join(d, "pic.png"))  
      
    # 对分词后的文本生成词云  
    my_wordcloud = WordCloud( background_color = 'white',    
                                mask = nana_coloring,         
                                max_words = 2000,            
                                stopwords = STOPWORDS,       
                                max_font_size = 50,          
                                random_state = 30,          
                                )  
      
    # generate word cloud   
    my_wordcloud.generate(wl_space_split)  
      
    # create coloring from image    
    image_colors = ImageColorGenerator(nana_coloring)  
      
    # recolor wordcloud and show    
    my_wordcloud.recolor(color_func=image_colors)  
      
    plt.imshow(my_wordcloud)    # 显示词云图  
    plt.axis("off")             # 是否显示x轴、y轴下标  
    plt.show()  
      
    # save img    
    my_wordcloud.to_file(path.join(d, "cloudimg.png"))  
    

    输出的词云如图所示,右边的词云图是根据左边的图形形状生成的,其中“宝宝”、“我们”、“哈哈哈”等关键词比较突出。

    在这里插入图片描述

    同样可以输出作者近十年的博客词云图。

    请添加图片描述


    三.文档主题模型

    文档主题生成模型(Latent Dirichlet Allocation,简称LDA)通常由包含词、主题和文档三层结构组成。LDA模型属于无监督学习技术,它是将一篇文档的每个词都以一定概率分布在某个主题上,并从这个主题中选择某个词语。文档到主题的过程是服从多项分布的,主题到词的过程也是服从多项分布的。本小节将介绍LDA主题模型、安装过程、基本用法,并通过一个实例来讲解文档主题分布。

    1.LDA主题模型

    文档主题生成模型(Latent Dirichlet Allocation,简称LDA)又称为盘子表示法(Plate Notation),图22.14是模型的标示图,其中双圆圈表示可测变量,单圆圈表示潜在变量,箭头表示两个变量之间的依赖关系,矩形框表示重复抽样,对应的重复次数在矩形框的右下角显示。LDA模型的具体实现步骤如下:

    • 从每篇网页D对应的多项分布θ中抽取每个单词对应的一个主题z。
    • 从主题z对应的多项分布φ中抽取一个单词w。
      重复步骤(1)(2),共计Nd次,直至遍历网页中每一个单词。

    在这里插入图片描述

    \

    现在假设存在一个数据集DS,数据集中每篇语料记为D,整个数据集共T个主题,数据集的特征词表称为词汇表,所包含的单词总数记为V。LDA模型对其描述的内容是:数据集DS中每个实篇语料D都与这T个主题的多项分布相对应,记为多项分布θ;每个主题都与词汇表中V个单词的多项分布相对应,记为多项分布φ。其中θ和φ分别存在一个带超参数的α和β的狄利克雷先验分布,后面将结合具体实例深入讲解。


    2.LDA安装过程

    读者可以从gensim中下载ldamodel扩展包安装,也可以使用Sklearn机器学习包的LDA子扩展包,亦可从github中下载开源的LDA工具。下载地址如下所示。

    • gensim:https://radimrehurek.com/gensim/models/ldamodel.html
    • scikit-learn:利用pip install sklearn命令安装扩展包,LatentDirichletAllocation函数即为LDA原型
    • github:https://github.com/ariddell/lda

    作者最后使用的是通过“pip install lda”安装的官方LDA模型。

    • pip install lda

    在命令框CMD中输入该命令令安装LDA模型,安装过程如下图所示,安装成功显示“Successfully installed lda-1.0.3 pbr-1.8.1”。

    在这里插入图片描述

    在这里插入图片描述

    作者更推荐大家使用“pip install lda”语句安装的官方LDA扩展包,该方法简洁方便,更值得大家学习和使用。


    四.LDA基本用法及实例

    Python的LDA主题模型分布可以进行多种操作,常见的包括:输出每个数据集的高频词TOP-N;输出文章中每个词对应的权重及文章所属的主题;输出文章与主题的分布概率,文本一行表示一篇文章,概率表示文章属于该类主题的概率;输出特征词与主题的分布概率,这是一个K*M的矩阵,K为设置分类的个数,M为所有文章词的总数。下面让我们结合实例开始学习LDA模型的用法吧!

    这里使用的数据集为上一篇文章讲解数据预处理,对其进行数据分词、清洗、过滤后的数据集,如表所示,共9行语料,涉及贵州、大数据、爱情三个主题。

    在这里插入图片描述

    1.初始化操作

    (1) 生成词频矩阵
    首先,需要读取语料test.txt,载入数据并将文本中的词语转换为词频矩阵。调用 sklearn.feature_extraction.text 中的 CountVectorizer 类实现,代码如下:

    #coding=utf-8
    #By:Eastmount CSDN
    # coding:utf-8  
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer  
      
    #读取语料
    corpus = []  
    for line in open('test.txt', 'r').readlines():  
        corpus.append(line.strip())
    
    #将文本中的词语转换为词频矩阵
    vectorizer = CountVectorizer()
    
    #计算个词语出现的次数
    X = vectorizer.fit_transform(corpus)
    
    #获取词袋中所有文本关键词 
    word = vectorizer.get_feature_names()
    
    print('特征个数:', len(word))
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')
    
    #查看词频结果  
    print(X.toarray())
    

    其中输出的X为词频矩阵,共9行数据,43个特征或单词,即9*43,它主要用于计算每行文档单词出现的词频或次数。输出如下图所示,其中第0行矩阵表示第一行语料“贵州省 位于 中国 西南地区 简称 黔 贵”出现的频率。同时调用 vectorizer.get_feature_names() 函数计算所有的特征或单词。

    在这里插入图片描述

    (2) 计算TF-IDF值
    接下来调用TfidfTransformer类计算词频矩阵对应的TF-IDF值,它是一种用于数据分析的经典权重,其值能过滤出现频率高且不影响文章主题的词语,尽可能的用文档主题词汇表示这篇文档的主题。

    #coding=utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer  
      
    #读取语料
    corpus = []  
    for line in open('test.txt', 'r').readlines():  
        corpus.append(line.strip())
        
    #将文本中的词语转换为词频矩阵
    vectorizer = CountVectorizer()  
    X = vectorizer.fit_transform(corpus)  #计算个词语出现的次数  
    word = vectorizer.get_feature_names() #获取词袋中所有文本关键词
    print('特征个数:', len(word))
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')  
    print(X.toarray())                    #查看词频结果 
    
    #计算TF-IDF值
    transformer = TfidfTransformer()  
    print(transformer)
    tfidf = transformer.fit_transform(X) #将词频矩阵X统计成TF-IDF值
    
    #查看数据结构 输出tf-idf权重
    print(tfidf.toarray())
    weight = tfidf.toarray()
    

    输出如图所示,它也是9*43的矩阵,只是矩阵中的值已经计算为TF-IDF值了。

    在这里插入图片描述

    (3) 调用LDA模型
    得到TF-IDF值之后,可以进行各种算法的数据分析了,这里则调用lda.LDA()函数训练LDA主题模型,其中参数n_topics表示设置3个主题(贵州、数据分析、爱情),n_iter表示设置迭代次数500次,并调用fit(X)或fit_transform(X)函数填充训练数据,具体代码如下:

    model = lda.LDA(n_topics=3, n_iter=500, random_state=1)  
    model.fit(X)          
    #model.fit_transform(X) 
    

    运行过程如图所示。

    在这里插入图片描述

    读者也可以import lda.datasets导入官方数据集,然后调用lda.datasets.load_reuters()函数载入数据集进行分析,这里作者则直接对下表实例数据集进行LDA分析。

    在这里插入图片描述


    2.计算文档主题分布

    该语料共包括9行文本,每一行文本对应一个主题,其中1-3为贵州主题,4-6为数据分析主题,7-9为爱情主题,现在使用LDA文档主题模型预测各个文档的主体分布情况,即计算文档-主题(Document-Topic)分布,输出9篇文章最可能的主题代码如下。

    #coding=utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer  
    import lda
    import numpy as np
    
    #生成词频矩阵
    corpus = []  
    for line in open('test.txt', 'r').readlines():  
        corpus.append(line.strip())
    vectorizer = CountVectorizer()  
    X = vectorizer.fit_transform(corpus)    
    word = vectorizer.get_feature_names()
    
    #LDA分布
    model = lda.LDA(n_topics=3, n_iter=500, random_state=1)  
    model.fit(X)
    
    #文档-主题(Document-Topic)分布 
    doc_topic = model.doc_topic_
    print("shape: {}".format(doc_topic.shape))  
    for n in range(9):  
        topic_most_pr = doc_topic[n].argmax()  
        print(u"文档: {} 主题: {}".format(n,topic_most_pr))  
    

    输出结果如图所示,可以看到LDA算法将第1、7、8篇文档归纳为一个主题,第2、5、9篇文档归纳为一个主题,第3、4、6篇文档归纳为一个主题。而真实的主题是第1-3篇文档为贵州主题,第4-6篇文档为数据分析主题,第7-9篇文档为爱情主题,所以数据分析预测的结果会存在一定的误差,这是由于每篇文档的单词较少,影响了实验结果。

    在这里插入图片描述

    同时,在进行数据分析时,通常需要采用准确率、召回率或F特征值来评估一个算法的好坏,研究者也会不断的优化模型或替换为更好的算法。


    3.主题关键词的Top-N

    下面讲解计算各个主题下包括哪些常见的单词,即计算主题-词语(Topic-Word)分布。下面代码用于计各主题5的词频最高的五个单词,即Top-5,比如爱情主题下最常见的五个单词是“爱情 鸡蛋 苦涩 一场 中国”。

    代码如下所示,首先分别计算各个主题下的关键词语。

    #主题-单词(Topic-Word)分布
    word = vectorizer.get_feature_names()
    topic_word = model.topic_word_  
    for w in word:  
        print(w,end=" ")
    print('')
    
    n = 5    
    for i, topic_dist in enumerate(topic_word):    
        topic_words = np.array(word)[np.argsort(topic_dist)][:-(n+1):-1]    
        print(u'*Topic {}\n- {}'.format(i, ' '.join(topic_words)))
    

    在上述代码中,vectorizer.get_feature_names()函数用于列举出各个特征或词语, model.topic_word_函数是存储各个主题单词的权重。首先输出所有的单词,再输出三个主题中包含的前5个单词,输出如下:

    一只 一场 中国 产物 位于 分类 可以 回归 多彩 存储 平凡 广泛应用 往往 数学 数据 数据分析 无数次 普通 林城 爬取 爱情 珍藏 甜美 生活 相关 相结合 省会 神州大地 简称 算法 紧密 美誉 聚类 苦涩 西南地区 计算机科学 贵州 贵州省 贵阳市 走遍 过程 醉美 鸡蛋 
    *Topic 0
    - 珍藏 多彩 林城 醉美 生活
    *Topic 1
    - 爱情 鸡蛋 苦涩 一场 中国
    *Topic 2
    - 数据分析 数据 聚类 数学 爬取
    

    接着通过通过代码计算各个主题通过LDA主题模型分析之后的权重分布,代码如下:

    #主题-单词(Topic-Word)分布
    print("shape: {}".format(topic_word.shape))  
    print(topic_word[:, :3])  
    for n in range(3):  
        sum_pr = sum(topic_word[n,:])  
        print("topic: {} sum: {}".format(n,  sum_pr))  
    

    首先计算topic_word矩阵的形状,即shape: (3L, 43L),它表示3个主题、43个特在词。topic_word[:, :3]输出三个主题的前三个词语对应的权重,最后计算每行语料所有特征词的权重和,求和值均为1。

    shape: (3L, 43L)
    [[ 0.00060864  0.00060864  0.00060864]
     [ 0.06999307  0.06999307  0.06999307]
     [ 0.00051467  0.00051467  0.00051467]]
    topic: 0 sum: 1.0
    topic: 1 sum: 1.0
    topic: 2 sum: 1.0
    

    输出如图所示。

    在这里插入图片描述


    4.可视化处理

    最后作者将讲述LDA常用的两种可视化处理,这里直接给出完整代码。

    (1) 文档-主题分布图

    #coding=utf-8
    #By:Eastmount CSDN 
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer  
    import lda
    import numpy as np
    
    #生词频矩阵
    corpus = []  
    for line in open('test.txt', 'r').readlines():  
        corpus.append(line.strip())
    vectorizer = CountVectorizer()  
    X = vectorizer.fit_transform(corpus)  
      
    #LDA分布
    model = lda.LDA(n_topics=3, n_iter=500, random_state=1)  
    model.fit_transform(X)
    
    #文档-主题(Document-Topic)分布 
    doc_topic = model.doc_topic_
    print("shape: {}".format(doc_topic.shape))  
    for n in range(9):  
        topic_most_pr = doc_topic[n].argmax()  
        print("文档: {} 主题: {}".format(n+1,topic_most_pr))
        
    #可视化分析
    import matplotlib.pyplot as plt  
    f, ax= plt.subplots(9, 1, figsize=(10, 10), sharex=True)  
    for i, k in enumerate([0,1,2,3,4,5,6,7,8]):  
        ax[i].stem(doc_topic[k,:], linefmt='r-',  
                   markerfmt='ro', basefmt='w-')  
        ax[i].set_xlim(-1, 3)      #三个主题
        ax[i].set_ylim(0, 1.0)     #权重0-1之间
        ax[i].set_ylabel("y")  
        ax[i].set_title("Document {}".format(k+1))  
    ax[4].set_xlabel("Topic")  
    plt.tight_layout()
    plt.savefig("result.png")
    plt.show() 
    

    输出结果如下图,它是计算文档Document1到Document9各个主题分布情况。X轴表示3个主题,Y轴表示对应每个主题的分布占比情况。如果某个主题分布很高,则可以认为该篇文档属于该主题。例如Document1、Document7和Document8在第1个主题分布最高,则可以认为这两篇文章属于主题1。

    请添加图片描述

    文档: 1 主题: 1
    文档: 2 主题: 0
    文档: 3 主题: 2
    文档: 4 主题: 2
    文档: 5 主题: 0
    文档: 6 主题: 2
    文档: 7 主题: 1
    文档: 8 主题: 1
    文档: 9 主题: 0
    

    (2) 主题-词语分布图
    该图用于计算各个单词的权重,供43个特征或单词。

    #coding=utf-8
    #By:Eastmount CSDN 
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer  
    import lda
    import numpy as np
    
    #生词频矩阵
    corpus = []  
    for line in open('test.txt', 'r').readlines():  
        corpus.append(line.strip())
    vectorizer = CountVectorizer()  
    X = vectorizer.fit_transform(corpus)
    
    #LDA分布
    model = lda.LDA(n_topics=3, n_iter=500, random_state=1)  
    model.fit_transform(X)
    
    #文档-主题(Document-Topic)分布 
    doc_topic = model.doc_topic_
    print("shape: {}".format(doc_topic.shape))  
    for n in range(9):  
        topic_most_pr = doc_topic[n].argmax()  
        print(u"文档: {} 主题: {}".format(n+1,topic_most_pr))
    topic_word = model.topic_word_
    
    #可视化分析
    import matplotlib.pyplot as plt
    f, ax= plt.subplots(3, 1, figsize=(8,6), sharex=True) #三个主题
    for i, k in enumerate([0, 1, 2]):
        ax[i].stem(topic_word[k,:], linefmt='b-',
                   markerfmt='bo', basefmt='w-')
        ax[i].set_xlim(-1, 43)      #单词43个
        ax[i].set_ylim(0, 0.5)      #单词出现频率
        ax[i].set_ylabel("y")
        ax[i].set_title("Topic {}".format(k))
    ax[1].set_xlabel("word")
    plt.tight_layout()
    plt.savefig("result2.png")
    plt.show() 
    

    输出如下图所示,它是计算主题topic0、topic1、topic2各个单词权重分布情况。横轴表示43个单词,纵轴表示每个单词的权重。

    请添加图片描述


    五.总结

    当今社会,词云热点技术和文档主题分布分析被更广泛地应用于数据分析中。通过词云热点技术形成类似云的彩色图片来聚集关键词,从视觉上呈现文档的热点关键词,并突出各关键词的重要程度,该技术被广泛应用于广告传媒、舆情分析、图片分析等领域。

    通过文档主题分布识别文档库或知识语料中潜藏的主题信息,计算文档作者感兴趣的主题和每篇文档所涵盖的主题比例,该技术被广泛应用于论文引文分析、聚类分析、自然语言处理、摘要自动生成等领域。本文详细讲解了Python环境下的WordCloud技术的词云热点分布和LDA模型的主题分布,并结合实例进行分析,希望读者能熟练掌握这两个技术并学以致用。

    在这里插入图片描述

    最后希望读者能复现每一行代码,只有实践才能进步。同时更多聚类算法和原理知识,希望读者下来自行深入学习研究,也推荐大家结合Sklearn官网和开源网站学习更多的机器学习知识。

    该系列所有代码下载地址:

    感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~

    在这里插入图片描述

    (By:娜璋之家 Eastmount 2021-08-10 夜于武汉 https://blog.csdn.net/Eastmount )


    参考文献

    • [1] 杨秀璋. 专栏:知识图谱、web数据挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.
    • [2] 杨秀璋. [python数据挖掘课程]十三.WordCloud词云配置过程及词频分析[EB/OL]. (2017-03-21)[2017-11-07]. http://blog.csdn.net/eastmount/article/details/64438407.
    • [3] 杨秀璋. [python] LDA处理文档主题分布及分词、词频、tfidf计算[EB/OL]. (2016-03-15)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50891162.
    • [4] 杨秀璋. [python] 使用scikit-learn工具计算文本TF-IDF值[EB/OL]. (2016-08-08)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50323063.
    • [5] 杨秀璋. [python] 基于k-means和tfidf的文本聚类代码简单实现[EB\OL]. (2016-01-16)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50473675.
    • [6] Jiawei Han,Micheline Kamber著. 范明,孟小峰译. 数据挖掘概念与技术. 北京:机械工业出版社,2007.
    • [7] Github. WordCloud[EB/OL].(2017)[2017-12-01]. https://github.com/amueller/word_cloud.
    • [8] 半吊子全栈工匠. 10行python代码的词云[EB/OL]. (2017-03-06)[2017-12-01]. http://blog.csdn.net/wireless_com/article/details/60571394.
    • [9] 杨秀璋. [python] 使用Jieba工具中文分词及文本聚类概念[EB/OL]. (2015-12-11)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50256163.
    • [10] pypi官网. Python中文分词组件 jieba[EB/OL]. https://pypi.python.org/pypi/jieba/.
    • [11] scikit-learn官网. LatentDirichletAllocation[EB/OL]. http://www.scikit-learn.org/.
    • [12] gensim LDA下载地址[EB/OL]. https://radimrehurek.com/gensim/models/ldamodel.html
    展开全文
  • 最近在学习文本分类,读了很多博主的文章,要么已经严重过时(还在一个劲介绍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.

    展开全文
  • 有两种主要类型的文本摘要技术: 1. 提取摘要 在提取摘要中,将原文中重要的一段文本包含在摘要文本中。摘要基本上是对原文重要部分的汇总。摘要文中原文措辞不变。 2. 抽象摘要 在抽象摘要中,原文被完全理解,...

    来源 | Natural Language Processing for Beginners

    作者 | AI Publishing 

    翻译 | 悉尼没睡醒

    校对 | gongyouliu

    编辑 | auroral-L

    全文共2406字,预计阅读时间30分钟。

    第九章 文本摘要和主题建模 

    1.  用 NLTK 进行文本摘要

        1.1  抓取维基百科的文章

        1.2  文本清洗

        1.3  查找词频

        1.4  查找句子分数

        1.5  输出摘要

    2.  使用 Genism 利用 LDA 进行主题建模

        2.1  维基百科文章抓取

        2.2  数据清洗

        2.3  使用 LDA 进行主题建模

        2.4  测试主题模型

    文本摘要和主题建模是自然语言处理非常常见的应用。在本章中,你将通过示例进行文本摘要和主题建模。

    1. 用NLTK进行文本摘要

    text summarization,顾名思义,任务是总结一段给定的文本。有两种主要类型的文本摘要技术:

    1. 提取摘要

    在提取摘要中,将原文中重要的一段文本包含在摘要文本中。摘要基本上是对原文重要部分的汇总。摘要文中原文措辞不变。

    2. 抽象摘要 

    在抽象摘要中,原文被完全理解,然后用全新的词概括,代表原文的主旨。提取摘要很容易执行,因此,大多数现有的 NLP 方法都执行提取文本摘要。让我们看一个例子。假设你有以下一段文字,并且你想对其进行总结。

     

    你可以使用提取摘要方法来实现。我们将要使用的方法很简单。首先,我们必须将我们的文本分成句子,如下面的脚本所示:

     

    接下来,我们必须为输入文本的所有句子中的所有单词分配一个出现频率。

     

    让我们看看文本文档中所有单词的频率:

     

     

    你可以看到climate这个词出现了两次,change出现了三次,依此类推。接下来,我们需要找到每个单词的相对频率。一个词的相对频率可以通过将一个词的频率除以出现次数最多的词的频率来计算。下面的脚本就是这样做的。

     

    让我们输出相对频率。

     

     

    最后一步是计算语料库中所有句子的频率分数。一个句子的频率得分等于该句子中所有单词的频率得分之和。以下脚本计算语料库中所有句子的频率分数。

     

    以下输出显示了所有句子的频率分数。

     

    总而言之,选择频率最高的 N 个句子。例如,以下脚本选择频率最高的前三个句子。

     

    输出如下:

     

    总结看起来很有意义。这只是一个非常粗略的例子。在下一节中,你将看到我们如何总结维基百科文章。

    首先,你需要安装 beautifulsoup4 和 lxml 库。你需要这些库来抓取我们将要总结的维基百科文章。在命令终端上执行以下命令以安装这些库。

     

    1.1 抓取维基百科的文章

    以下脚本抓取了维基百科关于自然语言处理的文章。脚本解析文章,然后创建一个语料库,其中包含文章中所有段落的文本,忽略 HTML 标签。

     

    抓取文本的前 1,000 个字符如下所示。

     

     

    1.2 文本清洗

    下一步是清洗数字和特殊字符的文本。

     

    1.3 查找词频

    其余过程类似。你必须首先将文本分成句子。

     

    接下来,根据清理过的数据,创建一个词频词典,其中包含单词及其相应的出现频率。

     

     

    下一步是创建单词的相对频率,如下所示:

     

    1.4 查找句子分数

    最后,可以通过将句子中所有单词的频率分数相加来计算句子的频率分数,这是在下面脚本中实现的。请记住,非常长的句子将被忽略,并且仅包含少于 25 个单词的句子包含在摘要中。你可以增加或减少此数字。

     

     

    1.5 输出摘要

    最后一步是按照频率分数的升序选择前N个句子。以下脚本选择前五个句子。

     

    输出显示了维基百科关于自然语言处理的文章的摘要。

     

    2. 使用 Genism 利用 LDA 进行主题建模

    主题建模是一项常见的 NLP 任务,它试图在文本文档中找到主题。请注意,主题建模是一种无监督的方法,主题建模只能让你了解哪些词经常出现。然后由你来推断已经看到频繁和同时出现的词的主题。

    我们将使用 Gensim 库来执行主题建模。此外,为了抓取维基百科文章,我们将使用 Python 维基百科模块。

    在命令终端上执行以下命令以安装 Wikipedia 和 Gensim 库。

    $ pip install wikipedia
    $ pip install gensim
    

    2.1 维基百科文章抓取

    我们将从维基百科中抓取四篇文章。文章主题是机器学习、比萨、冠状病毒和埃菲尔铁塔。

    文章抓取后,然后通过“content”对象的“page”属性检索文章的内容.

     

     

    2.2 数据清洗

    下一步是清理所有数据,将数据转换为单词(tokens),将单词转换为小写,删除停用词,对单词进行词形还原(lemmatize),并删除所有小于五个字符的单词。clean_text() 方法执行所有这些任务。

     

     

    以下脚本通过将数据传递到 clean_text() 方法,将数据转换为经过清理和预处理的单词集合。

     

    2.3 使用 LDA 进行主题建模

    LDA(Latent Dirichlet Allocation)是最常用的主题建模算法之一。LDA 模型做出两个假设:

    1. 包含相似词的文本文档具有相同的主题。

    2. 包含一组经常一起出现的词的文本文档具有相同的主题。

    Gensim 库包含 LDA 模型的实现。但是,在使用它之前,你需要创建一个包含输入文本中所有单词的 Gensim 语料库。Gensim 语料库是使用 Gensim 字典创建的 BOW 模型。要创建 Gensim 字典,你需要将一组格式化的单词从 Gensim 库传递给 Corpora 模块的 Dictionary 对象。创建Gensim语料库,需要将Gensim词典传递给Gensim词典的doc2bow()方法,词典返回Gensim语料库,如下脚本所示。

     

    要使用 Gensim 创建 LDA 模型,你可以使用 gensim.models.ldamodel 模块中的 LdaModel 类。

    要提取的主题数传递给 num_topics 属性,而 Gensim 语料库作为第一个属性传递。pass 属性是指你要用于训练 LDA 模型的迭代次数。看下面的脚本:

     

    训练模型后,你可以为每个主题提取 N 个单词。以下脚本每个主题提取七个单词,即总共 28 个单词。

     

     

    输出显示第一个主题中的单词,例如 Eiffel、engineer、tallest、structure、French 等,指的是法国的一些高层建筑。由于 Eiffel 这个词是明确存在的,我们可以说我们文本中的主题之一与 Eiffel Tower 相关。

    属于第二个主题的词是learning、machine和algorithm。因此,我们可以得出结论,第二个主题与机器学习有关。同样,可以得出结论,第三个主题与披萨有关,而最后一个主题与冠状病毒有关。

    你可以看到,尽管在某些情况下,一个主题包含混合词,例如在主题 4 中,我们有机器学习、冠状病毒,由于我们的主题模型并非 100% 正确,因此可以将其视为噪音。

    2.4 测试主题模型

    最后一步是测试主题模型。让我们向我们的主题模型传递一个句子,看看分配给我们的主题是什么句子。

     

    输出显示我们的句子属于主题 1 的概率为 13.30%,属于主题 2 的概率为 12.54%,属于主题 3 的概率为 61.63%,而属于主题 4 的概率为 12.50%。所以,最高概率是我们的句子属于主题 3,即 Pizza。我们实际上在我们的句子中谈论食物。因此,我们可以说我们的主题模型做出了正确的预测。

    拓展阅读 – 主题模型

    如果想要了解关于主题模型更多的知识,请阅读这一篇文章:https://bit.ly/3hFhuyG

    展开全文
  • 分词最常用的工作包是jieba分词包,jieba分词是Python写成的一个分词开源库,专门用于中文分词,其有3条基本原理,即实现所采用技术。 ①基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成...
  • 什么是语雀? 「语雀」是一个「专业的云端知识库」,孵化自蚂蚁金服,是体验科技理念下的一款创新产品,已是 10 万阿里员工进行文档编写、知识沉淀的标配。 语雀诞生伊始,只是希望能给工程师提供一个好用的工具...
  • CSS中处理不同长度文本的几种小技巧【推荐教程:CSS视频教程 】当我们使用 CSS 构建布局时,考虑长短文本内容很重要,如果能清楚地知道当文本长度变化时需要怎么处理,可以避免很多不必要的问题。在许多情况下,添加...
  • 文本文本的生成技术主要指对给定文本进行变换和处理从而获得新文本技术,具体说来包括文本摘要(Document Summarization)、句子压缩(Sentence Compression)、句子融合 (Sentence Fusion)、文本复述(Paraphrase ...
  • 对话文本摘要概述

    2021-11-30 23:09:56
    本篇文章会探究对话文本的特点和对话摘要的实现,基于三个不同的对话场景(会议、医患沟通、客服对话),分别介绍一篇有代表性的近期顶会paper,并在最后总结不同对话文本特点对应的解决方案。 引言 当前,对文本...
  • Python 文本相似度和聚类文本数据是非结构化的和高噪声的。在执行文本分类时,拥有标记合理的训练数据和有监督学习大有裨益。但是,文档聚类是一个无监督的学习过程,将尝试通过让机器学习各种各样的文本文档及其...
  • 前言多行文本超出高度限制出现省略号 , 移动端多为webkit内核的 , 有扩展属性-webkit-line-clamp , 但并不是CSS规范中的属性 , PC端往往要借助js去实现这一效果,但麻烦且不是很靠谱,今天就用纯CSS来实现一个完全...
  • 文本分类的一些例子如下:分析社交媒体中的大众情感鉴别垃圾邮件和非垃圾邮件自动标注客户问询将新闻文章按主题分类目录本文将详细介绍文本分类问题并用Python实现这个过程:文本分类是有监督学习的一个例子,它使用...
  • 1.TF-IDF昨天给大家演示简单的文本聚类,但要给每个聚类再提取一两个关键词用于表示该聚类。我们还是用TFIDF算法来做,因为这是比较简单的提取特征算法,不过这里的TF是指某词在本聚类内所有文章的词频,而不是本...
  • 一种基于计算机信息处理技术的中文文本情感分析方法【技术领域】[0001] 本发明设及自然语言处理技术,特别是一种基于计算机信息处理技术的中文文本 情感分析方法。【背景技术】[0002] 随着互联网和电子商务的飞速...
  • 作者:Susan Li翻译:陈之炎校对:陈汉青 本文约1900字,建议阅读5分钟在这篇文章,我们将LDA应用于一组文档,并将文档按照主题分类。 标签:LDA 算法主题建模是一种用于...
  • 1.何为TF-IDF? TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率). TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的... 部分内容转载于:TF-IDF算法计算公式及含义_SEO技术
  • NG+ 开发者大会2020 主题视频知乎视频​www.zhihu.com视频文字版本本文主要分享基于Angular和Slate开发富文本编辑器的实践历程,基于Angular做编辑器对我们来说也是一个新的尝试,社区关于Angular编辑器的实现更多的...
  • 文本分类的基本原理

    2021-02-18 16:44:14
    文本分类的基本原理 文本分类的概念 文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用...
  • 计算文本相似度的常用算法

    千次阅读 2021-03-07 14:33:43
    文本分析是数据挖掘的重要手段,利用文本分析,我们将很快的读取到一本书、一篇文章、一段话中的关键词和核心思想,而文本相似度就是我们用来剔除无用信息或者重复信息的重要手段,让计算机去找文本中的不同。...
  • 言归正传,我之前基本一直没怎么接触VAE,最多只是看过一些博客介绍,这篇文章应该算是我对VAE的一次全面了解,初始感觉,VAE强啊,本文做的是有条件的文本生成任务,基于VAE去做文本隐含分布映射,然后通过给
  • Python文本分析

    2021-02-11 22:25:16
    译者序前言第1章自然语言基础11自然语言111什么是自然语言112语言哲学113语言习得和用法12语言学13语言句法和结构131词132短语133从句134语法135语序类型学14语言语义14...
  • 简介:文本生成(Text Generation)是自然语言处理(Natural Language Processing,NLP)领域的一项重要且具有挑战的任务。...可控文本生成技术大图 一 文本生成技术 文本生成(Text Generation).
  • 文本分类从入门到精通在这篇文章中,笔者将讨论自然语言处理中文本分类的相关问题。笔者将使用一个复旦大学开源的文本分类语料库,对文本分类的一般流程和常用模型进行探讨。首先,笔者会创建一个非常基础的初始模型...
  • 文本聚类!

    2021-08-29 15:53:38
    第10章 文本聚类 10.1 概述 10.2 文档的特征提取 10.3 k均值算法 10.4 重复二分聚类算法 10.5 标准化评测 10.6 总结 第10章 文本聚类 上一章我们在字符、词语和句子的层级上应用了一些无监督学习方法。这些...
  • 文章目录自然语言处理系列三十文本相似度算法余弦相似度Java代码实现总结 自然语言处理系列三十 文本相似度算法 在自然语言处理中,我们经常需要判定两个东西是否相似。比如,在微博的热点话题推荐那里,我们需要...
  • 基于MLP进行文本分类

    2021-10-14 19:27:38
    最近学习了基于Pytorch框架下的MLP、CNN、RNN网络模型,利用在GitHub上获取的商品评论数据进行文本分类实验。本文介绍了如何在Pytorch框架下建立MLP对数据进行二分类,数据集大致如下: 1、导入模块 import pandas ...
  • LDA是在pLSI的基础上增加了贝叶斯框架,是pLSI变成了贝叶斯主题模型的LDA。概率模型求参数,当然需要进行参数估计,LDA参数估计的方法有:变分贝叶斯推断(VB);期望传播(EP);Collapsed Gibbs Sampling;Collapsed ...
  • 深度学习文本分类|模型&代码&技巧

    千次阅读 2021-02-03 17:58:59
    来自:李rumor文本分类是NLP的必备入门任务,在搜索、推荐、对话等场景中随处可见,并有情感分析、新闻分类、标签分类等成熟的研究分支和数据集。本文主要介绍深度学习文本分类的常用模型原理、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,111
精华内容 29,244
关键字:

文本主题实现需要什么技术