如何基于相似度匹配实现字符串列表的自动分组
文本相似度自动分组方案
实现思路
整个流程不需要提前指定分组数量,能自动识别文本里的重复核心模式,步骤如下:
- 文本预处理:统一文本格式,过滤无实际语义的停用词、标点,减少无关内容对相似度计算的干扰
- 相似度计算:通用场景用TF-IDF提取文本特征,计算两两文本的余弦相似度,轻量高效;需要识别近义语义的场景替换为句向量模型即可
- 自动聚类:用DBSCAN密度聚类算法,根据设定的相似度阈值自动划分类别,不需要提前预设分组数
- 结果排序:聚类完成后按每个分组包含的文本数量从多到少排序输出
可直接运行的代码实现
先安装依赖:pip install scikit-learn numpy
对应实现代码:
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity from sklearn.cluster import DBSCAN # 输入待分组的字符串列表 text_list = [ "Anna loves to speak to Mary", "Joey like to work with Jefferson", "Michael loves to speak to John when he's on the shelf", "Karen hates crying at her son" ] # 向量化文本,自动过滤英文停用词 vectorizer = TfidfVectorizer(stop_words="english") tfidf_vec = vectorizer.fit_transform(text_list) # 计算文本间的余弦相似度,转换为距离矩阵供聚类使用 sim_matrix = cosine_similarity(tfidf_vec) dist_matrix = 1 - sim_matrix # 聚类,eps为距离阈值,值越大越容易把不同文本归为同一组,可根据实际效果调整 cluster_model = DBSCAN(eps=0.7, min_samples=1, metric="precomputed") labels = cluster_model.fit_predict(dist_matrix) # 整理分组结果,按组内文本数量降序排列 group_res = {} for text, lab in zip(text_list, labels): group_res.setdefault(lab, []).append(text) sorted_groups = sorted(group_res.values(), key=lambda x: len(x), reverse=True) # 打印输出 for idx, content in enumerate(sorted_groups, 1): print(f"分组{idx}:") for line in content: print(line) print()
效果说明
针对给出的示例输入,上述代码运行后输出结果和参考分组完全一致:
分组1: Anna loves to speak to Mary Michael loves to speak to John when he's on the shelf 分组2: Joey like to work with Jefferson 分组3: Karen hates crying at her son
参数调整技巧
- 若分组过粗、不相关文本被分到同一组:把
eps参数调小(比如降到0.5),提高相似度判定门槛 - 若分组过碎、相似文本被拆到不同组:把
eps参数调大(比如升到0.8),放宽相似度判定要求 - 若需要处理中文文本,把TfidfVectorizer的停用词换成中文停用词表即可;需要识别近义表述的场景,把TF-IDF向量化部分替换为轻量句向量模型,后续聚类逻辑无需改动。
内容的提问来源于stack exchange,提问作者aac
相关产品推荐
相关产品推荐

