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

基于用户名和社交关系网络的跨数据集同一用户匹配方案咨询

跨库用户身份匹配实现方案

1. 现有表结构说明

两个库的表结构完全一致,包含两张核心表:

Users表

  • id:主键
  • username:唯一值,用户昵称

Relation表

  • id:主键
  • follower_id:外键,关联Users表的id,代表粉丝用户ID
  • following_id:外键,关联Users表的id,代表被关注用户ID

2. 核心实现思路

2.1 第一步:优先做精确匹配兜底

优先将两个库中username完全一致的用户直接配对,这部分匹配准确率接近100%,已经匹配成功的用户可以作为后续社交关系匹配的锚点数据,剩余未匹配的用户进入下一步计算。

2.2 第二步:计算用户名相似度

对未匹配的用户名对计算相似度,可选择的计算规则:

  • Levenshtein(编辑距离):统计两个字符串互相转换需要的最少增删改次数,归一化后得到0-1区间的相似度得分
  • Jaccard相似度:将用户名拆分为字符级ngram后,计算交集与并集的比值得到得分

2.3 第三步:计算社交网络相似度

基于用户的关注、粉丝列表计算重合度,结合已匹配的锚点用户加权计算:

  • 基础版:计算两个用户的关注列表(映射到已匹配的锚点ID后)的Jaccard相似度、粉丝列表的Jaccard相似度,取两者平均值作为社交相似度得分
  • 进阶版:采用图匹配算法(如DeepWalk、Node2Vec)将两个库的用户社交网络编码为向量,直接计算向量余弦相似度,对小幅度的关系差异容错性更高

2.4 第四步:融合得分判定匹配结果

给用户名相似度和社交相似度设置权重(可根据业务场景调整,比如社交信息可信度高就设权重为0.6,用户名权重0.4),计算总得分:
总得分 = 用户名相似度 * 用户名权重 + 社交相似度 * 社交权重
遍历每个待匹配用户的所有候选对,取总得分最高的结果,若最高得分低于预设阈值(比如0.7)则标记为None,否则判定为匹配成功。

2.5 可选优化:迭代匹配

将本轮新匹配成功的用户加入锚点集合,重新计算剩余未匹配用户的社交相似度,重复上述流程2-3轮,可进一步提升匹配覆盖率。

3. Python伪代码示例

import Levenshtein

# 1. 加载两个库的数据,结构示例:{user_id: {"username": xxx, "followings": set(), "followers": set()}}
db1_users = load_data_from_db1()
db2_users = load_data_from_db2()

match_result = {}  # key: db1_user_id, value: db2_user_id / None
matched_pairs = set()  # 已匹配的对,作为锚点

# 2. 精确匹配
db1_name_map = {v["username"]: k for k, v in db1_users.items()}
db2_name_map = {v["username"]: k for k, v in db2_users.items()}
common_names = set(db1_name_map.keys()) & set(db2_name_map.keys())
for name in common_names:
    u1 = db1_name_map[name]
    u2 = db2_name_map[name]
    match_result[u1] = u2
    matched_pairs.add((u1, u2))
    # 从待匹配集合中移除
    del db1_users[u1]
    del db2_users[u2]

# 3. 剩余用户模糊匹配
USERNAME_WEIGHT = 0.4
SOCIAL_WEIGHT = 0.6
SCORE_THRESHOLD = 0.7

for u1_id, u1_info in db1_users.items():
    max_score = 0
    best_match = None
    for u2_id, u2_info in db2_users.items():
        # 计算用户名相似度
        edit_dis = Levenshtein.distance(u1_info["username"], u2_info["username"])
        max_len = max(len(u1_info["username"]), len(u2_info["username"]))
        username_sim = 1 - edit_dis / max_len if max_len != 0 else 0
        
        # 计算社交相似度:基于已匹配锚点的关注重合度
        u1_matched_followings = set([match_result[f] for f in u1_info["followings"] if f in match_result])
        u2_followings = set(u2_info["followings"])
        follow_inter = u1_matched_followings & u2_followings
        follow_union = u1_matched_followings | u2_followings
        follow_sim = len(follow_inter) / len(follow_union) if len(follow_union) != 0 else 0
        
        # 粉丝相似度计算逻辑同上,补充后可与关注相似度取平均得到最终社交相似度
        social_sim = follow_sim
        
        # 总得分
        total_score = username_sim * USERNAME_WEIGHT + social_sim * SOCIAL_WEIGHT
        if total_score > max_score and total_score >= SCORE_THRESHOLD:
            max_score = total_score
            best_match = u2_id
    match_result[u1_id] = best_match

# 输出匹配结果
print(match_result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:06:03