@whiteslove/parsing-lexicon 0.6.8 → 0.6.10
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 +13 -4
- package/src/central-asia-locations.js +1 -1
- package/src/hiring-professions.js +1 -1
- package/src/hiring-semantics.d.ts +1 -1
- package/src/hiring-semantics.js +1 -0
- package/src/hiring-skills.js +1 -1
- package/src/hiring-source-semantics.js +8 -0
- package/src/housing-address.js +7 -4
- package/src/housing-card-fields.js +2 -2
- package/src/housing-context.js +2 -1
- package/src/housing-listing-enrichment.js +1 -1
- package/src/housing.js +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whiteslove/parsing-lexicon",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.10",
|
|
4
4
|
"description": "Shared deterministic multilingual parsing lexicon for WhitesLove housing and hiring services",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,9 +37,18 @@
|
|
|
37
37
|
},
|
|
38
38
|
"./central-asia": "./src/central-asia.js",
|
|
39
39
|
"./ukraine": "./src/ukraine.js",
|
|
40
|
-
"./ua-geo-coordinates": {
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
"./ua-geo-coordinates": {
|
|
41
|
+
"types": "./src/ua-geo-coordinates.d.ts",
|
|
42
|
+
"import": "./src/ua-geo-coordinates.js"
|
|
43
|
+
},
|
|
44
|
+
"./ua-geo-resolver": {
|
|
45
|
+
"types": "./src/ua-geo-resolver.d.ts",
|
|
46
|
+
"import": "./src/ua-geo-resolver.js"
|
|
47
|
+
},
|
|
48
|
+
"./uz-geo-coordinates": {
|
|
49
|
+
"types": "./src/uz-geo-coordinates.d.ts",
|
|
50
|
+
"import": "./src/uz-geo-coordinates.js"
|
|
51
|
+
},
|
|
43
52
|
"./location-merge": "./src/location-merge.js",
|
|
44
53
|
"./locations": "./src/locations-runtime.js",
|
|
45
54
|
"./kg-location-extensions": "./src/kg-location-extensions.js",
|
|
@@ -186,7 +186,7 @@ function markedResidentialMatch(value, item) {
|
|
|
186
186
|
|
|
187
187
|
const LOCATION_CLAUSE_BOUNDARY_RE = /[\n\r.!?;|]/u;
|
|
188
188
|
const PRIMARY_LOCATION_PREFIX_RE = /(?:(?:^|[^\p{L}\p{N}_])(?:адрес|локаци(?:я|и)|расположени(?:е|я)|находится)\s*[:\-–—]?\s*|(?:^|[^\p{L}\p{N}_])(?:в|на)\s+(?:(?:ж\.?\s*к\.?|жил(?:ом|ой)\s+комплекс\p{L}*|микрорайон\p{L}*|мкр\.?|массив\p{L}*|махалл\p{L}*|mahalla|massiv|district|район\p{L}*|metro|метро)\s*)?)$/iu;
|
|
189
|
-
const NEARBY_LOCATION_PREFIX_RE = /(?:^|[^\p{L}\p{N}_])(?:до|около|возле|рядом(?:\s+(?:с|со))?|недалеко\s+от|неподал[её]ку\s+от|вблизи|напротив|ориентир(?:ом)
|
|
189
|
+
const NEARBY_LOCATION_PREFIX_RE = /(?:^|[^\p{L}\p{N}_])(?:до|около|возле|рядом(?:\s+(?:с|со))?|недалеко\s+от|неподал[её]ку\s+от|вблизи|напротив|ориентир(?:ом)?|ор[-–—]?р\.?|near|nearby|close\s+to|next\s+to|opposite|landmark|yaqin(?:ida)?|yonida|mo['’ʻ]?ljal|яқин(?:ида)?|ёнида|м[уў]лжал|жақын|жанында|маңында)(?=$|[^\p{L}\p{N}_])[\s\S]{0,96}$/iu;
|
|
190
190
|
const DISTANCE_LOCATION_PREFIX_RE = /(?:\d+(?:[.,]\d+)?\s*(?:мин(?:ут\p{L}*)?|min(?:ute)?s?|daqiqa|м|m|метр\p{L}*|км|km)\s*(?:от|до|from|to)\s+)[\s\S]{0,80}$/iu;
|
|
191
191
|
const NEARBY_LOCATION_SUFFIX_RE = /^\s*(?:[-—–:]\s*)?(?:(?:\d+(?:[.,]\d+)?\s*(?:мин(?:ут\p{L}*)?|min(?:ute)?s?|daqiqa|м|m|метр\p{L}*|км|km))|(?:рядом|поблизости|nearby|yaqin(?:ida)?|яқин(?:ида)?|жақын))(?=$|[^\p{L}\p{N}_])/iu;
|
|
192
192
|
|
|
@@ -188,7 +188,7 @@ const rows = [
|
|
|
188
188
|
['chat_operator','customer_support',['chat operator','оператор чата','чат оператор']],
|
|
189
189
|
['customer_success_manager','customer_support',['customer success manager','csm','менеджер по успеху клиентов']],
|
|
190
190
|
['office_manager','administration',['office manager','офис менеджер','офіс менеджер']],
|
|
191
|
-
['administrator','administration',['administrator','администратор','адміністратор','
|
|
191
|
+
['administrator','administration',['administrator','администратор','администратором','адміністратор','адміністратором']],
|
|
192
192
|
['receptionist','administration',['receptionist','ресепшионист','ресепшн','рецепционист']],
|
|
193
193
|
['executive_assistant','administration',['executive assistant','personal assistant','ассистент руководителя','личный помощник']],
|
|
194
194
|
['secretary','administration',['secretary','секретарь','секретар']],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DegreeLevel } from './hiring-requirements.js';
|
|
2
2
|
|
|
3
|
-
export type CandidateFeatureCode = 'student' | 'parentalLeave' | 'noExperience' | 'partTime' | 'nightShift' | 'openToRelocation';
|
|
3
|
+
export type CandidateFeatureCode = 'student' | 'parentalLeave' | 'noExperience' | 'partTime' | 'nightShift' | 'openToRelocation' | 'withPets';
|
|
4
4
|
export type HiringScopeCode = 'architecture' | 'leadership' | 'mentoring' | 'scale' | 'ownership';
|
|
5
5
|
|
|
6
6
|
export function isCandidateNonTargetContext(value: unknown): boolean;
|
package/src/hiring-semantics.js
CHANGED
|
@@ -31,6 +31,7 @@ const FEATURE_RULES = Object.freeze([
|
|
|
31
31
|
['partTime', /подработк|підробіт|part[-\s]?time|неполный\s+день|неповн(?:ий|а)\s+день|yarim\s+stavka/iu],
|
|
32
32
|
['nightShift', /ночн(?:ая|ую|ой)\s+смен|нічн(?:а|у|ої)\s+змін|night\s+shift|tungi\s+smena/iu],
|
|
33
33
|
['openToRelocation', /готов\p{L}*\s+к\s+переезду|готов\p{L}*\s+переехать|готов\p{L}*\s+до\s+переїзду|relocat(?:e|ion)|ko(?:'|’)chib\s+o(?:'|’)tish/iu],
|
|
34
|
+
['withPets', /тварин\p{L}*|животн\p{L}*|жануар\p{L}*|\bwith\s+(?:animals|pets)\b|\banimals?\b|\bpets?\b|hayvon(?:lar)?(?:\s+bilan)?/iu],
|
|
34
35
|
]);
|
|
35
36
|
|
|
36
37
|
const RELOCATION_NEGATIVE_RE = /не\s+готов\p{L}*\s+к\s+переезду|не\s+розгляда\p{L}*\s+переїзд|not\s+(?:open|ready)\s+to\s+relocat/iu;
|
package/src/hiring-skills.js
CHANGED
|
@@ -149,7 +149,7 @@ export const SKILL_CATALOG = [
|
|
|
149
149
|
...group('Marketing', 'Digital Marketing', [
|
|
150
150
|
['Digital Marketing'], ['Content Marketing'], ['Social Media Marketing', ['smm']], ['Email Marketing'],
|
|
151
151
|
['Google Ads', ['google adwords']], ['Meta Ads', ['facebook ads']], ['Google Analytics', ['ga4']],
|
|
152
|
-
['Google Tag Manager'
|
|
152
|
+
['Google Tag Manager'], ['Marketing Automation'], ['Copywriting', ['копирайтинг']],
|
|
153
153
|
['Market Research'], ['A/B Testing', ['ab testing']], ['Conversion Rate Optimization', ['cro']],
|
|
154
154
|
]),
|
|
155
155
|
...group('HR', 'Recruiting & People', [
|
|
@@ -24,6 +24,10 @@ const FIELD_EXTRA_ALIASES = Object.freeze({
|
|
|
24
24
|
const APPLICATION_MODAL_RE = /(?:отправить\s*резюме\s*)+(?:\[telegram\]\s*)?пол\s*мужской\s*женский\s*образование[\s\S]{0,500}?выберите\s*вакансию[\s\S]*/iu;
|
|
25
25
|
const LEAKED_STYLESHEET_START_RE = /:root\s*\{\s*--[\w-]+\s*:/iu;
|
|
26
26
|
const LEAKED_CSS_RULE_RE = /\s*(?:[.#][\w\\-]+|:root)(?:[^{}\n]{0,300})\{\s*(?:(?:--)?[\w-]+\s*:\s*[^;{}]+;?\s*)+\}\s*/giu;
|
|
27
|
+
// Button/chrome labels copied along with a resume from Ukrainian job boards
|
|
28
|
+
// (novarobota.ua, robota.ua, work.ua and similar). Matched as whole lines so
|
|
29
|
+
// genuine resume prose is never touched.
|
|
30
|
+
const JOB_BOARD_UI_NOISE_RE = /^(?:подробнее|детальніше|предпросмотр|попередній\s+перегляд|добавить\s+в\s+отклики\/?\s*избранное|додати\s+до\s+відгуків\/?\s*обраного|предложить\s+вакансию|запропонувати\s+вакансію|для\s+того\s+чтобы\s+предложить\s+вакансию\s+нужно\s+авторизоваться\s+как\s+работодатель|щоб\s+запропонувати\s+вакансію[^\n]*|пожаловаться\s+на\s+резюме|поскаржитися\s+на\s+резюме|отправить)$/iu;
|
|
27
31
|
|
|
28
32
|
/** Remove source-page controls and stylesheet fragments copied into hiring text. */
|
|
29
33
|
export function cleanHiringSourceText(value) {
|
|
@@ -32,7 +36,11 @@ export function cleanHiringSourceText(value) {
|
|
|
32
36
|
return (stylesheetStart >= 0 ? text.slice(0, stylesheetStart) : text)
|
|
33
37
|
.replace(APPLICATION_MODAL_RE, '')
|
|
34
38
|
.replace(LEAKED_CSS_RULE_RE, ' ')
|
|
39
|
+
.split('\n')
|
|
40
|
+
.filter((line) => !JOB_BOARD_UI_NOISE_RE.test(line.trim()))
|
|
41
|
+
.join('\n')
|
|
35
42
|
.replace(/[ \t]+(?=\n)/g, '')
|
|
43
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
36
44
|
.trim();
|
|
37
45
|
}
|
|
38
46
|
|
package/src/housing-address.js
CHANGED
|
@@ -12,10 +12,10 @@ const HOUSE_MARKER = String.raw`(?:дом|д\.|будинок|буд\.|house|h\.
|
|
|
12
12
|
const BUILDING_MARKER = String.raw`(?:корп(?:ус)?\.?|к\.|строен(?:ие)?|стр\.|будова|секц(?:ия|ія)?|bloc|corp|building|bldg\.?|korpus)`;
|
|
13
13
|
const NUMBER_TOKEN = String.raw`\d{1,5}(?:[-\/]?[\p{L}])?(?:[\/-]\d{1,4}(?:[-\/]?[\p{L}])?)?`;
|
|
14
14
|
const STREET_WORD = String.raw`[\p{L}'’.-]{2,48}`;
|
|
15
|
-
const ADDRESS_FIELD_STOP_RE = /\s+(?:цена|ціна|нарх(?:и)?|narx|price|стоимост[ьи]|этаж(?:ность)?|поверх|qavat|қабат|кават|қават|комнат(?:ы|а)?|кімнат(?:и|а)?|xona|хона|площадь|площа|maydon|тел(?:ефон)?|phone|комисси\p{L}*|депозит|deposit)(?=$|[\s:№#-])/iu;
|
|
15
|
+
const ADDRESS_FIELD_STOP_RE = /\s+(?:цена|ціна|нарх(?:и)?|narx|price|стоимост[ьи]|этаж(?:ность)?|поверх|qavat|қабат|кават|қават|комнат(?:ы|а)?|кімнат(?:и|а)?|xona|хона|площадь|площа|maydon|тел(?:ефон)?|phone|комисси\p{L}*|депозит|deposit|ориентир\p{L}*|ор[-–—]?р\.?)(?=$|[\s:№#-])/iu;
|
|
16
16
|
const PROPERTY_AREA_LINE_RE = /(?:^|[^\p{L}\p{N}_])(?:(?:общая|жилая|полезная|кухонная)\s+площадь|площадь\s+(?:квартиры|дома|комнаты))(?=$|[^\p{L}\p{N}_])/iu;
|
|
17
17
|
const NON_ADDRESS_BARE_RE = /^(?:(?:(?:перш(?:ий|ому)|перв(?:ый|ом)|друг(?:ий|ому)|втор(?:ой|ом)|трет(?:ій|ьем|ий)|\d{1,3}(?:-?й)?)\s+(?:поверх|этаж|floor|qavat|қабат))|(?:поверх|этаж|floor|qavat|қабат)(?:\s|$)|(?:район|р-н|рн|мікрорайон|микрорайон|мкр\.?|жк|ж\.к\.|жилой\s+комплекс|житловий\s+комплекс|residential\s+complex)(?:\s|$)|(?:недалеко|поруч|рядом|біля|около|возле)(?=$|[^\p{L}\p{N}_])|(?:зупинка|остановка|станція|станция)(?:\s|$))/iu;
|
|
18
|
-
const DELIMITED_STREET_REJECT_RE = /(?:^|\s)(?:город|місто|city|район|р-н|рн|мікрорайон|микрорайон|мкр|жк|метро|поверх|этаж|floor|qavat|кімнат\p{L}*|комнат\p{L}*|квартира|квартири|квартиры|оренда|аренда|продаж\p{L}*|цена|ціна|площад\p{L}
|
|
18
|
+
const DELIMITED_STREET_REJECT_RE = /(?:^|\s)(?:город|місто|city|район|р-н|рн|мікрорайон|микрорайон|мкр|жк|метро|поверх|этаж|floor|qavat|кімнат\p{L}*|комнат\p{L}*|квартира|квартири|квартиры|оренда|аренда|продаж\p{L}*|цена|ціна|площад\p{L}*|площа|зупинка|остановка|ориентир\p{L}*|ор[-–—]?р\.?)(?:\s|$)/iu;
|
|
19
19
|
|
|
20
20
|
function clean(value) {
|
|
21
21
|
return String(value ?? '')
|
|
@@ -265,11 +265,14 @@ function delimitedBareAddress(text) {
|
|
|
265
265
|
function bareAddress(text) {
|
|
266
266
|
const cleaned = clean(text);
|
|
267
267
|
if (!cleaned || PROPERTY_AREA_LINE_RE.test(cleaned) || NON_ADDRESS_BARE_RE.test(cleaned)) return null;
|
|
268
|
-
const
|
|
268
|
+
const stopMatch = cleaned.match(ADDRESS_FIELD_STOP_RE);
|
|
269
|
+
const truncated = stopMatch ? clean(cleaned.slice(0, stopMatch.index)) : cleaned;
|
|
270
|
+
if (!truncated) return null;
|
|
271
|
+
const tail = splitAddressTail(truncated);
|
|
269
272
|
if (!tail) return null;
|
|
270
273
|
if (/^(?:центр|centre|center)$/iu.test(compactStreet(tail.street) || '')) return null;
|
|
271
274
|
const confidence = tail.houseNumber ? 0.85 : 0.55;
|
|
272
|
-
return result(
|
|
275
|
+
return result(truncated, tail.street, tail.houseNumber, tail.building, confidence);
|
|
273
276
|
}
|
|
274
277
|
|
|
275
278
|
/**
|
|
@@ -38,10 +38,10 @@ const PLACE_KINDS = Object.freeze([
|
|
|
38
38
|
['Университет', /(?:университет|институт)\s+([A-ZА-ЯЁ][\p{L}\p{N}_'’-]{2,24})/u],
|
|
39
39
|
]);
|
|
40
40
|
|
|
41
|
-
const NEARBY_BLOCK_RE = /(?:^|\n)[^\n]{0,30}?(?:что\s+(?:есть|находится)\s+р[яa]дом|р[яa]дом(?:\s+(?:есть|находятся|расположены|с\s+домом))?|непода[лл][её]ку|поблизости|в\s+шаговой\s+доступности|окружени[ие]|ориентир(?:ы|ами)
|
|
41
|
+
const NEARBY_BLOCK_RE = /(?:^|\n)[^\n]{0,30}?(?:что\s+(?:есть|находится)\s+р[яa]дом|р[яa]дом(?:\s+(?:есть|находятся|расположены|с\s+домом))?|непода[лл][её]ку|поблизости|в\s+шаговой\s+доступности|окружени[ие]|ориентир(?:ы|ами)?|ор[-–—]?р\.?|yaqinida|atrofida|yonida|nearby|landmarks?)\s*[:—-]?\s*([^\n]{4,500})/iu;
|
|
42
42
|
const NEARBY_NOISE_RE = /^(?:и|а|в|на|у|до|от|все|вс[её]|есть|рядом|близко|недалеко|минут\p{L}*|пешком|транспорт|остановк\p{L}*|магазин|магазины|аптека|аптеки|садик|садики|всё\s+необходимое|развит\p{L}*)$/iu;
|
|
43
43
|
const NEARBY_FILLER_RE = /(?:инфраструктур\p{L}*|все\s+необходимо|вс[её]\s+рядом|шаговой\s+доступност|развитый\s+район)/iu;
|
|
44
|
-
const QUARTER_NEARBY_PREFIX_RE = /(?:^|[\s,;:—–-])(?:до|рядом\s+(?:с|со)|недалеко\s+от|возле|около|ориентир\s*[:—–-]?|near(?:by)?|close\s+to|lângă|aproape\s+de)\s*$/iu;
|
|
44
|
+
const QUARTER_NEARBY_PREFIX_RE = /(?:^|[\s,;:—–-])(?:до|рядом\s+(?:с|со)|недалеко\s+от|возле|около|ориентир\s*[:—–-]?|ор[-–—]?р\.?\s*[:—–-]?|near(?:by)?|close\s+to|lângă|aproape\s+de)\s*$/iu;
|
|
45
45
|
|
|
46
46
|
function enumeratedNearby(text) {
|
|
47
47
|
const blocks = [...text.matchAll(new RegExp(NEARBY_BLOCK_RE.source, `${NEARBY_BLOCK_RE.flags}g`))]
|
package/src/housing-context.js
CHANGED
|
@@ -12,7 +12,7 @@ export const PROPERTY_CONDITION_TERMS = Object.freeze([
|
|
|
12
12
|
group('designerRenovation', { ru: ['дизайнерский ремонт'], en: ['designer renovation', 'designer interior'], uk: ['дизайнерський ремонт'], ro: ['renovare de designer'], uzLatn: ['dizaynerlik remont'], uzCyrl: ['дизайнерлик ремонт'], kk: ['дизайнерлік жөндеу'] }),
|
|
13
13
|
group('good', { ru: ['хорошее состояние', 'отличное состояние'], en: ['good condition', 'excellent condition'], uk: ['хороший стан', 'відмінний стан'], ro: ['stare bună', 'stare excelentă'], uzLatn: ['yaxshi holat', 'yaxshi xolat', 'juda yaxshi xolatda'], uzCyrl: ['яхши ҳолат'], kk: ['жақсы жағдай'] }),
|
|
14
14
|
group('livable', { ru: ['жилое состояние'], en: ['livable condition', 'habitable'], uk: ['житловий стан'], ro: ['locuibil'], uzLatn: ['yashashga tayyor'], uzCyrl: ['яшашга тайёр'], kk: ['тұруға жарамды'] }),
|
|
15
|
-
group('needsRenovation', { ru: ['требует ремонта', 'под ремонт', 'нужен ремонт'], en: ['needs renovation', 'requires renovation'], uk: ['потребує ремонту', 'під ремонт'], ro: ['necesită renovare'], uzLatn: ['remont kerak'], uzCyrl: ['ремонт керак'], kk: ['жөндеу қажет'] }),
|
|
15
|
+
group('needsRenovation', { ru: ['требует ремонта', 'под ремонт', 'нужен ремонт'], en: ['needs renovation', 'requires renovation'], uk: ['потребує ремонту', 'під ремонт'], ro: ['necesită renovare'], uzLatn: ['remont kerak', "ta'mirsiz", 'tamirsiz', "ta'mirga muhtoj"], uzCyrl: ['ремонт керак', 'таъмирсиз', 'тамирсиз'], kk: ['жөндеу қажет'] }),
|
|
16
16
|
group('shell', { ru: ['черновая отделка', 'черновая', 'без отделки'], en: ['shell condition', 'shell and core', 'unfinished shell'], uk: ['чорнова обробка', 'без оздоблення'], ro: ['la roșu', 'fără finisaje'], uzLatn: ['qora suvoq', 'qora suvoq holati'], uzCyrl: ['қора сувоқ'], kk: ['қара әрлеу'] }),
|
|
17
17
|
group('whiteBox', { ru: ['предчистовая', 'предчистовая отделка'], en: ['white box', 'white-box'], uk: ['передчистове оздоблення'], ro: ['semifinisat'], uzLatn: ['white box'], uzCyrl: ['white box'], kk: ['white box'] }),
|
|
18
18
|
]);
|
|
@@ -24,6 +24,7 @@ export const LAYOUT_TERMS = Object.freeze([
|
|
|
24
24
|
group('euroTwoRoom', { ru: ['евродвушка', 'евро двушка'], en: ['euro two-room', 'euro one bedroom'], uk: ['євродвушка'], ro: ['apartament euro două camere'], uzLatn: ['evro ikki xonali'], uzCyrl: ['евро икки хонали'], kk: ['еуро екі бөлмелі'] }),
|
|
25
25
|
group('euroThreeRoom', { ru: ['евротрёшка', 'евротрешка', 'евро трешка'], en: ['euro three-room', 'euro two bedroom'], uk: ['євротрійка'], ro: ['apartament euro trei camere'], uzLatn: ['evro uch xonali'], uzCyrl: ['евро уч хонали'], kk: ['еуро үш бөлмелі'] }),
|
|
26
26
|
group('openPlan', { ru: ['свободная планировка'], en: ['open plan', 'free layout'], uk: ['вільне планування'], ro: ['plan deschis'], uzLatn: ['erkin reja'], uzCyrl: ['эркин режа'], kk: ['еркін жоспарлау'] }),
|
|
27
|
+
group('improvedLayout', { ru: ['улучшенная планировка', 'улучшенка'], en: ['improved layout'], uk: ['покращене планування', 'поліпшене планування'], ro: ['plan îmbunătățit'], uzLatn: ['yaxshilangan reja'], uzCyrl: ['яхшиланган режа'], kk: ['жақсартылған жоспарлау'] }),
|
|
27
28
|
group('masterBedroom', { ru: ['мастер-спальня', 'мастер спальня'], en: ['master bedroom'], uk: ['майстер-спальня'], ro: ['dormitor matrimonial'], uzLatn: ['master yotoqxona'], uzCyrl: ['мастер ётоқхона'], kk: ['master bedroom'] }),
|
|
28
29
|
group('walkInCloset', { ru: ['гардеробная'], en: ['walk-in closet', 'dressing room'], uk: ['гардеробна'], ro: ['dressing'], uzLatn: ['garderob xona'], uzCyrl: ['гардероб хона'], kk: ['киім бөлмесі'] }),
|
|
29
30
|
]);
|
|
@@ -39,7 +39,7 @@ const AIR_CONDITIONER_RE = /(?:кондицион|air\s*con|konditsioner|kandit(
|
|
|
39
39
|
const PER_PERSON_PRICE_RE = /(?:kishi\s+boshiga|киши\s+бошига)\s*(\d{1,3}(?:[\s.,]\d{3})*|\d+(?:[.,]\d+)?)\s*(ming|минг|million|mln|млн)?(?:dan|дан)?/iu;
|
|
40
40
|
const WALK_MINUTES_RE = /(?:yayov|piyoda|пешком)\s*(\d{1,2})\s*(?:daqiqa|min(?:ute)?s?|минут)/iu;
|
|
41
41
|
const TRANSIT_ROUTES_RE = /(?:aftobuslar|avtobuslar|автобуслар|автобусы)[^\r\n\d]{0,24}((?:\d{1,4}[\s,;/]*){1,10})/iu;
|
|
42
|
-
const NEARBY_RELATION_TAIL_RE = /(?<!\p{L})(?:рядом\s+(?:с|со)|недалеко\s+от|возле|около|ориентир\s*[:—–-]?|near(?:by)?|close\s+to|lângă|aproape\s+de)(?!\p{L})[^.!?\r\n;]*/giu;
|
|
42
|
+
const NEARBY_RELATION_TAIL_RE = /(?<!\p{L})(?:рядом\s+(?:с|со)|недалеко\s+от|возле|около|ориентир\s*[:—–-]?|ор[-–—]?р\.?\s*[:—–-]?|near(?:by)?|close\s+to|lângă|aproape\s+de)(?!\p{L})[^.!?\r\n;]*/giu;
|
|
43
43
|
const NEARBY_TRAVEL_TAIL_RE = /(?<!\p{L})(?:до|până\s+la)(?!\p{L})[^.!?\r\n;]{0,96}(?<!\p{L})\d{1,3}\s*(?:мин(?:ут(?:ы|а|ах)?|\.?)?|min(?:ute)?s?|дақиқ\p{L}*|daqiqa|км|km|метр(?:а|ов)?|m)(?!\p{L})[^.!?\r\n;]*/giu;
|
|
44
44
|
const RESIDENTIAL_CONTEXT_RE = /(?:ж\.?\s*к\.?|жил(?:ой|ого)\s+комплекс|новострой(?:ка|ки)?|residential\s+complex|residence|turar\s+joy|uy[-\s]?joy|majmua|массив)/iu;
|
|
45
45
|
|
package/src/housing.js
CHANGED
|
@@ -42,8 +42,8 @@ export const ADDRESS_TERMS = Object.freeze({
|
|
|
42
42
|
uzLatn: ['kirish', 'podyezd'], uzCyrl: ['кириш', 'подъезд'], kk: ['кіреберіс', 'подъезд'],
|
|
43
43
|
}),
|
|
44
44
|
landmark: group('landmark', {
|
|
45
|
-
ru: ['ориентир', 'рядом с', 'возле', 'напротив'], en: ['landmark', 'near', 'next to', 'opposite'], uk: ['орієнтир', 'поруч', 'біля', 'навпроти'], ro: ['reper', 'lângă', 'langa', 'în apropiere', 'in apropiere', 'vizavi'],
|
|
46
|
-
uzLatn: ['mo‘ljal', "mo'ljal", 'yaqinida', 'yonida', 'ro‘parasida'], uzCyrl: ['мўлжал', 'яқинида', 'ёнида', 'рўпарасида'], kk: ['бағдар', 'жанында', 'маңында', 'қарсысында'],
|
|
45
|
+
ru: ['ориентир', 'ор-р', 'орр', 'рядом с', 'возле', 'напротив'], en: ['landmark', 'near', 'next to', 'opposite'], uk: ['орієнтир', 'поруч', 'біля', 'навпроти'], ro: ['reper', 'lângă', 'langa', 'în apropiere', 'in apropiere', 'vizavi'],
|
|
46
|
+
uzLatn: ['mo‘ljal', "mo'ljal", 'yaqinida', 'yonida', 'ro‘parasida'], uzCyrl: ['мўлжал', 'мулжал', 'яқинида', 'ёнида', 'рўпарасида'], kk: ['бағдар', 'жанында', 'маңында', 'қарсысында'],
|
|
47
47
|
}),
|
|
48
48
|
});
|
|
49
49
|
|