Page 199 - 《软件学报》2025年第12期
P. 199
5580 软件学报 2025 年第 36 卷第 12 期
算法 1. 华谱通同名人物筛选算法.
输入: 问题三元组 (s*, r*, t*), 其中 s*是同名人物姓名; 条件三元组集合 P={(s 1 , r 1 , t 1 ), (s 2 , r 2 , t 2 ),…,(s n , r n , t n )}; 关系
类型集合 R; 属性类型集合 A;
输出: 最符合条件的同名人物 max_URI.
1. new List same_people_uri_list=SPARQL((s*, 简介, ?)); /*保存所有候选同名人物 URI*/
2. new Dict same_people_dict; /*用于保存同名人物的信息, 包括属性和人物关系*/
3. for URI in same_people_uri_list
4. for r in R∪A
5. same_people_dict[URI]=SPARQL((URI, r, ?)); /*获取每个同名人物的所有信息*/
6. end for /*对应步骤 4*/
7. end for /*对应步骤 3*/
8. new List same_people_match_score; /*用于保存同名人物信息与条件信息的匹配度*/
9. for URI in same_people_uri_list
10. new List candidate_information_list;
11. for (s i , r i , t i ) in P
12. if equal(URI, s i .uri)
13. candidate_information_list.append(t i ); /*获取每个同名人物的查询条件*/
14. end if /*对应步骤 12*/
15. end for /*对应步骤 11*/
16. score=TextMatch(same_people_dict[URI], candidate_information_list); /*匹配用户提供的条件和同名人物的知
识库信息*/
17. same_people_match_score.append((URI, score)); /*存储所有同名人物与查询条件的匹配度*/
18. end for /*对应步骤 9*/
19. max_URI =max(same_people_match_score); /*选择最大 score 对应的 URI */
20. return max_URI
在算法 1 中, 步骤 1 的 SPARQL() 函数表示根据输入的三元组构造 SPARQL 查询语句并返回查询结果, 查询
语句的构造过程参考表 1. 此外, 步骤 16 的 TextMatch(A, B) 函数被定义为公式 (1):
| jieba(A)∩ jieba(B)|
TextMatch(A,B) = (1)
| jieba(B)|
其中, A 是华谱通查询到的同名人物信息, B 是用户提供的同名人物查询条件. 为了便于进行词频匹配, 本文使用
jieba 分词软件对 A 和 B 中的文本进行分词, 并将 A 和 B 中共同存在的语段占 B 中语段的比重作为用户需要查询
某个同名人物的概率, 最后选择概率最高的同名人物 URI 作为查询目标. 若无法匹配出最符合条件的同名人物,
华谱通会从候选的同名人物中随机选择一个进行查询和大模型问答; 之后, 在大模型生成答案的末端增加对其余
同名人物的简介 (参考第 3.3.1 节中内容), 以方便用户做进一步选择. 为帮助读者更直观地了解算法中功能函数
(SPARQL() 和 TextMatch(A, B)) 的具体设计细节, 本文将华谱通同名人物多条件匹配机制的核心脚本上传至
GitHub 代码库, 详见 https://github.com/lazyloafer/Huaputong/tree/main/qa_demo.py.
2.3.2 关系路径排序
当进行人物关系查询时, SPARQL 可能会检索到多条关系路径来提示大模型生成答案. 然而, 大多数关系路径
所表达的人物关系都不够直观, 且大模型对复杂关系的总结能力偏弱. 因此, 大量冗余的路径可能会干扰大模型对
人物关系的总结, 图 6 展示了 ChatGPT 在多关系路径下错误总结人物关系的案例.

