目录

一、数据

二、代码

2.1、加载停用词

2.2、加载数据

2.3、计算tf-idf向量值

2.4、训练

三、完整代码


一、数据

通过爬虫爬取贴吧数据,这里怎么爬取的就不记录了。然后以一句一行的格式存入到txt中。接着我们要通过对每句话进行分词转向量,最后使用kmeans进行聚类并输出结果。

二、代码

2.1、加载停用词

在stop_words目录下有多个停用词表,需要循环加总所有停用词。

def defined_stop_words():all_stop_words = []for i, file in enumerate(os.listdir(r'D:\Gitlab\extract_key\stop_words')):# 读取图片filepath = fr'D:\Gitlab\extract_key\stop_words\{file}'with open(filepath, 'r', encoding='utf-8') as fp:all_line = fp.readlines()for line in all_line:all_stop_words.append(line.replace('\n',''))return all_stop_words

2.2、加载数据

这边主要是对原始数据的一个筛选+jieba分词+去停用词。这是相对标准的一个流程。


def loadDataset(filepath):'''导入文本数据集'''dataset = []key_list = ['公司','项目','专业投资团队','元宇宙投资项目','养老项目','养老服务','老年产品','高回报','理财','募集','贷款','抵押','利息','保险','包赔','高利贷']with open(filepath,'r',encoding='utf-8') as fp:all_line = fp.readlines()for line in all_line:dataset.append(line.replace('\n','' ))fp.close()# print(len(dataset))# # 随机抽样10W条# dataset = random.sample(dataset,10000)# print(len(dataset))# 加载停用词stop_words = defined_stop_words()all_sen = []original_sen = []for sen in list(set(dataset)):# 判断句子是否包含关键字for key in key_list:if operator.contains(sen,key):sentence = ""# jieba分词word = jieba_postag(sen)for w in word:# 去停用词if w.word not in stop_words:sentence += w.word + ' 'all_sen.append(sentence)original_sen.append(sen)break#         原句       原句分词结果return original_sen,all_sen

2.3、计算tf-idf向量值

X返回输入dataset的向量值,参数看数据选择合适的。

def transform(dataset, n_features=1000):vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2, use_idf=True)X = vectorizer.fit_transform(dataset)return X, vectorizer

2.4、训练

这里选择Kmeans的方式,自定义k值,欠考虑的一个方案。

def train(X, vectorizer, true_k=10, minibatch=False):# 使用采样数据还是原始数据训练k-means,if minibatch:km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,init_size=1000, batch_size=1000, verbose=False)else:km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1,verbose=False)km.fit(X)# 报存模型save_model_file(km,'Kmeans.pkl')result = list(km.predict(X))print('Cluster distribution:')print(dict([(i, result.count(i)) for i in result]))return km.score(X),result

三、完整代码

根据实际的数据情况有部分是需要调整的,这里是做的文本聚类。这样盲目的定义k的取值为100是不太合理的。感兴趣的可以看下Canopy算法,它能根据你的数据集来输出最佳k的取值。使用Canopy + Kmeans 或许效果会好一些。

from __future__ import print_function
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans, MiniBatchKMeans
import pandas as pd
import sys
import os
import jieba.posseg as pseg
import operator
import random
from sklearn.externals import joblibdef save_model_file(model,save_model_name):joblib.dump(model, save_model_name)def jieba_postag(text):words = pseg.cut(text)return wordsdef defined_stop_words():all_stop_words = []for i, file in enumerate(os.listdir(r'D:\Gitlab\extract_key\stop_words')):# 读取图片filepath = fr'D:\Gitlab\extract_key\stop_words\{file}'with open(filepath, 'r', encoding='utf-8') as fp:all_line = fp.readlines()for line in all_line:all_stop_words.append(line.replace('\n',''))return all_stop_wordsdef loadDataset(filepath):'''导入文本数据集'''dataset = []key_list = ['公司','项目','专业投资团队','元宇宙投资项目','养老项目','养老服务','老年产品','高回报','理财','募集','贷款','抵押','利息','保险','包赔','高利贷']with open(filepath,'r',encoding='utf-8') as fp:all_line = fp.readlines()for line in all_line:dataset.append(line.replace('\n','' ))fp.close()# print(len(dataset))# # 随机抽样10W条# dataset = random.sample(dataset,10000)# print(len(dataset))stop_words = defined_stop_words()all_sen = []original_sen = []for sen in list(set(dataset)):# 判断句子是否包含关键字for key in key_list:if operator.contains(sen,key):sentence = ""# jieba分词word = jieba_postag(sen)for w in word:# 去停用词if w.word not in stop_words:sentence += w.word + ' 'all_sen.append(sentence)original_sen.append(sen)breakreturn original_sen,all_sendef transform(dataset, n_features=1000):vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2, use_idf=True)X = vectorizer.fit_transform(dataset)return X, vectorizerdef train(X, vectorizer, true_k=10, minibatch=False):# 使用采样数据还是原始数据训练k-means,if minibatch:km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,init_size=1000, batch_size=1000, verbose=False)else:km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1,verbose=False)km.fit(X)# 报存模型save_model_file(km,'Kmeans.pkl')result = list(km.predict(X))print('Cluster distribution:')print(dict([(i, result.count(i)) for i in result]))return -km.score(X),resultdef test():'''测试选择最优参数'''# 读数据filepath = r'D:\Gitlab\extract_key\all.txt'original_data,dataset = loadDataset(filepath)X, vectorizer = transform(dataset, n_features=500)train_score,class_result = train(X, vectorizer, true_k=100)socre = train_score / len(dataset)print(socre)abc_dict = {'original_sentence':original_data,'class':class_result,'cut_words':dataset}result = pd.DataFrame(abc_dict)# print(result)result.to_csv('result.csv',index=False)if __name__ == '__main__':test()

Python实现Kmeans文本聚类相关推荐

  1. 机器学习算法Python实现:kmeans文本聚类

    # -*- coding:utf-8 -* #本代码是在jupyter notebook上实现,author:huzhifei, create time:2018/8/14 #本脚本主要实现了基于py ...

  2. [python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像

    0 前言 本文主要讲述以下几点:         1.通过scikit-learn计算文本内容的tfidf并构造N*M矩阵(N个文档 M个特征词):         2.调用scikit-learn中 ...

  3. 使用Spark+Hanlp进行简单的文本处理(中)-Kmeans文本聚类

    文本聚类 1. TFIDF TFIDF全程叫做term frequency–inverse document frequency,即文本频率与逆文档频率指数, TFIDF就是为了表征一个token的重 ...

  4. [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. K-means算法及文本聚类实践

    K-Means是常用的聚类算法,与其他聚类算法相比,其时间复杂度低,聚类的效果也还不错,这里简单介绍一下k-means算法,下图是一个手写体数据集聚类的结果. 基本思想 k-means算法需要事先指定 ...

  6. 第1关:无监督学习的文本聚类

    1. 无监督学习的特点有: B. 不需要带标签的数据 D. 无法量化效果 2. 下列哪项是无监督学习的方法? C. 聚类 3. 常用的聚类方法有 A. KMeans D. DBSCAN 第2关:基于 ...

  7. [python] 基于k-means和tfidf的文本聚类代码简单实现

    俗话说"外行看热闹,内行看门道",作为一个机器学习的门外汉,刚研究python机器学习scikit-learn两周时间,虽然下面这段程序可能对于那些专研算法或机器学习的人来说非常简 ...

  8. 【项目实战】Python基于KMeans算法进行文本聚类项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 随着计算机技术的发展.Web 应用的逐步普及,大量的电子文本已经 ...

  9. 【python数据挖掘课程】二十四.KMeans文本聚类分析互动百科语料

    这是<Python数据挖掘课程>系列文章,也是我上课内容及书籍中的一个案例.本文主要讲述文本聚类相关知识,包括中文分词.数据清洗.特征提取.TF-IDF.KMeans聚类等步骤.本篇文章为 ...

  10. 中文文本聚类(切词以及Kmeans聚类)

    简介 一 切词 二 去除停用词 三 构建词袋空间VSMvector space model 四 将单词出现的次数转化为权值TF-IDF 五 用K-means算法进行聚类 六 总结 简介 查看百度搜索中 ...

最新文章

  1. Google Java编程风格指南中文版
  2. 我的android studio
  3. Oracle命令--数据文件被误删后的处理
  4. mysql全局变量 error_记录——node-mysql连接池遇到的全局变量问题
  5. _ASSERTE(_CrtIsValidHeapPointer(pUserData))错误详解
  6. jquery-窗口滚动事件-属性操作
  7. 操作系统—进程的状态与状态的转换
  8. 视图,触发器,事务,存储过程,函数与流程控制,索引
  9. docker中 system limit for_java中的split函数的坑
  10. 这是 iPhone 6主板?包含 802.11ac WiFi、NFC 芯片
  11. 深度学习结合SLAM的研究思路/成果整理之(二)语义SLAM 端到端
  12. 关于杂质过滤的一点研究
  13. 【Python】获取数组中非零元素
  14. C++——隐式类型转换
  15. 【编程小技巧】实现弹窗、选项、关机(文件后缀改成.vbs)
  16. Redis数据库常用操作命令(查询db、key、value)
  17. C++11精要学习:decltype的功能与使用
  18. c++|类静态成员之英雄类
  19. 机器学习实战(1)—— 机器学习基础
  20. opencv应用——以图拼图

热门文章

  1. c语言编程 碰撞的小球,小球碰撞游戏程序代码,求注释,越详细越好》》》
  2. java解析魔兽争霸3录像_《魔兽争霸》的录像,为什么长达半小时的录像大小只有几百 KB?...
  3. Microled简介及关键工艺(巨量转移)
  4. htc G18 一键解锁,3键root
  5. QT | 聊聊QT与直播流播放——从QMediaPlayer到Qt-AV
  6. Android--使用融云SDK开发即时聊天(一)----基本环境搭建
  7. linux so库反编译命令,使用IDA反编译.so文件并修改
  8. 计算机视觉是否已经进入瓶颈期?
  9. java程序员 英文简历_Java程序员英文简历
  10. python tkinter frame教程_Tkinter教程之Frame 框架