- @[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
- 五、分类和聚类的模型解释
首先导入本项目所需的所有模块。
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 |
本文使用百度所提供的停用词表来去除停用词。
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.
from sklearn.cluster import DBSCAN clf = DBSCAN(eps=0.16, min_samples=10) y = clf.fit_predict(tfidf) # 每个文本对应的簇的编号 (-1 在dbscan中属于噪音簇,里面都是噪音点) print(y)四、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 Pipeline
knn = 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_score
clf = 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。可见SVM对于该文本的分类效果更好。
五、分类和聚类的模型解释文本聚类和文本分类最大的不同是一个是监督是学习,一个是非监督式学习。
文本分类:事先给定分类体系和训练样例(标注好类别信息的文本),将文本分到某个或者某几个类别中。可用于新闻栏目分类、垃圾过滤和推荐系统等。
文本聚类:在文本方向上的应用,首先要把一个个文档的自然语言转换成数学信息,这样形成高维空间点之后再去计算点与点之间的距离,然后将这些距离比较近的聚成一个簇,这些簇的中心成为簇心。而我们做的就是保证簇内点的距离足够近,簇与簇的距离足够远。可用于检索结果的聚类显示和提高检索结果等功能。
参考文献:https://blog.csdn.net/lllhhhv/article/details/124267371



