2011-03-15 32 views
6

我目前正在探索從作者機構(考研文章)我的樣本數據看起來像抽取國名的可能性:提取國家名稱從作者機構

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中進行進一步分析並生成圖形。

+1

如果您預處理R以外的文件,將其保存爲CSV,然後將R用於其餘部分,您可能會做得更好。 Google Refine是這類工作的絕佳工具。 – edmz 2011-03-15 21:30:51

+0

'Google Refine'也很好用!感謝您的建議! – 2011-03-16 17:06:05

回答

6

下面是一個簡單的解決方案,可能會讓你開始一些方法。它利用包含地圖包中的城市和國家數據的數據庫。如果你能獲得更好的數據庫,修改代碼應該很簡單。

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) 

有了位數據清理的你可以做一些與此有關。

+0

有了外部地理編碼服務,您可能已經找到了第四個,但您的解決方案非常好,並保留在R內。如果我剩下一些選票,我會提高投票率:-) – juba 2011-03-15 21:57:35

+0

@juba謝謝。可以擴展這個解決方案。例如,如果找到了一個城市,但是一個國家沒有,那麼可以在這個國家找到這個國家來尋找世界上所發現的城市。城市 – Andrie 2011-03-15 22:03:13

+0

'caa <-gsub(「[[:punct:] \ n]」,「」,aa)#Works''str_replace_all'不工作,'llply'應該替換爲'lapply'非常感謝@Andrie – 2011-03-15 23:50:48

1

一種方式可能是拆分字符串以隔離地理信息(例如刪除所有內容直至第一次昏迷),然後將結果提交給地理編碼服務。

例如,Google地理編碼API允許發送地址並獲取本地化和相應的地理信息,例如國家/地區。我不認爲這是一個現成的R時包做,但你可以在這裏找到一些功能,例如:

Geocoding in R with Google Maps

也有擴展其他語言,比如Ruby:

http://geokit.rubyforge.org/

這還取決於您的觀察次數,例如,如果我沒有記錯的話,免費的Google API限制爲約200個地址/ IP /天。

相關問題