如何用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
相关产品推荐
相关产品推荐

