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

如何用Pandas对近似相似字符串列进行分组统计?

基于文本相似度的分组计数方案

你提到的余弦相似度完全可以解决这个近似文本分组的问题,核心思路是先把文本转换成可计算相似度的向量,再通过聚类把相似文本归为同一组,最后基于分组标签统计计数。下面是具体实现步骤和代码:

实现步骤

  • 文本向量化:用TF-IDF把字符串转换成数值向量,能有效捕捉文本的语义特征,过滤停用词后效果更准确。
  • 计算相似度矩阵:通过余弦相似度量化每对文本的相似程度。
  • 聚类分组:设定相似度阈值,用聚类算法把相似文本归为同一组。
  • 分组统计:基于聚类标签和年份列做groupby计数。

代码示例

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.cluster import AgglomerativeClustering

# 构造示例数据
data = {
    'col A': ['abc', 'abc2'],
    'col year': [2009, 2009],
    'col C': ['no plan today', 'wrong plan today']
}
df = pd.DataFrame(data)

# 1. 文本向量化(去除英文停用词)
vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = vectorizer.fit_transform(df['col C'])

# 2. 计算余弦相似度矩阵,转换为距离矩阵(聚类算法通常用距离)
cos_sim = cosine_similarity(tfidf_matrix)
distance_matrix = 1 - cos_sim

# 3. 层次聚类:设定距离阈值(对应相似度=1-阈值,这里0.3对应相似度≥0.7)
cluster_model = AgglomerativeClustering(
    n_clusters=None,
    affinity='precomputed',
    linkage='average',
    distance_threshold=0.3
)
df['cluster_label'] = cluster_model.fit_predict(distance_matrix)

# 4. 按年份和聚类标签分组计数
count_result = df.groupby(['col year', 'cluster_label'], as_index=False).size()
count_result.rename(columns={'size': 'count'}, inplace=True)

print(count_result)

关键参数说明

  • distance_threshold:控制分组的严格程度,值越小要求文本越相似。比如设0.2对应相似度≥0.8,适合更严格的分组场景;设0.4对应相似度≥0.6,适合宽松场景。
  • 停用词过滤:stop_words='english'会去掉"the""today"这类无意义的词,让相似度计算更聚焦核心语义(比如示例中的"plan")。

其他可选方案

如果是短文本或更关注字符层面的相似性,也可以用**编辑距离(Levenshtein距离)**替代余弦相似度,通过设定编辑距离阈值来分组,但对于长文本,余弦相似度的语义匹配效果更好。

内容的提问来源于stack exchange,提问作者Jlow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:35:20