设想你被派往一座永远在扩张的城市——“科学之城”。这里没有路标,只有上百万篇论文像忽隐忽现的建筑群。要在这座城里导航,你需要一张“总地图”:把论文里反复出现的基因、蛋白质、疾病、算法、数据集认成地标(实体),把“治疗”“抑制”“激活”这些动作画成连接地标的路(关系),再把同名同义的楼合并成一座,最后把整张地图装进手机导航系统。这张地图就是科研知识图谱,而“画地图”的整套方法,就是本文要讲的构建之道。从概念定义、实体识别、关系抽取、知识融合,到图存储与查询、应用部署,我们将一步步走完这条流水线——读完你不仅能看懂一座知识图谱如何拔地而起,还能亲手为你的研究方向绘制第一版地图。

岗位关联

学会知识图谱构建,意味着你能把海量文献变成可查询、可推理的科研资产——这是科研自动化时代底层架构师的核心技能,直接提升选题调研、文献综述与成果发现的效率与深度。

目录
  1. 可视化演示
  2. 概念与架构:先定下“地图的语言”
  3. 实体识别:从文字洪流里点出地标
  4. 关系抽取:给地标之间画上道路
  5. 知识融合:把“双胞胎”地标合并
  6. 图存储与查询:把地图装进导航系统
  7. 应用与部署:让地图为城市服务
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示轮询、最少连接和加权轮询三种负载均衡算法的请求分发过程,实时对比各服务器负载。

本节配有交互动效(进入视口后自动加载,约 3KB)。

负载均衡算法 负载均衡器 后端服务器 请求数据包 RR / LC / WRR 切换算法观察分发策略差异

概念与架构:先定下“地图的语言”

在科学之城画地图,第一件事不是拿笔出门,而是先和全城人约定一套规范:什么叫“地标”,什么叫“大道”,每条路有没有名字。没有这套约定,张三画的路和李四画的路根本对不上。知识图谱也一样,开工之前必须定义自己的“地图语言”——否则后面所有环节都会各自为政。

这套语言在计算机里被压缩成一个极简形式——三元组 (h, r, t):一头一尾是两个实体(Entities),中间是关系(Relation)。一句“论文 A 证实 药物 B 治疗 疾病 C”,就变成一条三元组。实体还可以带属性,比如“蛋白质”有“分子量、结构域”等属性键值,相当于地标附带“高度、用途”等补充信息。整张图 G 就是实体集合 E、关系集合 R 与三元组集合 S 的打包:

有了这套统一语言,科学之城的地标与道路终于有了官方认证。但规范只是纸面功夫——城市那么大,真要走街串巷把地标一个个认出来,才是下一关。

G=(E,R,S),S={(h,r,t)∣h∈E, t∈E, r∈R}\displaystyle G = (E, R, S), \quad S = \{(h, r, t) \mid h \in E, \ t \in E, \ r \in R\}
这行公式的意思是:图=点的集合+箭头的集合+所有“点-箭头-点”记录。三元组 (h,r,t) 就是地图上“地标-道路-地标”的一段行程。
  1. 集合 E(实体表)所有地标的清单,例如 {p53, 肿瘤,阿司匹林}。
    E={e1,e2,…,em}E = \{e_1, e_2, \dots, e_m\}
  2. 集合 R(关系表)所有允许的道路类型,例如 {治疗,抑制,激活}。
    R={r1,r2,…,rn}R = \{r_1, r_2, \dots, r_n\}
  3. 三元组集合 S满足“头尾都在 E、关系在 R”的全部记录,是图谱真正的数据主体。
    S={(h,r,t)∣h∈E, t∈E, r∈R}S = \{(h, r, t) \mid h \in E,\ t \in E,\ r \in R\}

实体识别:从文字洪流里点出地标

地图员带着规范走上街头,发现麻烦来了:一整篇论文是密密麻麻的文字洪流,必须先把“哪些词是地标”圈出来。“p53“是基因名,”肿瘤“是疾病名,而”调节”只是个普通动词——把它们区分开,就是实体识别(NER)。对科研领域而言,生物医学命名尤其刁钻:同一个实体有缩写、有全称、有大小写变体,甚至互相嵌套。

早期做法像翻词典:准备一本领域词表,在句子里逐词比对,见到“阿司匹林”就高亮,这是“规则与词典法”,快但脆弱。后来改用统计机器学习,再到深度学习:把一个句子切成 token,让 BERT 之类的模型为每个 token 生成一个“上下文向量” $\mathbf{h}_i$——相当于让模型先读完整条街,再判断眼前这块招牌是不是地标。最后用一个分类器给每个词贴标签:

就这样,地图员一个词一个词地点名,把整条“论文街道”里的基因、蛋白、药物、疾病都圈了出来。地标有了名字,接下来最激动人心的一步——给它们之间连路。

y^i=arg⁡max⁡y∈L Wy⊤hi+by\displaystyle \hat{y}_i = \mathop{\arg\max}_{y \in \mathcal{L}} \ \mathbf{W}_y^{\top} \mathbf{h}_i + b_y
给每个词在所有候选标签上打分,取最高分的标签作为最终判断。
  1. 上下文向量 h_i第 i 个词的语义指纹,由它前后的词共同决定,代表“这个词在这条街上的身位”。
    hi\mathbf{h}_i
  2. 候选标签集 L例如 {B-基因,I-基因,O},B 表示实体开头、I 表示实体内部、O 表示非实体。
    L={B-gene, I-gene, O}\mathcal{L} = \{B\text{-}gene,\ I\text{-}gene,\ O\}
  3. 打分器 W_y 与 b_y每个标签配一套权重和偏置,对上下文向量做线性打分。
    Wy⊤hi+by\mathbf{W}_y^{\top} \mathbf{h}_i + b_y
  4. argmax 取最高分在全部候选标签里选出得分最高的那个作为输出。
    y^i=arg⁡max⁡y∈L(⋯ )\hat{y}_i = \mathop{\arg\max}_{y \in \mathcal{L}} (\cdots)

关系抽取:给地标之间画上道路

有了地标清单,城市还是碎的:你知道这里有“阿司匹林”、那里有“炎症”,却不知道它们有什么关系。关系抽取(RE)就是拿着头尾两个地标,在文本里确认“这条路牌上写的是什么”——是“治疗”,还是“抑制”,还是只是碰巧出现在同一句话里。

主流做法把它当作分类问题:把头实体向量 $\mathbf{e}_h$ 与尾实体向量 $\mathbf{e}_t$ 拼接在一起,喂进 softmax 分类器,在关系候选集 $\mathcal{R}$ 上打分。这相当于站在路口问:这两个地标之间最可能挂哪块路牌?公式如下:

每条通向地标的道路都被标好了名字。可地图员很快发现问题:同一个地标在城东叫“中科院计算所”,城西叫“中国科学院计算技术研究所”,明明是同一栋楼——不处理,地图上就会长出“双胞胎”。这就轮到知识融合登场。

P(r∣h,t)=exp⁡ ⁣(ur⊤[eh;et])∑r′∈Rexp⁡ ⁣(ur′⊤[eh;et])\displaystyle P(r \mid h, t) = \frac{\exp\!\big(\mathbf{u}_r^{\top} [\mathbf{e}_h; \mathbf{e}_t]\big)}{\sum_{r' \in \mathcal{R}} \exp\!\big(\mathbf{u}_{r'}^{\top} [\mathbf{e}_h; \mathbf{e}_t]\big)}
这就是 softmax:把每个候选关系的原始得分转成 0 到 1 之间的概率,所有候选概率加起来等于 1。
  1. 拼接向量 [e_h; e_t]把头部和尾部两个地标的表示连成一个长向量,作为分类依据。
    [eh;et][\mathbf{e}_h; \mathbf{e}_t]
  2. 关系打分项第 r 种关系的权重向量对拼接向量做点积,得到该关系的原始得分。
    ur⊤[eh;et]\mathbf{u}_r^{\top} [\mathbf{e}_h; \mathbf{e}_t]
  3. exp 指数放大把任意实数映射为正数,得分越高指数爆炸式放大,拉大差距。
    exp⁡(⋅)\exp(\cdot)
  4. 分母归一化对所有候选关系的指数值求和,使分子除以分母后概率总和为 1。
    ∑r′∈Rexp⁡ ⁣(ur′⊤[eh;et])\sum_{r' \in \mathcal{R}} \exp\!\big(\mathbf{u}_{r'}^{\top} [\mathbf{e}_h; \mathbf{e}_t]\big)

知识融合:把“双胞胎”地标合并

地图的敌人是重复与矛盾。同一栋楼可能被不同文献用缩写、全称、别名各记录一次;同一个基因 “p53“ 和 ”P53“ 在句子里反复横跳。知识融合要做的,就是判断”两个记录是否指向现实世界的同一事物”,然后合并,并消掉互相冲突的属性——这就是实体对齐、共指消解与冲突消解的职责。

判断的依据是相似度:名称上字符重叠有多少(Jaccard),语义上嵌入向量靠得多近(余弦相似度),再把两类证据加权合成一个总分,超过阈值 θ 就合并。工程上还会配合别名表、同义词表和人工规则一起做。加权相似度的典型形式如下:

合完并、消完错,科学之城终于只剩一座座真实的地标和一条条干净的路。可是——地图画在纸上没法被电脑快速查。下一步,把这座城装进导航系统:图数据库。

sim(e1,e2)=ω1⋅Jaccard(N1,N2)+ω2⋅cos⁡(v1,v2),ω1+ω2=1\displaystyle \text{sim}(e_1, e_2) = \omega_1 \cdot \text{Jaccard}(N_1, N_2) + \omega_2 \cdot \cos(\mathbf{v}_1, \mathbf{v}_2), \quad \omega_1 + \omega_2 = 1
两个实体的相似度=名称相似度乘以权重 ω₁+语义相似度乘以权重 ω₂;两者权重之和为 1,表示按比例分配信任。
  1. Jaccard 名称相似度两组名称 token 集合的交集大小除以并集大小,衡量“名字长得有多像”。
    Jaccard(N1,N2)=∣N1∩N2∣∣N1∪N2∣\text{Jaccard}(N_1, N_2) = \frac{|N_1 \cap N_2|}{|N_1 \cup N_2|}
  2. 余弦相似度两个语义向量夹角的余弦值,越接近 1 说明语义越相近。
    cos⁡(v1,v2)\cos(\mathbf{v}_1, \mathbf{v}_2)
  3. 权重归一化ω₁ 与 ω₂ 分别表示名称证据和语义证据各占多少信任,二者之和恒为 1。
    ω1+ω2=1\omega_1 + \omega_2 = 1
  4. 合并决策当综合相似度超过阈值 θ 时,判定两个实体是同一事物并合并。
    sim(e1,e2)>θ ⇒ e1≡e2\text{sim}(e_1, e_2) > \theta \ \Rightarrow \ e_1 \equiv e_2

图存储与查询:把地图装进导航系统

纸质地图画得再漂亮,游客也没法实时问路。图数据库就是科学之城的“导航内核”:它把实体存成节点、关系存成边,并且按“邻接”的方式物理存放——每个节点直接连着它的邻居,就像每个路口挂着指向下一路口的牌子。选型上,Neo4j 这类属性图数据库最常用:节点和边都能带属性,用 Cypher 之类的图查询语言就能问“从 A 出发两步能到哪些地标”。

为什么图数据库“多跳友好”?关系型数据库回答同样的问题要反复 JOIN 大表,路径每加一跳代价指数上升;图数据库则沿边指针直接走,代价随跳数线性增长。科学家最常问的一类问题是“两个实体之间怎么关联”,这就落到最短路径计算——比如“某药物通过哪条通路影响某疾病”:

导航系统上线,游客终于能问“p53 和肿瘤之间怎么走”。但一座城市地图的最终价值,在于它催生的应用——问路、推荐、侦探推理。地图的真正威力,才刚刚开始。

d(s,t)=min⁡P∈P(s,t)∑e∈Pw(e)\displaystyle d(s, t) = \min_{P \in \mathcal{P}(s, t)} \sum_{e \in P} w(e)
两个实体间的最短距离=遍历从 s 到 t 的所有通路,取路径上边权重之和最小的一条。
  1. 路径集合 P(s,t)从起点 s 到终点 t 的所有可行通路,即所有“走法”的集合。
    P(s,t)\mathcal{P}(s, t)
  2. 路径代价之和把一条路径上每条边 e 的权重 w(e) 累加,得到这条路的总代价。
    ∑e∈Pw(e)\sum_{e \in P} w(e)
  3. min 选择最优在全部路径中挑代价最小的那一条,其代价就是最短距离。
    d(s,t)=min⁡P∈P(s,t)∑e∈Pw(e)d(s, t) = \min_{P \in \mathcal{P}(s, t)} \sum_{e \in P} w(e)

应用与部署:让地图为城市服务

地图的价值不在纸面而在使用。科学之城有了完整图谱后,第一批应用立刻涌现:科研问答直接回答“哪些药物可能作用于这个靶点”;文献推荐告诉“还有哪些论文与你在读的这篇主题相关”;知识推理则通过中间节点,推测两条通路之间隐藏的关联。部署侧要做的是把 NER→RE→融合→入库接成一条自动化管线,用 F1 等指标持续监控每一步质量。

推荐类任务常从一个朴素又有效的指标出发——共同邻居(Common Neighbors):两篇文献各自引用了哪些论文,看交集有多大。交集越大,越可能走在同一研究路线上。这与“推荐给你和好友共同去过的实验室”是同一个道理。计算公式如下:

至此,科学之城的地图完成了从“语言规范—地标识别—道路连接—合并去重—数字入库—服务市民”的完整闭环。下一次面对成堆的文献时,不妨换个视角:你不是在“读论文”,你是在为这座永远扩张的城市,继续绘制它的地图。

CN(u,v)=∣N(u)∩N(v)∣\displaystyle \text{CN}(u, v) = |\mathcal{N}(u) \cap \mathcal{N}(v)|
共同邻居数=两个实体各自邻居集合的交集大小,数值越高,越值得推荐建立新连接。
  1. 邻居集合 N(u)图上与节点 u 直接相连的全部节点,即 u 的“一步朋友圈”。
    N(u)={x∣(u,x)∈G 或 (x,u)∈G}\mathcal{N}(u) = \{x \mid (u, x) \in G \ \text{或} \ (x, u) \in G\}
  2. 交集运算取两个邻居集合共同拥有的节点,即“共同朋友”。
    N(u)∩N(v)\mathcal{N}(u) \cap \mathcal{N}(v)
  3. 集合基数数出交集中节点的个数,这个数字就是连接预测的推荐得分。
    CN(u,v)=∣N(u)∩N(v)∣\text{CN}(u, v) = |\mathcal{N}(u) \cap \mathcal{N}(v)|

AI 应用场景

科研综述自动编绘:药物重定位

阶段:知识表示与图查询

解决的问题:传统药物研发中,调研“某疾病由哪些蛋白通路介导、哪些已有药可能干预”需要研究员手动阅读上千篇论文,耗时数周且容易遗漏。AI 先把病理-蛋白-药物-疾病文献构建成知识图谱,再用最短路径查询在几分钟内给出候选老药-靶点-疾病的完整链路。

具体案例:某团队在新冠文献上构建“病毒-宿主蛋白-药物”图谱,抽取两万余条实体关系三元组,通过图谱路径发现“瑞德西韦→某种激酶→病毒复制”的关联通路,筛出若干待验证的候选药物组合,把原本数月的文献调研压缩到数天。

基金选题辅助与文献推荐

阶段:实体识别 + 关系抽取 + 连接预测

解决的问题:申报课题时,申请人难以快速判断“这个方向是否已做烂、还有哪些空白”。AI 对历年基金与论文做实体、关系抽取建成图谱,再用共同邻居指标做连接预测,推荐“当前论文与哪些热点实体最可能建立新连接”。

具体案例:某科研管理平台对十万篇论文构建共同引用图谱,当用户打开一篇关于“知识图谱构建”的综述时,推荐算法依据共同邻居得分推荐 5 篇高潜关联论文,命中率较关键词检索提升约 40%。

机构合作网络分析

阶段:知识融合 + 图查询

解决的问题:高校院所之间“谁与谁有合作潜质”的信息散落在大量论文作者栏里,人工难以汇总。AI 识别作者与机构实体,做共指消解(同一学者不同署名方式合并),存入图数据库后用多跳查询找出跨院系合作路径。

具体案例:某大学科研处对五年论文构建合作图谱,通过“共同作者”与“师生关系”两跳路径,自动推荐 12 对跨学科潜在合作者,为院系间资源对接节省了大量人力。

Python 演示

python103 行
# -*- coding: utf-8 -*-"""Mini knowledge graph pipeline: NER -> RE -> fusion -> storage -> query."""import refrom collections import deque # --- 1. 语料:模拟科研论文中的句子 ---CORPUS = [    "p53 regulates apoptosis and inhibits tumor growth.",    "P53 regulates tumor growth.",    "Aspirin treats inflammation.",    "Aspirin reduces fever.",    "BRCA1 interacts with p53 in DNA repair.",    "Metformin treats diabetes.",    "Apoptosis inhibits tumor growth.",] # --- 2. 词典式实体识别:把词表里的术语当作地标 ---ENTITY_DICT = {    "gene": ["p53", "brca1"],    "disease": ["apoptosis", "tumor", "inflammation", "fever", "diabetes"],    "drug": ["aspirin", "metformin"],} # --- 3. 别名表实现知识融合:P53 与 p53 指向同一实体 ---ALIASES = {"P53": "p53", "BRCA1": "brca1"} # --- 4. 关系模板:用正则表达式在句中找"路牌" ---PATTERNS = [    ("regulates", r"(\w+)\s+regulates\s+(\w+)"),    ("treats", r"(\w+)\s+treats\s+(\w+)"),    ("reduces", r"(\w+)\s+reduces\s+(\w+)"),    ("inhibits", r"(\w+)\s+inhibits\s+(\w+)"),    ("interacts_with", r"(\w+)\s+interacts with\s+(\w+)"),] def canonical(name):    """把各种写法归一化为同一实体名。"""    return ALIASES.get(name.upper(), name.lower()) def recognize_entities(sentence):    """返回句子中出现的所有已知实体。"""    found = set()    for ent_type, words in ENTITY_DICT.items():        for w in words:            if re.search(r"\b" + re.escape(w) + r"\b", sentence, re.IGNORECASE):                found.add(canonical(w))    return found def extract_triplets(sentence):    """抽取满足'头尾都是已知实体'的三元组。"""    ents = recognize_entities(sentence)    triplets = []    for rel, pat in PATTERNS:        for m in re.finditer(pat, sentence, re.IGNORECASE):            h, t = canonical(m.group(1)), canonical(m.group(2))            if h in ents and t in ents and h != t:                triplets.append((h, rel, t))    return triplets def build_graph(sentences):    """把三元组写入邻接表,完成图谱存储。"""    graph = {}    triples = []    for s in sentences:        for h, r, t in extract_triplets(s):            triples.append((h, r, t))            graph.setdefault(h, []).append((t, r))            graph.setdefault(t, []).append((h, r + "_rev"))    # 简单融合:去掉完全重复的三元组    uniq = list(dict.fromkeys(triples))    return graph, uniq def shortest_path(graph, start, goal):    """BFS 广度优先搜索:回答两个实体之间怎么走。"""    if start not in graph or goal not in graph:        return None    queue = deque([(start, [start])])    seen = {start}    while queue:        node, path = queue.popleft()        for nxt, rel in graph[node]:            if nxt == goal:                return path + [nxt]            if nxt not in seen:                seen.add(nxt)                queue.append((nxt, path + [nxt]))    return None def main():    graph, triples = build_graph(CORPUS)    print("=== triples (deduplicated) ===")    for h, r, t in triples:        print("  (%s, %s, %s)" % (h, r, t))    print("\n=== entities in graph ===")    print(len(graph), "entities:", sorted(graph.keys()))    print("\n=== fusion demo ===")    print("P53 is normalized to p53 by ALIASES, so they share one node.")    print("\n=== shortest path query ===")    print("p53 -> tumor:", shortest_path(graph, "p53", "tumor"))    print("aspirin -> inflammation:", shortest_path(graph, "aspirin", "inflammation")) if __name__ == "__main__":    main()
目的:用一个小型语料演示知识图谱构建全流程——词典式实体识别、模板式关系抽取、别名融合去重、邻接表存储,以及用 BFS 做最短路径查询。
  1. ALIASES = {"P53": "p53", "BRCA1": "brca1"}知识融合的别名表:P53 和 p53 被归一化到同一节点,避免图谱里出现“双胞胎”。
  2. found.add(canonical(w))把识别到的词统一转成规范名后再加入实体集合。
  3. for h, r, t in extract_triplets(s):逐句抽取三元组,相当于把地标和道路写进地图草案。
  4. graph.setdefault(h, []).append((t, r))邻接表存储:每个实体挂一条“邻居+关系”的列表,如同每个路口挂着指向下一路口的牌子。
  5. uniq = list(dict.fromkeys(triples))用字典去重,完成最简单的冲突消解。
  6. queue = deque([(start, [start])])BFS 初始化:从起点开始逐层向外扩展,先到达终点的路径边数最少。
  7. if nxt == goal:找到目标立即返回,保证返回的是最短路径。
  8. if __name__ == "__main__":可执行入口,一键跑通“识别→抽取→融合→存储→查询”全流程。

常见误区

误区三元组用 SQL 表存不就行了?反正都是数据,没必要专门引入图数据库,学习成本还高。

正解存储方式决定查询复杂度。图数据库按邻接关系物理存储边,查询“三步关系路径”只需沿边跳三次;关系型数据库则要反复 JOIN 大表,路径越长代价指数上升。就像纸质地图可以顺着路标一路走,而目录卡片只能一页页翻。

为何常见:从传统数据库思维出发,容易把“存得住”等同于“查得快”,忽略了图查询的本质是沿边遍历而非表连接。

误区实体识别我训到 95%,关系抽取也训到 95%,合起来应该也接近 95% 的准确率吧?

正解管道式设计会让误差逐级放大:实体认错,关系必错;0.95 × 0.95 ≈ 0.90,再乘上融合与入库环节,到终点往往只剩八成出头。因此工业界倾向联合抽取或端到端模型,共享编码、共同优化。类比来说,图纸上第一步标错了,后面每一步都会跟着歪。

为何常见:把每个模型当成独立优化的孤岛,忽略了管线是串联结构,整体精度是各环节精度的乘积。

误区p53 和 P53 长得很像,直接当成同一个实体不就行了?反正都是那几个字母。

正解科研文本别名泛滥:缩写、全称、中英混写、大小写变体。不做实体对齐,图谱里同一概念会裂成多个孤立节点,最短路径查询直接断在路上,“p53 与肿瘤的关系”可能查不出来。融合就像把“中山路”和“中山大道”合并成同一条路,否则导航永远绕不过去。

为何常见:词面一致时容易默认是同一实体,词面不同又容易被当成新实体;判断标准其实只有一个——是否指向现实世界中的同一事物。

误区把能抽到的三元组全存进去,宁可多存一些噪声,也不能漏掉有用的知识。

正解图谱的敌人是噪声。错误三元组比缺失更危险——图查询会给出看似可信实则错误的“科研结论”。工程上必须用置信度过滤、规则校验和人工抽样评估(precision/recall/F1),宁缺毋滥。地图上多画一百条不存在的路,导航就会把司机带进河里。

为何常见:直观上“信息多”总优于“信息少”,却忽略了知识图谱服务于人机决策,错误信息的成本远高于信息缺失。

面试题

Q1. 知识图谱最基本的表示单元是什么?

单选题 · easy

  • A.键值对存储的记录行
  • B.实体关系实体的三元组← 正确答案
  • C.文档段落句子的层级树
  • D.特征权重构成的高维向量

答案:B。知识图谱的原子单位是“实体-关系-实体”三元组,如同地图上一段“地标-道路-地标”的记录。表格记录、层级树、特征向量都不是图谱的基本单元。

Q2. 在图定义 G=(E,R,S) 中,S 表示什么?

单选题 · easy

  • A.语义相似度得分的集合
  • B.实体与关系名称的组合
  • C.三元组 h r t 的全体集← 正确答案
  • D.顶点和边的全部记录

答案:C。S 专门存放三元组 (h,r,t) 的集合,E 是实体集,R 是关系集。如同城市地图的“总记录册”,每行一条“点-路-点”。

Q3. 实体识别公式 ŷ=argmax(W·h+b) 中 argmax 的作用是什么?

单选题 · mid

  • A.对每个词选得分最高的标签← 正确答案
  • B.对所有词求平均的嵌入特征
  • C.对每个词执行词频统计
  • D.对句子进行语法树解析

答案:A。实体识别最后一层是对每个词的上下文表示 h 打分,argmax 负责选最高分标签,相当于给每个词发一张最合适的标签卡。均值、词频、句法树都不是分类输出。

Q4. 关系抽取 softmax 公式中分母的作用是什么?

单选题 · mid

  • A.将各关系得分归一化为概率← 正确答案
  • B.提升模型反向传播的速度
  • C.消除实体嵌入中的随机噪声
  • D.计算两个实体间的欧氏距离

答案:A。分母把所有候选关系的指数得分求和作归一化,让输出成为和为 1 的概率分布。速度、去噪、距离都不是分母的职责——归一化才能比较“哪个关系最可信”。

Q5. 知识融合中的“共指消解”解决什么问题?

单选题 · mid

  • A.同一实体在不同文献中的不同指称← 正确答案
  • B.不同实体恰好拥有完全相同的名称
  • C.实体在句子中承担的具体语法成分
  • D.文献之间相互引用的次数统计

答案:A。共指消解处理“同一实体的多种指称”,比如 p53、P53、TP53 指向同一个基因。同词异义、语法成分、引用次数都不是共指消解的靶子。

Q6. 实体对齐公式中 ω₁+ω₂=1 表示什么?

单选题 · mid

  • A.两类相似度特征的权重之和为 1← 正确答案
  • B.两个实体的嵌入向量维度相同
  • C.模型训练数据需按两批顺序输入
  • D.相似度的最终计算结果恒为 1

答案:A。ω₁ 和 ω₂ 分别表示名称证据与语义证据各占多少信任,二者之和为 1 是加权平均的约束。向量维度、训练批次、结果恒为 1 都是误读。

Q7. 图数据库在多跳路径查询上优于关系型数据库的根本原因是什么?

单选题 · hard

  • A.边按邻接关系存储可沿边快速遍历← 正确答案
  • B.图数据库支持更丰富的 SQL 方言
  • C.关系型数据库默认不建任何索引
  • D.图数据库无需存储实体的属性

答案:A。图数据库按邻接结构物理存储边,多跳查询沿节点指针直接走;关系表多跳则要多次 JOIN 大表,代价随跳数爆炸。优势来自存储结构,而非 SQL 关键字或索引数量。

Q8. 以下哪些属于知识图谱构建中的知识融合技术?

多选题 · mid

  • A.实体对齐与共指消解← 正确答案
  • B.冲突消解与质量评估← 正确答案
  • C.实体识别与关系抽取← 正确答案
  • D.关键词抽取与词云生成

答案:ABC。融合环节包含实体对齐、共指消解、冲突消解与质量评估;实体识别和关系抽取属于前置构建,关键词抽取与词云则是文本统计手段,不属于图谱构建环节。

Q9. 科研知识图谱构建中常见的工程陷阱有哪些?

多选题 · hard

  • A.管道式抽取误差逐级传播← 正确答案
  • B.同名实体未做对齐融合← 正确答案
  • C.过度追求召回引入噪声← 正确答案
  • D.图数据库导致查询变慢

答案:ABC。管道误差传播、同名实体未融合、过度召回引入噪声都是典型坑;图数据库通常让多跳查询变快而非变慢,D 恰恰说反了。

Q10. 无权图上用 BFS 求最短路径,为什么能保证结果最优?

单选题 · extreme

  • A.按层扩展先达目标的路径边最少← 正确答案
  • B.深度优先更慢所以 BFS 必然最优
  • C.图中边的权重全部设定为 1
  • D.优先队列每次弹出距离最小点

答案:A。BFS 按层次逐层扩展,同一层的节点到起点边数相同,因此第一个到达终点的路径边数必最少。D 描述的是带权图下的 Dijkstra 策略;C 把结论建立在额外假设上;B 的说法毫无依据。