全文共3168字,預計學習時長8分鐘
本教程將介紹如何使用機器學習技術(如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)讀取所有文本文件
接下來使用列表推導式來加載項目目錄中所有的路徑文件,如下:
vectorize =lambda Text: TfidfVectorizer().fit_transform(Text).toarray()similarity = lambda doc1, doc2:cosine_similarity([doc1, doc2])
· 使用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))
創造一個計算相似性的功能。下面是腳本的主要功能,負責管理計算學生之間相似度的整個過程。
defcheck_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學習與發展的乾貨
如轉載,請後臺留言,遵守轉載規範