把畅销书扒光了看(二)
(题图照片:2017年12月摄于旧金山机场。)
在把畅销书扒光了看(一)中,我们介绍了《畅销书密码》这本书的作者和畅销书们被揭发出来的主要套路:
一、谁敢说有?斯坦福出来的一男一女Jodie和Matt。
二、有哪些套路?主题、情节、文风、人物都有套路。
今天接着聊两位作者是怎么「扒光畅销书」识别套路的。
此贴适用于对上篇发现的套路表示怀疑的知友:
以及对自然语言处理表示惊讶和好奇的知友:
「这么神奇?」3D表情生成:http://www.faceturn.com/
如果此刻你有类似表情,那咱们继续吧。
三、套路怎么识破的?
Jodie和Matt是良心魔术师,在《畅销书密码》这本书正文之后专门加了一章魔术揭秘,分享识破畅销书套路的方法。这个方法分三步走:
扒光:用自然语言处理技术提取小说的文本特征
找规律:从已知小说的所有文本特征中找出与「是否畅销书」强相关的代表特征
归堆:扫描未知小说的代表特征,判断是与畅销书还是非畅销书更相近
1. 首先是「扒光」,提取文本特征。
跟人相比,机器的特长是海量阅读和量化阅读。人看小说,进入情节,喜怒哀乐随着主人公变化,但是我们不会注意文字的那些量化特征。比如:
「的地得」的词频是不是比正常人多?
平均句子长度偏长偏短?
同一本小说中叙述和对话的篇幅比例?
主人公喜欢用什么动作?
小说相关主题的篇幅占比排序?
作者更喜欢用「非常」还是「特别」还是「忒」来表程度?
机器在数数方面比人拿手多了。如果把这些可量化的文本特征提取出来,就相当于扒掉了人眼最熟悉的一层,直接分析对比人类读小说时忽视的那些细节。
要做到这一点,就得让机器能读懂人话,这就是自然语言处理。
比如严歌苓在《芳华》中的名言:
一个始终不被人善待的人,最能识得善良,也最能珍视善良。
要读懂这句话,涉及到分词、分句、词性标注、依存句法和情感分析。
第一步是「分词」,就是把句子分成词。对读中文的人或机器来说,分词的难点在于要知道哪个字跟哪个字搭伙算一个词。比如「善」和「良」组成「善良」。上面这句话用的都是常用词,比较好分:
一个 始终 不 被 人 善待 的 人 , 最 能 识 得 善良 , 也 最 能 珍视 善良 。
但是,当有一些字脚踩两只船跟前后都眉来眼去的时候,分词就变成一件坑机的任务。比如:
沿海南方向逃跑:「沿海」还是「海南」?
结婚的和尚未结婚的:「和尚」还是「尚未」?
上面这俩还是3P,来一个5P的:
他说的确实在理:「的确」和「实在」,还是「确实」和「在理」?
有同学说还是英文简单吧:英文天然分词,词跟词之间现成空格啊!
真的吗?如果真是拿空格来分词,标点符号怎么算?是「today」还是「today,」?标点不算词,那带撇的那些货呢?「can’t」? 「Robert’s」?
所以,分词看起来简单,也需要利用词典和统计推断算法来让机器从海量阅读训练中学会消除歧义和应付例外。比如,机器可以在训练阅读中发现,「理」字很少单独出现在句尾,因此「在理」最可能是句尾的词,前面自然是「的确」。
当然,即使用机器学习,也不能保证100%准确分词。比如这句话:
两种人容易被甩:一种不知道什么叫做爱,一种不知道什么叫做爱。
哈工大模型认为:
两 种 人 容易 被 甩 : 一 种 不 知道 什么 叫做 爱 , 一 种 不 知道 什么 叫做 爱 。
斯坦福模型认为:
两 种 人 容易 被 甩 : 一 种 不 知道 什么 叫 做爱 , 一 种 不 知道 什么 叫 做爱 。
明显两校都没看懂,您说谁污谁萌?
在分词过程中,还需要教会机器识别各种人名、地名、机构名等命名实体。这样,
国务院总理李克强调研上海外高桥时提出,支持上海积极探索新机制。
就不会被分成:
国务院 总理 李克 强调 研 上 海外 高桥...
在《畅销书密码》里,作者就是用命名实体识别来扫描书中的地名,发现小说背景选择的地点与畅销与否没关系。纽约发生的故事斯德哥尔摩的故事畅销机会均等。
分词之后的分句也有歧义问题。
要教机器断句,可以简单粗暴地用几条规则:见到句号、叹号、问号就算一句。这个中文还好,英文就有麻烦了:句号这个点的玩法太多。「Dr. Smith」和「a.s.a.p.」中的点都不是句号。要消除歧义,当然可以加很多条规则,但还是很难穷举语言中的种种例外。所以,算法们越来越多的从罗列规则转向海量阅读训练和统计推断。
分完词断完句,要标注词性。作者用名词来归纳畅销主题,用形容词来分析情感,用动词来分析主人公的主观能动性。这里的坑在于:同一个词在不同句子中的词性不同。比如「希望」可以是动词,也可以是名词。跟分词分句的思路相似,词性标注算法也是通过海量阅读训练文本来熟悉同一个词在不同句子中不同位置上的最可能词性。
比如,《芳华》中的那句话被哈工大的系统标注成这样:
一个/m 始终/d 不/d 被/p 人/n 善待/v 的/u 人/n ,/wp 最/d 能/v 识/v 得/u 善良/a,/wp 也/d 最/d 能/v 珍视/v 善良/a
m、d、p、n、v、u、a、wp分别表示量词、副词、介词、名词、动词、连词、和形容词。
如果用《畅销书密码》作者使用的斯坦福模型,标注成这样:
一/CD 个/M 始终/AD 不/AD 被/LB 人/NN 善待/VV 的/DEC 人/NN,/PU 最/AD 能/VV 识得/VV 善良/VA,/PU 也/AD 最/AD 能/VV 珍视/VV 善良/NN。/PU
而一面数据采用的词性标注模型输出这样的结果:
一个/m 始终/d 不/d 被/p 人/n 善待/v 的/uj 人/n ,/x 最/d 能/v 识得/v 善良/a ,/x 也/d 最/d 能/v 珍视/v 善良/a 。/x
这里不用深究不同系统标注符号的差别。但是注意:
哈工大模型认为第二个「善良」是形容词(a),斯坦福模型认为最后一个「善良」是名词(NN),虽然二者同意第一个「善良」是形容词。
一面数据调校的jieba模型跟哈工大一样认为两个「善良」都是形容词,但是跟斯坦福一样认为「识得」是一个词。(对,「结巴」不丢人。)
通过这一句话我们没打算对比模型优劣,只是说明不同模型对同一句子的解读可能会不同,正如人类一样。
词性标注之后,就可以做依存句法解析。这就是用机器熟悉的类似主程序和子程序的结构来表达一句话各个词之间的依存关系。
上面那句话,在哈工大的系统中解析成:
依存句法解析。来源:https://www.ltp-cloud.com/demo/。
斯坦福的系统解析成这样:
(ROOT
(IP
(NP
(QP (CD 一)
(CLP (M 个)))
(CP
(IP
(VP
(ADVP (AD 始终))
(ADVP (AD 不))
(VP (LB 被)
(IP
(NP (NN 人))
(VP (VV 善待))))))
(DEC 的))
(NP (NN 人)))
(PU ,)
(VP
(VP
(ADVP (AD 最))
(VP (VV 能)
(VP (VV 识得)
(IP
(VP (VA 善良))))))
(PU ,)
(VP
(ADVP (AD 也))
(ADVP (AD 最))
(VP (VV 能)
(VP (VV 珍视)
(NP (NN 善良))))))))
(来源:Stanford Parser)
无论是哪种形式,总算是让机器能理解一句话的结构了。这样,我们就可以分析主语对应的动词,结合命名实体识别,挑出那些主语是主人公名字的句子,我们就可以统计小说的主人公使用不同动词的相对频率。比如,是「需要」多一些还是「觉得」多一些。
在把畅销书扒光了看(一)里,我们还提到了情节曲线。作者用的是情感分析。情感分析的算法可繁可简。复杂的情感分析也用到统计推理,简单的用情感词库来标记积极和消极情感。比如「爱」是积极的,「恨」是消极的。统计推理法目前在消费者评论分析、电邮分析中已经在用。《畅销书密码》作者经过试验发现对于情节曲线的提取来说,简单的情感词库算法效果还不错。
2. 提取完文本特征,下面是「找规律」,筛选出判据特征。
《畅销书密码》的研究通过自然语言处理,分析了28,000个文本特征,包括The的词频、平均句长、故事所在地等等在我们人类读者看来非常无聊的数据。
作者经过漫长的筛选,发现其中90%确实是无聊的,它们对于一本书是否畅销没有任何预测价值,比如故事所在地和故事发生年份。最后中选的特征只有2799个,这些判据特征跟一本书是否畅销相关,包括前面介绍的那些畅销套路,比如亲密关系主题、主人公的需要和想要、口语化缩写的词频等。
发现这些判据特征的思路很直接。
作者依据纽约时报畅销榜把所有书分成非黑即白的两大类:上榜的和落榜的。如果某一个特征在上榜书和落榜书中有明显不同,比如上榜书用「really」明显多而用「very」明显少,那么「really」和「very」的词频就成为判据特征之二。
3. 判据特征有了,最后是「归堆」,根据未知书的判据特征值猜它是否畅销。
根据已有知识对未知进行归类,这是机器学习的基本问题之一。这个技术的应用不光用在诊断一本书是否畅销,还包括其它领域比如根据症状诊断患者是否有癌症。机器归类是要解决这个问题:
已知上榜书和落榜书的判据特征值在特征空间中的分布,给出未知书的判据特征值,判断它应该属于上榜书还是落榜书。
《畅销书密码》的作者采用了三种归类算法:K最近邻(KNN)、支持向量机(SVM)和最近收缩形心(NSC)。这些高大上的缩写比较烧脑,咱们还是打个比方抄个近道吧。
比如您搬到了一个别墅区,周围邻居的小洋楼们有一期的,有二期的,分散在小区里。您想知道:过节您应该参加一期邻居的活动还是二期的?您有三个思路。
K最近邻(K Nearest Neighbors)。来源:维基百科。
第一个思路是「数邻居」。您定个要数的个数K,比如K=3,然后环视四周,找三个最近的邻居。是一期的多还是二期的多?哪期多您就跟哪期邻居玩。这就是K最近邻(KNN)算法。
支持向量机(Support Vector Machine)方法。来源:维基百科。
第二个思路是「划边界」。您想办法在一期洋房和二期洋房之间沿空隙最大的方向在空隙正中划一条边界线,如果您家落在边界线一期一侧就算一期,否则就算二期。这就是支持向量机的理念。
最近收缩形心(Nearest Shrunken Centroid)。来源:researchgate.net
第三个思路是「看会所」。假设一期二期在各自楼群最方便的地方各自有一个会所。您看看您家离哪期的会所近,您就算哪期。这就是最近收缩形心(NSC)。
在《畅销书密码》研究中,作者三种方法都使用。其中,数邻居的KNN方法在K=15时效果最好,猜中率能达到90%,划边界的支持向量机法(SVM)只能达到70%猜中率,而看会所的最近收缩形心法(NSC)达到79%。三种方法的综合平均猜中率是80%。其中,NSC的额外优势是能直接总结出上榜书和落榜书的特征值差异,因为「会所」的位置清晰。
猜中率的具体计算是这样的:
随机选择10%的上榜书和落榜书放在一旁作为待测未知书
用剩下的90%小说训练机器,提取文本特征,归纳出判据特征
用判据特征去判断未知书是否上榜,记录猜测的准确性
另外,还可以随机选择仅仅一本书放在一旁待测,用剩下的所有书对机器进行训练和建模,然后猜测未知书是否上榜,记录是否猜中;之后换一本书放在一旁,用剩下的所有书再次建模再次测试,以此类推,计算总体猜中率。
所以,识破畅销书套路,离不开自然语言处理和机器学习的套路。包括:
怎么通过分词、分句、命名实体识别、词性标注、句法依存解析和情感分析来准备素材,提取文本特征
怎么通过相关性分析从文本特征中筛选出与上榜落榜最相关的判据特征
怎么通过三种机器归类方法,根据未知书的判据特征值,猜测未知书上榜还是落榜
如果想了解同样套路在消费品市场调研方面的应用,可以参考:一面数据 | 让决策更智能。
参考资料: