@whiteslove/parsing-lexicon 0.3.9 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whiteslove/parsing-lexicon",
3
- "version": "0.3.9",
3
+ "version": "0.4.3",
4
4
  "description": "Shared deterministic multilingual parsing lexicon for Whiteslove housing and hiring services",
5
5
  "repository": {
6
6
  "type": "git",
package/src/geo.js CHANGED
@@ -117,17 +117,18 @@ const area = (name, aliases, type = 'local_area') => deepFreeze({ canonical: nam
117
117
 
118
118
  export const TASHKENT_AREAS = Object.freeze({
119
119
  Almazar: Object.freeze([
120
- area('Sebzar', ['себзар', 'sebzar', 'ц 17', 'ц 18', 'c 17', 'c 18'], 'microdistrict'),
120
+ area('Sebzar', ['себзар', 'себзор', 'sebzar', 'sebzor', 'ц 17', 'ц 18', 'c 17', 'c 18']),
121
121
  area('Karakamysh-1/2', ['каракамыш 1 2', 'қорақамиш 1 2', 'qoraqamish 1 2', 'karakamish 1 2']),
122
122
  area('Karakamysh-2/3', ['каракамыш 2 3', 'қорақамиш 2 3', 'qoraqamish 2 3', 'karakamish 2 3']),
123
123
  area('Karakamysh-2/4', ['каракамыш 2 4', 'қорақамиш 2 4', 'qoraqamish 2 4', 'karakamish 2 4']),
124
124
  area('Karakamysh-2/5', ['каракамыш 2 5', 'қорақамиш 2 5', 'qoraqamish 2 5', 'karakamish 2 5']),
125
- area('Olympia', ['олимпия', 'olimpiya', 'olympia'], 'microdistrict'), area('Vuzgorodok', ['вузгородок', 'вуз городок', 'vuzgorodok']),
125
+ area('Olympia', ['олимпия', 'olimpiya', 'olympia']), area('Vuzgorodok', ['вузгородок', 'вуз городок', 'vuzgorodok']),
126
126
  area('Medgorodok', ['медгородок', 'мед городок', 'medgorodok']),
127
127
  area('Chimbay', ['чимбай', 'chimboy', 'chimbay']),
128
+ area('Takhtapul', ['тахтапуль', 'тахтапул', 'taxtapul', 'takhtapul']),
128
129
  ]),
129
130
  Mirobod: Object.freeze([
130
- area('Hospitalny', ['госпитальный', 'госпиталка', 'hospitalny']), area('Lolazor', ['лолазор', 'lolazor']),
131
+ area('Hospitalny', ['госпитальный', 'госпиталка', 'hospitalny']),
131
132
  area('Oltinkul', ['алтынкуль', 'олтинкул', 'олтинкўл', 'oltinkol', 'oltinkul']), area('Movarounnahr', ['мавераннахр', 'мовароуннахр', 'movarounnahr']),
132
133
  ]),
133
134
  'Mirzo Ulugbek': Object.freeze([
@@ -135,9 +136,15 @@ export const TASHKENT_AREAS = Object.freeze({
135
136
  area('Alay', ['олой', 'алайский', 'алайск', 'alay', 'ц 2', 'c 2']),
136
137
  ...[1, 2, 3, 4].map((n) => area(`Karasu-${n}`, [`карасу ${n}`, `қорасув ${n}`, `qorasuv ${n}`, `karasu ${n}`], 'microdistrict')),
137
138
  area('Karasu-6', ['карасу 6', 'қорасув 6', 'qorasuv 6', 'karasu 6'], 'microdistrict'),
138
- ...[1, 2, 3, 4].map((n) => area(`TTZ-${n}`, [`ттз ${n}`, `ttz ${n}`], 'microdistrict')),
139
+ area('Traktorsozlar-1', ['тракторсозлар 1', 'traktorsozlar 1', 'ттз 1', 'ttz 1']),
140
+ area('Traktorsozlar-2', ['тракторсозлар 2', 'traktorsozlar 2', 'ттз 2', 'ttz 2']),
141
+ area('TTZ-3', ['ттз 3', 'ttz 3']),
142
+ area('Traktorsozlar-4', ['тракторсозлар 4', 'traktorsozlar 4', 'ттз 4', 'ttz 4']),
139
143
  area('Yalangach', ['ялангач', 'yalangach', "yalang'och"]), area('Feruza', ['феруза', 'feruza']), area('Geofizika', ['геофизика', 'поселок геофизиков', 'geofizika']),
140
144
  ]),
145
+ Uchtepa: Object.freeze([
146
+ area('Lolazor', ['лолазор', 'lolazor']),
147
+ ]),
141
148
  Sergeli: Object.freeze([
142
149
  area('Yangi Sergeli', ['янги сергели', 'yangi sergeli']), area('Stroygorod', ['стройгород', 'stroygorod']),
143
150
  area('Uzgarish', ['узгарыш', 'ўзгариш', "o'zgarish", 'uzgarish']),
@@ -150,11 +157,10 @@ export const TASHKENT_AREAS = Object.freeze({
150
157
  area('Labzak', ['лабзак', 'labzak', 'ц 13', 'c 13']), area('Khadra', ['хадра', 'xadra', 'khadra', 'ц 14', 'c 14']),
151
158
  area('Jangoh', ['джангох', 'жангох', 'jangoh', 'ц 15', 'c 15']), area('Karatash', ['караташ', 'қоратош', 'qoratosh', 'karatash']),
152
159
  area('Chorsu', ['чорсу', 'chorsu']), area('Beltepa', ['белтепа', 'beltepa']),
153
- area('Takhtapul', ['тахтапуль', 'тахтапул', 'taxtapul', 'takhtapul']),
154
160
  ]),
155
161
  Yunusabad: Object.freeze([
156
- area('Kashgar', ['кашгар', 'қашқар', 'qashqar', 'kashgar', 'ц 4', 'c 4']), area('Kiyot', ['киёт', 'қиёт', 'qiyot', 'kiyot', 'ц 5', 'c 5']),
157
- area('Minor', ['минор', 'minor', 'ц 6', 'c 6']), area('TashGRES', ['ташгрэс', 'tashgres']),
162
+ area('Kashgar', ['кашгар', 'қашқар', 'qashqar', 'kashgar', 'ц 4', 'c 4']), area('Qiyot', ['киёт', 'кият', 'қиёт', 'qiyot', 'kiyot', 'markaz 5', 's 5']),
163
+ area('Minor', ['минор', 'minor', 'ц 6', 'c 6']), area('TashGRES', ['ташгрэс', 'tashgres']), area('Manzara', ['манзара', 'manzara']),
158
164
  ]),
159
165
  Yakkasaray: Object.freeze([
160
166
  area('Bashlyk', ['башлык', 'бошлиқ', 'boshliq', 'bashlyk']), area('Kushbegi', ['кушбеги', 'қушбеги', 'qushbegi', 'kushbegi']),
@@ -162,12 +168,12 @@ export const TASHKENT_AREAS = Object.freeze({
162
168
  ]),
163
169
  Yangihayot: Object.freeze([
164
170
  area('Dustlik-1', ['дустлик 1', 'дўстлик 1', "do'stlik 1", 'dustlik 1'], 'microdistrict'),
165
- area('Dustlik-2', ['дустлик 2', 'дўстлик 2', "do'stlik 2", 'dustlik 2'], 'microdistrict'), area('Yangi Choshtepa', ['янги чоштепа', 'yangi choshtepa'], 'microdistrict'), area('Sputnik', ['спутник', 'йўлдош', "yo'ldosh", 'yoldosh'], 'microdistrict'),
171
+ area('Dustlik-2', ['дустлик 2', 'дўстлик 2', "do'stlik 2", 'dustlik 2'], 'microdistrict'), area('Yangi Choshtepa', ['янги чоштепа', 'yangi choshtepa']), area('Sputnik', ['спутник', 'йўлдош', "yo'ldosh", 'yoldosh'], 'microdistrict'),
166
172
  ]),
167
173
  Yashnobod: Object.freeze([
168
174
  area('Kuylyuk Center', ['куйлюк центр', 'куйлик центр', "qo'yliq markaz", 'kuylyuk center']),
169
175
  ...[1, 2, 3, 4].map((n) => area(`Aviasozlar-${n}`, [`авиасозлар ${n}`, `городок авиастроителей ${n}`, `aviasozlar ${n}`])),
170
176
  ...[1, 2, 3, 4].map((n) => area(`Tuzel-${n}`, [`тузель ${n}`, `tuzel ${n}`])),
171
- area('Tashselmash', ['ташсельмаш', 'tashselmash'], 'microdistrict'), area('Alimkent', ['алимкент', 'olimkent', 'alimkent']), area('Shohimardon', ['шохимардон', 'shohimardon']),
177
+ area('Tashselmash', ['ташсельмаш', 'tashselmash']), area('Alimkent', ['алимкент', 'olimkent', 'alimkent']), area('Shohimardon', ['шохимардон', 'shohimardon']),
172
178
  ]),
173
179
  });
@@ -67,6 +67,12 @@ export const GEOGRAPHY_DISPLAY_NAMES = Object.freeze({
67
67
  }),
68
68
  microdistrict: Object.freeze({
69
69
  Tsukrovyi: 'Сахарный',
70
+ Karakamysh: 'Каракамыш', Sebzar: 'Себзар', Tashselmash: 'Ташсельмаш', Aviasozlar: 'Авиасозлар',
71
+ Kuylyuk: 'Куйлюк', Sergeli: 'Сергели массив', Sputnik: 'Спутник', 'Yangi Choshtepa': 'Янги Чоштепа',
72
+ // Same places as Choshtepa/Takhtapul above, but under the spelling the
73
+ // mahalla registry (uz-location-extensions.js) actually uses as its
74
+ // canonical name -- exact-key lookup means both spellings must be here.
75
+ Chashtepa: 'Чаштепа', Taxtapul: 'Тахтапул',
70
76
  }),
71
77
  metro: Object.freeze({
72
78
  'Buyuk Ipak Yoli': 'Буюк Ипак Йули', Pushkin: 'Пушкин', 'Hamid Olimjon': 'Хамид Алимджан',
@@ -33,7 +33,11 @@ function escapeRegExp(value) {
33
33
 
34
34
  function compactStreet(value) {
35
35
  return clean(value)
36
- .replace(new RegExp(`^${PREFIX_STREET_MARKER}\\s*`, 'iu'), '')
36
+ // The bare abbreviations in PREFIX_STREET_MARKER (e.g. "пр" for "пр-т")
37
+ // must not be followed by a letter, or this would strip a false-positive
38
+ // prefix off an unrelated word that merely starts the same way (e.g.
39
+ // "проживания" -> "оживания").
40
+ .replace(new RegExp(`^${PREFIX_STREET_MARKER}(?!\\p{L})\\s*`, 'iu'), '')
37
41
  .replace(new RegExp(`\\s+${POSTFIX_STREET_MARKER}$`, 'iu'), '')
38
42
  .replace(/[\s,;:.\-–—]+$/gu, '')
39
43
  .trim() || null;
@@ -167,7 +171,7 @@ function explicitStreetAddress(text) {
167
171
  if (prefixTyped) return prefixTyped;
168
172
 
169
173
  const boundedPrefix = line.match(new RegExp(
170
- `(?:^|[\\s,;])${PREFIX_STREET_MARKER}\\s*((?:${STREET_WORD}\\s+){0,3}${STREET_WORD})(?=$|[,;])`,
174
+ `(?:^|[\\s,;])${PREFIX_STREET_MARKER}(?!\\p{L})\\s*((?:${STREET_WORD}\\s+){0,3}${STREET_WORD})(?=$|[,;])`,
171
175
  'iu',
172
176
  ));
173
177
  if (boundedPrefix) return result(boundedPrefix[0], boundedPrefix[1], null, null, 0.9);
@@ -12,6 +12,7 @@ const DISPLAY = Object.freeze({
12
12
  Market: 'Market', Cafe: 'Cafe', Restaurant: 'Restaurant', Playground: 'Playground', Pharmacy: 'Pharmacy',
13
13
  Mosque: 'Mosque', Church: 'Church', 'Railway station': 'Railway station', Airport: 'Airport',
14
14
  'Bobur Park': 'Bobur Park', 'Independence Square': 'Independence Square', 'Mega Planet': 'Mega Planet',
15
+ 'Bek Baraka': 'Bek Baraka', Khadra: 'Khadra',
15
16
  }),
16
17
  ru: Object.freeze({
17
18
  Park: 'Парк', Metro: 'Метро', 'Bus stop': 'Автобусная остановка', 'Public transport': 'Общественный транспорт',
@@ -21,6 +22,7 @@ const DISPLAY = Object.freeze({
21
22
  Market: 'Рынок', Cafe: 'Кафе', Restaurant: 'Ресторан', Playground: 'Детская площадка', Pharmacy: 'Аптека',
22
23
  Mosque: 'Мечеть', Church: 'Церковь', 'Railway station': 'Железнодорожный вокзал', Airport: 'Аэропорт',
23
24
  'Bobur Park': 'Парк Бобура', 'Independence Square': 'Площадь Независимости', 'Mega Planet': 'Mega Planet',
25
+ 'Bek Baraka': 'Бек-Барака', Khadra: 'Хадра',
24
26
  }),
25
27
  });
26
28
 
@@ -51,15 +53,28 @@ export function housingSemanticCanonical(value) {
51
53
  return exactPoi(text)?.name || text;
52
54
  }
53
55
 
56
+ function cyrillicPoiAlias(poiEntry) {
57
+ return (poiEntry?.aliases || []).find((alias) => /[а-яёіїґ]/iu.test(alias)) || null;
58
+ }
59
+
54
60
  export function housingSemanticDisplayName(value, locale = 'en') {
55
61
  const text = String(value || '').trim();
56
62
  if (!text) return '';
57
63
  const language = languageKey(locale);
58
64
  const extension = extensionEntity(text);
59
65
  if (extension?.display?.[language]) return extension.display[language];
66
+ const poiEntry = exactPoi(text);
60
67
  const canonical = extension?.canonical
61
68
  || findCanonical(text, GENERIC_LANDMARK_TERMS)?.canonical
62
- || exactPoi(text)?.name
69
+ || poiEntry?.name
63
70
  || text;
71
+ // Named landmarks (markets, squares, parks) are added one at a time in
72
+ // tashkent-pois.js and often only carry a Russian alias, no dedicated
73
+ // DISPLAY entry. Fall back to that alias for ru rather than leaking the
74
+ // Latin canonical name, instead of requiring every POI to be re-listed here.
75
+ if (language === 'ru' && !DISPLAY.ru[canonical]) {
76
+ const fallback = cyrillicPoiAlias(poiEntry);
77
+ if (fallback) return fallback;
78
+ }
64
79
  return DISPLAY[language]?.[canonical] || canonical;
65
80
  }
@@ -56,11 +56,11 @@ export const HOUSING_LANDMARK_EXTENSIONS = Object.freeze([
56
56
  uzCyrl: ['ресторан', 'ресторанлар'],
57
57
  }, { category: 'restaurant' }),
58
58
  group('Park', {
59
- ru: ['парки', 'рядом парки'],
60
- en: ['parks'],
61
- uzLatn: ["bog'lar", 'bog‘lar', 'bogʻlar'],
62
- uzCyrl: ['боғлар', 'сайлгоҳлар', 'сайлгох', 'сайлгохлар'],
63
- }, { category: 'park' }),
59
+ ru: ['парк', 'парка', 'парку', 'парком', 'парке', 'парки', 'парков', 'рядом парки', 'рядом с парком'],
60
+ en: ['park', 'parks'],
61
+ uzLatn: ["bog'", 'bog‘', 'bogʻ', "bog'i", 'bog‘i', 'bogʻi', "bog'lar", 'bog‘lar', 'bogʻlar'],
62
+ uzCyrl: ['боғ', 'боғи', 'боғлар', 'сайлгоҳлар', 'сайлгох', 'сайлгохлар'],
63
+ }, { category: 'park', display: { ru: 'Парк', en: 'Park' } }),
64
64
  group('Playground', {
65
65
  ru: ['детская площадка', 'детские площадки'],
66
66
  en: ['playground', 'playgrounds', 'children playground'],
package/src/locations.js CHANGED
@@ -28,6 +28,9 @@ export const UA_EXTRA_LOCATION_DICTIONARIES = Object.freeze({
28
28
 
29
29
  const TASHKENT_UNSUPPORTED_SEED_MICRODISTRICTS = new Set([
30
30
  'Sergeli',
31
+ 'Sebzar',
32
+ 'Tashselmash',
33
+ 'Yangi Choshtepa',
31
34
  'Yunusabad-20',
32
35
  'Yunusabad-21',
33
36
  'Yunusabad-22',
@@ -36,7 +36,6 @@ export const TASHKENT_AREA_ADDITIONS = Object.freeze({
36
36
  area('Feruza-1', ['феруза 1', 'feruza 1']),
37
37
  area('Buz-1', ['буз 1', 'бўз 1', 'boz 1', 'bo z 1']),
38
38
  area('Turon', ['турон', 'turon']),
39
- area('Riyoziy', ['риёзий', 'riyoziy']),
40
39
  ]),
41
40
  Sergeli: Object.freeze([
42
41
  area('Sergeli-2 G-40', ['сергели 2 г 40', 'sergeli 2 g 40'], 'microdistrict'),
@@ -70,6 +69,7 @@ export const TASHKENT_AREA_ADDITIONS = Object.freeze({
70
69
  area('Asalabad-1', ['асалабад 1', 'asalobod 1', 'asalabad 1']),
71
70
  area('Asalabad-2', ['асалабад 2', 'asalobod 2', 'asalabad 2']),
72
71
  area('Mumtoz', ['мумтаз', 'mumtoz']),
72
+ area('Riyoziy', ['риёзий', 'риезий', 'mavlono riyoziy', 'mavlono riyozi', 'riyoziy']),
73
73
  ]),
74
74
  });
75
75
 
@@ -43,7 +43,7 @@ export const TASHKENT_HOUSING_LANDMARKS = Object.freeze([
43
43
  locationEntry('Novomoskovskaya', 'residential_complex', [
44
44
  'Новомосковская', 'Новомосковской', 'Novomoskovskaya',
45
45
  ]),
46
- locationEntry('Yangi Choshtepa', 'microdistrict', [
46
+ locationEntry('Yangi Choshtepa', 'local_area', [
47
47
  'Янги Чоштепа', 'Янги чоштепа', 'Yangi Choshtepa',
48
48
  ]),
49
49
  locationEntry('Glinka', 'landmark', [
@@ -13,7 +13,7 @@ function entries(rows = [], defaults = {}) {
13
13
  }));
14
14
  }
15
15
 
16
- function city({ districts = [], mahallas = [], microdistricts = [], localAreas = [], developmentAreas = [], residentialComplexes = [], landmarks = [], suburbs = [] }) {
16
+ function city({ districts = [], mahallas = [], microdistricts = [], localAreas = [], developmentAreas = [], residentialComplexes = [], streets = [], landmarks = [], suburbs = [] }) {
17
17
  return Object.freeze({
18
18
  ...(districts.length ? { districts: entries(districts, { entityType: 'district', country: 'UZ' }) } : {}),
19
19
  ...(mahallas.length ? { mahallas: entries(mahallas, { entityType: 'mahalla', country: 'UZ' }) } : {}),
@@ -21,6 +21,7 @@ function city({ districts = [], mahallas = [], microdistricts = [], localAreas =
21
21
  ...(localAreas.length ? { localAreas: entries(localAreas, { entityType: 'local_area', country: 'UZ' }) } : {}),
22
22
  ...(developmentAreas.length ? { developmentAreas: entries(developmentAreas, { entityType: 'development_area', country: 'UZ' }) } : {}),
23
23
  ...(residentialComplexes.length ? { residentialComplexes: entries(residentialComplexes, { entityType: 'residential_complex', country: 'UZ' }) } : {}),
24
+ ...(streets.length ? { streets: entries(streets, { entityType: 'street', country: 'UZ' }) } : {}),
24
25
  ...(landmarks.length ? { landmarks: entries(landmarks, { entityType: 'poi', country: 'UZ' }) } : {}),
25
26
  ...(suburbs.length ? { suburbs: entries(suburbs, { entityType: 'suburb', country: 'UZ' }) } : {}),
26
27
  });
@@ -77,6 +78,23 @@ export const UZ_LOCATION_EXTENSIONS = Object.freeze({
77
78
  { name: 'Beshkapa', aliases: ['Бешкапа'], parent: 'Mirzo Ulugbek' },
78
79
  { name: 'Chashtepa', aliases: ['Чаштепа'], parent: 'Yangihayot' },
79
80
  { name: 'Yangi Darhan', aliases: ['Yangi Darxon','Янги Дархан','Янги Дархон'], parent: 'Yangihayot' },
81
+ { name: 'Ahmad Yugnakiy', aliases: ['Ahmad Yugnaki','Ahmad Yugnakiy mahallasi','Аҳмад Югнакий','Ахмад Югнаки'], parent: 'Mirzo Ulugbek', confidence: 'official' },
82
+ { name: 'Humoyun', aliases: ['Humoyun mahallasi','Ҳумоюн','Хумаюн'], parent: 'Mirzo Ulugbek', confidence: 'official' },
83
+ { name: "Bog'ko'cha", aliases: ['Bog‘ko‘cha','Bogʻkoʻcha','Bogkocha','Боғкўча','Богкуча'], parent: 'Shaykhantahur', confidence: 'official' },
84
+ { name: 'Gulobod', aliases: ['Gulabad','Гулобод','Гулабад'], parent: 'Shaykhantahur', confidence: 'official' },
85
+ { name: 'Qalqon', aliases: ['Қалқон','Калкон'], parent: 'Yashnobod', confidence: 'official' },
86
+ { name: "Bog'bon", aliases: ['Bog‘bon','Bogʻbon','Bogbon','Боғбон','Богбон'], parent: 'Yashnobod', confidence: 'official' },
87
+ { name: 'Shifokorlar', aliases: ['Shifokorlar mahallasi','Шифокорлар','Шифокорлар махалла'], parent: 'Almazar', confidence: 'official' },
88
+ { name: 'Taraqqiyot', aliases: ['Taraqqiyot mahallasi','Тараққиёт','Тараккиёт'], parent: 'Almazar', confidence: 'official' },
89
+ { name: "Chamanbog'", aliases: ['Chamanbog‘','Chamanbogʻ','Chamanbog mahallasi','Чаманбоғ','Чаманбог'], parent: 'Almazar', confidence: 'official' },
90
+ { name: 'Asalobod', aliases: ['Asalobod mahallasi','Asalabad','Асалобод','Асалабад'], parent: 'Yashnobod', confidence: 'official' },
91
+ { name: "Sug'diyona", aliases: ['Sug‘diyona','Sugʻdiyona','Sugdiyona','Суғдиёна','Согдиана'], parent: 'Sergeli', confidence: 'official' },
92
+ { name: 'Olimpiya', aliases: ['Olimpiya mahallasi','Olympia','Олимпия','Олимпия махалла'], parent: 'Almazar', confidence: 'official' },
93
+ { name: 'Sebzor', aliases: ['Sebzor mahallasi','Sebzar','Себзор','Себзар'], parent: 'Almazar', confidence: 'official' },
94
+ { name: 'Yangi Choshtepa', aliases: ['Yangi Choshtepa mahallasi','Янги Чоштепа','Янги Чоштепа махалла'], parent: 'Yangihayot', confidence: 'official' },
95
+ { name: 'Taxtapul', aliases: ['Taxtapul mahallasi','Takhtapul','Тахтапул','Тахтапуль'], parent: 'Shaykhantahur', confidence: 'official' },
96
+ { name: 'Ibn Sino', aliases: ['Ibn Sino mahallasi','Ибн Сино','Ибн Сино махалла'], parent: 'Shaykhantahur', confidence: 'official' },
97
+ { name: 'Traktorsozlar', aliases: ['Traktorsozlar mahallasi','Тракторсозлар','Тракторсозлар махалла'], parent: 'Mirzo Ulugbek', confidence: 'official' },
80
98
  ],
81
99
  microdistricts: [
82
100
  ['Qorasuv', 'Qorasuv massivi', 'Korasuv massivi', 'Корасув Массиви', 'Корасув массиви', 'Карасу массив', 'Карасу массиви', 'Қорасув массиви'],
@@ -87,10 +105,118 @@ export const UZ_LOCATION_EXTENSIONS = Object.freeze({
87
105
  localAreas: [
88
106
  { name: 'Yangidarhan-1', aliases: ['Yangi Darhan-1','Yangi Darxon-1','Янги Дархан-1','Янги Дархон-1'], parent: 'Yangihayot' },
89
107
  { name: 'Yangidarhan-2', aliases: ['Yangi Darhan-2','Yangi Darxon-2','Янги Дархан-2','Янги Дархон-2'], parent: 'Yangihayot' },
108
+ { name: 'Suvsoz-1', aliases: ['Suvsoz 1','Suvsoz-1 mavzesi','Сувсоз-1','Сувсоз 1','Водник-1','Водник 1'], parent: 'Bektemir', confidence: 'official' },
109
+ { name: 'Suvsoz-2', aliases: ['Suvsoz 2','Suvsoz-2 mavzesi','Сувсоз-2','Сувсоз 2','Водник-2','Водник 2'], parent: 'Bektemir', confidence: 'official' },
110
+ { name: 'Suvsoz-3', aliases: ['Suvsoz 3','Suvsoz-3 mavzesi','Сувсоз-3','Сувсоз 3','Водник-3','Водник 3'], parent: 'Bektemir', confidence: 'official' },
111
+ { name: 'Suvsoz-4', aliases: ['Suvsoz 4','Suvsoz-4 mavzesi','Сувсоз-4','Сувсоз 4'], parent: 'Bektemir', confidence: 'official' },
112
+ { name: 'Suvsoz-5', aliases: ['Suvsoz 5','Suvsoz-5 mavzesi','Сувсоз-5','Сувсоз 5'], parent: 'Bektemir', confidence: 'official' },
113
+ { name: "Bo'z-1", aliases: ['Bo‘z-1','Boʻz-1','Boz-1','Boz 1','Бўз-1','Буз-1','Буз 1'], parent: 'Mirzo Ulugbek', confidence: 'official' },
114
+ { name: "Bo'z-2", aliases: ['Bo‘z-2','Boʻz-2','Boz-2','Boz 2','Бўз-2','Буз-2','Буз 2'], parent: 'Mirzo Ulugbek', confidence: 'official' },
115
+ { name: 'Ahmad Yugnakiy', aliases: ['Ahmad Yugnaki dahasi','Ahmad Yugnakiy dahasi','Аҳмад Югнакий даҳаси','Ахмад Югнаки массив','Солнечный массив','массив Солнечный'], parent: 'Mirzo Ulugbek', confidence: 'official' },
116
+ { name: 'Humoyun', aliases: ['Humoyun dahasi','Ҳумоюн даҳаси','Хумаюн массив','Ясный массив','массив Ясный'], parent: 'Mirzo Ulugbek', confidence: 'official' },
117
+ { name: 'Feruza', aliases: ['Feruza dahasi','Феруза массив','Феруза массиви','Северо-Восток','Северо Восток','Северо-Восток массив'], parent: 'Mirzo Ulugbek', confidence: 'official' },
118
+ { name: 'Feruza-2', aliases: ['Feruza 2','Феруза-2','Феруза 2','Феруза 2 массив'], parent: 'Mirzo Ulugbek', confidence: 'colloquial' },
119
+ { name: 'Feruza-3', aliases: ['Feruza 3','Феруза-3','Феруза 3','Феруза 3 массив'], parent: 'Mirzo Ulugbek', confidence: 'colloquial' },
120
+ { name: 'Quruvchi', aliases: ['Quruvchi dahasi','Қурувчи','Курувчи','Курувчи массив'], parent: 'Sergeli', confidence: 'official' },
121
+ { name: "Bog'ko'cha", aliases: ['Bog‘ko‘cha mavzesi','Bogʻkoʻcha mavzesi','Bogkocha mavzesi','Боғкўча массив','Богкуча массив','Ц-27','Ц 27','C-27','C 27'], parent: 'Shaykhantahur', confidence: 'official' },
122
+ { name: 'Gulobod', aliases: ['Gulobod mavzesi','Gulabad mavzesi','Гулобод массив','Гулабад массив','Ц-26','Ц 26','C-26','C 26'], parent: 'Shaykhantahur', confidence: 'official' },
123
+ { name: "Beshqo'rg'on-1", aliases: ['Beshqo‘rg‘on-1','Beshqoʻrgʻon-1','Beshqorgon-1','Beshkurgan-1','Бешқўрғон-1','Бешкурган-1'], parent: 'Almazar', confidence: 'official' },
124
+ { name: "Beshqo'rg'on-2", aliases: ['Beshqo‘rg‘on-2','Beshqoʻrgʻon-2','Beshqorgon-2','Beshkurgan-2','Бешқўрғон-2','Бешкурган-2'], parent: 'Almazar', confidence: 'official' },
125
+ { name: "Beshqo'rg'on-3", aliases: ['Beshqo‘rg‘on-3','Beshqoʻrgʻon-3','Beshqorgon-3','Beshkurgan-3','Бешқўрғон-3','Бешкурган-3'], parent: 'Almazar', confidence: 'official' },
126
+ { name: "Beshqo'rg'on-4", aliases: ['Beshqo‘rg‘on-4','Beshqoʻrgʻon-4','Beshqorgon-4','Beshkurgan-4','Бешқўрғон-4','Бешкурган-4'], parent: 'Almazar', confidence: 'official' },
127
+ { name: "Qo'yliq-1", aliases: ['Qo‘yliq-1','Qoʻyliq-1','Qoyliq-1','Qoyliq 1','Куйлюк-1','Куйлюк 1','Куйлик-1','Куйлик 1'], parent: 'Mirobod', confidence: 'official' },
128
+ { name: "Qo'yliq-2", aliases: ['Qo‘yliq-2','Qoʻyliq-2','Qoyliq-2','Qoyliq 2','Куйлюк-2','Куйлюк 2','Куйлик-2','Куйлик 2'], parent: 'Mirobod', confidence: 'official' },
129
+ { name: "Qo'yliq-3", aliases: ['Qo‘yliq-3','Qoʻyliq-3','Qoyliq-3','Qoyliq 3','Куйлюк-3','Куйлюк 3','Куйлик-3','Куйлик 3'], parent: 'Mirobod', confidence: 'official' },
130
+ { name: "Qo'yliq-4", aliases: ['Qo‘yliq-4','Qoʻyliq-4','Qoyliq-4','Qoyliq 4','Куйлюк-4','Куйлюк 4','Куйлик-4','Куйлик 4'], parent: 'Mirobod', confidence: 'official' },
131
+ { name: "Qo'yliq-5", aliases: ['Qo‘yliq-5','Qoʻyliq-5','Qoyliq-5','Qoyliq 5','Куйлюк-5','Куйлюк 5','Куйлик-5','Куйлик 5'], parent: 'Sergeli', confidence: 'official' },
132
+ { name: "Qo'yliq-6", aliases: ['Qo‘yliq-6','Qoʻyliq-6','Qoyliq-6','Qoyliq 6','Куйлюк-6','Куйлюк 6','Куйлик-6','Куйлик 6'], parent: 'Sergeli', confidence: 'official' },
133
+ { name: "Qo'yliq-7", aliases: ['Qo‘yliq-7','Qoʻyliq-7','Qoyliq-7','Qoyliq 7','Куйлюк-7','Куйлюк 7','Куйлик-7','Куйлик 7'], parent: 'Sergeli', confidence: 'official' },
134
+ { name: 'Parkent-Riyoziy', aliases: ['Parkent Riyoziy','Riyoziy','Mavlono Riyoziy','Мавлоно Риёзи','Риёзий','Риезий','Паркент Риёзий'], parent: 'Yashnobod', confidence: 'official' },
135
+ { name: 'Parkent-Siolkovskiy', aliases: ['Parkent Siolkovskiy','Parkent Tsiolkovskiy','Сиолковский массив','Циолковский массив','Паркент Сиолковский'], parent: 'Yashnobod', confidence: 'official' },
136
+ { name: 'Qalqon', aliases: ['Qalqon mavzesi','Қалқон мавзе','Калкон массив','Harbiylar-58a','Harbiylar 58a','Harbiylar-58a shaharchasi'], parent: 'Yashnobod', confidence: 'official' },
137
+ { name: "Bog'bon", aliases: ['Bog‘bon mavzesi','Bogʻbon mavzesi','Bogbon mavzesi','Боғбон мавзе','Богбон массив','Normuhammedov mavzesi','Normuhammedov','Нормухаммедов'], parent: 'Yashnobod', confidence: 'official' },
138
+ { name: 'Akademgorodok', aliases: ['Академгородок','Академ городок','Akademgorodok','Akadem shaharchasi'], parent: 'Mirzo Ulugbek', confidence: 'colloquial' },
139
+ { name: 'C-7', aliases: ['Ц-7','Ц 7','C 7','массив Ц-7','Ц-7 массив'], parent: 'Mirobod', confidence: 'colloquial' },
140
+ { name: 'Aviasozlar-1', aliases: ['Aviasozlar 1','Авиасозлар-1','Авиасозлар 1','Городок авиастроителей-1','Лисунова-1','Лисунова 1','Lisunova-1','Lisunova 1'], parent: 'Yashnobod', confidence: 'official' },
141
+ { name: 'Aviasozlar-2', aliases: ['Aviasozlar 2','Авиасозлар-2','Авиасозлар 2','Городок авиастроителей-2','Лисунова-1а','Лисунова 1а','Lisunova-1A','Lisunova 1A'], parent: 'Yashnobod', confidence: 'official' },
142
+ { name: 'Aviasozlar-3', aliases: ['Aviasozlar 3','Авиасозлар-3','Авиасозлар 3','Городок авиастроителей-3','Лисунова-2','Лисунова 2','Lisunova-2','Lisunova 2'], parent: 'Yashnobod', confidence: 'official' },
143
+ { name: 'Aviasozlar-4', aliases: ['Aviasozlar 4','Авиасозлар-4','Авиасозлар 4','Городок авиастроителей-4','Лисунова-4','Лисунова 4','Lisunova-4','Lisunova 4'], parent: 'Yashnobod', confidence: 'official' },
144
+ { name: 'Minora', aliases: ['Minora mavzesi','Минора','Минора массив'], parent: 'Almazar', confidence: 'official' },
145
+ { name: 'Guruchariq', aliases: ['Guruchariq mavzesi','Guruch ariq','Гуручариқ','Гуручарик','S-22','S 22','С-22','С 22','C-22','C 22'], parent: 'Almazar', confidence: 'official' },
146
+ { name: 'Muxbir', aliases: ['Muxbir mavzesi','Мухбир','Мухбир массив'], parent: 'Almazar', confidence: 'official' },
147
+ { name: 'Chuqursoy', aliases: ['Chuqursoy mavzesi','Чуқурсой','Чукурсай','Чукурсой'], parent: 'Almazar', confidence: 'official' },
148
+ { name: 'Shimoliy Olmazor', aliases: ['Shimoliy Olmazor dahasi','Шимолий Олмазор'], parent: 'Almazar', confidence: 'official' },
149
+ { name: 'Shimoliy Olmazor-1', aliases: ['Shimoliy Olmazor 1','Шимолий Олмазор-1','Шимолий Олмазор 1'], parent: 'Almazar', confidence: 'official' },
150
+ { name: 'Shimoliy Olmazor-2', aliases: ['Shimoliy Olmazor 2','Шимолий Олмазор-2','Шимолий Олмазор 2'], parent: 'Almazar', confidence: 'official' },
151
+ { name: 'Taraqqiyot-1', aliases: ['Taraqqiyot 1','Taraqqiyot-1 mavzesi','Тараққиёт-1','Тараккиёт-1'], parent: 'Almazar', confidence: 'official' },
152
+ { name: 'Taraqqiyot-2', aliases: ['Taraqqiyot 2','Taraqqiyot-2 mavzesi','Тараққиёт-2','Тараккиёт-2'], parent: 'Almazar', confidence: 'official' },
153
+ { name: 'Taraqqiyot-3', aliases: ['Taraqqiyot 3','Taraqqiyot-3 mavzesi','Тараққиёт-3','Тараккиёт-3'], parent: 'Almazar', confidence: 'official' },
154
+ { name: 'Taraqqiyot-4', aliases: ['Taraqqiyot 4','Taraqqiyot-4 mavzesi','Тараққиёт-4','Тараккиёт-4'], parent: 'Almazar', confidence: 'official' },
155
+ { name: 'Shifokorlar-1', aliases: ['Shifokorlar 1','Shifokorlar-1 mavzesi','Шифокорлар-1','Шифокорлар 1','TashGosMI','ТашГосМИ'], parent: 'Almazar', confidence: 'official' },
156
+ { name: 'Shifokorlar-2', aliases: ['Shifokorlar 2','Shifokorlar-2 mavzesi','Шифокорлар-2','Шифокорлар 2'], parent: 'Almazar', confidence: 'official' },
157
+ { name: 'Shifokorlar-3', aliases: ['Shifokorlar 3','Shifokorlar-3 mavzesi','Шифокорлар-3','Шифокорлар 3'], parent: 'Almazar', confidence: 'official' },
158
+ { name: 'Shifokorlar-4', aliases: ['Shifokorlar 4','Shifokorlar-4 mavzesi','Шифокорлар-4','Шифокорлар 4','ToshGU-ToshPI','ТошГУ-ТошПИ'], parent: 'Almazar', confidence: 'official' },
159
+ { name: 'Shifokorlar-5', aliases: ['Shifokorlar 5','Shifokorlar-5 mavzesi','Шифокорлар-5','Шифокорлар 5'], parent: 'Almazar', confidence: 'official' },
160
+ { name: 'Shifokorlar-6', aliases: ['Shifokorlar 6','Shifokorlar-6 mavzesi','Шифокорлар-6','Шифокорлар 6'], parent: 'Almazar', confidence: 'official' },
161
+ { name: 'Beruniy-B1', aliases: ['Beruniy B1','Beruniy B-1','Беруний-Б1','Беруний Б1'], parent: 'Almazar', confidence: 'official' },
162
+ { name: 'Beruniy-B3', aliases: ['Beruniy B3','Beruniy B-3','Беруний-Б3','Беруний Б3'], parent: 'Almazar', confidence: 'official' },
163
+ { name: "Chamanbog'", aliases: ['Chamanbog‘ mavzesi','Chamanbogʻ mavzesi','Chamanbog mavzesi','Чаманбоғ мавзе','Чаманбог массив'], parent: 'Almazar', confidence: 'official' },
164
+ { name: 'Irrigator', aliases: ['Irrigator mavzesi','Ирригатор','массив Ирригатор','Ирригатор массив'], parent: 'Mirzo Ulugbek', confidence: 'official' },
165
+ { name: 'Parkent', aliases: ['Parkent dahasi','Паркент даха','Паркент массив'], parent: 'Mirzo Ulugbek', confidence: 'official' },
166
+ { name: 'Markaz-12', aliases: ['Markaz 12','Markaz-12 mavzesi','Марказ-12','Ц-12','Ц12','Ц 12','C-12','C12','C 12','Лабзак Ц-12','Лабзак Ц12'], parent: 'Shaykhantahur', confidence: 'official' },
167
+ { name: "So'lim", aliases: ['So‘lim','Soʻlim','Solim','So‘lim mavzesi','Soʻlim mavzesi','Сўлим','Сулим'], parent: 'Yashnobod', confidence: 'official' },
168
+ { name: 'Asalobod-1', aliases: ['Asalobod 1','Asalobod-1 mavzesi','Asalabad-1','Asalabad 1','Асалобод-1','Асалабад-1'], parent: 'Yashnobod', confidence: 'official' },
169
+ { name: 'Asalobod-2', aliases: ['Asalobod 2','Asalobod-2 mavzesi','Asalabad-2','Asalabad 2','Асалобод-2','Асалабад-2'], parent: 'Yashnobod', confidence: 'official' },
170
+ { name: 'ToshGRES', aliases: ['ToshGRES mavzesi','Tosh GRES','ТашГРЭС','Таш ГРЭС','Ташгрэс массив'], parent: 'Yunusabad', confidence: 'official' },
171
+ { name: "Sug'diyona", aliases: ['Sug‘diyona mavzesi','Sugʻdiyona mavzesi','Sugdiyona mavzesi','Суғдиёна мавзе','Согдиана массив'], parent: 'Sergeli', confidence: 'official' },
172
+ { name: 'Karakamysh-1/2', aliases: ['Karakamysh 1/2','Karakamysh 1 2','Каракамыш-1/2','Каракамыш 1/2','Қорақамиш 1/2'], parent: 'Almazar', confidence: 'verified' },
173
+ { name: 'Karakamysh-2/3', aliases: ['Karakamysh 2/3','Karakamysh 2 3','Каракамыш-2/3','Каракамыш 2/3','Қорақамиш 2/3'], parent: 'Almazar', confidence: 'verified' },
174
+ { name: 'Karakamysh-2/4', aliases: ['Karakamysh 2/4','Karakamysh 2 4','Каракамыш-2/4','Каракамыш 2/4','Қорақамиш 2/4'], parent: 'Almazar', confidence: 'verified' },
175
+ { name: 'Karakamysh-2/5', aliases: ['Karakamysh 2/5','Karakamysh 2 5','Каракамыш-2/5','Каракамыш 2/5','Қорақамиш 2/5'], parent: 'Almazar', confidence: 'verified' },
176
+ { name: 'Chimbay', aliases: ['Chimboy','Чимбай'], parent: 'Almazar', confidence: 'verified' },
177
+ { name: 'Medgorodok', aliases: ['Медгородок','Мед городок'], parent: 'Almazar', confidence: 'verified' },
178
+ { name: 'Vuzgorodok', aliases: ['Вузгородок','Вуз городок'], parent: 'Almazar', confidence: 'verified' },
179
+ { name: 'Hospitalny', aliases: ['Госпитальный','Госпиталка','Gospital','Gospital dahasi'], parent: 'Mirobod', confidence: 'verified' },
180
+ { name: 'Movarounnahr', aliases: ['Мавераннахр','Мовароуннахр','Movarounnahr dahasi'], parent: 'Mirobod', confidence: 'verified' },
181
+ { name: 'Yalangach', aliases: ['Ялангач',"Yalang'och"], parent: 'Mirzo Ulugbek', confidence: 'verified' },
182
+ { name: 'Yangi Sergeli', aliases: ['Янги Сергели','Yangi Sergeli massivi'], parent: 'Sergeli', confidence: 'verified' },
183
+ { name: 'Nakkoshlik', aliases: ['Наккошлык','Наққошлик','Naqqoshlik'], parent: 'Chilanzar', confidence: 'verified' },
184
+ { name: 'Beshagach', aliases: ['Бешагач',"Beshyog'och"], parent: 'Chilanzar', confidence: 'verified' },
185
+ { name: 'Beltepa', aliases: ['Белтепа'], parent: 'Shaykhantahur', confidence: 'verified' },
186
+ { name: 'Jangoh', aliases: ['Janggoh','Джангох','Жангох'], parent: 'Shaykhantahur', confidence: 'verified' },
187
+ { name: 'Karatash', aliases: ['Qoratosh','Қоратош','Караташ'], parent: 'Shaykhantahur', confidence: 'verified' },
188
+ { name: 'Bashlyk', aliases: ['Башлык','Boshliq','Бошлиқ'], parent: 'Yakkasaray', confidence: 'verified' },
189
+ { name: 'Kushbegi', aliases: ['Кушбеги','Qushbegi','Қушбеги'], parent: 'Yakkasaray', confidence: 'verified' },
190
+ { name: 'Alimkent', aliases: ['Алимкент','Olimkent'], parent: 'Yashnobod', confidence: 'verified' },
191
+ { name: 'Tuzel-1', aliases: ['Tuzel 1','Тузель-1','Тузель 1'], parent: 'Yashnobod', confidence: 'verified' },
192
+ { name: 'Tuzel-2', aliases: ['Tuzel 2','Тузель-2','Тузель 2'], parent: 'Yashnobod', confidence: 'verified' },
193
+ { name: 'Tuzel-3', aliases: ['Tuzel 3','Тузель-3','Тузель 3'], parent: 'Yashnobod', confidence: 'verified' },
194
+ { name: 'Tuzel-4', aliases: ['Tuzel 4','Тузель-4','Тузель 4'], parent: 'Yashnobod', confidence: 'verified' },
195
+ { name: 'Olimpiya', aliases: ['Olimpiya mavzesi','Olympia','Олимпия','Олимпия массив'], parent: 'Almazar', confidence: 'official' },
196
+ { name: 'Sebzor', aliases: ['Sebzor mavzesi','Sebzar','Себзор','Себзар','Ц-17','Ц-18','C-17','C-18'], parent: 'Almazar', confidence: 'official' },
197
+ { name: 'Tashselmash', aliases: ['Toshselmash','Toshselmash mavzesi','Ташсельмаш','Тошсельмаш'], parent: 'Yashnobod', confidence: 'official' },
198
+ { name: 'Yangi Choshtepa', aliases: ['Yangi Choshtepa mavzesi','Янги Чоштепа','Янги Чоштепа массив'], parent: 'Yangihayot', confidence: 'official' },
199
+ { name: 'Taxtapul', aliases: ['Taxtapul mavzesi','Takhtapul','Тахтапул','Тахтапуль','Тахтапул массив'], parent: 'Almazar', confidence: 'official' },
200
+ { name: 'Manzara', aliases: ['Manzara mavzesi','Манзара','Манзара массив'], parent: 'Yunusabad', confidence: 'official' },
201
+ { name: 'Qiyot', aliases: ['Qiyot mavzesi','Kiyot','Киёт','Кият','Қиёт','Markaz-5','Markaz 5','S-5','S 5'], parent: 'Yunusabad', confidence: 'official' },
202
+ { name: 'Ibn Sino-1', aliases: ['Ibn Sino 1','Ibn Sino-1 mavzesi','Ибн Сино-1','Ибн Сино 1'], parent: 'Shaykhantahur', confidence: 'official' },
203
+ { name: 'Ibn Sino-2', aliases: ['Ibn Sino 2','Ibn Sino-2 mavzesi','Ибн Сино-2','Ибн Сино 2'], parent: 'Shaykhantahur', confidence: 'official' },
204
+ { name: 'Traktorsozlar-1', aliases: ['Traktorsozlar 1','Traktorsozlar-1 dahasi','Тракторсозлар-1','Тракторсозлар 1','TTZ-1','TTZ 1','ТТЗ-1','ТТЗ 1'], parent: 'Mirzo Ulugbek', confidence: 'official' },
205
+ { name: 'Traktorsozlar-2', aliases: ['Traktorsozlar 2','Traktorsozlar-2 dahasi','Тракторсозлар-2','Тракторсозлар 2','TTZ-2','TTZ 2','ТТЗ-2','ТТЗ 2'], parent: 'Mirzo Ulugbek', confidence: 'official' },
206
+ { name: 'TTZ-3', aliases: ['TTZ 3','ТТЗ-3','ТТЗ 3'], parent: 'Mirzo Ulugbek', confidence: 'colloquial' },
207
+ { name: 'Traktorsozlar-4', aliases: ['Traktorsozlar 4','Traktorsozlar-4 dahasi','Тракторсозлар-4','Тракторсозлар 4','TTZ-4','TTZ 4','ТТЗ-4','ТТЗ 4'], parent: 'Mirzo Ulugbek', confidence: 'official' },
90
208
  ],
91
209
  developmentAreas: [
92
210
  ['Tashkent City', 'Ташкент Сити', 'Toshkent City', 'Tashkent City IBC'],
93
211
  ],
212
+ streets: [
213
+ { name: 'Lolazor Street', aliases: ['Lolazor ko‘chasi', "Lolazor ko'chasi", 'улица Лолазор', 'ул. Лолазор'], parent: 'Uchtepa' },
214
+ { name: 'Shohimardon Street', aliases: ['Shohimardon ko‘chasi', "Shohimardon ko'chasi", 'улица Шохимардон', 'ул. Шохимардон'], parent: 'Yashnobod' },
215
+ { name: 'Shohimardon Passage 1', aliases: ['Shohimardon 1-tor ko‘chasi', "Shohimardon 1-tor ko'chasi", '1-й проезд Шохимардон', '1 проезд Шохимардон'], parent: 'Yashnobod' },
216
+ { name: "Oltinko'l Street", aliases: ['Oltinko‘l ko‘chasi', "Oltinko'l ko'chasi", 'Oltinkol kochasi', 'улица Олтинкуль', 'ул. Олтинкуль'], parent: 'Mirobod' },
217
+ { name: "Oltinko'l Passage 1", aliases: ['Oltinko‘l 1-tor ko‘chasi', "Oltinko'l 1-tor ko'chasi", '1-й проезд Олтинкуль', '1 проезд Олтинкуль'], parent: 'Mirobod' },
218
+ { name: 'Rakatboshi Street', aliases: ['Rakatboshi ko‘chasi', "Rakatboshi ko'chasi", 'улица Ракатбоши', 'ул. Ракатбоши'], parent: 'Yakkasaray' },
219
+ ],
94
220
  }),
95
221
 
96
222
  Samarkand: city({