Chapter 10
第10章Python案例1:中文小说分析
章节主张
第10章Python案例1:中文小说分析这一章真正要建立的,不是孤立知识点,而是围绕“案例章节把工具串成完整工作流、SciPy 把高等数学能力接进代码、环境与工具链先于语法细节”形成一套能反复练习、能迁移到真实任务里的 Python 学习路径。
中文释读
读 第10章Python案例1:中文小说分析 时,不要只把它当作语法或模块说明书。更有价值的读法,是问自己:这一章解决了我在编程、科学计算或数据分析流程中的哪个瓶颈?
这本书的强项在于把工具、基础语法、科学计算库和案例工作流连成一条线。章节页因此会把原书内容翻译成“知识点 -> 操作动作 -> 易错边界 -> 迁移练习”的学习结构。
本章知识路线
关键论据
- 一般来说,由于原始数据的格式并不一定符合数据分析的需求,通常需要对其进行一定的处理。
- 这种把原始数据处理成需要的格式的过程通常叫作 数据预处理 (Data Preprocessing)。
- 数据预处理有很多方法,根据数据类型和分析的需要,处理方法也各不相同。
- 1.jieba模块进行中文分词 中文文本不像西欧语言,它没有明显的词的划分。
- 如果要应用一些基于词的中文文本分析工具,必须要对中文进行分词处理: 逻辑上,需要对其进行分词,以达到这样的效果: 分词本身涉及很多其他的非编程知识,这里不做过多介绍。
行动清单
- 先用最小代码样例跑通本章核心知识点。
- 把本章知识点接到一个真实小任务上,而不只停留在示例。
- 记录本章最容易报错的边界条件和调试方式。
- 复盘:这一章内容如何进入自己的长期 Python 学习系统。
本章图版学习路径
图版按知识点分组,适合拿来做复现、迁移和复盘练习,不只是“看一眼效果”。
源章节深读
10.1 数据预处理
这节解决什么问题:这节要解决的不是背下“10.1 数据预处理”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。
怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“10.1 数据预处理”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。
常见错误:常见误区是只记住 API 或代码片段,却没理解 10.1 数据预处理 背后的对象模型、输入输出和适用边界。
数据分析需要对数据进行处理。一般来说,由于原始数据的格式并不一定符合数据分析的需求,通常需要对其进行一定的处理。这种把原始数据处理成需要的格式的过程通常叫作 数据预处理 (Data Preprocessing)。数据预处理有很多方法,根据数据类型和分析的需要,处理方法也各不相同。 1.jieba模块进行中文分词 中文文本不像西欧语言,它没有明显的词的划分。如果要应用一些基于词的中文文本分析工具,必须要对中文进行分词处理: 逻辑上,需要对其进行分词,以达到这样的效果: 分词本身涉及很多其他的非编程知识,这里不做过多介绍。一个比较好用的中文分词第三方模块叫jieba(中文“结巴”的拼音),其网址为 可以使用pip命令安装: 安装完毕后,先导入这个模块: 使用jieba.cut()函数进行分词,该函数返回一个生成器: 将这个生成器变成列表: 2.真实数据的预处理 中文小说分析需要根据小说的内容和特点做一些与数据相关的处理,如小说的人物、情节、设定等。为了方便后续处理,可以提前收集好这些相关信息。 考虑到金庸先生写了很多部武侠小说,不同小说有不同的主角,可以采用这样的格式存储人物,每两行表示一部小说:其中第一行是小说名;第二行是该小说中出场人物的姓名,用空格隔开,命名为“character.txt”,其格式为: 假定该文件的编码格式是UTF-8(Windows系统保存的中文文件通常为GBK或GB18030格式,UNIX、Mac通常为UTF-8),可以用open()函数读入这个文件,并按照行进行存储: 文件的奇数行是小说名,偶数行是人物的名。在Python中,索引是从0开始的,因此奇数行从索引0开始,偶数行从索引1开始。实际项目通常会给变量取一些有实际意义的名称,比简单使用a、b的代码可读性更强。将小说名
10.2 数据统计
这节解决什么问题:这节要解决的不是背下“10.2 数据统计”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。
怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“10.2 数据统计”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。
常见错误:常见误区是只记住 API 或代码片段,却没理解 10.2 数据统计 背后的对象模型、输入输出和适用边界。
对于预处理得到的数据,一般会分析数据的统计情况。对于文本数据,一个比较有用的统计数据是词频。所谓 词频 (Word Frequency),指的是单词在文本中出现的次数。 1.词频的统计 具体到小说分析问题,词频统计可以对应到小说中的各个角色的出场次数。显然,对于角色来说,主要人物的出场次数多,词频也较高,因此,通过词频统计,可以大致看出小说中谁是主角。假定所有的小说文件的名称都是“小说名.txt”,编码都是UTF-8。仍然以《天龙八部》为例,首先用open()函数读取小说的内容: 利用人物字典character_info得到《天龙八部》中所有人物的列表chars,并用字符串的.count()方法对chars中单个人物c在content出现的次数进行计数。为了方便对词频进行排序,可以将结果变成NumPy数组: 利用数组的.argsort()方法对单词出现的次数counts进行排序,得到相应的下标: 默认情况下,数组的排序是按照从小到大进行的。因此,可以使用idx[-5:]得到《天龙八部》中出现次数最多的5个角色的索引i,并利用索引i得到人名及其出现次数: 2.词频的可视化 还可以对词频进行可视化,得到更直观的结果。在绘制词频图像之前,需要解决在Matplotlib中显示汉字的问题。默认情况下,Matplotlib是不能直接显示汉字的。例如,直接添加汉字标题会得到如图10-1所示的结果: 图10-1 不能正常显示的中文标题 标题中应该显示“中文”两个字的地方被两个方块替代了,原因是Matplotlib找不到合适的中文字体去显示中文。解决这个问题需要找到一些支持中文的字体。 ●Windows 7及以上的系统中,字体库的位置为C:/Windows/Fonts,如宋体C:/Windows/Fonts/si
10.3 数据建模
这节解决什么问题:这节要解决的不是背下“10.3 数据建模”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。
怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“10.3 数据建模”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。
常见错误:常见误区是只记住 API 或代码片段,却没理解 10.3 数据建模 背后的对象模型、输入输出和适用边界。
数据建模是一个用数学模型对原始数据进行抽象组织的过程。具体到文本分析,为了使用数学模型进行建模,可以将单词转换成某种数学表示,方便后续用程序进行处理。在数据分析中,一种常用的数学表示方法是用一个向量去表示一个单词,这个用来表示单词的向量叫作 词向量 (Word Vector)。 词向量有很多种实现方法,比如最常用的 独热编码 (One-Hot Encoding)方法,将一个词转换为一个很长的向量。这个向量的大小与词库中单词总数的大小相同,每个维度对应一个单词。表示单词时,该向量在该单词对应的维度的值为1,其余维度的值为0。举个例子,在独热编码下: ●“武功”可以表示为[0,0,0,1,0,0,0,0,0,0,0,…]。 ●“江湖”可以表示为[0,0,0,0,0,0,1,0,0,0,0,…]。 这种表示方法简单明了,但对于小说文本来说,词库中对应的单词总数太大,因此在独热编码下,词对应的向量会很长,处理起来很不方便。更为重要的是,从独热编码的表示中,也看不出不同单词之间的关系。 基于这种因素,可以使用低维的实数向量代替独热编码表示单词。一个低维实数向量的例子可以是[0.231,-2.324,1.2,3.4,-5.6]。每个单词对应的词向量维度相同,常用的维度是50或100。在这种表示形式下,不同单词之间的关系可以利用向量之间的一些相似关系得到。与独热编码不同,低维实数向量并不能直接获得,而需要通过一些现成的算法对文本进行分析计算得到。 一个常用的计算低维词向量的方法叫作Word2Vec。与分词类似,本书不介绍Word2Vec的具体实现过程,而是使用一个叫gensim的第三方Python模块实现这个功能。gensim包的源代码地址为 可以使用pip安装gensim: 安装好之后,导入这个模块: Wo
10.4 效果分析
这节解决什么问题:这节要解决的不是背下“10.4 效果分析”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。
怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“10.4 效果分析”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。
常见错误:常见误区是只记住 API 或代码片段,却没理解 10.4 效果分析 背后的对象模型、输入输出和适用边界。
数据建模完成后,通常需要对模型进行一定的效果分析来验证模型的合理性。同时,利用模型可以从数据中提取信息,并得到一些有意义的结论。 对于中文文本分析中得到的Word2Vec词向量模型,可以做一些简单的分析,得到一些有趣的结果。注意,由于Word2Vec模型的构建存在一定的随机性,实际的效果可能与下面的结果略有出入。 1.相似性分析 在现实生活中,不同的事物之间存在相似关系,可以通过一些手段或标准去衡量这些相似关系。在文本分析中, 余弦相似度 (Cosine Similarity)是一种常用的相似性度量,它衡量的是两个向量在空间中夹角的余弦值大小,对于向量 v 1 和 v 2 ,其余弦相似度的计算公式为 余弦值越大,两个向量的夹角越小,两个向量也越相似。相似的词向量通常说明对应的词在某些方面上有一定的相似性。在中文小说分析的案例中,产出的模型对象model中包含所有词的词向量。因此,通过这些词向量之间的余弦相似度,可以判断两个词是否具有相似性。 事实上,model对象的.wv属性提供了.most_similar()方法,可以直接得到与某些单词最相似的其他单词。该方法通过计算给定单个词或多个词的词向量与词库中其他词向量的余弦相似度,来得到与给定单词或词组相似度最大的前几个词。.most_similar()方法支持在参数positive中传入一个列表,调用后,该方法计算所有其他单词与参数列表positive中的词的相似度,并返回相似度最大的前10相似词以及对应的相似度。相似度越大,说明两个词的词向量越接近。例如,如果这样调用.most_similar()方法: 该方法会返回与男性角色“乔(萧)峰”相似的前10个词及其对应的相似度组成的列表,其形式为: 利用for循环遍历这个结果,得到: 可以看到,与男性
10.5 本章学习笔记
这节解决什么问题:这节要解决的不是背下“10.5 本章学习笔记”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。
怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“10.5 本章学习笔记”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。
常见错误:常见误区是只记住 API 或代码片段,却没理解 10.5 本章学习笔记 背后的对象模型、输入输出和适用边界。
本章通过使用Python分析中文小说这个案例,对数据分析的一些基本流程进行了介绍,可以帮助读者了解如何使用Python进行一些简单的数据分析处理。对于更高层次的案例和项目,则需要从实际问题出发,掌握相关的算法和知识,才能取得更好的分析结果。 学完本章,读者应该能够了解和掌握如何进行数据分析的几个基本步骤。 1.本章新术语 本章涉及的新术语见表10-1。 表10-1 本章涉及的新术语 (续) 2.本章新函数 本章不涉及新函数。 3.本章Python 2与Python 3的区别 本章不涉及Python 2与Python 3的区别。
辨析题:如果你只会照抄 第10章Python案例1:中文小说分析 里的例子,却无法换一个输入自己写出来,真正缺的是什么?
多数时候缺的不是记忆,而是对象模型、输入输出边界和操作顺序的理解。把知识点换到新输入上依然能运行,才算真的进入了自己的系统。