[NLP] 中文文本相似度实战
原文: https://blog.csdn.net/github_36326955/article/details/54891204
1. 計算文本相似度的常用算法
(1) 基于詞向量: 余弦相似度, 曼哈頓距離, 歐幾里得距離, 明式距離(是前兩種距離測度的推廣)
(2) 基于字符: 編輯距離, simhash(適用于海量數據), 共有字符數(有點類似 onehot 編碼, 直接統計兩個文本的共有字符數, 最naive)
(3) 基于概率統計: 杰卡德相似系數
(4) 基于詞嵌入模型: word2vec/doc2vec
2. TF-IDF簡介
TF-IDF = term frequency–inverse document frequency = 詞頻-逆文本頻率指數
思想: 如果某個詞或短語在一篇文章中出現的頻率TF高, 并且在其他文章中很少出現, 則認為此詞或者短語具有很好的類別區分能力, 適合用來分類.
具體原理描述:
TF: 某個詞在該文件中出現的次數(往往會被歸一化).
IDF: 度量詞語的普遍性, 某一詞語的IDF=log包含該詞語的文件數目總文件數目IDF=log?包含該詞語的文件數目總文件數目
如果一個詞語的TF很高而IDF很低, 則它的TF-IDF權重就會很高, 即該詞語有很好的分類能力.
3. sklearn庫
sklearn是基于numpy和scipy的一個機器學習算法庫.
3.1 該庫共包括三大模塊:
監督學習: neighbors, svm, kernel-ridge, discriminant_analysis 等
無監督學習: cluster, manifold, mixture, neural_network 等
數據變換: feature_extraction, feature_selection, preprocess 等
4. 數據集和訓練任務
tmt.txt, eng.txt, food.txt: 這三個txt文件是訓練數據, 每一行都是一個物品的介紹, 文件名指的是產品的類別(訓練集共包含三個類別的產品).
test.txt: 這個txt文件是測試數據, 和訓練數據一樣每一行都是一個物品的介紹, 要訓練一個模型來判斷每一行說的是那種物品.
在訓練之前, 我把這些txt文件都按行拆分為了很多小txt, 如tmt_1.txt中的內容是tmt.txt第一行的內容. txt文件的按行拆分可以使用”txt殺手”這個小工具.
5. 整個訓練步驟
(1) 用jieba分詞(corpus_segment.py).
主要使用了jieba這個工具庫.
(2) 把分好的詞轉換為sklearn庫中的Bunch格式(corpus2Bunch.py).
分詞后的結果依然是一系列的txt文件, 這一步是把它們變成變量, 采用的是sklearn庫中的Bunch數據結構. Bunch結構可以理解為字典, 它的每一行都包含了四個信息: 類別(target_name, 包括tmt, eng, food, test), 文件名(filenames), 文本標簽(label, 包括tmt, eng, food), 文本內容(contents).
bunch = Bunch(target_name=[], label=[], filenames=[], contents=[])(3) 用TF-IDF構建有權詞向量空間(TFIDF_space.py).
這部分的任務是構建詞向量空間W.
每一個詞都是W的一個維度(好比是三維空間中的x, y, z), 該維度上的值是該詞的權重(由TF-IDF算出). 為了減少W的維度, 要把沒用的詞(如”的”, “了”等)去掉, 為實現這個功能可以使用一個停用詞表, 把沒用的詞剔除.
注意測試集和訓練集要用同一個詞向量空間W. 因此測試集出現但是訓練集中沒有出現的詞將不再設為W的一個維度.
該部分最后的運行結果有兩個: (1) 詞典(單詞及其對應的序號), (2) 權重矩陣tdm(該矩陣是二維的, 即tdm[i][j]表示第i個詞在第j個類別中的權值).
(4) 用樸素貝葉斯算法對test數據進行分類(NBayes_Predict.py).
所有源碼: https://github.com/YasinQiu/Chinese-Text-Classification-NBayes
總結
以上是生活随笔為你收集整理的[NLP] 中文文本相似度实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hping3 使用 (构造dos攻击)
- 下一篇: 自适应中值滤波器(基于OpenCV实现)