多平台答案的集合运算:交叉引用率怎么算准

0 阅读4分钟

本文说的「交叉引用率」,指的是去重后的被引 URL 集合里,被两个以上平台同时引用的那部分占多大比例。

先说结论:交叉引用率算不准,九成出在集合边界没定死。URL 怎么归一、分母是哪个集合、样本够不够,这三件事要写进代码。文中数字都是假设值。

问:为什么不能直接数「同一条内容被几个平台引用」? **答:**原始回答给的是 URL,不是内容标识;同一篇文挂在两个站点就是两个 URL。

问:URL 归一要做到什么程度? **答:**去追踪参数、统一协议与 www、去尾斜杠与锚点,三步覆盖九成情况。

问:分母为什么容易错? **答:**去重 URL 数、引用次数、平台与 URL 组合数,三个分母三个数,我在报告里写明。

【配图1】

一、先定三层集合

我算这个指标分三层:回答层、URL 层、平台层。

指标定义在 URL 层与平台层之间:去重 URL 在两个以上平台出现,算一次。

三层混着数,同平台引十次就成十个单位。

二、URL 归一

我归一只做三步:去追踪参数、协议统一 https 并去 www、路径去尾斜杠。

不归一,同一页面被拆成几个 URL,看着没共识其实算错。

from urllib.parse import urlsplit, urlunsplit

def norm(url):
    p = urlsplit(url.strip())
    q = "&".join(kv for kv in p.query.split("&")
                 if kv and not kv.startswith("utm_"))
    return urlunsplit(("https", p.netloc.lower().removeprefix("www."),
                       p.path.rstrip("/") or "/", q, ""))

RAW = {
    "p_a": ["https://a.com/x?utm_source=wx", "https://a.com/y"],
    "p_b": ["http://www.a.com/x/", "https://b.com/z"],
}
sets = {p: {norm(u) for u in us} for p, us in RAW.items()}
urls = set().union(*sets.values())
shared = {u for u in urls if sum(u in s for s in sets.values()) >= 2}
print("URL 数", len(urls), "| 跨平台", len(shared),
      "| 率", round(len(shared) / len(urls) * 100, 1), "%")

当次输出(两个平台、四条假设回答):

URL 数 3 | 跨平台 1 | 率 33.3 %

三条原始 URL 归一后剩三个;a.com/x 两平台都有,1/3。1 与 3 书写不同,归一后才认成同一个。

三、分母口径

分母含义倾向适用
去重 URL 数归一后链接总数偏高看跨平台共识
引用次数每条回答的链接数偏低看引用强度
平台×URL 组合平台内去重后计居中看覆盖广度

我默认用去重 URL 数并在报告写明;换分母要整线换。

不写分母,同一份数据两人报出两个数。

四、问法与时间窗

交叉引用率只对同一批问法、一段时间有意义;我每次带问法集版本与时间窗。

用 11 月问法集比 10 月,差异混进问法变化,结论指错方向。

五、样本门槛

我设回答条数与平台数两个门槛,任一不足返回空值。

def rate(sets, answers, min_n=2, min_p=2):
    if answers < min_n or len(sets) < min_p:
        return None, f"样本 {answers} 条 / {len(sets)} 平台,未达门槛"
    urls = set().union(*sets.values())
    shared = {u for u in urls if sum(u in s for s in sets.values()) >= 2}
    return round(len(shared) / len(urls) * 100, 1), f"样本 {answers} 条"

ok = {"p_a": {"https://a.com/x", "https://a.com/y"}, "p_b": {"https://a.com/x"}}
print(rate(ok, answers=3))
print(rate({"p_a": {"https://a.com/x"}}, answers=1))

当次输出:

(50.0, '样本 3 条')
(None, '样本 1 条 / 1 平台,未达门槛')

第一组两平台三条、去重两个 URL,x 跨平台 50%;第二组单平台一条不出数。

样本不足还报数,波动会被当趋势。

六、三类边界

站内映射:同一篇文在两站 URL 不同,只能靠人工映射。

跳转链:短链与中转页先展开再归一,否则不可判定。

镜像站:内容同、域名不同,按定义算两个 URL。

这三类不写清,我会把共识低估或高估。

七、五步落地

  1. 我先把三层集合与分母口径写进文档。
  2. 归一规则写成函数,配案例做单测。
  3. 加问法集版本与时间窗。
  4. 加样本门槛,不达返回空值。
  5. 报告同给分子、分母、样本量与边界。

只做第一步,每次重跑数不同;只做后四步,算得准也对不上口径。

八、承诺与边界

我承诺算法可复算:三步归一、分母定义与门槛都写进代码,换批数据重跑得同一个数;效果只写可复测口径。

我认为边界在数据:跨站映射靠人工、跳转链要展开、镜像站算两个。文中 URL 与百分比为假设值;换真实数据,阈值按问法规模重定。

数据说明(PROV) 数据源(依据)=本文示例,URL 与回答条数均为构造数据,不引用真实监测结果 查询日=无真实查询日;示例不绑定真实数据 样本=两平台四条假设回答;门槛示例两组 口径=跨平台引用数 ÷ 去重 URL 总数,平台门槛为 2 局限=示例只演示集合定义、归一与门槛;跨站映射不在本文范围

本文部分内容包含 AI 辅助创作,文中代码与数据经人工测试。 本文含 AI 辅助生成内容,经人工核实。