前言
看到用机器学习方法分析红楼梦的文章不少,也有好几种方法,大观是因为纯文字的分析成本低吧,比较适合初学者练手,先转载一两篇文章过来学习。所谓机器学习也是一些数学统计的方法,通过习惯用词来做判断, 也并不是很难。这里判定的维度越多越精准,下面判定仅供参考,仅供娱乐学习!
判定整体思路
主要从以下几个方面可以进行粗略进行判定:
1.写作习惯
每个人写作都有一些与种不同的小习惯,这些小习惯并不会轻易就会发生改变;万分之一的例外情况不考虑!
2.词频统计
就像每次领导人开会一样,媒体或政客们都会去统计领导人讲话中出现的高频词汇,来判断领导人政策的下一步走向!
用开源的分词工具把全书分词,然后统计词频。把出现频次超过100次的词语找出来,人工去掉一些可能因为文章内容造成前后出现不一致的人名、地名;
3.分别统计章节中的词频
然后每一章按照下列表中的词频表,看这一章中出现这些词语的频次;
4.进行推断
前80回、后40回各选15回作为机器学习的数据,让机器学习这些章节的用词特点,然后推算其他章节的用词特点是属于前80回呢、还是后40回;
5.得出结论
如果机器根据这些用词特征推算的是否属于后40回的结果跟实际的结果吻合,那么就说明后40回的写作风格跟前80回有很大不同,很可能是两个人写的;
下面就对上面的判断依据进行一一实现,所谓编程其实就是一个自我假设,自我实现论证,改进的过程!
生成全书的词汇表
截词说明
这只是截取了其中一段的词频表。
像宝二爷、黛玉笑这种涉及人物的词语,可能前面戏份多、后面戏份少,所以就不选它们作为用词习惯的特征,而像忽然、故、只要、可不是这种承接性质的碎词,就不太容易会受情节的影响,所以适合选出来作为用词习惯的特征。
处理
最终,我按照出现从多到少排序,选择了278个词作为机器学习的用词习惯。
接下来对整本书120回的词频进行一个有效统计
全书词频统计
接下来我把每一回出现这278个词的频次统计出来,得到我们给机器学习的样本。这个样本的样子大概是这样的:
通常我们在进行复杂的事情前,喜欢先简化问题,或者给自己一些直观的图表,以便了解问题。机器学习也是一样的。
我尝试着在图上把前80回和后40回习惯用词出现的频次画出来。以第一回为例,x1坐标代表「道」出现多少次,x2坐标代表「说」出现多少次,x3坐标代表「也」出现多少次……x280坐标代表「则」出现多少次。
这个是120个章节的用词习惯从278纬降到3维以后的图,红色+的点是前80回,蓝色o的点是后40回。
结论
从这个图可以直观地看到,确实在用词习惯上有明显的区别。就算我们没有机器学习工具的帮忙,也可以大胆猜测后40回是出自于另外一个人了。
机器学习判定
下面我们用机器学习来看精确一点的判断。
通过课程我大致了解了SVM的原理和简化版问题的算法实现,这里用python的scikit库来帮助我来完成这个预测。
算法的步骤很简单,前80回、后40回各选15个来喂给机器学习它们的特点,然后把剩下的章节输入给机器,问它们属于前80还是后40。
结论
看out[44]的结果,代表了机器预测这120回的用词习惯到底属不属于后40回(0为不属于,1为属于)。
机器在学习以后告诉我,如果我把随便一章的用词习惯告诉它、但不告诉它到底是前80回还是后40回,那么机器有95%的把握能猜出它是不是后40回。
至此,我们可以很有信心地判断它们的写作风格不同。
情节不同会造成用词习惯多大的差别?
好吧,那我再来做一个旁证。我把另外一部四大名著「三国演义」拿来分析,看看上部跟下部的用词习惯会不会有比较明显的差别。
结论
这个是三国演义的用词习惯缩到三维以后的图,红色+代表前60部的用词习惯,蓝色o代表后60部的用词习惯。
你可能会说,虽然中间交叉的地方比较多,但是还是可以看出来是有区分的。
可如果你比对一下跟红楼梦的图,你就会发现红楼梦的差别会明显得多。
大结论
最后,用机器学习的方式来说,如果我把三国演义随便一章的用词习惯告诉它、但不告诉它到底是前60回还是后60回,那么机器有7成的把握猜对,这个准确度已经远远低于红楼梦的95%的预测水平。
所以,我们用「三国演义」这个旁证来分析,即便是因为情节需要导致的用词习惯差别也不应该这么大。
所以,我们就更有信心说曹老先生没有写后40回了。