中文標題相似度檢測

zh_jp發表於2023-02-16

前言

對中文標題使用餘弦相似度演演算法編輯距離相似度分析進行相似度分析。

準備資料集part1

本次使用的資料集來源於前幾年的碩士學位論文,可根據實際需要更換。結構如下所示:

學位論文題名
基於卷積神經網路的人臉識別研究
P2P流媒體影片點播系統設計和研究
校園網安全體系的設計與實現
無線感測器網路中基於多中繼切換的CARQ方案效能分析
RFID和VLPR技術在酒鋼智慧門禁系統中的應用

...

基於MapReduce的Web連結結構分析演演算法研究
環形交叉口混合交通流元胞自動機模型研究
細菌覓食演演算法的最佳化及其在車間排程中的應用研究
基於多載體影像的通用隱寫分析方法研究
基於加權網路的傳染病免疫策略研究

檔名:data.csv

編碼格式:UTF-8

import pandas as pd
data = pd.read_csv('data.csv')
data = data['學位論文題名']

準備資料集part2

分詞是一種常用的文字預處理技術,它可以為後續的文字分析和處理提供便利。例如,對於文字分類任務,可以使用分詞將文字轉換為詞的序列,然後訓練分類器來對詞的序列進行分類。

在進行分詞時,通常會去掉一些無意義的詞,稱為停詞。停詞是指那些對文字分析沒有太多意義的詞,例如,冠詞、連詞、介詞等。去除停詞可以提高分詞的準確性,並使文字分析的結果更加清晰明瞭。
停詞文字集結構如下所示,停詞庫根據檔名在網上很容易找到:

$
0
1
2
3
4

...

順
順著
首先
!
,
:
;
?

檔名:cn_stopwords.txt

編碼格式:UTF-8

with open('cn_stopwords.txt', 'r', encoding='utf-8') as f: 
    stop_words = [word.strip() for word in f.readlines()]
  • 執行分詞和去停詞
import jieba
res = []
for i in data:
    ii = i
    wordCut = list(jieba.cut(ii))
    for j in wordCut:
        if j in stop_words:
            wordCut.remove(j)
    res.append(wordCut)
  • 儲存結果
import pickle
with open('word_cut.dat', mode='wb') as f:
    pickle.dump(res, f)

這裡使用pickle儲存,是因為如果使用pandas,儲存的資料是帶了雙引號的(代表字串),後續處理不便,因此採用序列化儲存。

餘弦相似度演演算法

餘弦相似度演演算法是一種計算兩個向量之間相似度的方法,常用於自然語言處理和推薦系統等領域。

餘弦相似度演演算法的基本思想:計算兩個向量的夾角餘弦值,作為它們的相似度。兩個向量的夾角餘弦值越接近1,它們的相似度就越高;反之,如果兩個向量的夾角餘弦值接近0,它們的相似度就越低。

載入資料

with open('word_cut.dat', mode='rb') as f:
    dwc = pickle.load(f) # dwc 意為 Data of Word Cut

使用Word2Vec模型生成單詞向量

在Word2Vec模型中,單詞被表示為一個向量,並且這些向量是透過學習單詞在上下文中的出現機率而生成的。skip-gram和CBOW是用於訓練Word2Vec模型的兩種不同的演演算法,它們都可以用來生成單詞向量。

在使用Word2Vec模型進行自然語言處理任務時,可以使用餘弦相似度演演算法來計算單詞向量之間的相似度。例如,可以使用餘弦相似度演演算法來尋找與給定單詞最相似的其他單詞,或者用來比較兩個文字之間的相似度。

需要注意的是,Word2Vec模型和餘弦相似度演演算法在不同的級別上操作。Word2Vec模型生成單詞向量,而餘弦相似度演演算法用於比較單詞向量之間的相似度。因此,它們通常被結合使用來解決自然語言處理任務。

from gensim.models import Word2Vec
model = Word2Vec(dwc, sg=1, vector_size=100, window=5, min_count=1, negative=3, sample=0.001, hs=1,
                         workers=4)

Word2Vec模型有著眾多引數,這裡僅介紹用到的一部分,詳情見官方檔案

引數名 描述
sg {0, 1}, 可選 訓練演演算法:1為skip-gram;否則為CBOW
vector_size int, 可選 單詞向量的維數
windows int, 可選 句中當前單詞和預測單詞之間最大距離
min_count int, 可選 忽略總頻率低於此值的所有單詞
negative int, 可選 如果>0,將使用負取樣,負的int指定應繪製多少個“噪聲詞”(通常在5-20之間)。如果設定為0,則不使用負取樣
sample float, 可選 用於配置被隨機取樣的高頻詞,有效範圍:(0,1e-5)
hs {0, 1}, 可選 如果為1,則分層softmax將用於模型訓練。如果0,且負值為非零,則將使用負取樣
workers int, 可選 使用這些工作執行緒來訓練模型(相當於多核機器的更快訓練)。

儲存/載入訓練結果

model.save('model.dat')             # 儲存模型
model = Word2Vec.load('model.dat')  # 載入模型

計算相似度

limit = 0.99    # 相似度閾值
k = len(dwc)
st = [] # 意為Similar Title
for i in range(k):
    for j in range(i + 1, k):
        sim = model.wv.n_similarity(dwc[i], dwc[j])  # 計算兩個標題間的相似度
        if sim > limit:     # 相似度高於閾值的加入結果
            temp = [dwc[i], dwc[j], sim]
            st.append(temp)
for i in st:
    print(i)

部分結果如下:

['卷積,神經網路,人臉識別,研究', '雙目,測距,機器人,研究', 0.99172336]
['P2P,流媒體,影片點播,系統,設計,研究', '部隊,數字化,營區,設計,實現', 0.9933342]
['P2P,流媒體,影片點播,系統,設計,研究', '屬性,環,籤密,NDN,敏感,資訊,保護,方案', 0.99131924]
['P2P,流媒體,影片點播,系統,設計,研究', '社交,關係,流行病,傳播,免疫,機制,研究', 0.9944775]
['P2P,流媒體,影片點播,系統,設計,研究', 'WSN,節能型,資料壓縮,方法,研究', 0.99563485]

編輯距離相似度演演算法

演演算法介紹
編輯距離相似度演演算法是一種計算兩個字串之間相似度的方法,常用於自然語言處理和資訊檢索等領域。

編輯距離相似度演演算法的基本思想是,計算兩個字串之間的最小編輯次數,作為它們的相似度。兩個字串之間的最小編輯次數越少,它們的相似度就越高;反之,如果兩個字串之間的最小編輯次數越多,它們的相似度就越低。

import Levenshtein
limit2 = 5     # 相似度閾值
k = len(dwc)
st2 = dict()
for i in range(k):
    for j in range(i + 1, k):
        title1 = ''.join(dwc[i])
        title2 = ''.join(dwc[j])
        sim = Levenshtein.distance(title1, title2)
        if sim < limit2:    # 相似度低於閾值的加入結果
            key = title1 + ' ' + title2
            st2[key] = sim
sim_rk = sorted(st2.items(), key=lambda x: x[1])   # 根據相似度增序排序
for i in sim_rk:
    print(i)

結果如下:

('稀疏,表示,目標,跟蹤,演演算法,研究 稀疏,表示,目標,跟蹤,演演算法,研究', 0)
('稀疏,表示,目標,跟蹤,演演算法,研究 稀疏,表示,目標,跟蹤,方法,研究', 1)
('稀疏,表示,目標,跟蹤,方法,研究 稀疏,表示,目標,跟蹤,演演算法,研究', 1)
('自,適應,有限元,方法,三維,相場,模型模擬,研究 自,適應,有限元,方法,相場,模型模擬,研究', 3)
('多,特徵,融合,粒子,濾波,跟蹤,演演算法,研究 特徵,適應,融合,粒子,濾波,跟蹤,演演算法,研究', 4)
('模糊,軟集,多,屬性,決策,方法,研究 軟集,理論,多,屬性,決策,方法,研究', 4)

總結

在Python中,使用這兩種演演算法能夠簡單實現文字分析。

相關文章