目录

  • 1 第一章 数据仓库概述
    • 1.1 授课安排
    • 1.2 数据仓库及其历史
      • 1.2.1 数据仓库的概念
        • 1.2.1.1 本节视频
      • 1.2.2 数据仓库特征
        • 1.2.2.1 本节视频
    • 1.3 数据仓库系统结构
      • 1.3.1 数据仓库系统的组成
        • 1.3.1.1 本节视频
      • 1.3.2 ETL
        • 1.3.2.1 本节视频
      • 1.3.3 数据仓库和数据集市的关系
      • 1.3.4 元数据及其管理
      • 1.3.5 数据集市和元数据管理视频
    • 1.4 数据仓库系统开发工具
    • 1.5 数据仓库与操作型数据库的关系
      • 1.5.1 本节视频内容
  • 2 第二章 数据仓库设计
    • 2.1 授课安排
    • 2.2 数据仓库设计概述
    • 2.3 数据仓库的规划和需求分析
    • 2.4 数据仓库的建模
    • 2.5 数据仓库的物理模型设计
    • 2.6 数据仓库的部署和维护
  • 3 第三章 OLAP技术
    • 3.1 授课安排
    • 3.2 OLAP概述
    • 3.3 OLAP的多维数据模型
    • 3.4 OLAP实现
  • 4 第四章 数据
    • 4.1 课程资料
  • 5 第五章 数据挖掘概述
    • 5.1 授课安排
    • 5.2 什么是数据挖掘?
    • 5.3 数据挖掘系统
    • 5.4 视频
    • 5.5 数据挖掘过程
  • 6 第六章 关联分析
    • 6.1 授课安排
    • 6.2 关联分析概念
    • 6.3 Apriori算法
    • 6.4 FP-growth树
    • 6.5 多层关联规则
    • 6.6 【扩充知识】机器学习——关联规则——支持度(support)、置信度(confidence)、提升度(Lift)
  • 7 第七章 序列模式挖掘
    • 7.1 序列模式挖掘概述
    • 7.2 AprioriAll算法
    • 7.3 AprioriSome算法
    • 7.4 FreeSpan算法
    • 7.5 PrefixSpan算法
  • 8 第八章 聚类分析
    • 8.1 聚类概述
  • 9 分类算法
    • 9.1 课件
  • 10 实验1 python基础
    • 10.1 讲解文本内容
    • 10.2 课程PDF
    • 10.3 实验代码
    • 10.4 实验报告封皮
  • 11 实验2-python
    • 11.1 讲解文本内容
    • 11.2 实验代码
    • 11.3 实验报告封面
  • 12 实验3--python
    • 12.1 讲解文本内容
    • 12.2 实验代码
    • 12.3 实验报告封面
  • 13 实验4--python
    • 13.1 讲解文本内容
    • 13.2 21.1实验代码
    • 13.3 实验内容2
    • 13.4 实验内容3
    • 13.5 实验报告封面
  • 14 实验5--python
    • 14.1 文本内容-NumPy模块
    • 14.2 第三方可视化数据分析图表
    • 14.3 数据
    • 14.4 思考题
    • 14.5 实验报告封面
  • 15 实验6--python
    • 15.1 实验 NumPy矩阵的基本操作
    • 15.2 实验 关联规则算法
    • 15.3 实验 商品零售购物篮分析
    • 15.4 实验报告封面
  • 16 实验7--python
    • 16.1 实验1 用关联规则分析方法推荐电影
    • 16.2 实验2 FP-growth算法
    • 16.3 实验3 教育平台的线上课程推荐策略
    • 16.4 实验报告封面
  • 17 实验8-python
    • 17.1 实验1 购物车分析
    • 17.2 实验2 基于关联规则的文本分析
  • 18 实验9--python
    • 18.1 实验1 聚类分析
    • 18.2 实验2 航空公司客户价值分析
    • 18.3 实验3 运输车辆安全驾驶行为分析
    • 18.4 实验报告封面
实验2 基于关联规则的文本分析

关联规则分析有一个非常经典的故事—超市中啤酒和尿不湿的购买关联。超市通过分析其会员的购物数据,发现成年男性去超市给孩子买尿不湿时,一般都会顺手买一些啤酒,于是超市把尿不湿和啤酒放在了一起,方便两种商品一起购买,这大大增加了超市的销售额。关联规则算法是通过分析像购物车这样的非结构化数据,从中发现有趣信息的一种算法。同样文本数据也是一种常见的非结构化数据,而文本挖掘相关的算法则是从无结构的文本中,发现感兴趣的内容,如文本的主题、文本之间的相似性等。因此本部分将关联规则和文本挖掘放在一起进行讨论,介绍如何使用Python从非结构化的数据中发现感兴趣的内容。

本部分先简单介绍关联规则和文本挖掘时相关的模型,然后介绍如何利用Python中的相关库和函数进行分析和挖掘。

一、模型简介

本节简单介绍关联规则和文本挖掘相关的基础知识,有助于读者更好地理解与分析程序得到的结果。

1、关联规则

关联规则分析(Association Rule Learning)也叫关联规则挖掘或关联规则学习,它试图在很大的一个数据集中找出规则或相关的关系。关联规则在挖掘过程中,会分析一些事物同时出现的频率。比如,看买什么东西和买尿不湿同时出现的频率最高,购买啤酒的顾客是不是男性所占的比例较高等(这种方法通常称为购物篮分析)。关联规则的适用范围很广,除常用的购物篮数据、问卷调查等以分类变量为主的情况外,还可以对连续的数据变量离散化进行关联规则分析。

关联规则是经典机器学习算法之一,下面先介绍与其相关的几个概念。

(1)项目:交易数据库中的一个字段,对超市的交易来说一般是指一次交易中的一个物品,如啤酒。

(2)事务:某个客户在一次交易中,发生的所有项目的集合,如{面包,啤酒,尿不湿}。

(3)项集:包含若干个项目的集合,一般会大于0个。

(4)频繁项集:某个项集的支持度大于设定阈值(预先给定或者根据数据分布和经验来设定),即称这个项集为频繁项集。

(5)频繁模式:频繁地出现在数据中的模式。例如,频繁出现在交易数据中的商品(如面包和啤酒)集合就是频繁项集。先买了一件外套,然后买了裤子,最后买了双鞋子,如果它频繁地出现在购物的历史数据中,则称它为一个频繁的序列模式。

(6)关联规则:设I是项的集合,给定一个交易数据库D,其中的每项事务di都是I的一个非空子集,每一个事务都有唯一的标识符对应。关联规则是形如X⇒Y的蕴含式,其中XY属于项的集合I,并且XY的交集为空集,则X、Y分别称为规则的先导和后继(或者称前项和后项)。

支持度:关联规则X⇒Y的支持度(support)是D中事务包含XY同时出现的百分比,它就是概率P(Y∪X)

置信度:关联规则X⇒Y的置信度(confidence)是D中包含X的事务同时也包含Y的事务百分比,它就是条件概率P(Y|X)

规则的置信度可以通过规则的支持度计算出来,得到对应的关联规则X⇒YY⇒X,可以通过如下步骤找出强关联规则。

(i)找出所有的频繁项集:找到满足最小支持度的所有频繁项集。

(ii)由频繁项集产生强关联规则:这些规则必须同时满足给定的最小置信度和最小支持度。

提升度:关联规则的一种简单相关性度量,X⇒Y的提升度即在含有X的条件下同时含有Y的概率,与Y总体发生的概率之比。XY的提升度可以通过下面的公式进行求解:

如果lift(X,Y)的值小于1,则表明X的出现和Y的出现是负相关的,即一个出现可能导致另一个不出现;如果值等于1,则表明XY是独立的,它们之间没有关系;如果值大于1,则XY是正相关的,即每一个的出现都蕴含着另一个的出现。提升度可以用于判断获得的规则是不是有用的规则。

发现数据中关联规则的常用算法有Apriori算法和FPGrowth算法,这里不再详细介绍这些算法的工作模式,后面会介绍如何使用Python针对数据进行关联规则挖掘。图1展示了基本的关联规则分析流程。

图1 关联规则分析流程

2、文本挖掘

文本数据是常见的非结构数据类型之一,文本挖掘(Text Mining)就是从文本数据中获取有用信息的一种方法,它在机器学习及人工智能领域扮演着重要角色。文本挖掘有时也被称为文本数据挖掘,一般指通过对文本数据进行处理,从中发现高质量的、可利用的信息。文本中的高质量信息通常通过分类和预测来产生,如模式识别、情感分类等。本节介绍的文本挖掘内容如图2所示。

图2 文本挖掘流程示意图

在图2中,针对文本挖掘的内容可以分为4个部分:数据收集、文本数据预处理、数据可视化与特征提取、关键信息挖掘。

(1)数据收集。文本数据无处不在,所以收集时非常方便,如网络上的文本数据、电影评论、新闻等,书籍的内容也是文本数据,在数据收集时抓取技术非常有用。

(2)文本数据预处理。在文本数据预处理阶段根据文本语言的不同,处理方式会有些差异。针对英文文本,通常包括剔除文本中的数字、标点符号、多余的空格;将所有的字母都转化为小写字母;剔除不能有效表达信息甚至会对分析起干扰作用的停用词;对文本进行词干化处理,只保留词语的词干等。而针对中文文本,除了要剔除不需要的字符外,还需要首先对文本进行分词操作,分词是中文文本数据特有的数据预处理流程。

(3)数据可视化与特征提取。针对文本数据的可视化方式通常是可视化词语出现的次数,如使用词云、频数条形图等方式,数据可视化是为了能够快速地从大量的文本数据中,对数据进行一些概括性的了解,帮助后面的数据挖掘过程。特征提取通常会从文本数据中提取TF矩阵、TF-IDF矩阵以及句向量等特征,这些特征通常用于文本挖掘的相关分析。

(4)关键信息挖掘。这部分主要是使用一些有监督或者无监督的机器学习算法,从文本中获取更深层次的信息。如使用无监督的主题模型来分析文本中包含的主题;使用聚类分析算法分析文本之间的关系和聚集特性;使用有监督的机器学习算法,对文本数据进行分类等。

后面将会以具体的数据集为例,介绍如何利用Python进行相应的文本挖掘。这里先导入相关的库和模块,其中mlxtend库主要用于介绍关联规则分析,jieba库用于中文的分词操作,Gensim库和pyLDAvis库用于LDA主题模型。

二、数据关联规则挖掘

介绍如何进行数据关联规则挖掘之前,准备可以进行分析的数据,使用下面的程序从文件中读取数据。

在读取的数据中每行表示一个样本,每个样本中包含着不同的特性,这些特性的取值使用空格分开,例如第0个样本包含1、3、9等特性。针对该数据进行关联规则挖掘的目标就是发现数据集中的规则,例如{1,3,9,10}⇒{4,8,55}等。

进行关联规则挖掘之前,先对数据进行预处理。下面的程序中,将每行数据处理为列表,从程序输出结果中可以发现一共包含8124个样本序列,并且所有数据一共包含119个特性。

为了方便使用mlxtend库进行关联规则分析,将前面获得的列表数据使用函数TransactionEncode()进行数据变换,处理后的数据每个特性作为列名,每个样本对应着行,如果样本中有某种特性,则对应的取值为True,否则为False。程序如下:

1、FP-Growth关联规则挖掘

mlxtend库中同时提供了FPGrowthApriori两种关联规则算法,本节介绍如何使用FPGrowth算法进行关联规则分析。下面的程序使用fpgrowth()函数获取数据中的频繁项集,并且计算输出结果中每个频繁项集的元素数量,因此在输出结果中包含support(支持度)、itemsets(频繁项集)与length(频繁项集的元素数量)三个变量。

针对获得的频繁项集的支持度可以使用条形图进行可视化,在下面的程序中,分别可视化出了频繁项集中元素数量不同情况下,项集对应的支持度大小情况,结果如图3所示。

图3 频繁项集的支持度大小

使用FPGrowth算法获得的频繁项集,可以使用association_rules()函数发掘出其中的关联规则,下面的程序中利用置信度的大小对获取的规则进行筛选,只保留置信度大于等于0.9的规则,从输出的结果中可以发现一共获取了380条规则。

在获取的输出结果中,antecedents表示规则中的前项、consequents表示规则中的后项、support表示支持度、confidence表示置信度、lift表示提升度、leverageconviction分别表示杠杆率和确信度。其中杠杆率跟提升度类似,杠杆率大于0说明有一定关系,越大说明两者的相关性越强,确信度也用来衡量前项和后项的独立性,这个值越大,前项和后项越关联。

association_rules()函数中也可以使用其他参数指定筛选规则的方式,例如,在下面的程序中只获取提升度大于等于1.2的规则,从输出结果中一共发现了6条规则。

2、Apriori关联规则挖掘

mlxtend库中还提供了apriori()函数,利用Apriori算法进行关联规则挖掘,下面的程序通过最小支持度对发现的频繁项集进行筛选,运行程序后可以发现找到了565条频繁项集。

针对上面利用Apriori算法获得的频繁项集iterm_fre2,同样可以使用association_rules()函数从中发现关联规则,在下面的程序中只获取提升度大于等于1.1的规则,一共发现了2 136条规则。

由于发现的规则较多,所以通过观察数据的内容并不能很好地分析规则中的内容,下面使用一些可视化方式,将发现的规则进行可视化分析。想要分析的是规则中支持度、置信度和提升度之间的关系,针对这三个数值型特征,可以使用矩阵散点图进行可视化分析。运行下面的程序后,矩阵散点图可视化结果如图4所示。

通过图4可以发现,置信度和支持度并没有明显的相关性趋势,但随着提升度的增加,置信度也有增大的趋势。通过对角线的直方图可以发现支持度主要集中在0.4到0.45之间。

图4 置信度和支持度

针对获取的关联规则,可以通过不同的条件对规则进行筛选,例如,下面的程序是获得前项和后项的项目个数都大于2的规则,一共可获得212条规则。

同样可以指定前项或后项的元素内容,然后对规则进行筛选,挑出感兴趣的规则。下面的程序则是从规则中挑出前项的项目为90、36、85三个元素的规则,从输出结果中可以发现一共有7条规则满足条件。

下面的程序则是通过指定后项中所包含的项目,对规则进行筛选,找出后项中为86、34、36三个元素的规则,一共发现有6条规则。

针对获取的规则还可以挑选出项集中包含某些项目的规则,在下面的程序中先定义一个函数findset(),该函数可以挑选某个集合是否包含某个小的集合,从而可以更灵活地对规则进行筛选,运行下面的程序,则可以获取前项包含34、85,后项包含56、86的规则,运行程序后可以获得11条规则。

针对获得的规则还可以使用网络图进行可视化,可视化时一条规则的前项指向后项可以作为有向图的一条边。下面的程序则是将满足某些条件的规则,使用有向图进行可视化分析,程序运行后的结果如图5所示。

图5 关联规则有向图可视化

从图5中可以发现,拥于特性23、56、110的样本,会有很大的可能性拥有特性36。同时在使用有向图进行关联规则的可视化时,可以通过不同的筛选条件,选出感兴趣的规则,下面的程序则是可视化前项长度≤2,后项长度为1并且置信度大于0.8的规则,程序运行后的结果如图6所示。

图6 关联规则有向图可视化

三、文本数据预处理

在介绍文本数据挖掘之前,我们先介绍如何对文本数据进行预处理操作,这里分别针对英文文本和中文文本以不同的数据集为例进行预处理。

1、英文文本预处理

英文文本的词语已经被空格切分开了,所以不需要像中文分词这样的步骤,下面使用一个英文文本数据集演示如何对文本数据进行预处理。这里查看数据的保存形式,在bbc文件夹中包含5个子文件夹,每个子文件夹中包含多个.txt文本文件。数据读取就是将bbc文件夹中的数据正确读取,如图7所示。

图7 英文文本数据保存形式

文本读取可以定义一个read_txt()函数,该函数会读取指定文件夹下的所有文本数据,并且同时会保存每个子文件夹的名称作为文本的标签,运行下面的程序即可正确读取图7所示的bbc文件夹中的文本数据。

针对读取的数据对其类别标签进行分析,同时也可以使用map()方法将字符串转化为0~n-1的整数,用于表示不同类别的数据,程序如下:

针对英文文本的预处理操作主要包含对字符的清洗和对单词的预处理,下面编写一个text_preprocess()函数,主要对英文文本进行以下预处理操作:①将字母转化为小写;②去除数字;③去除标点符号;④去除非英文字符;⑤去除多余的空格。最后针对文本数据使用text_preprocess()函数,运行下面的程序后,输出的预处理前后的文本效果如下。

可以发现预处理后的英文文本更加干净,剔除了很多干扰信息。预处理后的文本可以使用词云进行可视化分析,下面的程序则是可视化出了所有英文文本的词云,程序运行后的结果如图8所示。

图8 英文文本词云图

2、《三国演义》文本预处理

中文文本数据挖掘和英文文本不同,中文文本在建立模型之前,需要进行分词操作,这是因为中文文本没有像空格一样的标示符将其切分为相应的词语。针对中文分词,Python中常用的包为jiebaR包。下面首先读取《三国演义》文本数据和停用词数据,程序如下:

从读取的数据输出中可以发现,《三国演义》数据一共有两个变量,分别对应着章节名称和章节内容。

使用jieba库进行中文分词时,不同的分词模型会获得不一样的分词结果,下面使用数据中的一个句子,展示不同分词模式下的分词效果。

(1)不使用词典的全模式。不参考自定义的词典,会把句子中所有的可以成词的词语都扫描出来,虽然速度很快,但是不能解决歧义。例如下面的示例:

(2)不使用词典的精确模式。不参考自定义的词典,试图将句子最精确地切开,适合文本分析,默认模式为精确模式。例如下面的示例:

jieba库还支持引入自定义的词典,来增强分词的准确性。词典的引入可以使用函数jieba.load_userdict(),并且只需要导入一次即可。

(3)使用词典的全模式。参考自定义的词典,会把句子中所有可以成词的词语都扫描出来。例如下面的示例:

(4)使用词典的精确模式。参考自定义词典,试图将句子最精确地切开,默认模式为精确模式。例如下面的示例:

通过上面的示例观察不同模式下的输出结果,可以清晰地分析出不同方式下输出分词结果之间的差异。下面针对整本书的文本数据,基于使用词典的全模式分词方式,对其进行分词操作,并对分词结果进行剔除停用词等预处理操作,程序如下:

运行上面的程序后,同时可以获得每个章节词语数量的折线图(见图9)。图中展示了每个章节分词后获得词语数量的变化趋势,在一定程度上反应了对应章节的长度。

图9 每个章节获得的分词数量

针对分词后的效果,可以使用TK_df.cutword[0:5]查看分词后的部分分词结果,输出如下:

针对分词后的《三国演义》内容,可以使用词云对其进行可视化,在一定程度上分析图书中的关键词。下面的程序利用了词语和词频的方式可视化词云,程序运行后的词云图如图10所示。

图10 《三国演义》词云图

四、文本聚类分析

文本数据挖掘可以使用无监督的聚类模型对其进行分析,发现文档之间的分布模式或隐藏关系,本节主要介绍使用不同的文本特征及利用不同的文本聚类方式对其进行分析的方法。

1、文本数据特征获取

利用聚类算法对文本进行数据挖掘之前,先将前面已经预处理好的文本数据进行特征获取操作,获得可以使用的特征。中文文本数据将会获取分词后数据的TF-IDF矩阵,数据预处理好的英文文本数据,将获取每个文本的句向量特征。

(1)TF-IDF矩阵

获取文本数据的TF-IDF特征之前,先观察会使用到的数据,程序如下:

TK_df数据表中,会针对cutword特征进行提取,并且使用n-gram模型来提取特征词项。n-gram也称为n元语法,是一种基于统计语言模型的算法。它的基本思想是将文本内容按照字节进行大小为n的滑动窗口操作,形成了长度是n的字节片段序列。每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表(语料库的向量特征空间),列表中的每一种gram就是一个特征向量维度。通常使用的方式有1-gram(将一个单词作为一个词项)和2-gram(将两个相邻的单词作为一个词项)。

在下面的程序中有先通过一个for循环,将一个章节中符合条件的分词使用空格拼接,然后利用CountVectorizer()函数构建语料库,参数ngram_range=(1,2))表示可以使用1-gram或者2-gram获得词组,再利用TfidfTransformer()函数获取文本数据的TF-IDF特征,最后会输出一个120×2000维的矩阵。

(2)句向量

句向量就是将一个文本句子使用一个向量来表示,通常可以使用算法训练得到文本的句向量。在获取英文文本的句向量之前,先查看待分析的数据,前几行程序如下:

获取句向量可以使用gemsim库中的Doc2Vec()函数,该函数获取textdf数据表中每个text_pre特征的句向量,程序如下:

程序中先将文本数据转化为需要的格式documents,然后使用Doc2Vec()函数初始化一个模型model,使用模型的train()方法进行训练,最后提取出每个文本的句向量,输出结果使用2225×500维的矩阵,即每个文本句子使用了一个长度为500的向量进行表示。

2、常用的聚类算法

获取了中文文本和英文文本对应的特征后,下面分别使用不同的数据聚类方法对相应的数据进行分析,主要使用了系统聚类(即层次聚类)、K-均值聚类等常用的聚类算法。

(1)系统聚类

系统聚类可以发现数据样本之间的聚集顺序和模式,在下面的程序中,则是使用系统聚类对《三国演义》文本数据进行聚类分析,同时还将聚类结果使用系统聚类树进行可视化,程序运行后的结果如图11所示。

图11 系统聚类树

从图11-11中可以发现,《三国演义》文本数据的120个章节可以被聚集为5个簇。

系统进行聚类分析后,可以使用fcluster()函数获取每个样本的聚类标签,并且可以使用参数t指定最终获得的聚类数目。在下面的程序中,分别获取了将数据聚为2个和5个簇的类别标签,接着利用t-SNE算法将数据降维到二维空间中,可视化出每个簇在空间中的分布情况,程序运行后的聚类结果如图12所示。

图12 聚类为不同簇的可视化结果

(2)K-均值聚类

前面的示例是使用系统聚类对《三国演义》数据进行分析,下面以bbc英文文本为例,使用K-均值聚类算法对其进行聚类分析。因为已经有了bbc英文文本数据的类别标签,所以可以将聚类的结果使用V测度等指标进行评价,运行下面的K-均值聚类程序后,可以发现最终的聚类V测度为0.7998

前面进行聚类时使用的是bbc英文文本的句向量特征,每个文本使用500维的向量表示,为了可视化聚类效果,使用t-SNE降维算法将句向量特征降维到二维空间,运行下面的程序后,最后可获得如图13所示的数据聚类效果。

图13 K-均值聚类和原始标签对比

在图13中分别可视化出了数据的原始标签下的分布情况,以及经过聚类算法后数据每个簇的分布情况。从可视化效果可以发现,大部分原本是同类的数据样本,经过聚类算法后都被归为了同一个簇。

(3)LDA主题模型

主题模型(Topic Model)是机器学习和自然语言处理等领域的常用文本挖掘方法,主要用来在一系列文档中发现抽象主题,是统计模型的一种。它是一种无监督的文档分组方法,和聚类很相似,它主要根据每个文档之间的相似性,对文档进行分组。一般来说,如果一篇文章有一个描述的中心主题,那么一些特定词语会频繁出现。例如,一篇介绍狗的文章,与“狗”相关的词语出现的频率会高一些,如骨头、狗粮、哈士奇等;如果一篇文章是关于猫的内容,那与“猫”相关的词语出现的频率会高一些,如猫粮、鱼干等。而有些词,如“这个”“和”“它们”等词语,在两篇文章中出现的频率大致相等。很多时候我们都希望一篇文档表达一种主题,但真实的情况是一篇文章通常包含多种主题,而且每个主题所占比例各不相同。因此,如果一篇文章10%和猫有关,90%和狗有关,那么与“狗”相关的关键字出现的次数大概是与“猫”相关的关键字出现次数的9倍。主题模型就是试图用数学框架来体现文档的这种特点。它通过自动分析每个文档,统计文档内词语出现的特性,根据统计的信息来断定当前文档含有哪个或哪些主题,以及每个主题所占的比例。

LDA(Latent Dirichlet Allocation,隐狄利克雷分布)是一种文档主题生成模型,包含词、主题和文档三层结构,可用来识别文档集或语料库中潜藏的主题信息,是一种无监督的机器学习技术。它把每一篇文档视为一个词频向量,从而将文本信息转化为易于建模的数字信息。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。图14给出了LDA文档主题和特征词的结构。

图14 LDA文档主题和特征词的结构

在图14中,LDA主题模型定义每篇文档均为隐含主题集的随机混合,从而可将整个文档集特征化成隐含主题的集合。LDA主题模型的层次结构可分为文档集层、隐含主题层及特征词层。

Python中可以使用Gensim库进行主题模型的应用,同时可以将主题模型的结果使用pyLDAvis库进行可视化。本小节将以《三国演义》数据为例,利用主题模型对其进行主题挖掘。在下面的程序中,针对分词后的数据集先使用Dictionary()进行处理,将单词集合转换为(word_id,word_frequency)二元组形式的列表作为分词后的语料库;再使用LdaModel()建立LDA主题模型,使用参数num_topics=5指定主题的个数,得到模型lda;然后使用lda.print_topics(-1)输出所有的主题进行查看。

上面输出的5个主题的结果是“词频率*词”的形式,并没有输出主题所包含的所有词,这种方式不能很方便地查看每个主题中所包含的内容。利用pyLDAvis库可以将LDA主题模型可视化展示,并且可以进行交互操作,更有助于用户了解各个主题。运行下面的程序,结果如图15所示。

注意:在Jupyter Notebook中获得的是一个可以交互操作的可视化图像,图15展示的只是一幅截图。

图15 LDA主题模型可视化

从图15中可以看出,这是选中了《三国演义》5个主题中第4个主题的图像,图像主要分为左边部分和右边部分,左边是5个主题在PCA的前两个主成分下的坐标位置,圆形越大,说明该主题包含的章节数目越多,当选中某个主题时,右边的关键词和频率就会发生相应地变化。

在进行主题模型可视化时,可以通过参数mds指定可视化图像左边的坐标图是降维方式,默认为主成分降维。下面的程序则是利用t-SNE算法进行降维,可获得如图16所示的可视化结果。

图16 《三国演义》5个主题(t-SNE

针对获得的LDA主题模型,需要使用lda.get_document_topics()方法获得每个章节所属的主题,该方法计算指定文本属于每个主题的百分比。下面的程序中将最大的百分比作为该章节所属的主题进行输出。程序运行后从输出的结果中可以看出,第一、二、五章为主题3;第三章为主题0;第四章为主题4。

针对主题模型的聚类结果,下面使用二维空间中的散点图进行可视化分析,可视化时仍然使用文本TF-IDF特征的t-SNE降维结果,作为每个章节的空间坐标。运行下面的程序后,聚类结果如图17所示。

图17 LDA聚类散点图

下面利用LDA主题模型将数据聚类为2个簇并进行可视化分析,程序如下,最终的可视化结果如图18所示。

图18 LDA聚类散点图(2个簇)

4、《三国演义》人物关系分析

众所周知,在《三国演义》中随着时间的变化出场了很多人物,这里可以利用一些文本挖掘方式,分析书中人物的关系等。本节将利用文本分析方法,观察书中人物的出场情况和人物之间的关系。

(1)人物重要性时序分析

这里先介绍一些关键人物,随着章节的推进,他们的出场频次随着时间的变化情况。读取“一些三国人物的名和字.csv”文件,该数据中主要包含书中不同阵营的关键人物的名、字等信息。

想要分析每个人物的出场情况,就需要计算每个章节中感兴趣的人物出场频次等信息。在下面的程序中,则是计算每个人物在每章节出现的次数,计算时将出现的名和字各作为一次出现。需要注意的是,根据分词前的文本内容进行计算,最终的计算结果将会转化为数据表格。在最终的输出数据表中,行表示对应的章节,列表示人物名称,对应的数值为人物在相应章节出现的次数。

针对获得的数据表TK_name_timedf,可以使用热力图对其进行可视化分析,分析所有人的出场整体趋势,运行下面的程序后,热力图结果如图19所示。

图19 人物出场次数热力图

从热力图中可以发现,出场次数较多的是刘备和诸葛亮两人,其中刘备前期出场较多,诸葛亮后期出场较多。

针对上面的数据,可以使用蒸汽图可视化一些关键人物的出场情况。下面的程序就是使用可交互的蒸汽图,可视化出曹操、曹丕、刘备、刘禅、孙策、孙权6个人的出场情况,程序运行后的结果如图20所示。

图20 蒸汽图可视化

需要注意的是,图20中是可交互的图像,可以通过单击选择一个人物的数据进行可视化分析,如刘备的出场情况可视化图像如图21所示。

图21 蒸汽图可视化(刘备)

(2)人物关系可视化分析

分析人物之间的关系,可以根据前面计算得到的每个人在书中的出场情况,获取人物之间的相关系数。下面的程序则是使用热力图将相关系数进行可视化,通过热力图可以很方便地分析不同人物之间的相关性,程序运行后的结果如图22所示。

图11-22 人物相关性热力图

针对人物之间的关系,也可以使用社交网络图可视化分析人物之间的关系。下面的程序根据相关系数的大小,构建人物之间的关系,并且只保留相关系数绝对值大于0.3的人物关系,从输出结果中可以发现最终只有100条边被保留。

针对获得的Tkcorlong数据表,可以使用下面的程序获得人物之间的关系网络图,如图23所示。

图23 关键人物之间的关系

在图23中,正相关性使用实线的箭头表示,负相关性使用虚线箭头表示。通过图可以更方便地分析两人之间的关系。

针对获得的关系网络图,也可以使用节点度表示每个人物在网络中的重要程度,其中度越大说明其越重要。运行下面的程序后,节点度分布条形图结果如图24所示。

24 网络图中节点度分布条形图

从图24中可以发现,甘宁、曹操、张鲁等人的节点度较高,说明他们在网络图中较为重要。


代码及数据