文本聚类与分类

引入库

首先导入本项目所需的所有模块。

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.

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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年6月8日 上午11:47
下一篇 2022年6月8日 上午11:49

相关推荐