在科研中,有时看到两个研究类似问题的工作,会希望看看是否有后续工作对二者进行了比较和评价。比如,我听说XLNet和RoBERTa是两个很牛的预训练模型,但不知道他们孰强孰弱。那我们就想找找同时引用了它们的论文,看看别人是怎么评价比较他们的?然而,Google Scholar这类的流行的搜索引擎并不直接提供找到同时引用了两篇特定文章A,B的论文,这样的搜索功能,那么我们怎么实现这一点呢?
在StackExchange的讨论中,高赞回答提供的解决方案是,从A的引文中,再搜索B的标题,然后看看得到的结果。因为一般来说引用了B的文章里应该会包括B的标题,所以这样能够找到一些符合要求的文章。不过因为这样的搜索不是精确的,也会有一些包含了与B很像的一些关键词的文章混入,总体来说不是很精确。
还有另一种方法,我们可以得到A和B各自的引文,然后再取交集。如果两篇文章的引文不多,那么我们人工比较也就能够很快确定目标了。但是如果两篇文章的引文很多,那么就需要人工整理和比较,工作量非常大。
作为一个程序员,这样大批量的问题,当然不能自己手工去做啦,我们可以编程自动解决这个问题。
这里我们用到一个好东西,Semantic Scholar提供的论文信息API。我们可以通过提供论文的标识,从其数据库中找到相关的信息,其中就包括引文,然后我们就可以实现上述思路了。
现在,我们就以XLNet(arXiv:1906.08237)和RoBERTa(arXiv:1907.11692)为例,找到同时引用了它们的论文:
import semanticscholar as sch
# XLNet
paper1 = sch.paper('arXiv:1906.08237', timeout=2)
paper1.keys()
dict_keys(['abstract', 'arxivId', 'authors', 'citationVelocity', 'citations', 'corpusId', 'doi', 'fieldsOfStudy', 'influentialCitationCount', 'isOpenAccess', 'isPublisherLicensed', 'is_open_access', 'is_publisher_licensed', 'numCitedBy', 'numCiting', 'paperId', 'references', 'title', 'topics', 'url', 'venue', 'year'])
可以看到,这里包括了论文相关的很多信息,这里我们主要专注于引用相关的内容。
paper1["title"]
'XLNet: Generalized Autoregressive Pretraining for Language Understanding'
paper1["influentialCitationCount"]
462
len(paper1["citations"])
2616
paper1["citations"][0]
{'arxivId': None,
'authors': [{'authorId': '1519065273', 'name': 'Jia-ying Zhang'},
{'authorId': '3021771', 'name': 'Z. Zhang'},
{'authorId': '49724519', 'name': 'H. Zhang'},
{'authorId': '148431487', 'name': 'Z. Ma'},
{'authorId': '2075311652', 'name': 'Qi Ye'},
{'authorId': '145848393', 'name': 'P. He'},
{'authorId': '2613015', 'name': 'Yangming Zhou'}],
'doi': '10.1016/j.jbi.2020.103628',
'intent': [],
'isInfluential': False,
'paperId': '0031e24987fcdb8cfb0a2b842417c1d0a43a5d06',
'title': 'From electronic health records to terminology base: A novel knowledge base enrichment approach',
'url': 'https://www.semanticscholar.org/paper/0031e24987fcdb8cfb0a2b842417c1d0a43a5d06',
'venue': 'J. Biomed. Informatics',
'year': 2021}
# RoBERTa
paper2 = sch.paper('arXiv:1907.11692', timeout=2)
paper2["title"]
'RoBERTa: A Robustly Optimized BERT Pretraining Approach'
paper2["influentialCitationCount"]
1107
现在,有了两篇文章各自的信息,我们就来找到引用它们的文章的交集。
由于两篇文章都很有影响力,引文很多,我们还可以利用其中isInfluential的标签,帮助我们筛选出其中有影响力的文章来进行考察。
co_citations = list(set(x['title'] for x in paper1['citations'] if x['isInfluential']) & set(x['title'] for x in paper2['citations'] if x['isInfluential']))
len(co_citations)
158
print("\n".join(co_citations[:10]))
Exploring Discourse Structures for Argument Impact Classification
STEP: Sequence-to-Sequence Transformer Pre-training for Document Summarization
Parameter-Efficient Transfer Learning with Diff Pruning
Maximal Multiverse Learning for Promoting Cross-Task Generalization of Fine-Tuned Language Models
Defending against Backdoor Attacks in Natural Language Generation
Transformers to Learn Hierarchical Contexts in Multiparty Dialogue for Span-based Question Answering
Improving BERT Fine-Tuning via Self-Ensemble and Self-Distillation
AR-LSAT: Investigating Analytical Reasoning of Text
memeBot: Towards Automatic Image Meme Generation
ARES: A Reading Comprehension Ensembling Service
大功告成,现在我们就可以在上面的文献里研究自己感兴趣的问题啦。希望这个小技巧能够在诸位工作磕盐中带来帮助~