-
- 实验目的
- 熟练掌握文本分析的常用步骤,包括但不限于分词、特征抽取、相似度计算等;
- 熟练掌握Kmeans聚类算法的全过程,包括但不限于类中心初始化与更新、数据点聚类等。
- 实验工具
- 编程语言:Python;
- 开发环境:PyCharm(或Sublime Text、Eclipse + PyDev、Visual Studio等);
- 常用模块:jieba、sklearn、biopython等。
- 实验题目
利用KMeans聚类算法对新闻文章进行聚类,并观察聚类个数K和初始类中心点对聚类效果的影响。
- 从新闻文章中抽取出两个数据集,其中一个数据集的文章类型固定,另一个的文章类型不确定,并分别对这两个数据集进行实验分析;
- 以tf-idf值作为词语特征,余弦相似度作为文本相似性的度量函数,对新闻文章进行聚类。
- 实验步骤
1. 对新闻文章进行分词,并计算所有词语的tf-idf值;
2. 采用余弦相似度作用相似性度量函数,计算不同新闻文章之间的距离(或相似性);
3. 选择K篇文章作为初始类中心;
4. 计算所有文章到K篇文章之间的距离,并将每篇文章归划到与之最近的类中心上;
5. 更新类中心的特征向量;
6. 重复第4、5步,直至各个类内的文章趋于稳定。
((请附上详细代码、程序运行截图、运行效果等内容))
import os
import re
from os import listdir
import jieba
import pandas as pd
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
outputDir = "D:\数据采集\新浪"
labels = []
corpus = []
size = 480
for i in range(0, 160):
z = '娱乐' + str(i)
labels.append(z)
for i in range(0, 160):
z = '民生' + str(i)
labels.append(z)
for i in range(0, 160):
z = '国际' + str(i)
labels.append(z)
def buildSW():
typetxt = open(r'C:\Users\Hasee\Desktop\3.txt', encoding='utf-8')
x = typetxt.read()
texts = ['\u3000', '\n', ' ']
'''停用词库的建立'''
for word in x:
word = word.strip()
texts.append(word)
return texts
def buildWB(texts):
file1 = pd.read_excel('D:\数据采集\新浪\新浪娱乐.xlsx', engine='openpyxl')
file2 = pd.read_excel('D:\数据采集\新浪\新浪民生.xlsx', engine='openpyxl')
file3 = pd.read_excel('D:\数据采集\新浪\新浪国际.xlsx', engine='openpyxl')
x = file1['正文'].tolist()
x = x[0:161]
x.extend(file2['正文'].tolist())
x = x[0:321]
x.extend(file3['正文'].tolist())
x = x[0:480]
print(len(x))
for i in range(0, len(x)):
doc = x[i]
data = jieba.cut(doc)
data_adj = ''
delete_word = []
for item in data:
if item not in texts:
value = re.compile(r'^[\u4e00-\u9fa5]{2,}$')
if value.match(item):
data_adj += item + ' '
else:
delete_word.append(item)
corpus.append(data_adj)
return corpus
def countIdf(corpus):
vectorizer = CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(
vectorizer.fit_transform(corpus))
weight = tfidf.toarray()
return weight
def Kmeans(weight, clusters, correct):
mykms = KMeans(n_clusters=clusters, max_iter=100)
y = mykms.fit_predict(weight)
result = []
for i in range(0, clusters):
label_i = []
js = 0
gj = 0
gn = 0
for j in range(0, len(y)):
if y[j] == i:
label_i.append(labels[j])
type = labels[j][0:2]
if (type == '娱乐'):
js += 1
elif (type == '民生'):
gj += 1
elif (type == '军事'):
gn += 1
max = js
type = '1'
if (gn > js):
max = gn
type = '2'
if (max < gj):
max = gj
type = '3'
correct[0] += max
result.append('类别' + '(' + type + ')' + ':' + str(label_i))
return result
def output(result, outputDir, clusters):
outputFile = 'out'
type = '.txt'
count = 0
while (os.path.exists(outputDir + outputFile + type)):
count += 1
outputFile = 'out' + str(count)
doc = open(outputDir + outputFile + type, 'w')
for i in range(0, clusters):
print(result[i], file=doc)
print('本次分类总样本数目为:' + str(size) + ' 其中正确分类数目为:' + str(correct[0]) + ' 正确率为:' + str(correct[0] / size), file=doc)
doc.close()
texts = buildSW()
corpus = buildWB(texts)
weight = countIdf(corpus)
clusters = 3
correct = [0]
result = Kmeans(weight, clusters, correct)
output(result, outputDir, clusters)
print('finish')
-
- 实验心得
简要介绍在Kmeans聚类算法中,聚类个数K、初始类中心、迭代次数等因素对聚类效果的影响?
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。