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