本教程将介绍如何使用机器学习技术(如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)

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

中小学生的噩梦:怎样用Python检测抄袭行为?广大中小学生们的美梦就此结束的更多相关文章

  1. python检测文件的MD5值

    python检测文件的MD5值MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权 ...

  2. 使用python检测一个设备是否ping的通

    使用python检测一个设备是否ping的通 一,subprocess以及常用的封装函数 运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并 ...

  3. python检测服务器是否ping通

    好想在2014结束前再赶出个10篇博文来,~(>_<)~,不写博客真不是一个好兆头,至少说明对学习的欲望和对知识的研究都不是那么积极了,如果说这1天的时间我能赶出几篇精致的博文,你们信不信 ...

  4. 安全篇:弱密码python检测工具

    安全篇:弱密码python检测工具 https://github.com/penoxcn/PyWeakPwdAudit

  5. python检测是否是质数

    python检测是否是质数 编写python脚本,使得实现以下功能: 输入一个整数,通过脚本判断出输入的这个数是否是质数,然后输出是否是质数. 脚本如下图所示: Num = input("P ...

  6. python检测变量名

    python检测变量名 变量在编程中的用途非常广,在python中,变量的名称只能以字母或者下划线“_”开头,变量名只能由字母.数字.下划线组成. 编写python,使得其实现以下功能: 1.输入一个 ...

  7. Python检测URL状态

    需求:Python检测URL状态,并追加保存200的URL 代码一: #! /usr/bin/env python #coding=utf-8 import sys import requests d ...

  8. python检测远程udp端口是否打开的代码

    研发过程,把开发过程较好的代码收藏起来,如下的代码内容是关于python检测远程udp端口是否打开的代码,希望对各朋友有较大帮助. import socketimport threadingimpor ...

  9. python检测当前端口是否使用

    基于python检测端口是否在使用 - 缘起花渊 - 博客园https://www.cnblogs.com/yqmcu/p/9804002.html def net_is_used(port,ip=' ...

随机推荐

  1. JUC并发工具包之CyclicBarrier

    1.简介 CyclicBarrier是一个同步器,允许多个线程等待彼此直到达一个执行点(barrier). CyclicBarrier都是在多个线程必须等到彼此都到达同一个执行点后才执行一段逻辑时才被 ...

  2. sentinel--初级使用篇

    1.官方资料 github官网地址:https://github.com/alibaba/Sentinel wiki:https://github.com/alibaba/Sentinel/wiki/ ...

  3. Java-Netty前菜-NIO

    NIO NIO主要有三个核心部分组成: buffer缓冲区 Channel管道 Selector选择器 在NIO中并不是以流的方式来处理数据的,而是以buffer缓冲区和Channel管道配合使用来处 ...

  4. 安全的字符串拷贝strcpy_s的实现与理解

    在C标准库中提供了字符串拷贝函数strcpy,而微软则为为它提供了一个更安全的版本strcpy_s,其函数原型为 errno_t __cdecl strcpy_s( char* _Destinatio ...

  5. Visual Studio 2019 升级16.8之后(升级.Net 5),RazorTagHelper任务意外失败

    vs2019升级16.8后,原来.net core 3.1的项目编译时出现了莫名其妙的错误: 1. "RazorTagHelper"任务意外失败 2. ...provide a v ...

  6. python大数问题

    python不需要特殊的声明,可以直接进行大数运算 验证:

  7. iNeuOS工业互联平台,WEB组态(iNeuView)图元和数据点组合及生成新图元复用,实现拖业务

    目       录 1.      概述... 1 2.      平台演示... 2 3.      应用过程... 2 1.   概述 iNeuView视图建模Web组态平台实现图元和数据点组合及 ...

  8. OpenCV击中击不中HMTxingt变换最容易理解的解释

    OpenCV击中击不中变换是几个形态变换中相对比较拗口.不容易理解的,给初学者理解带来了很多困难,虽然网上也有许多的公开资料,原理和算法基本上介绍比较清晰,但是是要OpenCV进行形态变换大多还是说得 ...

  9. 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器

    第四章 基础知识进阶第十七节 迭代.可迭代对象.迭代器 一.    引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本节 ...

  10. 问题:PyCharm调试方法Force Step over与step over的区别

    Force Step over与step over的差别是,后者在执行到函数时,如果函数中设置了断点,会在该函数断点处暂停,等待进一步调试指令,而Force Step over不论函数中是否有断点,都 ...