700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python词频统计之红楼梦_用 Python 分析《红楼梦》 后四十回是曹雪芹所写

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

时间:2019-09-20 03:31:06

相关推荐

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

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

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 的后缀字典树:

/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

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

制作字典

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。