聚类分析字符串数组

2024-04-26 04:20

本文主要是介绍聚类分析字符串数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

聚类分析字符串数组

对多个字符串进行聚类分析旨在根据它们之间的相似度将这些字符串划分成若干个类别,使得同一类别内的字符串彼此相似度高,而不同类别间的字符串相似度低

小结

  1. 数据要清洗。清洗的足够准确,可能不需要用聚类分析了
  2. 数据要多,聚集点要少,点阵就集中

步骤 1: 数据预处理

标准化:统一字符串的大小写、去除无关字符(如标点符号、空格等)。

步骤 2: 特征提取

  • 词频统计:对于每个字符串,统计其包含的词汇表中词语的出现次数,形成一个词频向量。

  • TF-IDF:除了词频统计,还可以使用TF-IDF(Term Frequency-Inverse Document Frequency)值作为特征。TF-IDF考虑了词语在文档集合中的重要性,对频繁出现但无区分度的词语给予较低的权重。

  • 词嵌入(Word Embeddings):使用预训练的词嵌入模型(如Word2Vec、GloVe或BERT)将每个词语转换为固定长度的稠密向量,然后对每个字符串中所有词语的向量取平均(或加权平均、最大池化等)得到字符串的向量化表示。

步骤 3: 应用聚类算法

选择聚类算法:如K-means、DBSCAN、谱聚类、层次聚类等。选择时需考虑数据特性、所需聚类形状(如球形、任意形状)、是否需要预先指定聚类数量等因素。

运行聚类:将提取的数值特征作为输入,运行所选聚类算法。对于某些算法(如K-means),可能需要多次尝试以确定最优聚类数量(如通过轮廓系数、肘部法则等评估指标)。

步骤 4: 结果解读与评估

可视化:对于较小的数据集,可以使用散点图、热力图、树状图等可视化聚类结果。

主题分析:分析各聚类中心(或代表性样本)的特征,总结聚类主题或类别描述

code (K-means)

import jsonimport numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn.compose import ColumnTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.manifold import TSNEdef compute_string_length(s):return np.array([len(text) for text in s]).reshape(-1, 1)def clean_data(data):data = [s.replace('"', ' ') for s in data]data = [s.split(']')[-1] for s in data]data = [s.split('】')[-1] for s in data]data = [s.lower() for s in data]return datadef analyse(inputs: list[str], n_clusters: int = 10):preprocessed_strings = clean_data(inputs)preprocessed_strings = [[text] for text in preprocessed_strings]# 使用 TF-IDF 向量化文本feature_vectors = TfidfVectorizer(stop_words='english')tfidf_transformer = ColumnTransformer([('tfidf', feature_vectors, 0),  # 对文本列进行 TF-IDF 向量化# ('length', FunctionTransformer(compute_string_length, validate=False), 0)  # 计算字符串长度], remainder='passthrough')  # 其他列原样传递# 将数据转换为 TF-IDF 向量和字符串长度的组合tfidf_matrix = tfidf_transformer.fit_transform(preprocessed_strings)# Step 3:  K-Meanskmeans = KMeans(n_clusters=n_clusters, random_state=42)cluster_labels = kmeans.fit_predict(tfidf_matrix)output = {}for i, v in enumerate(cluster_labels):if v not in output:output[v] = {"name": [], "count": 0, "key": int(v)}output[v]["name"].append(inputs[i])output[v]["count"] += 1sorted_dd_list = sorted(list(output.values()), key=lambda x: x['count'], reverse=True)with open("a.json", "w") as f:f.write(json.dumps(sorted_dd_list, ensure_ascii=False))# Step 4: 可视化 - 使用 t-SNE 和 matplotlibtsne = TSNE(n_components=2, random_state=42, perplexity=4)tfidf_matrix_2d = tsne.fit_transform(tfidf_matrix.toarray())plt.figure(figsize=(10, 5))for i in range(n_clusters):mask = (cluster_labels == i)plt.scatter(tfidf_matrix_2d[mask, 0],tfidf_matrix_2d[mask, 1],c="red",label="",alpha=0.8,edgecolors='none')plt.legend()plt.title('String Collection Clustering Results (t-SNE Projection)')plt.show()if __name__ == '__main__':demo = ["Concealer covers face with spots, pimples, dark circles, eyes and tears","【 Import day price 】Makeup revolution Concealer cover the face spots, acne, black eye circles, tears do not take off makeup","Makeup revolution Concealer Party sister K sister recommended to cover acne dark circles lasting moisturizing moisture","Concealer covers face with spots, pimples, dark circles, eyes and tears","Makeup revolution Concealer Party sister K sister recommended to cover acne dark circles lasting moisturizing moisture","Makeup revolution Concealer Party sister K sister recommended to cover acne dark circles lasting moisturizing moisture","Omorovicza Ultra Tonic Oil 30ml","【 Mia Exclusive 】MZ SKIN 2% hyaluronic Acid Filling Lip Care 3ml","Mz Skin Perfect Repair Mask 5 pieces/box","NAPIERS Micro Silver Deep Cleansing Mask 100ml canned skin care products clean and soften","【 Pre-sale 】MZ SKIN 2% hyaluronic Acid Filling Lip Care 3ml", "Omorovicza Body Massage Oil 100ml","Omorovicza Midnight Wake Up Inception Essence 2ml", "MZ SKIN 5-Day White Rejuvenating Ampere 2ml*2","MZ SKIN10% Vitamin C Whitening Serum 5ml", "Mz Skin 5-Day White Rejuvenating Ampere 10*2ml","Mz Skin Perfect Repair Mask sheet"]analyse(demo, 5)

运行后的json文件里有聚集点的原始字符串在这里插入图片描述

这篇关于聚类分析字符串数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936703

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.