数据采集与处理技术(如何掌握Kmeans聚类算法的全过程)

    1. 实验目的
  1. 熟练掌握文本分析的常用步骤,包括但不限于分词、特征抽取、相似度计算等;
  2. 熟练掌握Kmeans聚类算法的全过程,包括但不限于类中心初始化与更新、数据点聚类等。
    1. 实验工具
  1. 编程语言:Python;
  2. 开发环境:PyCharm(或Sublime Text、Eclipse + PyDev、Visual Studio等);
  3. 常用模块:jieba、sklearn、biopython等。
    1. 实验题目

利用KMeans聚类算法对新闻文章进行聚类,并观察聚类个数K和初始类中心点对聚类效果的影响。

  1. 从新闻文章中抽取出两个数据集,其中一个数据集的文章类型固定,另一个的文章类型不确定,并分别对这两个数据集进行实验分析;
  2. 以tf-idf值作为词语特征,余弦相似度作为文本相似性的度量函数,对新闻文章进行聚类。
    1. 实验步骤

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')

    1. 实验心得

简要介绍在Kmeans聚类算法中,聚类个数K、初始类中心、迭代次数等因素对聚类效果的影响?

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值