python删除中文停用词_我用Python分析了翟天临的论文,结果有点超乎想象…

本文以Python为工具,分析翟天临的论文,通过数据清理、词频统计和文章相似度比较,揭示学术不端现象。使用pkuseg分词并去除停用词,生成词云,最后通过TF-IDF和Sklearn计算文章相似度,结果显示相似度高达70.7%。
摘要由CSDN通过智能技术生成

73adfa7ad060d606bb12807d04578528.png

点击菜单栏“阅读打卡”

发现更多精彩和惊喜

新学期伊始,想必老师们、辅导员们今年开学都跟大家举例严肃强调了“知网到底是什么?”和学术不端的严重后果,

3408d394b8a1a68080d1b0b3ba734436.png

我平常不怎么关注娱乐圈,所以刚开始并没有把这件事放在心上,直到网上爆出翟的论文大篇幅抄袭的消息,我才对这位娱乐圈博士的文章起了兴趣。目前,翟天临已退出北大博士后科研流动站,博士学位也已经被撤销。接下来就让我们以一个coder的角度来硬核分析下翟的论文吧。

实验环境

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

  • MacOS 10.14.3

  • Python 3.6.8(Anaconda)

  • Visual Studio Code

  • 使用的包有:

  • pkuseg(分词)

  • matplotlib(绘图)

  • wordcloud(词云)

  • numpy(数学计算)

  • sklearn(机器学习)

数据获取

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

c1b4608d4f2475f92012d98286b8dc1e.png

数据清理

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

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

我统计了下,除去开头的标题和末尾的致谢,总共25005个字。

接下来我们来进行数据清理,在这里我用了pkuseg对内容进行分词处理,同时去掉停用词后输出分词的结果。

所谓停用词就是在语境中没有具体含义的文字,例如这个、那个,你我他,的得地,以及标点符合等等。因为没人在搜索的时候去用这些没意义的停用词搜索,为了使得分词效果更好,我就要把这些停用词过滤掉。

1# 数据清理(分词和去掉停用词) 2 3def cleanWord(content): 4 5    # 分词 6 7    seg = pkuseg.pkuseg() 8 9    text = seg.cut(content)10111213    # 读取停用词1415    stopwords = []1617    with open("stopwords/哈工大停用词表.txt", encoding="utf-8") as f:1819        stopwords = f.read()20212223    new_text = []2425    # 去掉停用词2627    for w in text:2829        if w not in stopwords:3031            new_text.append(w)32333435    return new_text

执行结果:

4102091b2064b4618440fe6a83e8bfa2.png

这里我提两点:

1、为什么分词工具用的是pkuseg而不是jieba?

pkuseg是北大推出的一个分词工具,官方地址是:https://github.com/lancopku/pkuseg-python,他的README中说他是目前中文分词工具中效果最好的。

accc9043d6c4cd119f3fdf8f91055316.png

2、为什么用哈工大的停用词表?

停用词表的下载地址:https://github.com/YueYongDev/stopwords。

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

  停用词表效果较好的文本种类

哈工大停用词表

文献期刊类文本

百度停用词表

新闻报道类文本

四川大学停用词表

邮件文献类文本

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

数据统计

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

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

打印的结果:

31fa9bea47b609a6f343cc86dcad347e.png

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

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

生成词云

词云生成这个部分我采用的是wordcloud库,使用起来非常简单,网上教程也有很多,这里需要提一点的就是:为了防止中文乱码情况的发生,需要配置font_path这个参数。中文字体可以选用系统的,也可以网上找,这里我推荐一个免费的中文字体下载的网址:http://www.lvdoutang.com/zh/0/0/1/1.html

下面是生成词云的代码:

1# 数据可视化(生成词云) 2 3def drawWordCloud(text, file_name): 4 5    wl_space_split = " ".join(text) 6 7 8 9    # 设置词云背景图1011    b_mask = plt.imread('assets/img/bg.jpg')1213    # 设置词云字体(若不设置则无法显示中文)1415    font_path = 'assets/font/FZZhuoYTJ.ttf'1617    # 进行词云的基本设置(背景色,字体路径,背景图片,词间距)1819    wc = WordCloud(background_color="white",font_path=font_path, mask=b_mask, margin=5)2021    # 生成词云2223    wc.generate(wl_space_split)2425    # 显示词云2627    plt.imshow(wc)2829    plt.axis("off")3031    plt.show()3233    # 将词云图保存到本地3435    path = os.getcwd()+'/output/'3637    wc.to_file(path+file_name)

df72f64edc12bfa764ca79d0a3e9fabd.png

真假李逵(文章对比)

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

8f12c97c3258cb92ca5ae9e71568ce36.png

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

文章相似度比较

TF-IDF

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

a9006aacfe7e8cfbadfcf60088557593.png

TF-IDF 实际上就是在词频 TF 的基础上再加入 IDF 的信息,IDF 称为逆文档频率,不了解的可以看下阮一峰老师的讲解:https://www.ruanyifeng.com/blog/2013/03/tf-idf.html,里面对 TFIDF 的讲解也是十分透彻的。

Sklearn

scikit-learn 也简称 sklearn, 是机器学习领域当中最知名的 Python 模块之一,官方地址为:https://github.com/scikit-learn/scikit-learn,其包含了很多种机器学习的方式,下面我们借助于 Sklearn 中的模块TfidfVectorizer来计算两篇文章之间的相似度,代码如下:

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

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

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

两篇文章的相似度为:

0.7074857881770839

其实这个结果我还是挺意外的,只知道是抄袭,却没想到相似度竟然高达70.7%。今年本科大四的同学和很多研究生、博士生同学都即将面临写毕业论文或者发表论文的任务要求,教育部也发文将提高管理。学术的路没有捷径,所以,好好看论文吧!

作者 | 雇个城管打天下 来源 | 01二进制(ID:gh_d1999add1857)

cce9a1fc93f30a349dd14885c37275db.pngb70bcc89d8cd11cf77f96c7bcb94b03e.png

71d1e52d665e299066e666d6d93823b4.png

9cdfd6f66ee4c34bdb9f591a906039eb.png

9e3447f127a3adf520825b03729ea405.png

868bb6cbd2a3391ca4cdc7cddae27523.png

fa14b200a47007cc8436ab5ac5ea3368.pngdafb594479dbd57017faa7586f8f94c8.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值