Извлечение названия страны из авторской принадлежности - PullRequest
6 голосов
/ 16 марта 2011

В настоящее время я изучаю возможность извлечения названия страны из принадлежности автора (статьи 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.

Ответы [ 2 ]

7 голосов
/ 16 марта 2011

Вот простое решение, которое может помочь вам начать работу. Он использует базу данных, содержащую данные о городе и стране в пакете карт. Если вы можете получить лучшую базу данных, вам будет просто изменить код.

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)

С небольшой очисткой данных вы сможете что-то сделать с этим.

1 голос
/ 16 марта 2011

Одним из способов может быть разделение строк для изоляции географической информации (например, путем удаления всего до первой запятой), а затем передача результата в службу геокодирования.

Например, API геокодирования Google позволяет отправить адрес и получить обратно локализацию и соответствующую географическую информацию, такую ​​как страна. Я не думаю, что для этого есть готовый пакет R, но вы можете найти здесь некоторые функции, например:

Геокодирование в R с Google Maps

Существуют также расширения на других языках, таких как Ruby:

http://geokit.rubyforge.org/

Это также зависит от количества ваших наблюдений, например, бесплатный Google API ограничен примерно 200 адресами / IP / день, если я правильно помню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...