把参考文献从纯文本格式转为 BibTeX 格式

为什么需要把纯文本格式的参考文献转为 BibTeX 格式?

对于一个经常需要撰写大量论文的人来说,经常需要阅读 PDF 版本的论文,并且边阅读边写作,边阅读边输出自已的文章,在这个时候。对于参考文献当然也是需要引用的,一般的做法是,把参考文献去 Google Schalor 里查一下,把 BibTeX 的格式拷贝下来并且放到自已的参考文献清单里。

整个过程费时费力,容易出错,涉及到了大量、重复的纯体力编辑工作。

有没有可能让这整个过程更加轻便呢?

另外一个设想:对于 AI 技术日益进步的今天,后续有一个 AI 助手来帮忙自已写论文也未必是不可能的事情。那么对于 AI 小助手来说,消化理解 PDF 内容最很关键的一个环节,就是对其中出现的参考文献内容进行整理与分析,如果能把 PDF 转为纯文本,再把其中的参考文献格式化索引出来,对后续的工作有莫大的帮助。

现有工具

现在有一些工作是可以做这类事情的,一一体验完毕后,来先做一个简单的分析。

借助 AI 语言大模型

使用 AI 语言大模型,可以使用类似下面的 prompt 来生成 BibTeX 的格式:

Convert the following to bibtex format: YATES, F. 1970 . Experimental Design. Selected Papers of Frank Yates, C.B.E., F.R.S. Griffin, London.

使用 ChatGPT、Coze 等,均可以生成类似下面的输出:

@book{yates1970,
     title={Experimental Design. Selected Papers of Frank Yates, C.B.E., F.R.S.},
     author={Yates, F.},
     year={1970},
     publisher={Griffin, London}
}

上面的这一切,看起来很流畅,输出结果也显示正常。但是仔细一看,会发现 ChatGPT 只是把我们输入的内容改写为 BibTeX,它并没有去检索最原始的信息,它并没有把输出的 BibTeX 信息补全,更为致命的是它并没有去检验该内容的正确性。它只是做了一步改写工作!

比如我们输入一段假的信息(把上面的内容稍作修改即可):

Convert the following to bibtex format: YATESFake, F. 2067 . Experimental Design. Selected Papers of Frank YatesPress, C.B.E., F.R.S. Griffin, London.

依然会得到下面的结果:

@book{yates2067,
    title={Experimental Design. Selected Papers of Frank Yates},
    author={Yates, F.},
    year={2067},
    publisher={Griffin Press},
    address={London}
}

text2bib

text2bib 是一个专门干这件事情的工具,它从功能上来说,和借助 AI 语言大模型类似。

但是这个工具做得比较专业,有 ChatGPT 等大语言模型所不具备的优点:

  1. 在上传文本文件的时候,有若干选项可以做选择,这样保证了转换结果更符合需求。

  2. 严格来说,对转换的参考文献条目数量没有限制,只限制文件大小为 100K 以下,所以可以多次进行转换,100K 的纯文本文件可不算小了,一篇正经的学术论文的参考文献,用纯文本格式来表达的话,估计 20K 或是 30K 已经算非常大的数量了。

  3. 在转换后,会有一个清单列表,方便你进行检查,并且有合适的页面来进行高效编辑;当你逐个一步一步的核对确认后生成的 BibTeX 就是你需要的精确的格式。

依然存在与 ChatGPT 一样最致命的问题:不会去检查参考文献本身的准确性。这一点在于科技写作来说,是最致命的。

我们需要什么样的工具?

综合上面的测试与体验,我想我们需要一个从纯文件参考文献转为 BibTeX 的工具,它必须具备以下几个功能:

  1. 能补全参考文献信息:从而提供一个完整的 BibTeX 条目,保证下次使用其它参考文献风格来生成时,能生成最完整的参考文献内容。

  2. 能校验参考文献准确性:当这个参考文献不存在或是信息不正确时,能输出警告信息并提示检查核对,这能保证我们不会写出笑话百出的论文。

  3. 使用简单,能批量检查:使用上一定要非常方便,具备一定的模糊匹配能力,能从输入的文本猜测意图,最大化查找与匹配结果。

  4. 其中的 BibTeX 的索引 Key 值,最好是 Google Scholar 上大家常用的键值,或是按某种特定的规则来生成的 key 值。

项目实现思路

为了实现上述产品定义需求,技术逻辑非常简单:

  1. 把 PDF 里的参考文献转为纯文本文件;

  2. 解析这个纯文本文件,提取 Reference(参考文献)这一章节的内容;

  3. 把 Reference 的内容转为格式化的 BibTeX 数据:在转换的过程中,最好使用 Google Scholar 之类的服务,逐一检查参考文献的有效性,并使用标准的 key 来进行标注。

  4. 在第3步的过程中,对一些有疑问的数据,可能采用人工介入的方式进行修正与判断。

PDF转为纯文本文件

PDF 转为纯文本文件,有很多方法,可以直接使用 PDF 软件来转,也可以使用代码来直接转。

代码的话,推荐使用 marker[1] 这个开源项目,虽然有不少问题,但是勉强能用,最重要的是,对数学公式也能转为 LaTeX 的格式。

获取参考文献的 BibTeX 引用信息

文献 [2] 对 Google Scholar 的 API 服务进行了非常好的综述,需要使用 Google Scholar 的 API 服务,只能考虑用第三方服务,或是自已再写一个网页爬虫。具体的实现手段并不重要,重要的是实现对纯文本文件逐一进行检查与校对的能力。

虽然有不少等同于 Google Scholar 的服务,但是相比之下,依然是优先选择这个服务,从各种情况来看,这个服务都是最通用、最好用的。经过测试,从 Google Scholar 获取信息的方法,有两种最好用:

  1. 使用 SerpApi[3]:对于免费帐号来说每个月有 100 次免费请求的额度。

  2. 使用 Scholarly[4] 这个开源项目,通过 API 来获取相关的结果。

Google Scholar 虽好,可惜上述两个 API 都是属于第三方 API,Google Scholar 并不支持这种使用方式,也就是说,使用 Scholarly 随时有可能存在不能用的风险(你得非常熟练地掌握代理的使用技术),而 SerpApi 的设计在我看来非常难用。

有一些论文查询服务提供官方的 API,简单介绍如下。

  1. arXiv API:提供查询 arXiv 的数据,同样也不提供 BibTeX 的输出。

  2. Crossref API:官方文档里同样也不提供 BibTeX 的查询方式,不过有人发现有一个[5]未经官方描述的方法,亲测可用。

  3. Zotero API:同样也不提供 BibTeX 的输出。

  4. semantic scholar API:semantic scholar 是检索论文数据一个很专业的网站,可以提供论文之间的关系链条,但是它的官方 API 同样也不提供 BibTeX 信息获取。

上述 API 是官方提供的,使用质量上有保证,但是依然是需要自已进行一定的加工才能获取 BibTeX 信息。

看起来,最稳妥的办法,依然是查询到论文的元数据,然后自已来组织生成 BibTeX 引用内容。最后我决定使用 Crossref API 来整合一个自已的工具。写这些接口实现的时候,最重要的问题依然是小心地保证调用间隔与并发数量,不要超过约定的数值。

把 Reference 的数据逐步转为 BibTeX

Reference 的数据一般来说是这样的:

Wald, A. (1943). Tests of statistical hypotheses concerning several parameters when the number of observations is large. Trans. Amer. Math. Soc. 54 426–482. MR0012401

Wald, A. (1949). Note on the consistency of the maximum likelihood estimate. Ann. Math. Statist. 20 595–601.
MR0032169

Yule, G. U. (1936). An Introduction to the Theory of Statistics, 10th ed. Charles Griffin, London. [This was the last edition revised by Yule himself; subsequent revisions from 1937 by M. G. Kendall were not greatly changed in emphasis.]

Zabell, S. L. (1992). R. A. Fisher and the fiducial argument. Statist. Sci. 7 369–387. Reprinted in 2005 in S. L. Zabell, Symmetry and its Discontents: Essays on the History of Inductive Philosophy. Cambridge Univ. Press. MR1181418

YATESFake, F. 2067 . Experimental Design. Selected Papers of Frank, YatesPress, C.B.E., F.R.S. Griffin, London.

请注意:最后一个参考文献,是我特意把日期改为错误的,以方便进行一些数据准确性校验。

现在需要做的一步,就是把上述参考文献的标题提取出来,再使用获取参考文献的 BibTeX 引用信息检索出 Cite 页面对应的 BibTeX 内容。

提取标题,有几种方法:

1. 使用正则表达式;

2. 可以使用语言大模型,使用下述的 prompt 来提取:

提取下面内容的标题并输出:
Yule, G. U. (1936). An Introduction to the Theory of Statistics, 10th ed. Charles Griffin, London. [This was the last edition revised by Yule himself; subsequent revisions from 1937 by M. G. Kendall were not greatly changed in emphasis.]

会得到如下输出:

"An Introduction to the Theory of Statistics"

第2种方法,是不是感觉比第一种正则表达式的方法好用多了?

文本语言大模型除了可以用来做上面的标题提取之外,其实还可以做更多事情,比如说判断这段文本是不是包含标题、里面的作者是谁。对于一些格式化不强、形式化不严谨的内容来说,文本语言大模型比正则表达式好用太多。

综合上述步骤,形成最终产品

把上述几个步骤的代码整合到一起,对参考文献作一个循环处理,就可以实现一个 PDF 参考文献自动转录为 BibTeX 的工程。

这个工程,在诸多方面都可以有一些用处。

测试

这里使用论文 [6] 来进行测试(有关这篇论文,我也做了一个中文翻译,有兴趣的同学可以看 [7]),先把 pdf 转为 plain text(有关这个转换另开一篇文章来进行介绍)。

参考资料

[1] “VikParuchuri/marker: Convert PDF to markdown quickly with high accuracy.” https://github.com/VikParuchuri/marker, 2024.

[2] “Top 5 google scholar APIs and scrapers in 2024.” https://blog.apify.com/best-google-scholar-apis-scrapers/, 2024.

[3] “Serper - the world’s fastest and cheapest google search API.” https://serper.dev/, 2024.

[4] “Scholarly-python-package/scholarly: Retrieve author and publication information from google scholar in a friendly, pythonic way without having to worry about CAPTCHAs!” https://github.com/scholarly-python-package/scholarly, 2024.

[5] https://github.com/CrossRef/rest-api-doc/issues/115#issuecomment-221821473, 2024.

[6] S. M. Stigler, “The epic story of maximum likelihood,” Statistical Science, pp. 598–620, 2007.

[7] M. Silkman, “The epic story of maximum likelihood | tinker, tailor, tiler.” https://cookwhy.com/publication/2024-04-18-stigler2007epic/, 2024.

Wattskemov
Wattskemov
Software Engineer

研究兴趣:音视频技术、AI技术、排版技术等

buy me a coffee