Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

JoeCao/PythonHLM

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

3 Commits

Repository files navigation

用Python读红楼

最近受到这篇文章用Python读金庸武侠的启发。作为古典文(zhuang)学(bi)青年,一定要用Python来试试我读了20年的《红楼梦》。

首先从网上找到了红楼梦.txt(不清楚版本,可能是程甲版)和对应的人物表。

把人名加入词库,然后用结巴分词切分整个文章(我没有区分前八十回和后四十回),加入gensim的训练中

def tranning():
 with open('hlm.txt') as f:
 data = [line.strip()
 for line in f.readlines()
 if line.strip()]
 sentences = []
 for line in data:
 words = list(jieba.cut(line))
 sentences.append(words)
 model = gensim.models.Word2Vec(sentences,
 size=100,
 window=5,
 min_count=5,
 workers=4)
 return model

训练生成一个以词向量表示词的模型,下面就用代码来找找和宝钗相似的人物吧。

 for k, s in model.most_similar(positive=["宝钗"]):
 print('{}:{}'.format(k, s))

探春:0.9595787525177002 紫鹃:0.9429049491882324 黛玉:0.9325058460235596 林黛玉:0.9230709075927734 李纨:0.9200501441955566 湘云:0.9067497253417969 袭人:0.9052997827529907 薛姨妈:0.9024999737739563 贾琏:0.899409294128418 宝玉:0.8973875045776367

电脑认为探春和宝钗的相似度最高,回想起第五十六回《敏探春兴利除宿弊 贤宝钗小惠全大体》,都是治家的好手,算是有点道理。 但是这个第二相似的是紫鹃,为什么不是袭人?看来还是没读懂? 第三名是黛玉,这个不奇怪,所谓"钗黛一体",红学家论述很多。(这里说明一下,因为目前还没法把黛玉和林黛玉这两个名字合为一个人,可能结果有些偏差)

下面用相似关系的来试试

find_relationship(model, '黛玉', '紫鹃', '宝玉')
给定"黛玉"与"紫鹃","宝玉"和"平儿"有类似的关系

我本意是晴雯或者袭人吧,不过这里平儿乱入,是不是说明了宝玉的一些小心思,呵呵,耐人寻味。

下面用K-Means算法,来聚类试试

类别1:
贾敬, 贾珠, 贾宝玉, 贾琮, 贾菌, 贾芹, 贾菖, 贾菱, 巧姐儿, 王子腾, 
王仁, 王熙凤, 薛宝钗, 林妹妹, 贾蓉之妻, 甄宝玉, 绮霰, 檀云, 茜雪, 春燕, 
坠儿, 四儿, 佳蕙, 待书, 入画, 彩屏, 翠墨, 莲花儿, 珍珠, 玻璃, 
翡翠, 小红, 金钏, 玉钏, 彩霞, 素云, 翠缕, 宝珠, 小螺, 傻大姐, 
焦大, 李贵, 锄药, 墨雨, 来旺, 隆儿, 昭儿, 喜儿, 王信, 龄官, 
蕊官, 藕官, 宝官, 文官, 葵官, 空空道人, 甄士隐, 小童, 神瑛侍者, 警幻仙子, 
贾雨村, 封肃, 冷子兴, 林如海, 李嬷嬷, 门子, 冯渊, 拐子, 刘氏, 板儿, 
青儿, 周瑞, 智能, 詹光, 吴新登, 秦业, 金氏, 戴权, 张材家的, 水溶, 
净虚, 赵嬷嬷, 程日兴, 花自芳, 多浑虫, 卜世仁, 倪二, 马道婆, 周姨娘, 蒋玉菡, 
云儿, 张道士, 傅试, 宋嬷嬷, 鲍二家的, 金文翔, 柳湘莲, 赖尚荣, 邢岫烟, 李婶娘, 
李纹, 李绮, 胡君荣, 乌进孝, 女先儿, 夏婆子, 柳家的, 佩凤, 尤三姐, 尤老娘, 
张华, 俞禄, 秋桐, 喜鸾, 王善保家的, 邢德全, 孙绍祖, 王一贴, 
类别2:
黛玉, 宝钗, 贾政, 贾琏, 贾母, 宝玉, 王夫人, 凤姐, 薛姨妈, 邢夫人, 
尤氏, 李纨, 刘姥姥, 袭人, 晴雯, 麝月, 紫鹃, 鸳鸯, 平儿, 
类别3:
贾赦, 贾珍, 贾环, 贾瑞, 贾蓉, 贾兰, 贾蔷, 贾芸, 史湘云, 薛蟠, 
薛蝌, 林黛玉, 香菱, 妙玉, 赵姨娘, 秋纹, 司棋, 雪雁, 琥珀, 莺儿, 
丰儿, 彩云, 宝蟾, 茗烟, 焙茗, 兴儿, 芳官, 周瑞家的, 秦钟, 冯紫英, 
赖大, 林之孝, 林之孝家的, 尤二姐, 

看见类别2都是主角,类别3是配角,类别1就是跑龙套的了

再采用层级聚类的方式 得到如下的图 Alt text 这幅图绿色的线都是主角,有些聚类比较准确,比如贾政、贾赦属于兄弟俩。 藕官、小红、春燕、坠儿都在丫头的分类里面。 有些比较搞笑,薛姨妈和李纨归为一类,难道因为都是寡妇的缘故吗(:-D)? 薛蟠和妙玉分在一类,这是什么鬼?难道预示了妙玉"无瑕白玉遭泥陷"的结局吗? 以上就是我的分析, gensim都是初学,就一个小时,一个新的红学家就诞生了,😄

严肃的来说,因为红楼梦属于明清小说,行文有很多和现代文不一样的地方,结巴分词不能很好的切词,导致学习效果比较差。 以上分析纯属逗乐,不能当真。

About

用Python读红楼

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /