用 Python 分析《红楼梦》,后四十回是曹雪芹所写

2020年11月04日 16:03:11    作者:九九文章网

处理后的效果是这个样子:

#甄士隐梦幻识通灵#贾雨村风尘怀闺秀#此开卷第一回也#作者自云#因曾历过一番梦幻之后#故将真事隐去#而借#通灵#之说#撰此石头记一书也#故曰#甄士隐#云云#但书中所记何事何人#自又云#今风尘碌碌一事无成#忽念及当日所有之女子#一一细考较去#觉其行止见识皆出于我之上#何我堂堂须眉诚不若彼裙钗哉#实愧则有馀#悔又无益之大无可如何之日也……

构建全文索引

得到处理后的文本之后,我需要建立一个全文索引。这样是为了快速地查找原文内容,加速后面的计算。我使用了后缀树这个结构作为索引。这个数据结构比较复杂,所以我们可以先谈谈更简单的字典树。

3.1 字典树

首先,我们看看字典树的样子:

Free Image on Pixabay - Landscape, Tree, Flowers, Book

啊错了,这个才是字典树……

Trie - Wikipedia

上图中,每个圆圈是一个结点,代表着一个字符串(就是圆圈内的内容);结点之间的连线是边,代表着一个字母。最上面的结点,也就是空着的那个结点,是根结点。如果我们从根结点不断向下走到某个结点,那么把经过的每一条边上的字母拼起来,就是这个结点代表的字符串了。这就是字典树的特点。

那么字典树是干什么用的呢?举个例子来说,假如我们想在这棵字典树里查找 “to” 这个单词,就可以先从根结点下面的边里找到第一个字母,也就是 “t” 这条边,从而找到 “t” 这个结点。然后我们再从 “t” 结点下面的边里找到第二个字母,也就是 “o” 这条边,就找到 “to” 这个结点了。假如 “to” 这个结点里储存了 “to” 的中文解释,那么我们只通过两次操作就找到了 to 的中文意思。这样比一个词一个词地找的方法快多了。这很像我们查字典的时候,先看第一个字母在字典中的位置,然后再看第二个字母……最终找到单词,因此被称为字典树。

3.2 后缀树

说完字典树,我们再说说后缀树的前身:后缀字典树。后缀字典树其实就是字典树,只不过里面的内容不是单词,而是一个字符串的所有后缀:从第一个字母到最后一个字母的内容,从第二个字母到最后一个字母的内容……以此类推。比如说,"banana" 的所有后缀就是 banana, anana, nana, ana, na 和 a。把这些内容都加到字典树里,就构成了后缀字典树。下面左图就是 banana 的后缀字典树:

https://www.slideshare.net/farseerfc/ukks-algorithm-of-suffix-tree

而后缀树和后缀字典树的区别就是,在后缀树中,我们要把下面只有一条边的结点去掉,然后把这个结点连接的两条边压缩成一条。比如,左图后缀字典树中的 b-a-n-a-n-a,在右图的后缀树中被压缩成了 banana 这一条边。此外,后缀树还使用了一个技巧,就是不储存边的内容,而是储存这些内容在原文中的位置。因为后缀树中的很多内容都是重复的,所以这个小技巧可以大大减少索引的大小(用专业的语言描述,它的空间复杂度是 O(n))。

后缀树又有什么用呢?它最大的用途就是检索字符串中间的内容。比如,假如我想查找 an 在 banana 中哪里出现过,只需要查找代表 an 的结点,就找到了所有以 an 开头的结点: anana 和 ana。由于每次出现 an 的地方都一定会产生一个以 an 开头的后缀,而所有的后缀都在后缀树中,所以这样一定能够找到所有 an 出现的位置。后缀树的强大之处在于,即使我们把 banana 换成一篇很长很长的文章,我们也能很快地进行这样的检索。

最后,我使用了 Ukkonen 算法快速地创建了整篇《红楼梦》的后缀树(用专业的语言描述 Ukkonen 算法的速度:它的时间复杂度是 O(n))。Ukkonen 算法比较复杂,所以这里我不会讲解 Ukkonen 算法,感兴趣的同学可以看看这些资料:

Ukkonen's suffix tree algorithm in plain English

后缀树的构造方法-Ukkonen详解 - 懒人小何的日志 - 网易博客

Ukkonen's Suffix Tree Construction - Part 6 - GeeksforGeeks

有了全文索引以后,后面的程序就好做了。

制作字典

python词频统计之红楼梦_用 Python 分析《红楼梦》,后四十回是曹雪芹所写相关推荐

  1. python红楼梦作者_用 Python 分析《红楼梦》,后四十回是曹雪芹所写吗?(开源)...

    原标题:用 Python 分析<红楼梦>,后四十回是曹雪芹所写吗?(开源)

  2. 《红楼梦》后四十回真假辨析——数据挖掘之关联规则挖掘

    前言 很多人都听说过<红楼梦>的后四十回并非曹雪芹所著.本文就是用关联规则挖掘的方法,验证红楼梦后四十回与前八十回之间的用词差异. 基本概念定义 关联:自然界中某种事物发生时,其他事物也会 ...

  3. [机器学习] --- 红楼梦后四十回到底是谁写的?机器学习分析法

    流传到今天的<红楼梦>共有120回,很多人认为是曹雪芹写了前八十回,后四十回是高鹗续写.后来随着新材料的发现,红学界经过慎重考察,认为后四十回并不是高鹗所写,高鹗和程伟元只是整理出版了&l ...

  4. python文本词频统计是字典吗_【python】文章、文本内容做词频统计(使用jieba分词,添加自定义字典)...

    使用python可以轻松统计词频,做文章的词频统计也是轻而易举的事情. 1.添加自定义字典(如:超级赛亚人.奥里给等) 2.jieba分词 PS:直接将文章丢进 tf.txt 文件里,将自定义字典丢进 ...

  5. python编写统计选票的程序_使用python编写微信公众号发稿统计程序

    近日为学校公众号统计发稿情况,需统计本年度各部门分别所发稿件标题.时间.作者等. 首先考虑查看公众号后台有无统计功能,看到的界面如下: 每页只显示7天的消息,且没有部门作者信息.再看另一界面: 只统计 ...

  6. python红楼梦_用Python读红楼

    用Python读红楼 最近受到这篇文章用Python读金庸武侠的启发.作为古典文(zhuang)学(bi)青年,一定要用Python来试试我读了20年的<红楼梦>. 首先从网上找到了红楼梦 ...

  7. python词频统计(word ——> excel,含去重)

    word资料处理 -------> 存入excel 精简地从word文档读取资料,分析后传入excel文档. 不是txt!因为我的电脑是mac,针对txt的乱码问题解决不了. 主要操作的思维导图 ...

  8. Python词频统计——《红楼梦》人物出场次数统计

    代码实现 import jieba as j names = ['贾母', '贾珍', '贾蓉', '贾赦', '贾政', '袭人', '王熙凤', '紫鹃', '翠缕', '香菱','豆官', '薛 ...

  9. python词频统计西游记_实例10-文本词频统计.pdf

    Python语言程序设计 实例10: 文本词频统计 嵩 天 北京理工大学 "文本词频统计"问题分析 CC BY-NC-SA 4.0 嵩天 问题分析 文本词频统计 - 需求 :一篇文 ...

最新文章

  1. 联发科有没有高端处理器_联发科陷入“危机”,高端处理器无人使用,只能依靠OPPO?...
  2. kmean之matlab
  3. 关于 Redis 的一些新特性、使用建议和最佳实践
  4. Mac下好用的取色器 Sip
  5. jquery中获取下拉框的文本值
  6. mysql57数据库命令_MySQL 5.7 mysql command line client 使用命令详解
  7. 漫话:如何给女朋友解释String对象是不可变的?
  8. pod install速度慢解决方案
  9. 漫画算法:5 分钟搞明白红黑树到底是什么?
  10. Java学习之道:jdk环境变量配置方法
  11. 微信公众号 开发详解04【编辑器、图片收集、动图Gif、截图软件、去水印】
  12. 驾校考试科目二完整流程
  13. 〖Python 数据库开发实战 - Python与MySQL交互篇⑫〗- 项目实战- 实现新闻管理模块
  14. 电话号码字母组合java代码回溯法力扣
  15. 高通ims架构android,深度揭密高通4/5G移动基带消息系统和状态机
  16. 高性能浏览器网络(High Performance Browser Networking) 第四章
  17. matlab遗传算法配送路径,基于遗传算法的生鲜配送的路径优化问题
  18. nginx设置禁止访问某个页面及只允许域名访问或某个ip禁止访问
  19. EMS是中国邮政提供的一种快递服务。
  20. 《2018年中国新零售“50强榜”》

热门文章

  1. 【转】中国地理的几个概念
  2. 如何在bat脚本中列出指定目录下的所有文件信息
  3. JS标准内置对象 数组 的 34 个方法
  4. 华中科技大学计算机学院刘明,关于拟确定刘明圆等26位同志为发展对象的公示...
  5. 04-面向对象之:封装,多态
  6. Appium 点击操作梳理
  7. JVM-G1 性能调优思路与实战
  8. 计算机职称照图片,职称计算机xp系统知识:插入图片、艺术字、图示
  9. c语言define作用范围,#define的作用(C语言)
  10. 燎原老师python_Python之火,可以燎原