本教程将介绍如何使用机器学习技术(如word2vec和余弦相似度等),在Python中用几行代码制作抄袭检测器。搭建完成后,抄袭检测器将会从文件中载入学生们的作业,然后通过计算相似度来判断学生有无相互抄袭行为。
要求
本教程需要在计算机上安装scikit-learn。
安装
<span><span>pip</span> install -Uscikit-learn</span>
怎样分析文本?
如你所知,电脑只能理解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)读取所有文本文件
接下来使用列表推导式来加载项目目录中所有的路径文件,如下:
<span>student_files =[doc <span>for</span> doc <span>in</span> os.listdir() <span>if</span> doc.endswith(<span> .txt </span>)]</span>
· 使用Lambda功能来向量化并计算相似性。
需要创建两个lambda函数,一个用来将文本转换成数字数组,另一个用来计算它们的相似性。
<span><span>vectorize</span> =lambda Text: TfidfVectorizer().fit_transform(Text).toarray()</span>
<span><span>similarity</span> = lambda doc1, doc2:cosine_similarity([doc1, doc2])</span>
· 将文本数据向量化
加入下列两行代码,将加载的学生文件向量化:
<span><span>vectors</span> =vectorize(student_notes)</span>
<span><span>s_vectors</span> = list(zip(student_files,vectors))</span>
创造一个计算相似性的功能。下面是脚本的主要功能,负责管理计算学生之间相似度的整个过程。
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)
抄袭检测器完成啦!老师们用起来,广大中小学生们的美梦就此结束了。
本教程介绍如何使用word2vec和余弦相似度等技术,在Python环境中快速构建一个文本抄袭检测器。该检测器能自动计算学生作业间的相似度,帮助教师高效识别抄袭行为。
5160

被折叠的 条评论
为什么被折叠?



