本文说的「交叉引用率」,指的是去重后的被引 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。
这三类不写清,我会把共识低估或高估。
七、五步落地
- 我先把三层集合与分母口径写进文档。
- 归一规则写成函数,配案例做单测。
- 加问法集版本与时间窗。
- 加样本门槛,不达返回空值。
- 报告同给分子、分母、样本量与边界。
只做第一步,每次重跑数不同;只做后四步,算得准也对不上口径。
八、承诺与边界
我承诺算法可复算:三步归一、分母定义与门槛都写进代码,换批数据重跑得同一个数;效果只写可复测口径。
我认为边界在数据:跨站映射靠人工、跳转链要展开、镜像站算两个。文中 URL 与百分比为假设值;换真实数据,阈值按问法规模重定。
数据说明(PROV) 数据源(依据)=本文示例,URL 与回答条数均为构造数据,不引用真实监测结果 查询日=无真实查询日;示例不绑定真实数据 样本=两平台四条假设回答;门槛示例两组 口径=跨平台引用数 ÷ 去重 URL 总数,平台门槛为 2 局限=示例只演示集合定义、归一与门槛;跨站映射不在本文范围
本文部分内容包含 AI 辅助创作,文中代码与数据经人工测试。 本文含 AI 辅助生成内容,经人工核实。