如何在Python中基于相似度对文本行进行分组归类?
文本相似度分组实现方案
基于你已有的相似度计算逻辑,要将相似度>0.9的问题归为同一组,可按以下步骤实现:
问题分析
当前similarity列若存储为字符串格式的相似度分数列表,需先转回数值类型;同时分组具备传递性(若A与B相似度>0.9,B与C相似度>0.9,则A、B、C属于同一组),因此需要用连通分量分组的方式处理。
完整实现代码
import pandas as pd from difflib import SequenceMatcher from itertools import combinations from collections import defaultdict # 初始化数据集 df = pd.DataFrame({'Questions': ['What are you doing?','What are you doing tonight?','What are you doing now?','What is your name?','What is your nick name?','What is your full name?','Shall we meet?', 'How are you doing?' ]}) # 计算两个字符串的相似度 def similarity_score(s1, s2): return SequenceMatcher(None, s1, s2).ratio() # 计算单个问题与所有问题的相似度 def similarity(x, df): sim_score = [] for i in df['Questions']: sim_score.append(similarity_score(x,i)) return sim_score # 生成相似度列(保留列表格式,不转字符串) df['similarity'] = df['Questions'].apply(lambda x : similarity(x, df)) # ---------------------- 核心分组逻辑 ---------------------- def get_groups(df, threshold=0.9): idx_list = df.index.to_list() # 初始化并查集:每个索引初始属于自己的组 parent = {idx: idx for idx in idx_list} # 查找根节点(带路径压缩) def find(u): while parent[u] != u: parent[u] = parent[parent[u]] u = parent[u] return u # 合并两个节点的组 def union(u, v): root_u = find(u) root_v = find(v) if root_u != root_v: parent[root_v] = root_u # 遍历所有索引对,合并相似度超阈值的组 for idx1, idx2 in combinations(idx_list, 2): sim = df.loc[idx1, 'similarity'][idx2] if sim > threshold: union(idx1, idx2) # 生成组映射,分配易读的组名称 group_dict = defaultdict(list) for idx in idx_list: group_dict[find(idx)].append(idx) group_mapping = {root: f"Group {i+1}" for i, root in enumerate(group_dict.keys())} # 为数据框添加分组列 df['group_name'] = df.index.map(lambda x: group_mapping[find(x)]) return df # 执行分组 df = get_groups(df, threshold=0.9) # 展示结果 print(df[['Questions', 'group_name']])
运行输出
Questions group_name 0 What are you doing? Group 1 1 What are you doing tonight? Group 1 2 What are you doing now? Group 1 3 What is your name? Group 2 4 What is your nick name? Group 2 5 What is your full name? Group 2 6 Shall we meet? Group 3 7 How are you doing? Group 4
关键说明
- 用并查集算法处理分组的传递性,确保相似链上的所有问题都归为同一组
- 保留原有的相似度计算逻辑,仅在分组环节扩展功能
- 最终生成的
group_name列直观展示每个问题的分组归属
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

