
这是一个no zuo no die的经历。。。我,一个菜鸟编程初学者,经过各种bug终于得出了结论。
一切都要从两天前看的一篇文章说起。[告别金庸,我们整理了100件往事【浪潮工作室】
64、金庸对自己小说中的女性角色非常博爱,并且喜好飘忽不定。2004年,金庸在四川参加论坛时说,最喜欢的女性角色是《神雕侠侣》里的郭襄;2007年在北大演讲时说,最喜欢的是《雪山飞狐》的程灵素;但金庸在《倚天屠龙记》后记中说,自己心中最爱小昭。
然后昨晚上自学python课程的时候刚好学到jieba库(中文分词)的使用,课程案例是《三国演义》的人物出场次数统计以及英文小说《哈姆雷特》的词频统计。
一边看mooc的我突然灵光一闪,这不是就是传说中人物出场次数统计吗!!!不走寻常路的我怎么可以分析什么三国演义!我要分析金庸小说!全集!发现金庸的秘密!
我妈的爱豆王力宏!他不是有句歌词!脑袋都是你!心里都是你!

最喜欢的当然是出现最多的角色!!!真是太厉害了我!

于是乎。。。。。
苦逼的编程开始了。这里省去10000字。

对有可能看到这篇文章的编程大佬,我先贴上自己的代码为敬。
#JinYong.py
import os
import jieba
num=15
bookpath=[]
def name(path):
namelist=open(path,"r",encoding="utf-8").read()
global names
names=namelist.split()
print(names[0:10])
for name in names:
jieba.add_word(name)
def getfilepath(path):
a=os.listdir(path)
global bookpath
for i in a:
bookpath.append(os.path.join(path,i))
name("D:\\name.txt")
getfilepath("D:\\books")
for i in bookpath:
txt=open(i,"r",encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {}
p = {}
for word in words:
if word not in names:
continue
else:
counts[word] = counts.get(word,0)+1
p[word] =p.get(word,0)+ counts[word]/len(txt)
print(i+"\n======================分词完成======================")
items = list(p.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(100):
word,p=items[i]
print("{0:<10}{1:>.5%}".format(word,p))
不是编程大佬,看不懂?你只需要做出这种表情,这种姿势:

简而言之,利用python语言的第三方中文分词库jieba,我将金庸全部的15部小说文本逐一分解为一个个词语,并利用计算机强大的计算速度和能力,对每个词语进行词频统计。(还好金庸先生只写了15部武侠小说就封笔了,要不然还不会爬虫的我可能会猝死在下载小说的过程中)
由于金庸先生多年笔耕不辍,常年在《明报》上连载小说,码了好多字。导致文本数据过大,每次运行程序都要好几分钟。
后来,我惊喜的发现网上有网友总结的金庸人名全集(感谢这个网友!不然我可能写代码写到通宵。。。),并且将这个文本也同时进行了分词,添加到我的jieba词库中,并建立了金庸人物姓名列表。
顺便科普一波,由于金庸先生的小说广受读者好评,世界各地涌现出许多研究金庸小说的人,并将研究金庸小说的学问称为“金学”。(ps:在我国,最著名的小说研究领域当属红楼梦的“红学”了)但金庸本人对“金学”并不感冒,觉得自己的小说没什么好研究的。
机智的我,利用姓名库对词语进行了筛选,如果词语不在金庸小说姓名列表中,就直接跳过这个词语,不对它进行出现次数的统计。由此一来,程序只对金庸小说中出现的人名进行统计,此举大大提高了程序运行的速度~~撒花!!

罗里吧嗦了那么多,所以金庸到底最喜欢哪个女主角???以下是金庸笔下出场频率最多的前100名(因为每部小说长短不一,为了科学起见,我将频率定义为【出场次数/小说全篇字数】),由上至下分别是第1名至100名。



结果不言而喻,答案是金老先生最喜欢的女性角色是双儿。
具体苦逼编程过程且听下回分解~
现在是凌晨2:22
乏了乏了,碎觉去。
(本篇文章其实有很多不足的地方,比如jieba库只能进行句子切分,而不能根据语义分析上下文,小说中很多代词例如“她、他、他们”都无法进行精确的人物定位和出场次数统计,所以以上结果仅供参考。ps韦小宝的出场频率为啥这么高?我怀疑程序出了一些我无法发现的bug= =如果有大佬发现欢迎指正。)
最后,写这篇文章主要是想以不一样的形式向金庸先生表示敬意。希望大家都能够享受金庸的小说~~~。
网友评论