文本聚类与分类
- @[TOC]( )
- 引入庫
- 一、數據預處理
- 1.加載數據
- 2.加載停用詞
- 3.分詞
- 二、數據轉換(tf-idf詞袋模型)
- 2.1 文本轉換成詞袋模型(詞頻作為統計指標)
- 2.2 詞頻統計指標轉換 tf-idf統計指標
- 2.3 對詞頻向量進行降維(PCA)
- 三、文本聚類(DBSCAN)
- 四、sklearn調用knn和svm進行分類.
- 4.1 KNN
- 4.2 SVM
- 五、分類和聚類的模型解釋
- @[TOC]( )
- 引入庫
- 1.加載數據
- 2.加載停用詞
- 2.1 文本轉換成詞袋模型(詞頻作為統計指標)
- 2.2 詞頻統計指標轉換 tf-idf統計指標
- 2.3 對詞頻向量進行降維(PCA)
- 4.1 KNN
- 4.2 SVM
引入庫
首先導入本項目所需的所有模塊。
from LAC import LAC import warnings warnings.filterwarnings('ignore') from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.cluster import KMeans from sklearn.decomposition import PCA以下是本篇文章正文內容。
一、數據預處理
1.加載數據
首先將文本數據和標簽數據導入。
#文本數據 f = open('x1.txt','r',encoding='utf-8') text_list = f.readlines() #標簽數據 labels = [] for line in open('y1.txt', 'r',encoding='utf-8'): #打開文件rs = line.rstrip('\n') # 移除行尾換行符labels.append(rs)labels中標簽的解釋:
| 體育 | 0 |
| 娛樂 | 1 |
| 家具 | 2 |
| 彩票 | 3 |
| 房產 | 4 |
| 教育 | 5 |
| 時尚 | 6 |
| 時政 | 7 |
| 星座 | 8 |
| 游戲 | 9 |
| 社會 | 10 |
| 科技 | 11 |
| 股票 | 12 |
| 財經 | 13 |
2.加載停用詞
本文使用百度所提供的停用詞表來去除停用詞。
stopword_path = "百度停用詞表.txt" with open(stopword_path, 'r', encoding='utf-8') as f:stop_words= [line.strip() for line in f]3.分詞
考慮中文方面分詞jieba的效果不如國內企業百度,因此使用百度的LAC模塊進行分詞,下載LAC這個庫,直接pip install lac即可。
lac = LAC(mode='lac') corpus = []for text in text_list :line = text.strip()lac_result = lac.run(line)corpus.append(' '.join(lac_result[0]))結果上述步驟之后就完成了數據預處理,下面將處理好之后的文本數據進行轉換。
二、數據轉換(tf-idf詞袋模型)
2.1 文本轉換成詞袋模型(詞頻作為統計指標)
countVectorizer = CountVectorizer(stop_words=stop_words,analyzer="word") count_v = countVectorizer.fit_transform(corpus) # 詞袋中的詞語 print(countVectorizer.get_feature_names_out()) # 詞頻向量 print(count_v.toarray())2.2 詞頻統計指標轉換 tf-idf統計指標
tfidfTransformer = TfidfTransformer() tfidf = tfidfTransformer.fit_transform(count_v) print(tfidf.toarray()) tfidf = tfidf.toarray()2.3 對詞頻向量進行降維(PCA)
由于下面將使用DBSCAN算法進行聚類,考慮DBSCAN算法對數據維度敏感,不適合高緯度的數據,因此采用PCA算法對數據進行降維,將數據維度壓縮到二維。
pca = PCA(n_components=2) pca_weights = pca.fit_transform(tfidf) print(pca_weights)三、文本聚類(DBSCAN)
DBSCAN是比較著名的基于密度的聚類方法,它可以輕松地得到各種形狀的簇。
主要有兩個參數,鄰域半徑 ? 以及鄰域內最少數據點數 minpts.
四、sklearn調用knn和svm進行分類.
劃分訓練集與測試集:
X_train = tfidf[:int(len(tfidf)*0.7)] X_test = tfidf[int(len(tfidf)*0.7):] y_train = labels[:int(len(tfidf)*0.7)] y_test = labels[int(len(tfidf)*0.7):]4.1 KNN
KNN的全稱是K Nearest Neighbors,意思是K個最近的鄰居,從這個名字我們就能看出一些KNN算法的蛛絲馬跡了。K個最近鄰居,毫無疑問,K的取值肯定是至關重要的。那么最近的鄰居又是怎么回事呢?其實啊,KNN的原理就是當預測一個新的值x的時候,根據它距離最近的K個點是什么類別來判斷x屬于哪個類別。
from sklearn.neighbors import KNeighborsClassifier from sklearn.pipeline import Pipelineknn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train)print('KNN分類準確率為:',knn.score(X_test, y_test))KNN分類準確率為:0.81467
4.2 SVM
支持向量機 (SVM) 是一個非常經典且高效的分類模型。盡管現在深度學習十分流行, 了解支持向量機的原理,對想法的形式化,簡化, 及一步步使模型更一般化的過程, 及其具體實現仍然有其研究價值。另一方面,支持向量機仍有其一席之地。相比深度神經網絡, 支持向量機特別擅長于特征維數多于樣本數的情況,而小樣本學習至今仍是深度學習的一大難題。
import numpy as np from sklearn import svm from sklearn.metrics import accuracy_scoreclf = svm.SVC(kernel='precomputed') gram_train = np.dot(X_train, X_train.T) clf.fit(gram_train, y_train) gram_test = np.dot(X_test, X_train.T) y_pred = clf.predict(gram_test) print('SVM分類準確率為:',accuracy_score(y_test,y_pred))SVM分類準確率為0.86467??梢奡VM對于該文本的分類效果更好。
五、分類和聚類的模型解釋
文本聚類和文本分類最大的不同是一個是監督是學習,一個是非監督式學習。
文本分類:事先給定分類體系和訓練樣例(標注好類別信息的文本),將文本分到某個或者某幾個類別中。可用于新聞欄目分類、垃圾過濾和推薦系統等。
文本聚類:在文本方向上的應用,首先要把一個個文檔的自然語言轉換成數學信息,這樣形成高維空間點之后再去計算點與點之間的距離,然后將這些距離比較近的聚成一個簇,這些簇的中心成為簇心。而我們做的就是保證簇內點的距離足夠近,簇與簇的距離足夠遠。可用于檢索結果的聚類顯示和提高檢索結果等功能。
參考文獻:https://blog.csdn.net/lllhhhv/article/details/124267371
總結
- 上一篇: 排序算法-C++实现
- 下一篇: 【c基础】入门语法