基於kNN的文字分類原理以及實現

2021-09-30 05:38:30 字數 1197 閱讀 5918

前兩天寫了 基於libsvm中文文字分類 ,只是做到了會用的,要做到知其然知其所以然還是很難的。不過svm的應用很廣泛,除了文字分類,比如人臉識別,手寫識別,甚至驗證碼識別都可以搞定。

knn(k最鄰近)演算法相對而言,就簡單得多了。

1,knn演算法就是找到k個最相似的樣本,這些樣本所在的類,就是當前文件的所屬的類。如下圖:綠色圓圈表示你想分類的文字,其他是已知類別的樣本。圖中其他形狀和綠色圓圈的距離代表了相似度。如果k = 3,就是取3個最相似的文字,那麼1個藍色框,2紅色三角被選中,因為紅色三角多,則綠色圓圈所屬的類就是紅色三角所在的類。如果k = 5,3個藍色框和2個紅色三角選中,那麼就屬於藍色框所屬於的類。knn你也可以取多個類別,就是綠色圓圈既屬於藍色框,也屬於紅色三角所屬的類別。

2,如何計算文章的相似度?建議先看看《數學之美-餘弦定理和新聞分類 》。首先必須對文件分詞,對於所有出現的詞叫做特徵。每個特徵必須有一定的值,這個值是根據某些公式計算出來的比如tf/idf。比如文件x表示為(f1:x1,f2:x2,......,fn:xn)文件y表示為(f1:y1,f2:y2,......,fn:yn)。

x1...xn以及y1...yn都是通過比如tf/idf公式計算出來的(你也可以用別的公式)。f1...fn就是特徵,如果特徵從0....n已經選擇好了,那麼fn可以省略,寫作x (x1,x2,......,xn),y寫作(y1,y2,......,yn)。

如上圖,如果x和y的夾角小,則相似度高,夾角大,則相似度小,那麼計算余弦cos(xy)就可以,越接近1,越相似,還有一種方法時計算內積,就是夾角間的面積,有興趣的同學可以試試。計算cos的公式為:

上面公式很好理解,把資料的代入,就等同下面的公式:

3,第2步是計算兩個文字之間的相似度,剩下的計算很簡單,計算和所有樣本的相似度。然後根據sim的值按照從高到低排序。k 等於幾,就取前幾個。下面有是乙個公式,看起來很麻煩,理解很容易:就是k個鄰居中,屬於哪個類別的多,x就屬於哪個類。

4,實現。實現請參考基於libsvm中文文字分類 中的,分詞部分,特徵提取部分,向量值計算部分,訓練樣本和測試樣本部分。knn的實現**如下:

5,總結。knn的分類方法因為沒有訓練過程,所以,分類時特別慢,因為需要和所有樣本進行比較,同時特徵維數很多,也要影響效率。分類準確度還可以,基本和沒有優化過的svm差不多,70%多。knn的準確度和樣本數量還是蠻相關的,我用每個類下的100個樣本和200個樣本,準確度差了9%左右。knn因為效率的問題,所以在實際中應用還需要慎重。

python使用KNN文字分類

上次爬取的爸爸 媽媽 老師和自己的作文,利用sklearn.neighbors.kneighborsclassifier進行分類。import jieba import pandas as pd import numpy as np import osimport itertools import ...

基於DL的文字分類綜述

新聞分類系統可以幫助使用者實時獲取感興趣的資訊。識別新興新聞主題並根據使用者興趣推薦相關新聞是新聞分類的兩個主要應用。主題分析試圖通過識別文字主題來自動從文字中獲取含義。主題分類是主題分析最重要的組成技術之一。主題分類的目的是為每個文件分配乙個或多個主題,以使其更易於分析。問答系統有兩種型別 抽取式...

機器學習1 KNN文字分類

思想 1.找到與資料最相近k個資料 根據余弦相似度 2.分別找出k條資料的類別,同類別相加,得到最大值,則該類別為測試資料的所屬類。encoding utf 8 from pylab import reload sys defcreatedataset group 1.0,1.1 2.0,2.1 1...