翟天临的噩梦:怎样用Python检测抄袭行为?


全文共3168字,预计学习时长8分钟

图源:Google

 

本教程将介绍如何使用机器学习技术(如word2vec和余弦相似度等),在Python中用几行代码制作抄袭检测器。搭建完成后,抄袭检测器将会从文件中载入学生们的作业,然后通过计算相似度来判断学生有无相互抄袭行为。

 

要求

 

本教程需要在计算机上安装scikit-learn。

 

安装

 

pip install -Uscikit-learn

怎样分析文本?

 

如你所知,电脑只能理解0和1。首先需要将文本转换成数字再对文本数据进行计算。

 

词嵌入

 

将文本数据转换为数字阵列的过程通常称为词嵌入(word embedding),我们将使用sci-kit-learn内置功能来完成此任务。

 

将文本数据转换为矢量不是随机过程,而是遵循某些算法,从而将单词表示为空间中的位置。这一点将通过使用scikit-learn内置功能来实现。

 

怎样检测文档的相似性?

 

这里需要使用向量、点积的基本概念来确定两个文本的相似度,也就是计算学生的文本作业的向量代表之间的余弦相似度值。

 

此外还需要学生作业中的样本文档来测试模型。文本文件必须与脚本位于同一目录中,扩展名为“.txt”。文件目录如下:

 

. ├──app.py ├── fatma.txt ├── image.png ├── john.txt └──juma.txt

一起来搭建抄袭探测器

 

·        首先载入所有必要的模块

 

import os from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity

使用OS模块加载文本文件的路径,然后使用TfidfVectorizer对文本数据和余弦相似度执行词嵌入,来计算是否存在抄袭。

 

·        用列表推导式(List Comprehension)读取所有文本文件

 

接下来使用列表推导式来加载项目目录中所有的路径文件,如下:

 

student_files =[doc for doc in os.listdir() if doc.endswith( .txt )]

·        使用Lambda功能来向量化并计算相似性。

 

需要创建两个lambda函数,一个用来将文本转换成数字数组,另一个用来计算它们的相似性。

 

vectorize =lambda Text: TfidfVectorizer().fit_transform(Text).toarray()similarity = lambda doc1, doc2:cosine_similarity([doc1, doc2])

·        将文本数据向量化

 

加入下列两行代码,将加载的学生文件向量化:

 

vectors =vectorize(student_notes)s_vectors = list(zip(student_files,vectors))

创造一个计算相似性的功能。下面是脚本的主要功能,负责管理计算学生之间相似度的整个过程。

 

def check_plagiarism():     plagiarism_results = set()     global s_vectors     for student_a, text_vector_a in s_vectors:         new_vectors=s_vectors.copy()         current_index = new_vectors.index((student_a,text_vector_a))         del new_vectors[current_index]         for student_b , text_vector_b in new_vectors:             sim_score =similarity(text_vector_a, text_vector_b)[0][1]             student_pair= sorted((student_a, student_b))             score = (student_pair[0], student_pair[1],sim_score)             plagiarism_results.add(score)     return plagiarism_results Let’s print plagiarism results for data in check_plagiarism():     print(data)

·        最终代码

 

完成上述所有操作后会得到如下脚本,可以检测学生作业中是否存在抄袭行为。

 

import os from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity
student_files = [doc for doc in os.listdir() if doc.endswith( .txt )] student_notes=[open(File).read() for File in student_files]
vectorize = lambda Text:TfidfVectorizer().fit_transform(Text).toarray() similarity = lambda doc1, doc2: cosine_similarity([doc1,doc2])
vectors = vectorize(student_notes) s_vectors= list(zip(student_files, vectors))
def check_plagiarism():     plagiarism_results = set()     global s_vectors     for student_a, text_vector_a in s_vectors:         new_vectors=s_vectors.copy()         current_index = new_vectors.index((student_a,text_vector_a))         del new_vectors[current_index]         for student_b , text_vector_b in new_vectors:             sim_score =similarity(text_vector_a, text_vector_b)[0][1]             student_pair= sorted((student_a, student_b))             score = (student_pair[0], student_pair[1],sim_score)             plagiarism_results.add(score)         return plagiarism_results
for data in check_plagiarism():     print(data)

·        输出:

 

运行上述app.py,结果如下:

 

$ python app.py#
__________RESULT ___________ ( john.txt ,  juma.txt , 0.5465972177348937)( fatma.txt ,  john.txt , 0.14806887549598566)( fatma.txt ,  juma.txt , 0.18643448370323362)

抄袭检测器完成啦!老师们用起来,广大中小学生们的美梦就此结束了。

 


推荐阅读专题

留言点赞发个朋友圈

我们一起分享AI学习与发展的干货

编译组:岳馨妍、欧舒蔓

相关链接:

https://hackernoon.com/how-to-detect-plagiarism-in-text-using-python-zn213tw7

如转载,请后台留言,遵守转载规范

推荐文章阅读

ACL2018论文集50篇解读

EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术成果全链接

ACL2017论文集:34篇解读干货全在这里

10篇AAAI2017经典论文回顾

长按识别二维码可添加关注

读芯君爱你

  • 26
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值