You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:00:32