文字相似度分析
1 演算法小結
相信有些人在閒暇時間喜歡讀小說,至於什麼小說在這就不一而論了。就拿我來說最近讀的“一寸山河一寸血”和“混在三國當軍閥”這兩本書,本人感覺很相似,但具體相似多少就需要量化,因此想通過電腦來分析一下。接下來就不廢話直接上原理和具體演算法。
用到演算法的概述:通過TF-IDF計算文字的關鍵詞,如果某個詞很重要,它應該在這篇文章中多次出現,我們進行”詞頻”(Term Frequency,縮寫為TF)統計;另外要對每個詞分配一個”重要性”權重。最常見的詞(”的”、”是”、”在”)給予最小的權重,較常見的詞(”一個”)給予較小的權重,較少見的詞給予較大的權重。這個權重叫做”逆文件頻率,它的大小與一個詞的常見程度成反比。知道了”詞頻”(TF)和”逆文件頻率”(IDF)以後,將這兩個值相乘,就得到了一個詞的TF-IDF值。得到tf-idf通過token2id得到特徵數(可以用來計算的特徵)然後計算稀疏矩陣相似度,從而建立索引,最後計算相似度結果。(TF-IDF演算法就不詳細及介紹哈,這個很多可以查到)
2 具體的步驟:
詳細過程:1)讀取文件(1-6分析文件);2)對要計算的多篇文件進行分詞;3)對文件進行整理成指定格式,方便後續進行計算;4)計算出詞語的頻率;5)對頻率低的詞語進行過濾(看資料量決定);6)通過語料庫建立詞典;7)載入要對比的文件(計算要分析的文件7-13);8)將要對比的文件通過doc2bow轉化為稀疏向量;9)對稀疏向量進行進一步處理,得到新語料庫;10)將新語料庫通過tfidfmodel進行處理,得到tfidf;11)通過token2id得到特徵數(可以用來計算的特徵);12)稀疏矩陣相似度,從而建立索引;13)得到最終相似度結果
3 具體例項
import jieba from gensim import corpora,models,similarities from collections import defaultdict doc1 = 'C:/Users/test2/Desktop/hzsgdjf.txt' d1 = open(doc1,'r',encoding="utf-8").read() data1 = jieba.cut(d1) list1 = [] list = [] for i in data1: list1.append(i) list = [list1] frequency = defaultdict(int)#如果鍵不存在則返回N/A,而不是報錯,獲取分詞後詞的個數 for i in list: for j in i: frequency[j] +=1 #建立詞典 dictionary = corpora.Dictionary(list) #詞典儲存到本地 dictionary.save('C:/Users/test2/Desktop/dic1.txt') doc3 = 'C:/Users/test2/Desktop/ycshycx.txt' d3 = open(doc3,'r',encoding="utf-8").read() data3 = jieba.cut(d3) data31 = [] for i in data3: data31.append(i) new_doc = data31 #稀疏向量.dictionary.doc2bow(doc)是把文件doc變成一個稀疏向量,[(0, 1), (1, 1)],表明id為0,1的詞彙出現了1次,至於其他詞彙,沒有出現。 new_vec = dictionary.doc2bow(new_doc) #獲取語料庫 corpus = [dictionary.doc2bow(i) for i in list] tfidf = models.TfidfModel(corpus) #特徵數 featureNUM = len(dictionary.token2id.keys()) #通過TfIdf對整個語料庫進行轉換並將其編入索引,以準備相似性查詢 index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNUM) #計算向量相似度 sim = index[tfidf[new_vec]] print(sim)
以上程式可以在jupyter中實現,可以實現簡單文字相似度的計算。