如何用Python基于文本模式聚合高相似度数据行?
文本相似度聚合方案
针对你提到的文本消息聚合需求(核心内容一致、仅细节差异的行合并,计数求和),可以按以下步骤实现:
一、核心匹配逻辑定义
首先要明确"核心内容一致"的判断规则,针对你的示例(abc 和 abc:very specific message),可以优先采用两种实用规则:
- 前缀匹配:判断短文本是否是长文本的前缀(可忽略大小写),比如
abc是abc:xxx的前缀,判定核心一致 - 分割符提取核心:用固定分隔符(比如示例中的
:)拆分文本,取第一部分作为核心标识
二、具体算法步骤
- 文本标准化:统一文本大小写(如果你的场景中大小写不影响核心判断),避免
ABC和abc被误判 - 构建核心映射表:
- 遍历所有文本,提取每条文本的核心标识(按前缀/分割规则)
- 为每个核心标识保留最简洁的原始文本(比如优先选短文本,而非带后缀的长文本)
- 计数聚合:将同一核心标识对应的
column2计数求和 - 生成结果:用核心映射的简洁文本和聚合后的计数输出最终数据集
三、代码示例(Python)
import pandas as pd # 模拟输入数据 data = { 'column1': ['ABC', 'DEF', 'abc', 'abc:very specific message'], 'column2': [3, 4, 1, 1] } df = pd.DataFrame(data) # 提取核心标识:转小写后按冒号分割取第一部分 def get_core(text): lower_text = text.lower() return lower_text.split(':')[0] df['core'] = df['column1'].apply(get_core) # 为每个核心匹配最简洁的原始文本 core_to_text = {} for core, text in zip(df['core'], df['column1']): if core not in core_to_text or len(text) < len(core_to_text[core]): core_to_text[core] = text # 聚合计数并替换为简洁文本 agg_df = df.groupby('core')['column2'].sum().reset_index() agg_df['column1'] = agg_df['core'].map(core_to_text) agg_df = agg_df[['column1', 'column2']].sort_values('column1') print(agg_df)
运行后输出:
column1 column2 0 ABC 3 1 DEF 4 2 abc 2
四、复杂场景扩展优化
如果你的文本没有固定分割符、核心匹配更复杂,可以采用以下方法:
- 编辑距离匹配:计算文本间的Levenshtein编辑距离,设定阈值判定相似度
- TF-IDF+聚类:将文本转为TF-IDF向量,用K-Means/DBSCAN聚类后聚合簇内计数
- 预训练模型嵌入:用BERT等模型生成文本嵌入,通过余弦相似度筛选高相似文本合并
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

