248 lines
13 KiB
Python
248 lines
13 KiB
Python
"""Global country → cities dataset for residence canonicalization.
|
|
|
|
Pakistan is one country in this map, not a special case. The employment-agent
|
|
prompt receives `countries_prompt_block()` so the model can map a messy
|
|
locality to exactly one city name. `canonical_city` uses the same index.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
|
|
Countries={
|
|
"Afghanistan":["Kabul","Kandahar","Herat","Mazar-i-Sharif","Jalalabad"],
|
|
"Albania":["Tirana","Durres","Vlore","Shkoder"],
|
|
"Algeria":["Algiers","Oran","Constantine","Annaba"],
|
|
"Andorra":["Andorra la Vella"],
|
|
"Angola":["Luanda","Huambo","Lobito","Benguela"],
|
|
"Argentina":["Buenos Aires","Cordoba","Rosario","Mendoza","La Plata"],
|
|
"Armenia":["Yerevan","Gyumri","Vanadzor"],
|
|
"Australia":["Sydney","Melbourne","Brisbane","Perth","Adelaide","Canberra","Gold Coast","Hobart","Darwin"],
|
|
"Austria":["Vienna","Graz","Linz","Salzburg","Innsbruck"],
|
|
"Azerbaijan":["Baku","Ganja","Sumqayit"],
|
|
"Bahamas":["Nassau","Freeport"],
|
|
"Bahrain":["Manama","Riffa","Muharraq"],
|
|
"Bangladesh":["Dhaka","Chittagong","Khulna","Rajshahi","Sylhet","Gazipur","Narayanganj"],
|
|
"Belarus":["Minsk","Gomel","Mogilev","Vitebsk"],
|
|
"Belgium":["Brussels","Antwerp","Ghent","Charleroi","Liege","Bruges"],
|
|
"Belize":["Belmopan","Belize City"],
|
|
"Benin":["Porto-Novo","Cotonou"],
|
|
"Bhutan":["Thimphu","Phuntsholing"],
|
|
"Bolivia":["La Paz","Santa Cruz","Cochabamba","Sucre"],
|
|
"Bosnia and Herzegovina":["Sarajevo","Banja Luka","Mostar","Tuzla"],
|
|
"Botswana":["Gaborone","Francistown"],
|
|
"Brazil":["Sao Paulo","Rio de Janeiro","Brasilia","Salvador","Fortaleza","Belo Horizonte","Manaus","Curitiba","Recife","Porto Alegre"],
|
|
"Brunei":["Bandar Seri Begawan"],
|
|
"Bulgaria":["Sofia","Plovdiv","Varna","Burgas"],
|
|
"Burkina Faso":["Ouagadougou","Bobo-Dioulasso"],
|
|
"Burundi":["Gitega","Bujumbura"],
|
|
"Cambodia":["Phnom Penh","Siem Reap","Sihanoukville"],
|
|
"Cameroon":["Yaounde","Douala","Garoua"],
|
|
"Canada":["Toronto","Montreal","Vancouver","Calgary","Ottawa","Edmonton","Winnipeg","Quebec City","Hamilton","Halifax"],
|
|
"Cape Verde":["Praia","Mindelo"],
|
|
"Central African Republic":["Bangui"],
|
|
"Chad":["N'Djamena","Moundou"],
|
|
"Chile":["Santiago","Valparaiso","Concepcion","Antofagasta"],
|
|
"China":["Beijing","Shanghai","Guangzhou","Shenzhen","Chengdu","Chongqing","Tianjin","Wuhan","Hangzhou","Nanjing","Xi'an","Suzhou","Dongguan","Qingdao","Dalian"],
|
|
"Colombia":["Bogota","Medellin","Cali","Barranquilla","Cartagena"],
|
|
"Comoros":["Moroni"],
|
|
"Congo":["Brazzaville","Pointe-Noire"],
|
|
"Costa Rica":["San Jose","Alajuela","Cartago"],
|
|
"Croatia":["Zagreb","Split","Rijeka","Osijek"],
|
|
"Cuba":["Havana","Santiago de Cuba","Camaguey"],
|
|
"Cyprus":["Nicosia","Limassol","Larnaca","Paphos"],
|
|
"Czech Republic":["Prague","Brno","Ostrava","Plzen"],
|
|
"Democratic Republic of the Congo":["Kinshasa","Lubumbashi","Mbuji-Mayi"],
|
|
"Denmark":["Copenhagen","Aarhus","Odense","Aalborg"],
|
|
"Djibouti":["Djibouti"],
|
|
"Dominican Republic":["Santo Domingo","Santiago"],
|
|
"Ecuador":["Quito","Guayaquil","Cuenca"],
|
|
"Egypt":["Cairo","Alexandria","Giza","Shubra El Kheima","Port Said","Suez","Luxor"],
|
|
"El Salvador":["San Salvador","Santa Ana","San Miguel"],
|
|
"Equatorial Guinea":["Malabo","Bata"],
|
|
"Eritrea":["Asmara"],
|
|
"Estonia":["Tallinn","Tartu"],
|
|
"Eswatini":["Mbabane","Manzini"],
|
|
"Ethiopia":["Addis Ababa","Dire Dawa","Mekelle"],
|
|
"Fiji":["Suva","Nadi"],
|
|
"Finland":["Helsinki","Espoo","Tampere","Oulu","Turku"],
|
|
"France":["Paris","Marseille","Lyon","Toulouse","Nice","Nantes","Strasbourg","Bordeaux","Lille","Rennes"],
|
|
"Gabon":["Libreville"],
|
|
"Gambia":["Banjul","Serekunda"],
|
|
"Georgia":["Tbilisi","Batumi","Kutaisi"],
|
|
"Germany":["Berlin","Hamburg","Munich","Cologne","Frankfurt","Stuttgart","Dusseldorf","Dortmund","Essen","Leipzig","Dresden","Hanover","Nuremberg"],
|
|
"Ghana":["Accra","Kumasi","Tamale","Takoradi"],
|
|
"Greece":["Athens","Thessaloniki","Patras","Heraklion"],
|
|
"Guatemala":["Guatemala City","Quetzaltenango"],
|
|
"Guinea":["Conakry"],
|
|
"Guyana":["Georgetown"],
|
|
"Haiti":["Port-au-Prince","Cap-Haitien"],
|
|
"Honduras":["Tegucigalpa","San Pedro Sula"],
|
|
"Hungary":["Budapest","Debrecen","Szeged","Miskolc"],
|
|
"Iceland":["Reykjavik"],
|
|
"India":["Mumbai","Delhi","Bengaluru","Hyderabad","Ahmedabad","Chennai","Kolkata","Pune","Jaipur","Surat","Lucknow","Kanpur","Nagpur","Indore","Bhopal","Patna","Chandigarh","Noida","Gurgaon","Kochi","Coimbatore"],
|
|
"Indonesia":["Jakarta","Surabaya","Bandung","Medan","Bekasi","Depok","Tangerang","Semarang","Makassar","Palembang"],
|
|
"Iran":["Tehran","Mashhad","Isfahan","Karaj","Shiraz","Tabriz","Qom","Ahvaz"],
|
|
"Iraq":["Baghdad","Basra","Mosul","Erbil","Najaf","Karbala","Sulaymaniyah"],
|
|
"Ireland":["Dublin","Cork","Limerick","Galway","Waterford"],
|
|
"Israel":["Jerusalem","Tel Aviv","Haifa","Rishon LeZion","Petah Tikva"],
|
|
"Italy":["Rome","Milan","Naples","Turin","Palermo","Genoa","Bologna","Florence","Venice","Bari"],
|
|
"Ivory Coast":["Yamoussoukro","Abidjan"],
|
|
"Jamaica":["Kingston","Montego Bay"],
|
|
"Japan":["Tokyo","Yokohama","Osaka","Nagoya","Sapporo","Fukuoka","Kobe","Kyoto","Kawasaki","Saitama","Hiroshima","Sendai"],
|
|
"Jordan":["Amman","Zarqa","Irbid","Aqaba"],
|
|
"Kazakhstan":["Astana","Almaty","Shymkent","Aktobe"],
|
|
"Kenya":["Nairobi","Mombasa","Kisumu","Nakuru"],
|
|
"Kuwait":["Kuwait City","Hawalli","Salmiya","Jahra"],
|
|
"Kyrgyzstan":["Bishkek","Osh"],
|
|
"Laos":["Vientiane","Luang Prabang"],
|
|
"Latvia":["Riga","Daugavpils"],
|
|
"Lebanon":["Beirut","Tripoli","Sidon","Zahle"],
|
|
"Lesotho":["Maseru"],
|
|
"Liberia":["Monrovia"],
|
|
"Libya":["Tripoli","Benghazi","Misrata"],
|
|
"Liechtenstein":["Vaduz"],
|
|
"Lithuania":["Vilnius","Kaunas","Klaipeda"],
|
|
"Luxembourg":["Luxembourg"],
|
|
"Madagascar":["Antananarivo","Toamasina"],
|
|
"Malawi":["Lilongwe","Blantyre"],
|
|
"Malaysia":["Kuala Lumpur","George Town","Johor Bahru","Ipoh","Shah Alam","Petaling Jaya","Kota Kinabalu","Kuching","Malacca"],
|
|
"Maldives":["Male"],
|
|
"Mali":["Bamako"],
|
|
"Malta":["Valletta","Birkirkara"],
|
|
"Mauritania":["Nouakchott"],
|
|
"Mauritius":["Port Louis"],
|
|
"Mexico":["Mexico City","Guadalajara","Monterrey","Puebla","Tijuana","Leon","Juarez","Merida","Cancun","Queretaro"],
|
|
"Moldova":["Chisinau"],
|
|
"Monaco":["Monaco"],
|
|
"Mongolia":["Ulaanbaatar"],
|
|
"Montenegro":["Podgorica","Niksic"],
|
|
"Morocco":["Rabat","Casablanca","Fes","Marrakesh","Tangier","Agadir","Meknes"],
|
|
"Mozambique":["Maputo","Beira","Nampula"],
|
|
"Myanmar":["Naypyidaw","Yangon","Mandalay"],
|
|
"Namibia":["Windhoek","Walvis Bay"],
|
|
"Nepal":["Kathmandu","Pokhara","Lalitpur","Biratnagar"],
|
|
"Netherlands":["Amsterdam","Rotterdam","The Hague","Utrecht","Eindhoven","Groningen"],
|
|
"New Zealand":["Auckland","Wellington","Christchurch","Hamilton","Dunedin"],
|
|
"Nicaragua":["Managua"],
|
|
"Niger":["Niamey"],
|
|
"Nigeria":["Abuja","Lagos","Kano","Ibadan","Port Harcourt","Benin City","Kaduna"],
|
|
"North Korea":["Pyongyang"],
|
|
"North Macedonia":["Skopje"],
|
|
"Norway":["Oslo","Bergen","Trondheim","Stavanger"],
|
|
"Oman":["Muscat","Salalah","Sohar","Nizwa"],
|
|
"Pakistan":[
|
|
"Karachi","Lahore","Islamabad","Rawalpindi","Peshawar","Quetta","Faisalabad",
|
|
"Multan","Hyderabad","Sialkot","Gujranwala","Sargodha","Bahawalpur",
|
|
"Sukkur","Larkana","Sheikhupura","Rahim Yar Khan","Sahiwal","Jhang","Okara",
|
|
"Gujrat","Kasur","Dera Ghazi Khan","Mardan","Abbottabad","Mingora","Nawabshah",
|
|
"Mirpur","Muzaffarabad","Gilgit","Skardu","Wah","Attock","Jhelum","Chakwal",
|
|
"Taxila","Kamra","Haripur","Mansehra","Kohat","Bannu","Dera Ismail Khan",
|
|
"Charsadda","Nowshera","Swat","Chitral","Swabi","Jacobabad","Khairpur","Thatta",
|
|
"Gwadar","Turbat","Hub","Kotri","Jamshoro","Shikarpur","Dadu","Badin","Khuzdar",
|
|
"Chaman","Kamoke","Muridke","Hafizabad","Narowal","Pakpattan","Vehari","Khanewal",
|
|
"Layyah","Burewala","Gojra","Chiniot","Bhakkar","Mianwali","Khushab","Murree",
|
|
"Kotli","Bhimber","Rawalakot","Toba Tek Singh","Mandi Bahauddin","Muzaffargarh",
|
|
"Mirpur Khas","Hasan Abdal",
|
|
],
|
|
"Palestine":["Gaza","Ramallah","Hebron","Nablus"],
|
|
"Panama":["Panama City","Colon"],
|
|
"Papua New Guinea":["Port Moresby"],
|
|
"Paraguay":["Asuncion","Ciudad del Este"],
|
|
"Peru":["Lima","Arequipa","Trujillo","Cusco"],
|
|
"Philippines":["Manila","Quezon City","Davao","Cebu","Zamboanga","Taguig","Pasig","Cagayan de Oro"],
|
|
"Poland":["Warsaw","Krakow","Lodz","Wroclaw","Poznan","Gdansk","Szczecin"],
|
|
"Portugal":["Lisbon","Porto","Braga","Coimbra","Faro"],
|
|
"Qatar":["Doha","Al Rayyan","Al Wakrah"],
|
|
"Romania":["Bucharest","Cluj-Napoca","Timisoara","Iasi","Constanta","Brasov"],
|
|
"Russia":["Moscow","Saint Petersburg","Novosibirsk","Yekaterinburg","Kazan","Nizhny Novgorod","Chelyabinsk","Samara","Rostov-on-Don","Ufa"],
|
|
"Rwanda":["Kigali"],
|
|
"Saudi Arabia":["Riyadh","Jeddah","Mecca","Medina","Dammam","Khobar","Dhahran","Tabuk","Abha","Taif"],
|
|
"Senegal":["Dakar","Touba","Thies"],
|
|
"Serbia":["Belgrade","Novi Sad","Nis"],
|
|
"Seychelles":["Victoria"],
|
|
"Sierra Leone":["Freetown"],
|
|
"Singapore":["Singapore"],
|
|
"Slovakia":["Bratislava","Kosice"],
|
|
"Slovenia":["Ljubljana","Maribor"],
|
|
"Somalia":["Mogadishu","Hargeisa"],
|
|
"South Africa":["Johannesburg","Cape Town","Durban","Pretoria","Port Elizabeth","Bloemfontein","East London","Soweto"],
|
|
"South Korea":["Seoul","Busan","Incheon","Daegu","Daejeon","Gwangju","Suwon","Ulsan"],
|
|
"South Sudan":["Juba"],
|
|
"Spain":["Madrid","Barcelona","Valencia","Seville","Zaragoza","Malaga","Murcia","Palma","Bilbao","Alicante"],
|
|
"Sri Lanka":["Colombo","Kandy","Galle","Jaffna","Negombo"],
|
|
"Sudan":["Khartoum","Omdurman","Port Sudan"],
|
|
"Suriname":["Paramaribo"],
|
|
"Sweden":["Stockholm","Gothenburg","Malmo","Uppsala"],
|
|
"Switzerland":["Zurich","Geneva","Basel","Bern","Lausanne","Lucerne"],
|
|
"Syria":["Damascus","Aleppo","Homs","Latakia"],
|
|
"Taiwan":["Taipei","Kaohsiung","Taichung","Tainan"],
|
|
"Tajikistan":["Dushanbe"],
|
|
"Tanzania":["Dodoma","Dar es Salaam","Mwanza","Arusha","Zanzibar"],
|
|
"Thailand":["Bangkok","Chiang Mai","Pattaya","Phuket","Nonthaburi","Hat Yai"],
|
|
"Togo":["Lome"],
|
|
"Trinidad and Tobago":["Port of Spain","San Fernando"],
|
|
"Tunisia":["Tunis","Sfax","Sousse"],
|
|
"Turkey":["Istanbul","Ankara","Izmir","Bursa","Antalya","Adana","Gaziantep","Konya","Mersin"],
|
|
"Turkmenistan":["Ashgabat"],
|
|
"Uganda":["Kampala","Gulu"],
|
|
"Ukraine":["Kyiv","Kharkiv","Odesa","Dnipro","Lviv","Zaporizhzhia"],
|
|
"United Arab Emirates":["Dubai","Abu Dhabi","Sharjah","Ajman","Ras Al Khaimah","Fujairah","Al Ain","Umm Al Quwain"],
|
|
"United Kingdom":["London","Birmingham","Manchester","Glasgow","Liverpool","Leeds","Sheffield","Edinburgh","Bristol","Leicester","Newcastle","Cardiff","Belfast","Nottingham","Southampton"],
|
|
"United States":[
|
|
"New York","Los Angeles","Chicago","Houston","Phoenix","Philadelphia","San Antonio",
|
|
"San Diego","Dallas","San Jose","Austin","Jacksonville","Fort Worth","Columbus",
|
|
"Charlotte","San Francisco","Indianapolis","Seattle","Denver","Washington",
|
|
"Boston","Nashville","Detroit","Portland","Las Vegas","Baltimore","Milwaukee",
|
|
"Albuquerque","Atlanta","Miami","Minneapolis","Tampa","Orlando","Cleveland",
|
|
"Pittsburgh","Cincinnati","Kansas City","St. Louis","Raleigh","Salt Lake City",
|
|
],
|
|
"Uruguay":["Montevideo"],
|
|
"Uzbekistan":["Tashkent","Samarkand","Bukhara"],
|
|
"Venezuela":["Caracas","Maracaibo","Valencia"],
|
|
"Vietnam":["Hanoi","Ho Chi Minh City","Da Nang","Hai Phong","Can Tho"],
|
|
"Yemen":["Sanaa","Aden","Taiz"],
|
|
"Zambia":["Lusaka","Ndola","Kitwe"],
|
|
"Zimbabwe":["Harare","Bulawayo"],
|
|
}
|
|
|
|
|
|
def _city_index():
|
|
"""First spelling of each city name wins. Longest names are matched first."""
|
|
out={}
|
|
for cities in Countries.values():
|
|
for city in cities:
|
|
name=(city or "").strip()
|
|
if not name:
|
|
continue
|
|
out.setdefault(name.lower(),name)
|
|
return out
|
|
|
|
|
|
CITY_BY_KEY=_city_index()
|
|
CITY_RE=re.compile(
|
|
r"\b(?:"+"|".join(
|
|
re.escape(name) for name in sorted(CITY_BY_KEY,key=len,reverse=True)
|
|
)+r")\b",
|
|
)
|
|
|
|
|
|
def countries_prompt_block():
|
|
"""Compact country → cities block fed into the employment-agent prompt."""
|
|
lines=[]
|
|
for country,cities in Countries.items():
|
|
names=[c.strip() for c in cities if (c or "").strip()]
|
|
if not names:
|
|
continue
|
|
# De-dupe while keeping order — Pakistan lists Peshawar twice above.
|
|
seen=set()
|
|
unique=[]
|
|
for name in names:
|
|
key=name.lower()
|
|
if key in seen:
|
|
continue
|
|
seen.add(key)
|
|
unique.append(name)
|
|
lines.append(f"{country}: {', '.join(unique)}")
|
|
return "\n".join(lines)
|