前言 對中文標題使用餘弦相似度演算法和編輯距離相似度分析進行相似度分析。 準備數據集part1 本次使用的數據集來源於前幾年的碩士學位論文,可根據實際需要更換。結構如下所示: 學位論文題名 基於捲積神經網路的人臉識別研究 P2P流媒體視頻點播系統設計和研究 校園網安全體系的設計與實現 無線感測器網路中 ...
前言
對中文標題使用餘弦相似度演算法
和編輯距離相似度分析
進行相似度分析。
準備數據集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中,使用這兩種演算法能夠簡單實現文本分析。