我目前正在探索从作者从属关系(PubMed文章)中提取国家名称的可能性。我的样本数据如下:
Mechanical and Production Engineering Department, National University of Singapore.
Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, U.K.
Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, UK.
Lilly Research Laboratories, Eli Lilly and Company, Indianapolis, IN 46285.
最初,我尝试删除标点符号并将向量分成单词,然后将其与维基百科中的国家名称列表进行比较,但我在这方面做得不成功。
有没有人能给我推荐一个更好的方法呢?我更喜欢在R
中的解决方案,因为我必须在R
中做进一步的分析和生成图形。
发布于 2011-03-15 21:45:57
这里有一个简单的解决方案,可能会让你开始一些工作。它利用了一个在地图包中包含城市和国家数据的数据库。如果你能得到一个更好的数据库,那么修改代码应该很简单。
library(maps)
library(plyr)
# Load data from package maps
data(world.cities)
# Create test data
aa <- c(
"Mechanical and Production Engineering Department, National University of Singapore.",
"Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, U.K.",
"Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, UK.",
"Lilly Research Laboratories, Eli Lilly and Company, Indianapolis, IN 46285."
)
# Remove punctuation from data
caa <- gsub(aa, "[[:punct:]]", "") ### *Edit*
# Split data at word boundaries
saa <- strsplit(caa, " ")
# Match on cities in world.cities
# Assumes that if multiple matches, the last takes precedence, i.e. max()
llply(saa, function(x)x[max(which(x %in% world.cities$name))])
# Match on country in world.countries
llply(saa, function(x)x[which(x %in% world.cities$country.etc)])
这是城市的结果:
[[1]]
[1] "Singapore"
[[2]]
[1] "Cambridge"
[[3]]
[1] "Cambridge"
[[4]]
[1] "Indianapolis"
对国家和地区的结果是:
[[1]]
[1] "Singapore"
[[2]]
[1] "UK"
[[3]]
[1] "UK"
[[4]]
character(0)
通过一些数据清理,您也许能够对此做一些事情。
发布于 2011-03-15 21:29:29
一种方法是拆分字符串以隔离地理信息(例如,删除第一个coma之前的所有内容),然后将结果提交给地理编码服务。
例如,Google地理编码API允许发送地址,并返回本地化和相应的地理信息,如国家。我不认为有现成的R包可以做到这一点,但你可以在这里找到一些函数,例如:
Geocoding in R with Google Maps
还有其他语言的扩展,比如Ruby:
这也取决于你的观察次数,例如,如果我没记错的话,免费的Google API被限制在大约200个地址/ IP /天。
发布于 2019-10-31 14:36:16
@Andrie的答案很好,但它忽略了超过一个单词的城市和国家,例如新西兰或纽约。第二个例子令人担忧,因为它将被标记为与英国约克匹配,而不是与美国纽约匹配。
这个替代方案应该能更好地捕捉到这些情况。
library(maps)
library(plyr)
# Load data from package maps
data(world.cities)
# Create test data
aa <- c(
"Mechanical and Production Engineering Department, National University of Singapore.",
"Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, U.K.",
"Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, UK.",
"Lilly Research Laboratories, Eli Lilly and Company, Indianapolis, IN 46285."
)
saa <- sapply(aa, strsplit, split = ", ", USE.NAMES = FALSE)
llply(saa, function(x)x[which(x %in% world.cities$name)])
llply(saa, function(x)x[which(x %in% world.cities$country.etc)])
缺点是,任何没有特定国家或城市字段的条目都不会返回任何内容,例如新加坡大学的例子。
城市:
[[1]]
character(0)
[[2]]
[1] "Cambridge"
[[3]]
[1] "Cambridge"
[[4]]
[1] "Indianapolis"
对我来说,这不是一个问题,而是多个单词的城市/国家问题。选择更适合您的数据的选项。也许有一种方法可以将两者结合起来?
https://stackoverflow.com/questions/5318076
复制