Disambiguasi nama tempat berantakan dengan python (lebih disukai di komputer lokal)

8

Saya punya daftar dengan beberapa juta nama tempat yang berasal dari profil Flickr. Pengguna memberikan nama tempat ini sebagai teks gratis, sehingga terlihat seperti ini:

Roma, Italy
Kennesaw, USA
Saginaw, MI
Rucker, Missouri, USA
Melbourne, Australia
Madrid, Spain
live in Sarnia / work in London, Canada
Valladolid, España
Italia
West Hollywood, United States

Saya ingin mendamaikan nama-nama tempat ini. Saya sadar bahwa dalam beberapa kasus tidak ada solusi langsung, tetapi saya bersedia untuk hidup dengan beberapa disambiguasi palsu dan dengan "tidak ada jawaban" untuk beberapa tempat. Jika nama tempat sesuai dengan nama beberapa kota, maka saya ingin menetapkan tempat itu ke kota terbesar yang terkait dengannya.

Api pencari tempat Yahoo akan menjadi solusi yang baik untuk masalah ini, tetapi saya perlu membuat terlalu banyak panggilan API untuk melewati daftar saya, jadi saya ingin solusi lokal (yaitu, yang tidak bergantung pada api jarak jauh) . Adakah yang tahu perpustakaan python yang melakukan hal semacam ini, atau solusi lokal lainnya?

(Saya juga menanyakan pertanyaan ini di stackoverflow .)

conradlee
sumber

Jawaban:

8

Anda bisa mencoba geodict library Python . Ini memiliki kumpulan data yang dapat Anda unduh dan impor ke database - Anda dapat memeriksa daftar untuk melihat apakah mereka berfungsi dengan baik atau tidak dengan data Anda. Ini bekerja dalam dua langkah:

  1. Mengekstrak nama
  2. Mencocokkan nama dengan lokasi dalam daftar

Lebih detail (dan opsi online lain di komentar) di sini .

geografi
sumber
2

Saya berasumsi tebakan terbaik Anda adalah menggunakan algoritma fuzzy.

Ambil kamus lokal Anda tentang nama tempat dan unit administratif dan bandingkan setiap kata dan setiap blok teks yang dipisahkan koma dengan kamus ini. Tetapkan skor untuk setiap pertandingan. Anda mungkin ingin menggunakan pencarian yang dinormalisasi untuk menghitung kesalahan pengejaan dan memiliki "daftar abaikan" untuk kata-kata seperti "langsung" dan "bekerja" dan "dalam". Tambahkan skor untuk unit administratif ke skor setiap unit yang lebih kecil atau nama tempat di pertandingan Anda yang ada di dalam unit administrasi ini.

Setel fungsi penilaian dengan hasil Anda sampai Anda bahagia. Ikuti pertandingan penilaian terbaik.

e.g.: Roma, Italy 
Roma matches 8 places (score according to size)
Roma matches 23 more places with normalization (lower score according to size)
Italy matches 4 places + 2 administrative units (COUNTRY, DISTRICT) (score acconding to size)
Italy matches 14 more places and units with normalization (lower score according to size)
One of the Romas lies in one of your units. -> combine scores

Jika Anda menyetel baik, Anda akan memberikan poin terbanyak ke ibukota Italia.

relet
sumber
1

Anda dapat menggunakan perpustakaan python geotext untuk hal yang sama.

pip install geotext

yang diperlukan hanyalah menginstal pustaka ini. Penggunaannya sesederhana:

from geotext import GeoText
places = GeoText("London is a great city")
places.cities

memberikan hasil 'London'

Daftar kota-kota yang dicakup dalam perpustakaan ini tidak luas tetapi memiliki daftar yang bagus.

Anindita Bhowmik
sumber
0

Tawaran komersial adalah geocoder Polygon Analytics , yang ada sebagai SAAS REST API serta API C ++ berkinerja tinggi di tempat (dengan pembungkus untuk Python, Java, dan lainnya) untuk menghindari latensi jaringan (atau untuk data sensitif).

API-nya juga menyediakan keluaran lat / lon untuk pemetaan.

James Winnacker
sumber