周末看了会python
,真是一门适合数据分析的语言,刚学不久,先拿《三国演义》练练手。统计结果在文章后面,对技术不感兴趣的可以跳过前面的部分。
统计方法
中文的语义分析是一件非常困难的事情,更别说《三国演义》这种半文言半白话的小说了。我的方法是,用python
找到可能是兵器或者姿势的一句话,然后再肉眼识别。因为兵器名和姿势名称只要出现一次就会记录下来,下次会被过滤掉,所以工作量其实并不大,一会儿就弄完了。
举例说明一下,比如我们可以通过武器方天画戟
搜索到这句话:威风凛凛,手执方天画戟,怒目而视
,其中的手执
就是拿兵器的姿势。然后查找所有手执
的语句:
['手执藜杖', '手执方天画戟', '手执白刃', '手执长竿', '手执宝剑扶车而行', '手执长枪', '手执定旗杆', '手执大斧', '手执铜刀', '手执青龙刀', '手执长枪', '手执旗幡围绕', '手执长竿', '手执长竿', '手执羽扇', '手执长枪', '手执谏章', '手执长戈', '手执长矛', '手执铁棒击吾右臂', '手执铁链', '手执大红罗销金伞盖', '手执茅草一把', '手执其手', '手执钢刀', '手执羽扇', '手执刀', '手执蒂钟', '手执麈尾', '手执黄旗招飐', '手执七星皂旙', '手执七星皂幡', '手执皂幡', '手执绣旗', '手执旗剑']
哇哦~ 一下子就找到了好多武器的名称,当然像 手执茅草一把
这种肉眼过滤掉就好了。
所以逻辑是这样的:通过一种兵器的名称=》找到拿兵器的姿势=》根据姿势找到更多的兵器=》根据兵器找到更多的姿势=》......
技术点
- 通过武器查找姿势
取出武器名称前面的6个字,一般拿武器的姿势就包括在里面了。
例如:挥关公使的青龙刀
reg = re.compile(r'(.{6}%s)' %weapon)
- 通过姿势查找武器
取出拿武器的姿势到到下一个逗号或句号,武器名称一般就包括在内了。
例如:掣了太史慈背上的短戟,
reg = re.compile('%s(.*?)[,,。]' % pos)
- 翻转数组
arr = arr[::-1]
- 根据数组中的对象值排序
arr = [{'name':方天画戟,'num':2},{'name':青釭剑,'num’:4}]
arr = sorted(arr, key=lambda x: x['num'])
统计结果
书中出现的兵器一共有63
种:
青龙偃月刀,丈八点钢矛,蛇矛丈八枪,三尖两刃刀,丈八蛇矛,方天画戟,七星皂旙,青釭宝剑,四楞铁简,倚天剑,双股剑,大砍刀,青龙刀,青釭剑,蘸金斧,七宝刀,宝雕弓,铁脊矛,丈八矛,铁链,宝刀,短戟,宝剑,大斧,铁棒,大刀,利刃,钢刀,钢斧,铁锤,铁枪,长枪,长竿,白刃,藜杖,铜刀,羽扇,蒂钟,长戈,长矛,腰刀,铜锤,双刀,钢鞭,大戟,双戟,硬弩,戒刀,蒺藜,飞锤,短刀,弩,箭,戟,钺,槊,鞭,矛,叉,弓,刀,枪,剑
按照出现的次数排序:
刀:480;箭:350;剑:327;枪:299;弓:177;戟:115;鞭:84;弩:80;矛:53;钺:29;宝剑:22;羽扇:19;宝刀:17;青龙刀:15;大刀:14;大斧:14;叉:12;长枪:11;槊:10;利刃:8;短刀:7;硬弩:6;钢刀:5;双刀:4;长竿:4;铁锤:4;宝雕弓:4;青釭剑:4;双股剑:4;丈八蛇矛:4;丈八点钢矛:4;蒺藜:3;双戟:3;大戟:3;蒂钟:3;铁枪:3;大砍刀:3;青龙偃月刀:3;飞锤:2;钢鞭:2;铜锤:2;腰刀:2;长戈:2;藜杖:2;铁棒:2;短戟:2;丈八矛:2;方天画戟:2;戒刀:1;长矛:1;铜刀:1;白刃:1;钢斧:1;铁链:1;铁脊矛:1;七宝刀:1;蘸金斧:1;倚天剑:1;四楞铁简:1;青釭宝剑:1;七星皂旙:1;三尖两刃刀:1;蛇矛丈八枪:1;
从出现次数可以看出刀,弓、箭,剑,枪,戟
是当时战争的主力兵器。
铁质兵器是从汉朝开始普及的,小说中也能反映出这一点,铁质兵器的数量要远高于铜质兵器,当然《三国演义》是明朝的书,分析《三国志》会更准确
另外有意思的是,我们耳熟能详的兵器出现次数其实并不多。比如关羽用的青龙偃月刀
只出现了3次,张飞的丈八蛇矛
也只出现了4次。不过要是算上它们别称的则会增加不少。比如青龙偃月刀+青龙刀
一共出现18次,丈八蛇矛+蛇矛丈八枪+丈八点钢矛+丈八矛
一共出现11次。关老爷的戏份还是比张飞多呀。
此外,在我的印象里,赵云的兵器是有名字的,叫亮银枪
。但实际书中并没有这个兵器,所有提到赵云的地方,都是一个字枪
。我们可能被游戏或者评书洗脑了......
再说下拿兵器的姿势,一共32
种:
手提,倒提,按定,手执,拔出,手捧,舞动,腰悬,手摇,手使,赍,射,佩,轮,仗,跨,悬,使,挥,掣,持,藏,挽,捻,用,提,挺,携,举,舞,取,拔
大部分都是常用词汇,只有赍jī
现在不用了,我也是搜索了才知道怎么念,它是携带;持
的意思:遂命使者赍宝剑先往冀州狱中杀田丰
今天就先写这么多,回头有时间再分析点别的东西。
网友评论