自然语言处理实战项目6-无监督学习之文本聚类分析,将任意文本分类

news2024/10/7 18:25:20

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目6-无监督学习之文本聚类分析,将任意文本分类。当今互联网上的数据量越来越大,机器学习技术越来越成熟。在这种情况下,将文本按其主题或者意义进行分类是一项重要任务,这就需要用到文本聚类分析技术。文本聚类分析是指将一组文档(或句子、单词等)根据它们之间的相似性进行分类,形成若干个簇(Cluster)。它是文本挖掘中的重要技术之一,可以用于文本分类、信息检索、智能推荐等领域。

一、聚类原理:相似度计算

余弦相似度:该方法基于向量空间模型,将每个文档表示为一个向量,并计算两个向量之间的余弦值作为它们的相似度。

欧氏距离:该方法采用欧式距离作为度量标准,即计算两个向量之间的距离,距离越近则相似度越高。

曼哈顿距离:该方法也是一种距离度量方法,计算两个向量之间的曼哈顿距离,即两点在坐标系上的横纵坐标距离之和。

皮尔逊相关系数:该方法用于度量两个变量之间的线性相关性,可用于计算文档之间的相似度。

二、聚类方法

基于原型的聚类(Prototype-based Clustering):该方法将每个簇表示为一个原型或代表性对象,并将其他文档分配到与其最相似的簇中。常见的原型包括均值向量、中心点或者某个随机样本。

层次聚类(Hierarchical Clustering):该方法将所有文档看作一个大的簇,然后逐步划分子簇,直到达到停止条件。可以分为自下而上的聚合和自上而下的分裂两种方式。

密度聚类(Density-based Clustering):该方法将簇定义为密度高、密度低的区域,通过寻找局部密度峰值来识别簇。常用的密度聚类算法包括 DBSCAN 和 OPTICS 等。

三、文本预处理

在进行文本聚类前,需要对文本进行预处理,包括分词、去停用词、词干提取等。这些预处理步骤可以减少不必要的噪声和冗余信息,提高聚类效果。

四、实现代码

本文采用K-means聚类算法实现文本的聚类分析,数据data.csv样例:

text,label
文本1,类别1
文本2,类别1
文本3,类别1
文本4,类别1
文本5,类别2
文本6,类别2
文本7,类别2
文本8,类别3
文本9,类别3
文本10,类别3

引入KMeans聚类分析模型,导入数据继续训练聚类分析,代码如下:

#coding utf-8
import csv
import jieba
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import os
import re
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 对中文文本进行分词
def tokenize_text(text):
    return " ".join(jieba.cut(text))

# 去除标点符号
def remove_punctuation(text):
    punctuation = '!"#,。、$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
    text = re.sub(r'[{}]+'.format(punctuation), '', text)
    return text

# 将分词后的文本转化为tf-idf矩阵
def text_to_tfidf_matrix(texts):
    tokenized_texts = [tokenize_text(remove_punctuation(text)) for text in texts]
    vectorizer = TfidfVectorizer()
    tfidf_matrix = vectorizer.fit_transform(tokenized_texts)
    return tfidf_matrix

# 聚类函数
def cluster_texts(tfidf_matrix, n_clusters):
    kmeans = KMeans(n_clusters=n_clusters)
    kmeans.fit(tfidf_matrix)
    return kmeans.labels_

# 保存聚类结果到新的CSV文件
def save_clusters_to_csv(filename, texts, labels):
    base_filename, ext = os.path.splitext(filename)
    output_filename = f"{base_filename}_clusters{ext}"
    with open(output_filename, "w", encoding="utf-8", newline="") as csvfile:
        csvwriter = csv.writer(csvfile)
        for text, label in zip(texts, labels):
            csvwriter.writerow([text, label])
    return output_filename

# 输出聚类结果
def print_cluster_result(texts, labels):
    clusters = {}
    for i, label in enumerate(labels):
        if label not in clusters:
            clusters[label] = []
        clusters[label].append(texts[i])

    for label, text_list in clusters.items():
        print(f"Cluster {label}:")
        for text in text_list:
            print(f"  {text}")

def text_KMeans(filename,n_clusters):
    df = pd.read_csv(filename, encoding='utf-8')  # 读取csv文件
    texts = df['text'].tolist()  # 提取文本数据为列表格

    print(df.iloc[:, [0, -1]])
    # 将文本转化为tf-idf矩阵
    tfidf_matrix = text_to_tfidf_matrix(texts)
    # 进行聚类
    labels = cluster_texts(tfidf_matrix, n_clusters)
    clusters = []
    for i, label in enumerate(labels):
        clusters.append(label)

    df['cluster'] = clusters

    output = 'data_clustered.csv'
    df.to_csv('data_clustered.csv', index=False, encoding='utf-8')

    return output,labels,tfidf_matrix

def pca_picture(labels,tfidf_matrix):
    # 进行降维操作并将结果保存到DataFrame中
    pca = PCA(n_components=3)
    result = pca.fit_transform(tfidf_matrix.toarray())
    result_df = pd.DataFrame(result, columns=['Component1', 'Component2', 'Component3'])

    # 将聚类结果添加到DataFrame中
    result_df['cluster'] = labels

    # 绘制聚类图形
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    colors = ['red', 'blue', 'green']
    for i in range(3):
        subset = result_df[result_df['cluster'] == i]
        ax.scatter(subset['Component1'], subset['Component2'], subset['Component3'], color=colors[i], s=50)
    ax.set_xlabel("Component 1")
    ax.set_ylabel("Component 2")
    ax.set_zlabel("Component 3")
    plt.show()

if __name__ == "__main__":
    # 加载中文文本
    filename = "data.csv"
    n_clusters =3
    output,labels,tfidf_matrix = text_KMeans(filename, n_clusters)
    pca_picture(labels, tfidf_matrix)

运行结果:

 运行后可以生成新的文件,并将文本聚类后的标签添上了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地部署 Whisper

本地部署 Whisper 1. 什么是 Whisper2. Github 地址3. 创建虚拟环境4. 安装 ffmpeg5. 部署 Whisper6. 使用 Whisper 1. 什么是 Whisper Whisper 是一个通用的语音识别模型。它是在一个大型的不同音频数据集上训练出来的&#xff0c;也是一个多任务模型&#xff0c;可以进行多语…

微服务介绍 SpringCloud,服务拆分和远程调用,注册中心Eureka,负载均衡Ribbon,注册中心Nacos

一、微服务介绍 1.系统架构的演变 什么是微服务&#xff0c;微服务有哪些特征SpringCloud是什么SpringCloud与Dubbo的区别 1.单体架构 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。当网站流量很小时&#xff0c;单体架构非常合适 1.单体架构 优点&a…

为什么我说自学黑客(网络安全),一般人还是算了吧!

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

Spark大数据处理讲课笔记4.1 Spark SQL概述、数据帧与数据集

文章目录 零、本讲学习目标一、Spark SQL&#xff08;一&#xff09;Spark SQL概述&#xff08;二&#xff09;Spark SQL功能&#xff08;三&#xff09;Spark SQL结构1、Spark SQL架构图2、Spark SQL三大过程3、Spark SQL内部五大组件 &#xff08;四&#xff09;Spark SQL工作…

大型剧本杀游戏小程序

大型剧本杀游戏具有以下几个方面的前景&#xff1a; 娱乐市场需求增加&#xff1a;随着人们对于娱乐方式的多样化需求增加&#xff0c;大型剧本杀游戏作为一种互动性强、参与感强的娱乐形式&#xff0c;将会得到越来越多的关注和喜爱。 适应移动端用户&#xff1a;大型…

Git-git的使用、分支、本地仓与远程仓、idea中使用

Git Git 简介 ​ Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 [1] 也是[Linus Torvalds](https://baike.baidu.com/item/Linus Torvalds/9336769)为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git…

PyTorch Geometric (PyG) 库的安装

PyG 库的安装 前言1、PyG库的安装过程2、版本问题解决 前言 最近在学习图神经网络&#xff0c;需要用到PyG库&#xff0c;发现这个库的安装不能简单的使用pip install 安装&#xff0c;这里记录一下。 1、PyG库的安装过程 第一步&#xff1a;查看自己的torch版本和cuda版本 …

ASEMI代理HMC408LP3ETR原装ADI车规级HMC408LP3ETR

编辑&#xff1a;ll ASEMI代理HMC408LP3ETR原装ADI车规级HMC408LP3ETR 型号&#xff1a;HMC408LP3ETR 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;QFN-16 批号&#xff1a;2023 引脚数量&#xff1a;16 工作温度&#xff1a;-40C~85C 安装类型&#xff1a;表面贴装型…

软件行业网络推广解决方案_上海添力

软件行业也属于B2B型的企业服务业务&#xff0c;由于这类企业都是轻资产&#xff0c;重人力&#xff0c;所以有个显著的特点就是公司再小&#xff0c;也会有健全的市场部&#xff1b;销售收入再少&#xff0c;也会在线上推广上大量投资&#xff0c;有的公司甚至把网络营销当成了…

vue 脚手架新手入门(vue cli 2)

文章目录 写在前面1、创建一个vue项目2、项目结构2.1、写两个页面试试2.2、代码解释 3、前后端对接3.1、使用 axios 发起简单请求3.2、 路由 的使用3.2.1、配置默认地址前缀3.2.2、添加子路由3.2.3、切换路由3.2.4、监听路由3.2.5、方法调用 与 页面刷新3.2.6、this.$route 获取…

Golang笔记:执行外部程序与Shell命令

文章目录 目的使用演示Cmd结构体总结 目的 程序中执行外部程序是比较常用的功能&#xff0c;Golang执行外部程序可以使用标准库中的 os/exec https://pkg.go.dev/os/exec 。这个包默认是用来执行外部程序的&#xff0c;可以通过调用Shell程序来执行Shell命令。这篇文章将对相关…

FastDFS集群搭建及StringBoot整合

简介 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文件访问&#xff08;文件上传、文件下载&#xff09;等&#xff0c;解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务&…

MySQL-5.56-MariaDB 转到MySQL-8.0.33过程笔记

MySQL-5.56-MariaDB 转到MySQL-8.0.33过程笔记 将MySQL 5中的数据导出并导入到MySQL8中在MySQL8中执行带有 GROUP BY的语句时会报错&#xff1a;同样的SQL查询语句&#xff0c;在MySQL5&#xff08;这里测试是5.5版本-MaraiaDB&#xff09;执行速度正常&#xff0c;但是在MySQL…

<IBM AIX> 《AIX中HA的网卡IP确认方法》

《HA网卡确认方法》 1 HA IP地址类型2HA IP地址设置原则3 HA网卡日常查看方法3.1 查看hosts文件3.2 查看网卡和IP 4 通过命令方式直接查看5 直接查看HA配置4 HA网卡SMIT查看方法&#xff08;暂不完整&#xff09;4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…

具有区域/边缘一致性的形状感知弱/半监督Disc and Cup状物分割

文章目录 Shape-Aware Weakly/Semi-Supervised Optic Disc and Cup Segmentation with Regional/Marginal Consistency摘要本文方法Modified Signed Distance Function (mSDF )Dual Consistency Regularisation of Semi-SupervisionDifferentiable vCDR estimation of Weakly S…

vue3+vite+多页面应用(MPA)示例

环境配置&#xff1a; 在硬盘里找个地方放项目内容&#xff1a;如&#xff1a;E:\vue3vitepros&#xff0c; 打开vscode,菜单》终端》新建终端&#xff0c;输入命令&#xff1a;cd E:\vue3vitepros 回车,然后依次运行下面命令&#xff1a; 1&#xff0c;安装vite:安装过的忽略此…

【开发必备】推荐几个非常好用的前端VsCode插件,快来看看你都用过哪些?

VSCode是前端开发的武器&#xff0c;下面给大家推荐几个必备的、非常好用的前端VsCode插件 1.Better Align Better Align就是一款能够实现代码规范的工具&#xff0c;它主要用于代码的上下对齐。它能够用冒号&#xff08;&#xff1a;&#xff09;、赋值&#xff08;&#xf…

Mybatis根据Bean生成对应的SQL语句工具类

Mybatis根据Bean生成对应配置SQL的语句 前言为什么不用MyBatis-PlusMybatis的困扰插入和更新查询 crud工具类MybatisCrudHelp.java 测试类需要注意的点 前言 在进入这一节知道MyBatis-Plus的人可能有人要问了&#xff1a;为什么我不用Mybatis-plus&#xff1f; 为什么不用MyB…

【JAVAEE】单例模式的介绍及实现(懒汉模式和饿汉模式)

目录 1.单例模式 1.1概念 1.2单例模式的实现方式 怎么去设计一个单例 饿汉模式 懒汉模式 懒汉模式-多线程版 解决懒汉模式多线程不安全问题-synchronized 解决懒汉模式多线程不安全问题-volatile 1.单例模式 1.1概念 单例是一种设计模式。 啥是设计模式 ? 设计模式…

机器学习——弹性网估计

机器学习——弹性网估计 文章目录 机器学习——弹性网估计[toc]1 模型介绍2 模型设定3 弹性网估计 1 模型介绍 弹性网估计属于惩罚回归&#xff0c;常见的惩罚回归包括岭回归(ridge)、套索回归(lasso)和弹性网(elasticnet)回归等。 岭回归用于缓解高维数据可能的多重共线性问…