李鬼见李逵,用Python“死磕”翟天临的博士论文

开发 后端 开发工具
都说今年的瓜特别多(葫芦娃的那种),但是过年期间最甜的我想非翟天临的“知网是什么?”莫属了吧。

都说今年的瓜特别多(葫芦娃的那种),但是过年期间最甜的我想非翟天临的“知网是什么?”莫属了吧。

[[258097]] 

近期,翟天临因“论文抄袭、学术造假”被推上风口浪尖,甚至连自己参演并准备播出的六部电视剧,也被央视要求全部删减,至此人设彻底崩塌,舆论哗然。

 

我平常不怎么关注娱乐圈,所以刚开始并没有把这件事放在心上,直到网上爆出翟的论文大篇幅抄袭陈坤论文的消息,我才对这位娱乐圈博士的文章起了兴趣。

 

目前北京电影学院已经撤销翟天临博士学位,取消陈浥博士研究生导师资格。

接下来就让我们以一个 Coder 的角度来硬核分析下翟的论文吧。

实验环境

工欲善其事,必先利其器,在开始分析之前,我先说明此次分析所处的实验环境,以免出现异常:

  • MacOS 10.14.3
  • Python 3.6.8(Anaconda)
  • Visual Studio Code
  • 使用的包有:
  • pkuseg(分词)
  • matplotlib(绘图)
  • wordcloud(词云)
  • numpy(数学计算)
  • Sklearn(机器学习)

数据获取

说实话,起初我以为就算翟不知“知网”为何物,“知网”也该收录翟的文章吧,可我在知网搜了好久也没能找到翟的论文,好在我在今日头条上找到了他的文章,保存在 data/zhai.txt 中。

 

说到这,还真要感谢翟天临啊,都是因为他,大家才变得这么有学术精神,开始研究起本科硕士博士论文了。

数据清理

上一节我们已经将他的论文保存到一个 txt 中了,所以我们需要先将文章加载到内存中:

  1. # 数据获取(从文件中读取) 
  2. def readFile(file_path): 
  3.     content = [] 
  4.     with open(file_path, encoding="utf-8"as f: 
  5.         content = f.read() 
  6.     return content 

我统计了下,除去开头的标题和末尾的致谢,总共 25005 个字。接下来我们来进行数据清理,在这里我用了 pkuseg 对内容进行分词处理,同时去掉停用词后输出分词的结果。

所谓停用词就是在语境中没有具体含义的文字,例如这个、那个,你我他,的得地,以及标点符合等等。

因为没人在搜索的时候去用这些没意义的停用词搜索,为了使得分词效果更好,我就要把这些停用词过滤掉。

  1. # 数据清理(分词和去掉停用词) 
  2. def cleanWord(content): 
  3.     # 分词 
  4.     seg = pkuseg.pkuseg() 
  5.     text = seg.cut(content) 
  6.  
  7.     # 读取停用词 
  8.     stopwords = [] 
  9.     with open("stopwords/哈工大停用词表.txt", encoding="utf-8"as f: 
  10.         stopwords = f.read() 
  11.  
  12.     new_text = [] 
  13.     # 去掉停用词 
  14.     for w in text: 
  15.         if w not in stopwords: 
  16.             new_text.append(w) 
  17.  
  18.     return new_text 

执行结果如下:

这里我提两点,为什么分词工具用的是 pkuseg 而不是 jieba?pkuseg 是北大推出的一个分词工具。官方地址是:

  1. https://github.com/lancopku/pkuseg-python 

它的 README 中说它是目前中文分词工具中效果***的。

为什么用哈工大的停用词表?停用词表的下载地址在:

  1. https://github.com/YueYongDev/stopwords 

以下是几个常用停用词表的对比:

 

参考文献:官琴, 邓三鸿, 王昊. 中文文本聚类常用停用词表对比研究[J]. 数据分析与知识发现, 2006, 1(3).

停用词表对比研究:

  1. https://github.com/YueYongDev/stopwords 

数据统计

说是数据统计,其实也没什么好统计的,这里简单化一下,就是统计下各个词出现的频率,然后输出词频***的 15 个词:

  1. # 数据整理(统计词频) 
  2. def statisticalData(text): 
  3.     # 统计每个词的词频 
  4.     counter = Counter(text) 
  5.     # 输出词频***的15个单词 
  6.     pprint.pprint(counter.most_common(15)) 

打印的结果如下:

 

真的是个***的“好演员”啊,能将角色带入生活,即使肚中无货却仍用自己的表演能力为自己设立一个“学霸”人设,人物形象如此饱满,兴许这就是创作的艺术吧!

文章中说的最多的就是生活、角色、人物、性格这些词,这些正是一个好演员的精神所在,如果我们将这些词做成词云的话,可能效果会更好。

生成词云

词云生成这个部分我采用的是 wordcloud 库,使用起来非常简单,网上教程也有很多。

这里需要提一点的就是:为了防止中文乱码情况的发生,需要配置 font_path 这个参数。

中文字体可以选用系统的,也可以网上找,这里我推荐一个免费的中文字体下载的网址:

  1. http://www.lvdoutang.com/zh/0/0/1/1.html 

下面是生成词云的代码:

  1. # 数据可视化(生成词云) 
  2. def drawWordCloud(text, file_name): 
  3.     wl_space_split = " ".join(text) 
  4.  
  5.     # 设置词云背景图 
  6.     b_mask = plt.imread('assets/img/bg.jpg'
  7.     # 设置词云字体(若不设置则无法显示中文) 
  8.     font_path = 'assets/font/FZZhuoYTJ.ttf' 
  9.     # 进行词云的基本设置(背景色,字体路径,背景图片,词间距) 
  10.     wc = WordCloud(background_color="white",font_path=font_path, mask=b_mask, margin=5) 
  11.     # 生成词云 
  12.     wc.generate(wl_space_split) 
  13.     # 显示词云 
  14.     plt.imshow(wc) 
  15.     plt.axis("off"
  16.     plt.show() 
  17.     # 将词云图保存到本地 
  18.     path = os.getcwd()+'/output/' 
  19.     wc.to_file(path+file_name) 

真假李逵(文章对比)

分析完了“李鬼”,我们有必要请出他的真身“李逵”兄弟了,同样还是和之前一样的套路,先找到数据,然后分词统计词频,这里就不重复操作了,直接放出词云图。

看到这图是不是觉得和翟的词云图异常相似,那么,这“真假李逵”之间到底有多像呢?接下来我们来计算下两篇文章的相似度吧。

TF-IDF

文章相似度的比较有很多种方法,使用的模型也有很多类别,包括 TF-IDF、LDA、LSI 等,这里方便起见,就只使用 TF-IDF 来进行比较了。

TF-IDF 实际上就是在词频 TF 的基础上再加入 IDF 的信息,IDF 称为逆文档频率。

不了解的可以看下阮一峰老师的讲解,里面对 TFIDF 的讲解也是十分透彻的。

  1. https://www.ruanyifeng.com/blog/2013/03/tf-idf.html 

Sklearn

Scikit-Learn 也简称 Sklearn,是机器学习领域当中最知名的 Python 模块之一,官方地址为:

  1. https://github.com/scikit-learn/scikit-learn 

其包含了很多种机器学习的方式,下面我们借助于 Sklearn 中的模块 TfidfVectorizer 来计算两篇文章之间的相似度。

代码如下:

  1. # 计算文本相似度 
  2. def calculateSimilarity(s1, s2): 
  3.     def add_space(s): 
  4.             return ' '.join(cleanWord(s)) 
  5.  
  6.     # 将字中间加入空格 
  7.     s1, s2 = add_space(s1), add_space(s2) 
  8.     # 转化为TF矩阵 
  9.     cv = TfidfVectorizer(tokenizer=lambda s: s.split()) 
  10.     corpus = [s1, s2] 
  11.     vectors = cv.fit_transform(corpus).toarray() 
  12.     # 计算TF系数 
  13.     return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1])) 

除了 Sklearn,我们还可以使用 gensim 调用一些模型进行计算,考虑到文章篇幅,就由读者自己去搜集资料实现吧。

我们将翟的论文和陈的论文分别传入该函数后,输出结果为:

  1. 两篇文章的相似度为: 
  2. 0.7074857881770839 

其实这个结果我还是挺意外的,只知道这“李鬼”长得像,却没想到相似度竟然高达 70.7%。

[[258099]]

当然,作为弟弟,翟的这个事和吴秀波的事比起来,那都不是个事。

 

责任编辑:武晓燕 来源: 01二进制
相关推荐

2023-06-05 14:11:14

论文

2021-10-18 17:54:13

论文博士数据

2023-12-25 15:11:16

AI模型

2021-06-01 09:29:43

ArthasJVM内存

2021-03-01 08:02:55

算法排序操作

2021-08-03 14:00:06

数据研究论文

2024-01-03 13:05:00

数据训练

2021-07-15 16:05:29

编程Rust开发

2021-10-28 09:23:17

论文学术数据

2020-11-25 20:03:41

AI 机器人工智能

2021-06-03 08:32:18

JVM调优虚拟机

2012-12-27 11:11:54

华为任正非

2022-10-09 14:53:35

机器学习

2009-03-02 16:11:56

2013-06-05 09:38:27

Intel功耗酷睿

2021-02-24 10:03:17

Java8日期API

2021-02-25 07:21:00

JVMJavaava虚拟机

2023-12-14 07:36:16

Java并发原子类

2017-02-27 10:43:07

Javasynchronize

2021-01-13 08:10:26

接口IEnumeratorIEnumerable
点赞
收藏

51CTO技术栈公众号