ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于65万篇COVID-19论文的科研情报分析:从数据清洗到知识图谱构建

基于65万篇COVID-19论文的科研情报分析:从数据清洗到知识图谱构建 2023年年初有个科研管理团队找到我他们的诉求非常具体过去三年全世界围绕COVID-19发了海量论文光把标题扫一遍都看不过来他们想知道这些论文里到底藏着什么规律——哪些研究方向在快速升温、哪些团队是真正的合作枢纽、药物研发这条线上有没有实质产出。为了回答这些问题我把公开文献语料系统性地整理了一遍形成一个包含标题、作者、摘要、正文、参考文献的论文分析数据集覆盖65万篇论文可以支撑科研趋势分析、合作网络挖掘和知识图谱构建。整条链路走下来数据清洗、字段标准化、趋势分析、网络建模到图数据库落地每一步都有不少值得记录的细节。这篇就把完整过程做一个复盘适合想拿公开文献数据做科研情报分析、学科态势研判或者知识图谱项目的朋友参考。1. 数据底座这65万篇论文从哪来、边界在哪1.1 多源语料合并与去重思路做这种规模的分析第一件事不是拿数据而是想清楚数据从哪里来、以哪个版本为主。现在公开可用的COVID-19文献语料并不只有一份常见的是从CORD-19语料的schema.org结构化记录、PubMed的题录数据、PMC的XML全文、bioRxiv和medRxiv的预印本元数据里组合获取再用DOI和标题做跨源去重。这一步最大的坑在于同一篇论文在不同源头里的样子完全不一样。预印本服务器里有标题、摘要、作者列表但通常没有最终排版PMC的XML全文里字段是全的但又不是所有论文都有PubMed的题录只到摘要级别正文靠PMC补齐。所以我在合并阶段先按DOI做精确匹配DOI缺失或解析失败的记录再用归一化标题 首作者姓氏 年份做模糊匹配兜底。模糊匹配具体做法是这样的把标题转成小写去掉所有标点和停用词然后计算Jaccard相似度相似度大于0.9就判定为同一篇论文。这里要提醒一下阈值不能设太低0.85以下会开始出现误判——一些综述论文的标题高度相似但实际内容完全不同。通过这一套流程65万篇论文的去重记录稳定下来后面所有分析都基于这个主键表。1.2 数据覆盖范围的偏差要心里有数我在跑第一批统计时就发现这个语料库看起来大覆盖偏差其实很明显。以英文文献为主这会导致非英语国家的研究贡献被系统性低估。比如某些期刊上的中文、西班牙文或俄文论文能进入这个语料的比例很低做全球科研力量对比时不能直接拿论文数量当绝对指标。另一个偏差在预印本与正式出版之间。bioRxiv和medRxiv上的COVID-19论文增长极快2020年那阵子大量团队选择先发预印本再投期刊导致同一内容有两个版本。我见过最极端的情况是同一篇论文在预印本服务器、PubMed和PMC里出现三个不同版本标题略有改动作者顺序也变了如果只靠标题去重很可能漏掉。这类版本漂移问题需要在数据说明文档里明确标注否则下游统计数字会虚高。还有一部分记录只有题录和摘要没有正文全文。对于一篇论文的标题-作者-摘要-正文-参考文献五个字段都齐全这个目标来说全文缺失率是判断数据可用性的核心指标。实测下来偏临床和公卫类的记录全文齐全率比病毒学和分子生物学方向低一些这跟期刊开放获取策略有关。处理策略是能解析全文就解析解析不到就保留题录和摘要并把是否有全文作为一个标记字段写入主表方便后续按需过滤。1.3 统一字段结构设计合并之后我把所有数据拍平到一个宽表结构里核心字段如下字段名说明示例paper_id全局唯一ID主键P00000123title论文标题SARS-CoV-2 spike protein...abstract摘要全文...authors作者列表JSON数组[{name:...,orcid:...}]institutions作者机构JSON数组[...]journal期刊或预印本来源Nature / medRxivpublish_date发表日期2020-03-15doiDOI标识符10.1101/...references参考文献列表JSON数组[...]has_fulltext是否含正文全文true/false这个宽表是后续所有分析的基础但直接拿它做事不行——里面的字段需要一系列标准化处理这就是下一节要展开的内容。2. 真正花时间的是字段标准化不只是把CSV读进来2.1 作者解析、消歧与组织作者难题刚开始我以为作者字段是最简单的一个JSON数组而已但实际上它是整条数据处理链路里最费劲的部分。COVID-19论文的作者列表有几个鲜明特点一是作者数量极端膨胀一篇论文几十个作者很常见甚至出现上百人的超大型团队二是同一个人的署名格式不统一一会儿是Zhang Wei一会儿是W. Zhang一会儿又带上了ORCID三是机构字段密集且嵌套一个作者可能同时挂两三个单位而机构名本身也存在缩写和改名问题。我实测下来作者消歧不能只靠字符串匹配。我的处理链路是四步优先用ORCID做硬匹配ORCID缺失时用姓名邮箱域名匹配还是没有就用姓名机构共著关系做图结构消歧。这里最实用的技巧是把同一个作者出现在多篇论文中的共著者们拉出来如果两个同名作者的共著者集合高度重合基本可以判定为同一人。这一步我把它叫作共著者投票在大型数据集上比单纯字段匹配准很多。组织作者是另一个隐藏雷区像World Health OrganizationChinese Center for Disease Control and Prevention这类机构名会混进作者列表。它们不是自然人不能进合作网络做作者节点。处理方法是维护一个组织作者名单在解析阶段直接打标单独归到一个机构作为署名主体的字段里不影响自然人合作网络。2.2 日期、语种和关键词的归一化日期字段看着简单实际解析时各种格式都有有2020-03-15这种标准格式也有2020/3/15Mar 15, 2020甚至2020-03这种只到月份的还有一部分预印本只标了年份。我的建议是全部转成ISO 8601格式解析失败的直接置空不要强行猜测否则趋势分析里会出现日期偏移的系统性误差。比较麻烦的是同一篇论文预印本日期和正式发表日期不一致的情况我选择统一取正式发表版本日期没有正式版本的才用预印本日期。这么选择的原因是后续按月份统计发文量时如果混用两种日期2020年初那个爬坡阶段会有明显的人为波动。语种识别我用了两步先用fastText的语言识别模型跑一遍摘要置信度低于0.5的再人工抽查。这里的经验是中文、日文、韩文等CJK语言的识别比较容易但德语和法语的摘要容易和英语混淆建议只保留置信度高的英文摘要做文本挖掘其他语种保留元数据但不进模型训练。关键词字段存在大量缺失很多期刊不提供作者关键词。我的处理方式是用标题加摘要做TF-IDF再抽Top 10关键词作为机器标注关键词。这套方案在趋势分析里能用但在知识图谱构建中机器标注词不能直接作为实体需要额外过滤和映射。2.3 参考文献的解析率决定了合作关系算得准不准参考文献字段质量直接决定引用网络和知识图谱的完整性。我整理的数据集中参考文献主要以两种形式存在已经结构化的DOI数组和原始字符串列表。前者好办直接用DOI关联后者需要从自由文本里把作者年份标题期刊页码拆出来再用交叉引用匹配到论文主键。实测下来的解析率大概在60%到75%之间解析失败集中在老文献、非英文文献和格式极其混乱的预印本。一个提升解析率的细节是用正则抽DOI之外再用标题相似度作者姓氏年份三重条件做二次匹配能多救回10%左右的参考文献。参考文献解析率这个指标要单独记录下来因为它直接影响后续知识图谱中引文网络的密度。3. 从发文量与主题演化看三年科研节奏3.1 分月发文量曲线里藏着科研群体的反应速度把publish_date按月份聚合并绘制发文量折线图之后整个过程最直观的规律浮现出来了。2020年1月之前COVID-19相关论文基本是零星的2020年1月到2月开始出现第一批病毒学和流行病学论文真正意义上的爆发从2020年3月开始当月增量几乎是前两个月的数倍然后持续高位运行。我后来分析这条曲线时发现它可以明显分成三个阶段快速爆发期、平台高产出期、回落稳定期。快速爆发期大约是2020年上半年科研社区的反应速度非常快病毒基因组测序、ACE2受体结合机制和早期流行病学参数是绝对主力平台高产出期从2021年持续到2022年疫苗、免疫应答、变异株尤其是Delta和Omicron是高频词回落稳定期大致从2023年上半年开始总量缓慢下降但长新冠和多系统影响的论文反而在往上走说明领域内部的热点发生了切换。这个分月发文量数据还有个实际用途——评估一个研究方向的热度斜率。如果只看总量容易被前期爆发掩盖我建议用滚动三个月窗口计算新增发文量哪个方向是正在退潮、哪个方向还在加速斜率一看就知道。3.2 用词频和主题模型辅助判断趋势的方法关键词趋势我用了两套互补方法第一套是n-gram词频统计直接统计摘要里的bigram和trigram频率第二套是主题模型我用BERTopic按摘要做聚类然后给每个主题打标签。这里有个教训词频统计适合看已知热点主题模型适合发现潜在主题但两者都不能直接作为科研结论的证据。具体操作上词频统计之前一定要做文本清洗。摘要里有大量COVID-19SARS-CoV-2这类全局高频词这些词在做全局词频时排在最前面会掩盖其他有效信息。我的做法是先做一个领域停用词表把COVID-19、SARS-CoV-2、coronavirus、pandemic这类词过滤掉再做词频和共现。这样出来的词云和趋势才有区分度。主题模型的参数调优也是个工程活。BERTopic的min_topic_size设得太小会出现几百个细碎主题设得太大又会把一些有区分度的研究领域合并到一起。我试了几组参数后把min_topic_size设在150左右比较合适同时用HDBSCAN的聚类结果结合c-TF-IDF自动打标签人工抽验了200个样本主题一致性总体在可接受范围内。4. 合作网络谁在跟谁做研究网络结构告诉你真实答案4.1 三种粒度的网络构建思路合作网络可以从三个粒度去构建作者级、机构级、国家/地区级。作者级网络最细论文里出现共著关系就连接一条边机构级网络按作者所属机构聚合国家/地区级网络再按机构的所属地域聚合。三个层次里作者级网络在65万论文的数据量下会非常稠密直接可视化会变成一团毛线建议先在机构或国家层级观察全局结构再下钻到作者层。我用NetworkX做网络分析边权重用共著论文数量节点大小用发文量。这里要说明一下不做连边的阈值过滤的话全网节点数会到几百万计算介数中心性时性能压力很大。我的处理策略是先保留发文量前5%的节点的子图或者按边权阈值比如至少合作过2篇裁剪出骨干网络再在这个骨干网络上算中心性指标。4.2 合作网络里的关键角色代表什么在网络结构里度和介数中心性是两个信息量很大的指标。度高的节点意味着这个团队或机构合作面很广介数中心性高的节点意味着它在合作网络中承担了桥梁角色很多合作路径都要经过它。我印象比较深的例子是有一些规模不是最大的机构在合作网络中却有很高的介数中心性因为它们的合作对象横跨病毒学、临床医学、公卫和药学研究多个圈子把不同领域连接了起来。这种节点在知识图谱视角下就是典型的关键中间人它们往往不是单一领域的大牛而是跨学科合作的粘合剂。老牌的大型研究机构通常兼具高发文量、高中心性是他们长期积累的合作网络密度的体现。但我也提醒一句中心性指标和科研水平不能划等号它衡量的是网络位置不代表论文质量或被引用情况。4.3 不建议只盯着发文量排名看把机构按发文量排序后头部机构的名单比较符合直觉。但只看这个排名容易误判我强烈建议配合两个辅助指标合作网络多样性一个机构合作对象的学科背景分布和独立研究占比。有些机构发文量很高但合作网络相对封闭主要在固定几个团队内部循环另一些机构发文量中等却连接了十几个不同学科的合作者后者的跨学科创新潜力往往被忽视。我在报告中通常这样组合呈现发文量Top 20、介数中心性Top 20、合作多样性Top 20三张表交叉比对。能同时出现在三张表里的机构才是真正意义上的平台型节点值得重点关注。5. 知识图谱构建从文献字段到实体关系的完整落地5.1 图谱Schema设计与建模思路文档数据进图数据库schema设计是第一步也是非常关键的一步。我的设计围绕核心实体Paper展开实体类型关键属性说明Paperid, title, publish_date, doi论文节点Authorname, orcid作者节点Institutionname, country机构节点Topicname, source研究主题/方向Referencecited_paper_id, citation_context参考文献关系逻辑是Author-AUTHORED-PaperInstitution-AFFILIATED_WITH-AuthorPaper-CITES-PaperPaper-BELONGS_TO-TopicAuthor-COLLABORATES_WITH-Author由共著关系导出。设计时最需要注意的取舍是主题Topic节点到底要不要进图。我的结论是要进但必须限定为主题模型产出的高置信主题或人工校准过的MeSH词不能把机器抽的关键词直接灌进图里否则实体数量爆炸而且噪音极大。5.2 Neo4j导入链路与实操细节选Neo4j做图数据库承载原因很直接它的Cypher查询生态成熟社区版节点和关系的规模足够覆盖这个大项目可视化扩展也省事。导入链路我分成三步先把宽表转成CSV再用cypher-shell的LOAD CSV导入节点最后用UNIQUE约束造索引。CREATE CONSTRAINT paper_id_unique IF NOT EXISTS FOR (p:Paper) REQUIRE p.id IS UNIQUE;LOAD CSV WITH HEADERS FROM file:///papers.csv AS row FIELDTERMINATOR , CREATE (p:Paper {id: row.paper_id, title: row.title, date: row.publish_date});这里容易踩的坑是CSV里含有换行符和逗号尤其是摘要和正文字段。解决方案是导入前统一把字段里的换行符替换成空格用制表符做分隔符避免字段截断。关系导入我推荐用批量MERGE而不是CREATE避免重复边LOAD CSV WITH HEADERS FROM file:///references.csv AS row MATCH (a:Paper {id: row.paper_id}) MATCH (b:Paper {id: row.cited_id}) MERGE (a)-[:CITES]-(b);5.3 典型情报查询示例知识图谱构建完之后的价值体现在方便回答复杂问题。举个实际查询例子想找所有涉及刺突蛋白spike protein的论文及其作者MATCH (p:Paper)-[:MENTIONS]-(t:Topic) WHERE t.name CONTAINS spike MATCH (a:Author)-[:AUTHORED]-(p) RETURN p.title, collect(DISTINCT a.name)[..5] AS authors, p.date ORDER BY p.date DESC LIMIT 20;再比如要找两个看起来不相关的领域之间的桥接论文可以查同时关联两个主题的Paper节点MATCH (p:Paper)-[:BELONGS_TO]-(t1:Topic), (p:Paper)-[:BELONGS_TO]-(t2:Topic) WHERE t1.name vaccine AND t2.name long COVID RETURN p.title, p.date LIMIT 30;这些查询在关系型数据库里要写多表JOIN而且表达不直观在图数据库里一个模式匹配就出来了这也是我推荐把文献分析结果落到图库里的核心原因。6. 五个学科视角下的差异化洞察6.1 病毒学与分子生物学基础研究是发令枪从论文数据看病毒学和分子生物学是整个知识体系的起点。前期的基因组测序、受体结合机制、蛋白结构解析这些研究为后端的检测、疫苗和药物研发提供了底层知识。这类论文的特点是引用半衰期短新论文出来很快会替代旧的做引文分析时要注意时效窗口。6.2 流行病学与公共卫生数据驱动的决策支撑流行病学和公共卫生类论文与政策时间线高度关联比如非药物干预措施、群体免疫、口罩有效性这些话题在政策窗口期会出现集中发文。这类论文里有大量真实世界数据和数学模型研究在做数据集的时候它们的参考文献解析率通常不高因为引用了大量灰色文献和早期预印本。6.3 临床医学与疫苗快速转化的主战场临床医学类论文在总量上占了相当大的份额从病例报告到随机对照试验证据等级跨度很大。疫苗方向是典型的高产出区从mRNA疫苗的免疫原性到真实世界的疫苗有效性研究话题演化非常清晰。在趋势分析中vaccine这个主题从2020年底开始快速上升与临床试验结果发布时间基本同步。6.4 药物研发与转化老药新用与创新药并行药物研发数据分析时最值得关注的是老药新用和创新药两条线的比例。瑞德西韦、氯喹/羟氯喹等老药的临床试验和回顾性研究数量不少但高质量证据的产出节奏比普通论文慢。用知识图谱做药物-靶点-论文关联时能比较直观地看出哪些候选药有持续的临床证据积累哪些只是一时的研究热点而后续无跟踪。6.5 交叉领域的信号最容易被总量排名淹没访谈中我遇到最多的问题是交叉领域怎么发现。我的答案是把两个主题词做共现分析找共同出现的Paper集合再看这些Paper的作者背景。比如mRNA technology和thermostability共现的论文往往来自疫苗递送和纳米技术团队的交叉合作。这类交叉信号总量可能只有几百篇放在65万的全局视角里几乎看不出来但它们的被引速度通常较快是识别新兴方向的重要参考信号。7. 跑完整个流程之后想重点提醒的几件事第一件事是数据版本管理。CORD-19这类公开语料是持续更新的今天下载的和三个月后下载的记录条数和字段都可能不同。完整记录数据源的版本号和下载时间这是能让分析结果追溯复现的底线别省。第二件事是分析结果必须回到原始论文验证。词频、主题模型、网络中心性这些计算指标只能作为线索写报告之前务必抽样回到原文看摘要甚至正文确认它们真的对应你描述的现象。我吃过一次亏主题模型把一个关于医疗资源分配的聚成了公卫政策类人工回看才发现它实际讨论的是医院床位优化模型主题标签完全跑偏。第三件事是图数据库的导入性能。65万节点和上百万条关系一次全量导入加上索引构建耗时可能以小时计。优化空间大的点在于关掉自动提交、分批导入、先建约束再导节点、关系用无向边的单一方向表达来减半写入量。我在导参考文献关系时还用了PERIODIC COMMIT的批处理参数实测能明显减少内存峰值。还有最后一点这是一套面向科研情报分析的通用数据管线不是只针对某一个病毒或疫情的一次性脚本。把清洗、标准化、建模的代码模块化之后后续处理类似的文献数据集比如糖尿病、肿瘤免疫或其他热点领域几乎可以复用80%的流程。我在实际使用中最大的体会是文献数据集的分析拼的不是堆算力而是对字段语义的理解到底有多深每一个看似不起眼的字段细节最后都会在分析结果里放大成误差或洞见。
返回列表