我有一个引文表,其中包括第一作者的姓氏、标题、期刊、年份和每个引文的页码。
我已经在Google Docs上发布了表格的前几行;它也以CSV 文件的形式提供。(请注意,有些记录没有DOI。)
我希望能够查询每个引用的 DOI。对于标题,最好是查询可以处理某种形式的模糊匹配。
我怎样才能做到这一点?
该表目前在 MySQL 中,但以 CSV 文件开始和结束就足够了,或者因为我主要使用 R,所以使用 R 数据框。(我将不胜感激从头到尾的答案。)
我有一个引文表,其中包括第一作者的姓氏、标题、期刊、年份和每个引文的页码。
我已经在Google Docs上发布了表格的前几行;它也以CSV 文件的形式提供。(请注意,有些记录没有DOI。)
我希望能够查询每个引用的 DOI。对于标题,最好是查询可以处理某种形式的模糊匹配。
我怎样才能做到这一点?
该表目前在 MySQL 中,但以 CSV 文件开始和结束就足够了,或者因为我主要使用 R,所以使用 R 数据框。(我将不胜感激从头到尾的答案。)
我不知道有任何完整的包或功能可以做到这一点,但这是我会使用的一般方法。Crossref DOI 注册机构提供了一种基于 Web 的方法,用于从https://www.crossref.org/guestquery/的书目数据中确定 DOI 。
该页面上有几种不同的搜索方式,包括最后一种采用 XML 格式搜索的方式。该页面包含有关如何创建适当 XML 的信息。您需要通过 HTTP 提交 XML(通过拆分页面来确定详细信息以找出表单目标和需要包含的任何其他信息),然后解析出响应。
此外,您需要验证以自动方式执行此操作不会以任何方式违反网站的服务条款。
以下是 Crossref 免费 DOI 查找的 XML 表单,其中可搜索的术语包括article_title
、author
、year
、journal_title
、volume
和first_page
:
<?xml version = "1.0" encoding="UTF-8"?>
<query_batch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xmlns="http://www.crossref.org/qschema/2.0"
xsi:schemaLocation="http://www.crossref.org/qschema/2.0 http://www.crossref.org/qschema/crossref_query_input2.0.xsd">
<head>
<email_address>test@crossref.org</email_address>
<doi_batch_id>test</doi_batch_id>
</head>
<body>
<query enable-multiple-hits="false|exact|multi_hit_per_rule|one_hit_per_rule|true"
list-components="false"
expanded-results="false" key="key">
<article_title match="fuzzy"></article_title>
<author search-all-authors="false"></author>
<component_number></component_number>
<edition_number></edition_number>
<institution_name></institution_name>
<isbn></isbn>
<issn></issn>
<volume></volume>
<issue></issue>
<year></year>
<first_page></first_page>
<journal_title></journal_title>
<proceedings_title></proceedings_title>
<series_title></series_title>
<volume_title></volume_title>
<unstructured_citation></unstructured_citation>
</query>
</body>
</query_batch>
这是一个开放的问题。有更好和更坏的方法来攻击它。首先阅读Karen Coyle对问题的总结。那篇文章末尾的参考书目非常好。
简而言之,量化两个书目记录之间的相同性问题是困难的,围绕这个主题已经进行了大量的机器学习研究。
我在http://www.crossref.org/stqUpload/找到了另一种有前途的解决方案,它在实践中不如直接上传 CSV 并在此处执行文本查询。
然而,250 个查询中只有 18 个(≈7%)返回了 DOI。
根据Brian Diggs 的回答,这里尝试完成 95% 的工作 — 编写基于 XML 的查询。它仍然有一些错误需要使用sed
. 但最大的问题是我在提交查询时遇到的“会话超时”错误。
XML 语法包括一个使用模糊匹配的选项。
该doiquery.xml
文件包含来自Brian 的答案的模板文本;该citations.csv
文件在上面链接。
library(XML)
doiquery.xml <- xmlTreeParse('doiquery.xml')
query <- doiquery.xml$doc$children$query_batch[["body"]]
citations <- read.csv("citations.csv")
new.query <- function(citation, query = query){
xmlValue(query[["author"]]) <- as.character(citation$author)
xmlValue(query[["year"]]) <- as.character(citation$year)
xmlValue(query[["article_title"]][["text"]]) <- citation$title
xmlValue(query[["journal_title"]]) <- citation$journal
return(query)
}
for (i in 1:nrow(citations)){
q <- addChildren(q, add.query(citations[i,]))
}
axml <- addChildren(doiquery.xml$doc$children$query_batch, q )
saveXML(axml, file = 'foo.xml')
Creativyst 软件提供了一个基于 Web 的CSV 到 XML 转换器。
采取的必要步骤如下。
document
在DocID字段中输入。query
在RowID字段中输入。