为基于余弦相似度匹配的公司名组合分配跨列统一组号
为成对匹配的公司名称分配全局组号(覆盖所有关联项)
这个问题本质是连通组件识别:所有直接/间接匹配的公司应归为同一组,不能仅依赖单一列分组。以下是具体实现方案,附样本数据与对应输出。
样本输入数据
| item1 | item2 | similarity | |-------------|---------------|------------| | 科技有限公司A | 科技A有限公司 | 0.95 | | 科技A有限公司 | 科技有限A公司 | 0.92 | | 商贸有限公司B | 商贸B有限公司 | 0.98 | | 科技有限公司A | 科技有限A公司 | 0.90 | | 制造有限公司C | 制造C有限公司 | 0.96 |
期望输出数据
| item1 | item2 | similarity | group_id | |-------------|---------------|------------|----------| | 科技有限公司A | 科技A有限公司 | 0.95 | 1 | | 科技A有限公司 | 科技有限A公司 | 0.92 | 1 | | 商贸有限公司B | 商贸B有限公司 | 0.98 | 2 | | 科技有限公司A | 科技有限A公司 | 0.90 | 1 | | 制造有限公司C | 制造C有限公司 | 0.96 | 3 |
R 实现方案
使用igraph包处理连通组件,自动关联所有匹配的公司:
- 安装并加载依赖包
install.packages("igraph") library(igraph) library(dplyr)
- 生成全局组号
# 假设你的数据框名为df # 提取所有唯一公司节点 nodes <- unique(c(df$item1, df$item2)) # 构建匹配关系的边列表 edges <- df %>% select(item1, item2) # 创建无向图 g <- graph_from_data_frame(d = edges, vertices = nodes, directed = FALSE) # 获取每个节点的连通组件ID component_ids <- membership(clusters(g)) # 将组号映射回原数据框 df$group_id <- component_ids[match(df$item1, names(component_ids))]
Python 实现方案
使用networkx包处理连通组件:
- 安装并导入依赖包
pip install networkx pandas import networkx as nx import pandas as pd
- 生成全局组号
# 假设你的数据框名为df # 创建无向图,构建匹配关系 G = nx.from_pandas_edgelist(df, source='item1', target='item2', create_using=nx.Graph()) # 遍历所有连通组件,分配组号 group_mapping = {} current_group = 1 for component in nx.connected_components(G): for node in component: group_mapping[node] = current_group current_group += 1 # 为原数据框添加组号列 df['group_id'] = df['item1'].map(group_mapping)
方案说明
两种方案均基于图论的连通组件逻辑:所有直接/间接匹配的公司会被归为同一连通组,无论它出现在item1还是item2列,彻底解决单一列分组的覆盖不全问题。
内容的提问来源于stack exchange,提问作者Barndog34
相关产品推荐
相关产品推荐

