






摘要:文章設計并實現了一個基于Python語言,利用余弦相似度進行內容比對的程序。該程序能夠高效地比對Word和PDF文檔內容相似度,通過內容解析、文本分詞以及余弦相似度計算等關鍵技術,實現對文檔內容相似度的精確評估。與其他相似應用相比,該程序能夠進行脫機處理,可用于本地化作業查重。論文詳細闡述了程序的設計思路、關鍵技術、具體編程實踐以及測試驗證過程,為文檔內容比對的研究與應用提供參考。
關鍵詞:余弦相似度;相似度比對;文件解析;數據分詞;程序設計與開發
中圖分類號:TP311.52 文獻標識碼:A
文章編號:1009-3044(2024)27-0042-03
0 引言
隨著信息化時代的迅猛發展,人們每天都被海量信息和數據淹沒。從新聞報道、工作文檔到個人文件,信息的快速增長對如何高效檢索、快速比對數據提出了嚴峻挑戰。文檔內容的相似度比對[1]技術成為了文獻查重、信息檢索、數據挖掘等多個領域不可或缺的工具,在快速識別出重復和相似內容,提高信息處理的效率和準確性上發揮著巨大作用。然而,在本地化文檔內容相似度[2]比對的細分領域,仍存在顯著的空白與挑戰。例如,當教師面對大量學生提交的本地作業文檔時,缺乏有效的輕量級程序來快速而準確地比對這些文檔的相似度?,F存的一些文檔比對工具大多依賴于網絡連接,在一定程度上限制了使用范圍;同時,一些工具操作復雜,界面不夠友好,對非技術背景人員來說難以上手;此外,許多工具需要用戶將文檔上傳至云端進行比對,這無疑增加了數據泄露的風險。因此,設計并開發一款專為本地化文檔內容設計,能夠離線運行、操作簡單、高效且注重隱私的輕量級程序是一個亟待解決的實際問題。
本論文設計并實現了一種基于余弦相似度的內容比對程序,利用余弦相似度算法對Word和PDF文檔進行內容相似度計算。該程序整體界面簡單、友好易用,可運行于本地化脫機環境,極大提升了本地化文檔比對的效率和準確性。特別是在教育領域的作業查重方面,展現出強大的實用性與創新性,彌補了現有內容比對領域的不足,具有一定的實踐價值。
1 程序設計
本程序是一個基于Python語言自主開發的文檔內容相似度比對的脫機程序。它整體采用模塊化架構設計,確保了程序的高內聚低耦合特性,便于后續維護與擴展。該程序可獨立運行于Windows本地環境,無須依賴額外的服務器或網絡,極大地提高了使用的便捷性。
在用戶界面設計上,程序使用圖形化界面、操作流程簡便,為用戶提供了兩種比對模式:一對一文件比對和某一文件路徑下多文件的相似度比對。用戶可以根據實際需求,在左側欄選擇相應的比對模式,右側會立即展現相應的操作界面。
在業務邏輯設計上,程序通過總控程序進行全局調度與管理,確保各模塊間的協同工作。程序設計的流程圖如圖1所示。首先,用戶啟動程序并在界面左側選擇一對一文件比對或者多文件比對模式。
在一對一比對模式下,用戶須分別選定兩個待比對的文件。點擊比對按鈕后,程序會檢測文件是否為可比對類型,若不是Word或PDF文檔,須提示“程序暫不支持此文件類型比對”。對于支持的文件類型,程序先根據文件類型調用相應的方法進行內容解析;獲取文本內容后,將連續的文本轉換為易于分析的詞匯單元,并利用詞頻-逆文檔頻率技術將分詞結果轉換為數值向量,最后計算兩個向量的余弦得出相似度作為結果輸出。
在多文件比對模式下,用戶需要選定某一文件夾路徑。點擊比對按鈕后,程序開始遍歷該文件夾下的所有文件,同時,利用排列組合的方式生成兩兩比對的文檔組合。這種方法與嵌套兩層for循環不同,可以有效避免重復組合,提升程序的比對效率。對于非Word或PDF文檔,程序須自動忽略包含任一非規定文檔的組合。后續處理邏輯與一對一比對模式相似,可復用代碼。
2 關鍵技術
程序的設計圍繞三大核心技術展開:內容解析、文本分詞和余弦相似度[3-4]計算。
首先,內容解析是程序的基礎環節,專注于從不同格式的文檔中精準提取出文本內容。程序結合了python-docx庫來讀取doc、docx等Word文檔的內容。同時,利用PyPDF2庫進行PDF文檔內容的提取,確保了本程序能夠支持多種格式的文檔內容比對。
接下來,文本分詞是將連續文本切割成獨立詞匯單元的預處理環節,為后續相似度計算奠定基礎。程序采用jieba[5]庫對中文文檔內容進行分詞處理,該庫算法是一種基于前綴詞典,并結合動態規劃算法和隱馬爾可夫模型實現的分詞算法。對于英文文檔,則直接采用簡單的空格作為分詞依據進行分詞處理。分詞后的文本內容被拆分為多個詞組,進而利用scikitlearn[6-7]庫中的TfidfVectorizer 類生成TF-IDF 向量[8]。通過統計各個詞在詞匯集中出現的次數和詞匯集合的大小計算出詞頻,同時統計包含各詞的集合數計算出逆文檔頻率,再者,將詞頻和逆文檔頻率進行相乘,形成文本向量,為相似度計算作準備。
最后,余弦相似度計算是衡量兩個文本向量之間相似度的指標,是得出程序結果的關鍵技術。其通過計算兩個向量夾角的余弦值,就可以判斷它們之間的相似程度。其算法邏輯見公式(1),A、B 為文本向量,A·B 表示兩個向量的點積,||A||、||B||分別為兩個向量的模。余弦相似度值越接近1,表示兩個文本越相似;值越接近0,表示兩個文本越不相似。
3 實現與測試
3.1 代碼實現
程序的主要代碼結構遵循模塊化設計原則,分為四大模塊:main.py作為主程序入口,負責程序的啟動與整體流程控制;GUI.py提供用戶交互界面;logic.py 負責邏輯處理,執行程序的核心功能;commonTools.py 包含多個公共方法,供其他模塊調用。這種設計使得每個模塊的職責清晰且單一,有效降低了模塊間的耦合度,提升了代碼的可讀性、可維護性和可擴展性。
main.py是整個程序的入口點,負責初始化必要的資源,啟動圖形用戶界面等。
GUI.py負責構建和管理用戶與程序之間的交互界面,使用圖形化元素,如按鈕、輸入框、表格等來呈現程序的功能和結果。GUI.py繪制了左右布局的頁面窗口,左側供用戶選擇比對模式,右側根據模式變換顯示。若選擇一對一比對,右側則顯示兩個文件的路徑選擇框、比對按鈕和結果展示區;若選擇多文件比對,右側則顯示單個文件夾選擇框、比對按鈕和結果展示區。GUI.py同時也定義了事件處理邏輯,當用戶選擇比對模式和比對按鈕時,程序會捕獲按鈕事件,分別調用compare_one_to_one()和compare_mul?tiple_files()方法,其代碼如圖2所示。這兩個方法處理邏輯類似,都是通過獲取頁面的文件路徑,并分別調用具體的比對方法compareOnetoOne()和compareFile?Path()之后,最后將返回結果插入result_treeview變量,最終展示在結果區。
logic.py是程序的核心處理邏輯代碼文件,包含compareOnetoOne()和compareFilePath()兩個方法,負責進行具體文件內容的比對。首先調用commonTools中的parseFile()方法解析文件,然后,將解析結果傳入preprocess_text()方法進行文本分詞并轉換為向量,之后,通過調用cos_similarity()方法計算余弦相似度,計算出兩個文件間的內容相似度,返回至result變量。compareFilePath()通過itertools 中的combinations 生成指定路徑下的兩兩文件組合,通過循環調用compare?OnetoOne()方法,完成文件夾下文件的內容比對,具體的處理邏輯如圖3所示。
commonTools.py包含了一系列公共方法和工具函數,用于輔助文件內容比對。這些方法可以在多個方法中進行重復使用,降低了代碼的冗余度,也提高了代碼的可維護性和可重用性。parseFile()、prepro?cess_text()、cos_similarity()就位于commonTools.py 中,用于文檔內容的解析提取、文本分詞預處理并轉換為向量、計算余弦相似度等。preprocess_text()方法調用jieba.cut()方法對解析的文檔內容進行分詞,通過Tfid?fVectorizer()方法創建TF-IDF 向量化器,通過調用fit_transform()方法將字符串文本轉換為向量,調用pairwise.py中的cosine_similarity()直接計算兩個向量間的余弦值。
3.2 程序測試
為檢測基于余弦相似度的內容比對程序的有效性和實用性,在Windows系統的D盤目錄下創建了一個名為test的文件夾,用于存放測試所需的文件。該文件夾中包含了Word文檔(.docx,.doc) 、PDF文件(.pdf) 和圖片(.png,.jpg) 等多種類型的文件。文檔以“模型概述.docx”為基礎文檔,其內容包含公式、特殊字符等情況,并對不同文件的內容進行了不同程度的刪減,同時另存為了多種不同類型的文件,以增加程序測試的可靠性。
接下來,雙擊similarity.exe文件啟動程序,左側選擇一對一比對模式,右側分別選定兩個文件,為“模型概述.docx”和“模型概述-副本.docx”,點擊比對按鈕。由于文件1是由文件2復制而來,如圖4(a) 所示,其檢測到的文件內容相似度為100%。另外,程序可支持PDF和Word文檔的比對,如圖4(b) 所示,分別選擇“模型概述.docx”和“模型概述.pdf”,相似度為98.59%,推測原因是格式轉變解析內容時稍有偏差,但還是很明顯能感受到相似度非常高。
左側選擇多文件比對模式,將右側選擇文件夾路徑指定為“D:/test”,點擊比對按鈕,程序遍歷文件夾下的所有文件,遇到png文件等非支持文檔時則忽略。運行結果如圖5所示,文件夾下的文件進行了兩兩組合匹配,通過鼠標滾輪滾動,可在結果框中查看所有文件內容的相似度。
程序對暫不支持的文檔類型進行了提示,當選擇非Word或PDF文件時,由于程序不支持文件內容的解析,因此提示“程序暫不支持此文件比對”,如圖6 所示。
4 總結
本文設計并實現了一種基于Python語言的余弦相似度內容比對程序。該程序通過文檔內容解析、數據分詞預處理和余弦相似度計算等關鍵技術,實現了對Word和PDF文檔的高效、準確相似度比對。測試結果表明,該程序具有較高的實用價值,可為本地化作業查重提供有力支持。同時,隨著內容解析技術和比對算法的逐漸精進,該程序可持續支持更多文件類型的比對。通過進一步優化算法效率,可進行更多應用場景的拓展。
參考文獻:
[1] 馬智勤,廖雪花,鄧威,等.基于分布式ElasticSearch相似內容比對算法研究[J]. 計算機與數字工程,2020,48(12):2843-2849.
[2] 宋玲,馬軍,連莉,等.文檔相似度綜合計算研究[J].計算機工程與應用,2006,42(30):160-163.
[3] 張振亞,王進,程紅梅,等.基于余弦相似度的文本空間索引方法研究[J].計算機科學,2005,32(9):160-163.
[4] 閆建紅,段運會.動量余弦相似度梯度優化圖卷積神經網絡[J].計算機工程與應用,2024,60(14):133-143.
[5] 石鳳貴.基于jieba中文分詞的中文文本語料預處理模塊實現[J].電腦知識與技術,2020,16(14):248-251,257.
[6] 鄧子云.scikit-learn的機器學習流水線技術與應用[J].信息化研究,2020,46(2):53-57.
[7] SHIHAB E,JING Y.Sentiment Analysis of Twitter Data Using Machine Learning Techniques and Scikit-learn[C].Sanya:2018International Conference on Algorithms,Computing and Artifi?cial Intelligence (ACAI 2018),2018.
[8] 武永亮,趙書良,李長鏡,等.基于TF-IDF和余弦相似度的文本分類方法[J].中文信息學報,2017,31(5):138-145.
【通聯編輯:謝媛媛】