addrkit: quality evaluation harness + parser hardening
- add internal/eval: deterministic citizen-style perturbation harness (typos, case, word order, abbreviations, filler words, dropped units) - parser: strip all street-type tokens, filler words (город/дом/д/область), trailing apartment (кв N); handle letter-before-fraction and corpus letters - matching: token-aware typo-tolerant street similarity; wider ambiguity margin to surface near-collisions instead of guessing - seed: correct parse-rate accounting, structure-aware de-duplication - CLI: 'addrkit eval' command; README with measured results Measured on the real 73,936-row registry: 99.98% parsed, 0 wrong-house safety violations across 34k+ perturbed cases.
This commit is contained in:
@@ -115,3 +115,46 @@ ADDRKIT_REGISTRY=/path/to/address_registry.ndjson \
|
||||
|
||||
На дампе из 73 936 строк парсер распознаёт **99.98 %** (14 строк — заведомо
|
||||
битые форматы; они не угадываются, а попадают в отчёт `stats.unparsed_sample`).
|
||||
|
||||
## Оценка качества (`addrkit eval`)
|
||||
|
||||
Детерминированный harness генерирует «гражданские» искажения канонических
|
||||
адресов и измеряет, как резолвер справляется. Это offline: сеть не нужна.
|
||||
|
||||
```bash
|
||||
./bin/addrkit eval -db registry.db -sample 800 -seed 1
|
||||
```
|
||||
|
||||
Категории и результат на реальном реестре (по 800 адресам на seed):
|
||||
|
||||
| Категория | Пример искажения | Точность |
|
||||
|---|---|---|
|
||||
| baseline | канонический адрес как есть | 100 % |
|
||||
| case_lower / case_upper | регистр | 100 % |
|
||||
| city_prefix | `г. Новосибирск, …` | 100 % |
|
||||
| filler_dom | `… дом 5` | 100 % |
|
||||
| punctuation | лишние `,`/пробелы | 100 % |
|
||||
| yo | `ё` вместо `е` | 100 % |
|
||||
| type_abbrev | `ул.`/`пер.`/`пр-т` | 100 % |
|
||||
| type_removed | улица без слова «улица» | 100 % |
|
||||
| type_front | `улица Станционная 1` | 100 % |
|
||||
| corpus_synonym | `корпус` вместо `к` | 100 % |
|
||||
| structure_drop | без `стр.` | 100 % |
|
||||
| **typo** | опечатка в названии улицы | ~70–75 % (остальное — `ambiguous`) |
|
||||
| drop_ordinal / drop_letter / drop_fraction | потеря `2-я` / литеры / дроби | потери (lossy) |
|
||||
|
||||
Ключевой результат: **0 случаев, когда сервис подставил неверный дом**
|
||||
(«safety violations») на десятках тысяч сгенерированных кейсов. Опечатки либо
|
||||
распознаются, либо честно уходят в `ambiguous`/`not_found`, но не превращаются
|
||||
в чужой адрес.
|
||||
|
||||
## Локальный dev
|
||||
|
||||
```bash
|
||||
make build
|
||||
./bin/addrkit seed -in registry.ndjson -out dev/registry.db -version 2026-10-01
|
||||
cp config.example.json dev/config.json # укажите data_path и portal.url
|
||||
./bin/addrkitd -config dev/config.json
|
||||
curl -s localhost:6171/v1/resolve -d '{"address":"2-я Станционная улица 1/1 стр."}'
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user