最近拜读了毛选,使用一些包装好的NLP工具分析了一下毛选,并写出了一些分析结果。代码是公开的,放在自己的github上了,请点击 maoxuan_analyse。
- 本项目使用了如下工具
- jieba分词
- wordcloud词云
- SNOWNLP
- word2vec
- 数据来源
词云
根据目录,将原始文本按照不同时期分到不同的文件夹下,这里分了5个文件夹,对应原始的5本纸质书。最后一本纸质书市场上不买了,但是网上还是有资源的。目录包括 国内革命战争时期、抗日战争时期上、抗日战争时期下、第三次国内革命战争时期、中国人民站起来了。
读取每个时期的所有文本到内存中,用一个类来保存一个文本,类的定义为文章的模型.
class Article:
def __init__(self, title, write_time, background, content, annotation):
# 标题
self.title = title
# 创作时间
self.write_time = write_time
# 背景
self.background = background
# 内容
self.content = content
# 注释
self.annotation = annotation
使用jieba分词,把所有一个时期的所有文章内容一起分词,然后调用词云api生成词云图。
以 国内革命战争时期 和 抗日战争时期上 这两个时期的词云为例进行分析。
在国内革命战争时期的图中,出现次数比较多的词汇是红军、农民、根据地、斗争、革命、矛盾、阶级。
这些工作在本图中基本可以看出来,毛最关心的是农民和红军,利用工农武装割据开展土地革命。
在图中,出现次数比较多的词汇是抗日战争、中国、游击战争、胜利、帝国主义、共产党、国民党、全国。
读过的知道,本卷最出名的文章是《论持久战》,在电影《地道战》中也出现了该文。在词云中也能感到,在进入国共合作全面抗战后,共产党主要通过游击战开展斗争。虽然条件艰难,国民党消极抗战、积极反共,但毛依然很乐观,他认为中国会取得最终的胜利。
- 最后根据每篇文章的创作时间,制作每一年的文章的词云,得到了从1925年到1957年每年的词云。篇幅原因这里只选两个年份进行分析。
1937年爆发了卢沟桥事件,全面抗战爆发,国共两党再次合作。从图中可以看到,毛关注的重点包括国民党、抗日、矛盾等方面,希望能团结全国的力量一起抗日。
1949年新中国成立,同时解放战争还没有结束。图中可以看到,毛一方面在组织成立新中国,建立人民政府,一方面动员解放军”宜将剩勇追穷寇“,消灭剩余的反动力量。
情感分析
借助SNOWNLP,可以对句子进行情感分析。对于长篇的文章,先计算每一句的情感得分,然后求平均值,作为该文章的情感得分,分数越高表明情感越正面。这种算法不能说很科学,但是也有一定的可行性。该段代码如下。
def generate_article_emotion(content):
#按中文标点对文章进行切分
lines = spiltString(content)
count = 1
score = 0
for line in lines:
if line.__len__()>1:
line_score = SnowNLP(line).sentiments
score += line_score
count += 1
return score/count
这里同样对不同时间段和不同年份的文章进行情感分析,结果存储在【情感分析结果.txt】中。这里选择抗日战争时期下 和 1940年 进行分析。
- 抗日战争时期下 中,最正面的文章是【关于反法西斯的国际统一战线】,得分0.88;最负面的文章是【开展根据地的减租、生产和拥政爱民运动】,得分0.60。
- 文章【关于反法西斯的国际统一战线】是毛泽东为中共中央写的对党内的指示,文章虽然短但是情绪积极向上,要求动员一切力量团结对抗世界法西斯势力。
- 文章【开展根据地的减租、生产和拥政爱民运】也是党内指示,批评了一些工作上的问题,提出了一些积极的工作指示。在直观上本文情绪负面其实不太可信,或许SNOWNLP的算法还有优化的空间。
- 1940年,最正面的文章是【新民主主义论】,得分0.87;最负面的文章是【向国民党的十点要求】,得分0.59。个人认为得分是比较准确的,尤其是最负面的文章,有理有据地批判了国民党的问题,揭露了国民党的各种罪行,有兴趣的可以自己品读,这里不做详细介绍。
相似度分析
词汇相似度分析使用了word2vec,第一步输入全部文章,进行分词,训练模型;第二步加载模型,输入待比较词汇,得到相似度最高的词汇。模型就不放出来了,有兴趣可以用作者的代码自己训练。
这里从前面的图云中选择了一些词汇作为输入,将比较结果存储在【word2vec分析结果.txt】中,这里列举一部分进行分析。
工人 农民 0.9811062812805176
农民 工人 0.9811063408851624
土豪 李自成 0.9986612796783447
解放区 军队 0.9435299038887024
日本 美国 0.9674444198608398
中国 殖民地 0.949562132358551
国民党 政府 0.954230546951294
买办 地主阶级 0.9861918091773987
地主 富农 0.9552240967750549
红军 八路军 0.927232563495636
政治 教育 0.9542652368545532
人民 力量 0.9281405210494995
群众 组织 0.9218489527702332
帝国 加深 0.9950364232063293
民族 联合 0.9364615678787231
孙中山 先生 0.9325805902481079
蒋介石 内战 0.9553549289703369
陈独秀 王明 0.995598316192627
斯大林 马克思 0.9780169129371643
南昌 莫斯科 0.998762309551239
延安 第八次 0.9956610798835754
上海 失守 0.9932041168212891
可以看出,对阶级、国家、组织、人名等词汇的分析结果是比较可靠的,对地名的分析结果就比较头疼,个人认为问题还是数据量不够大,毛选中涉及的地名不是很多。
总结
毛选非常值得一读,使用NLP工具分析后能在一定程度上加深理解。自我批评一下,本文没有涉及具体的算法,由于水平和时间有限,只能做一个调包boy了。本来想做一个每日一句毛语录,由于不好断句,选出的句子也不一定有特定的含义,后续有想法了再做。