對中文標題使用餘弦相似度演演算法
和編輯距離相似度分析
進行相似度分析。
本次使用的資料集來源於前幾年的碩士學位論文,可根據實際需要更換。結構如下所示:
學位論文題名
基於折積神經網路的臉部辨識研究
P2P串流媒體視訊點播系統設計和研究
校園網安全體系的設計與實現
無線感測器網路中基於多中繼切換的CARQ方案效能分析
RFID和VLPR技術在酒鋼智慧門禁系統中的應用
...
基於MapReduce的Web連結結構分析演演算法研究
環形交叉口混合交通流元胞自動機模型研究
細菌覓食演演算法的優化及其在車間排程中的應用研究
基於多載體影象的通用隱寫分析方法研究
基於加權網路的傳染病免疫策略研究
檔名:data.csv
編碼格式:UTF-8
import pandas as pd
data = pd.read_csv('data.csv')
data = data['學位論文題名']
分詞是一種常用的文字預處理技術,它可以為後續的文字分析和處理提供便利。例如,對於文字分類任務,可以使用分詞將文字轉換為詞的序列,然後訓練分類器來對詞的序列進行分類。
在進行分詞時,通常會去掉一些無意義的詞,稱為停詞。停詞是指那些對文字分析沒有太多意義的詞,例如,冠詞、連詞、介詞等。去除停詞可以提高分詞的準確性,並使文字分析的結果更加清晰明瞭。
停詞文字集結構如下所示,停詞庫根據檔名在網上很容易找到:
$
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模型中,單詞被表示為一個向量,並且這些向量是通過學習單詞在上下文中的出現概率而生成的。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中,使用這兩種演演算法能夠簡單實現文字分析。