使用 R 从 Pubmed 数据中的隶属关系中提取大学名称
Extracting university names from affiliation in Pubmed data with R
我一直在使用 R 中非常有用的 rentrez 包从 Pubmed 数据库中获取有关作者、文章 ID 和作者隶属关系的信息。这工作正常,但现在我想从附属字段中提取信息。不幸的是,隶属关系字段是广泛的非结构化字段,不是标准化的字符串,包含各种类型的信息,例如大学名称、部门名称、地址以及更多由逗号分隔的信息。因此,文本挖掘方法对于从该字段中获取任何有用的信息是必要的。
我尝试将 easyPubmed 包与 rentrez 结合使用,尽管 easyPubmed 包可以从附属字段中提取一些信息(例如电子邮件地址,这非常有用),但据我所知它无法提取大学名称。我也试过包 pubmed.mineR,但不幸的是这也不提供大学名称提取。我开始尝试使用 grep 和 regex 函数,但由于我不是 R 专家,所以无法完成这项工作。
我能够找到与 python:
非常相似的线程来解决问题
Regex for extracting names of colleges, universities, and institutes?
How to extract university/school/college name from string in python using regular expression?
但不幸的是,我不知道如何将 python 正则表达式函数转换为 R 正则表达式函数,因为我不熟悉 python。
这是一些示例数据:
PMID = c(121,122,123,124,125)
author=c("author1","author2","author3","author4","author5")
Affiliation = c("blabla,University Ghent,blablabla", "University Washington, blabla, blablabla, blablabalbalba","blabla,University of Florence,blabla", "University Chicago, Harvard University", "Oxford University")
df = as.data.frame(cbind(PMID,author,Affiliation))
df
PMID author Affiliation
1 121 author1 blabla,University Ghent,blablabla
2 122 author2 University Washington, blabla, blablabla, blablabalbalba
3 123 author3 blabla,University of Florence,blabla
4 124 author4 University Chicago, Harvard University
5 125 author5 Oxford University
我想得到什么:
PMID author Affiliation University
1 121 author1 blabla,University Ghent,blablabla University Ghent
2 122 author2 University Washington,ba, bla, bla University Washington
3 123 author3 blabla,University Florence,blabla University of Florence
4 124 author4 University Chicago, Harvard Univ University Chicago, Harvard University
5 125 author5 Oxford University Oxford University
如果网上已经有解决方案,请见谅,但老实说,我在谷歌上搜索了很多,但没有找到任何明确的 R 解决方案。我将非常感谢对此任务的任何提示和解决方案。
一般来说,正则表达式可以通过一些更改移植到 R。例如,使用您包含的 php link,您可以使用该正则表达式创建一个包含提取文本的新变量,并且只更改转义字符(“\\”而不是“\”)。因此,使用 dplyr
和 stringr
包:
library(dplyr)
library(stringr)
df <- df %>%
mutate(Organization=str_extract(Affiliation,
"([A-Z][^\s,.]+[.]?\s[(]?)*(College|University|Institute|Law School|School of|Academy)[^,\d]*(?=,|\d)"))
我一直在使用 R 中非常有用的 rentrez 包从 Pubmed 数据库中获取有关作者、文章 ID 和作者隶属关系的信息。这工作正常,但现在我想从附属字段中提取信息。不幸的是,隶属关系字段是广泛的非结构化字段,不是标准化的字符串,包含各种类型的信息,例如大学名称、部门名称、地址以及更多由逗号分隔的信息。因此,文本挖掘方法对于从该字段中获取任何有用的信息是必要的。
我尝试将 easyPubmed 包与 rentrez 结合使用,尽管 easyPubmed 包可以从附属字段中提取一些信息(例如电子邮件地址,这非常有用),但据我所知它无法提取大学名称。我也试过包 pubmed.mineR,但不幸的是这也不提供大学名称提取。我开始尝试使用 grep 和 regex 函数,但由于我不是 R 专家,所以无法完成这项工作。
我能够找到与 python:
非常相似的线程来解决问题Regex for extracting names of colleges, universities, and institutes?
How to extract university/school/college name from string in python using regular expression?
但不幸的是,我不知道如何将 python 正则表达式函数转换为 R 正则表达式函数,因为我不熟悉 python。
这是一些示例数据:
PMID = c(121,122,123,124,125)
author=c("author1","author2","author3","author4","author5")
Affiliation = c("blabla,University Ghent,blablabla", "University Washington, blabla, blablabla, blablabalbalba","blabla,University of Florence,blabla", "University Chicago, Harvard University", "Oxford University")
df = as.data.frame(cbind(PMID,author,Affiliation))
df
PMID author Affiliation
1 121 author1 blabla,University Ghent,blablabla
2 122 author2 University Washington, blabla, blablabla, blablabalbalba
3 123 author3 blabla,University of Florence,blabla
4 124 author4 University Chicago, Harvard University
5 125 author5 Oxford University
我想得到什么:
PMID author Affiliation University
1 121 author1 blabla,University Ghent,blablabla University Ghent
2 122 author2 University Washington,ba, bla, bla University Washington
3 123 author3 blabla,University Florence,blabla University of Florence
4 124 author4 University Chicago, Harvard Univ University Chicago, Harvard University
5 125 author5 Oxford University Oxford University
如果网上已经有解决方案,请见谅,但老实说,我在谷歌上搜索了很多,但没有找到任何明确的 R 解决方案。我将非常感谢对此任务的任何提示和解决方案。
一般来说,正则表达式可以通过一些更改移植到 R。例如,使用您包含的 php link,您可以使用该正则表达式创建一个包含提取文本的新变量,并且只更改转义字符(“\\”而不是“\”)。因此,使用 dplyr
和 stringr
包:
library(dplyr)
library(stringr)
df <- df %>%
mutate(Organization=str_extract(Affiliation,
"([A-Z][^\s,.]+[.]?\s[(]?)*(College|University|Institute|Law School|School of|Academy)[^,\d]*(?=,|\d)"))