reg-normalizer 1.0.0__tar.gz
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.
- reg_normalizer-1.0.0/MANIFEST.in +4 -0
- reg_normalizer-1.0.0/PKG-INFO +162 -0
- reg_normalizer-1.0.0/README.md +125 -0
- reg_normalizer-1.0.0/pyproject.toml +58 -0
- reg_normalizer-1.0.0/reg_normalizer/__init__.py +12 -0
- reg_normalizer-1.0.0/reg_normalizer/data/interim/regions_etalon_v2.0.yaml +2059 -0
- reg_normalizer-1.0.0/reg_normalizer/regions_validator.py +224 -0
- reg_normalizer-1.0.0/reg_normalizer.egg-info/PKG-INFO +162 -0
- reg_normalizer-1.0.0/reg_normalizer.egg-info/SOURCES.txt +13 -0
- reg_normalizer-1.0.0/reg_normalizer.egg-info/dependency_links.txt +1 -0
- reg_normalizer-1.0.0/reg_normalizer.egg-info/requires.txt +10 -0
- reg_normalizer-1.0.0/reg_normalizer.egg-info/top_level.txt +1 -0
- reg_normalizer-1.0.0/requirements.txt +5 -0
- reg_normalizer-1.0.0/setup.cfg +4 -0
- reg_normalizer-1.0.0/setup.py +9 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: reg-normalizer
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Tool for normalizing and standardizing Russian region names
|
|
5
|
+
Author-email: Your Name <your.email@example.com>
|
|
6
|
+
License: CC BY-NC-SA 4.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/tochno-st/reg_normalizer
|
|
8
|
+
Project-URL: Documentation, https://github.com/tochno-st/reg_normalizer#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/tochno-st/reg_normalizer
|
|
10
|
+
Project-URL: Bug Tracker, https://github.com/tochno-st/reg_normalizer/issues
|
|
11
|
+
Keywords: regions,normalization,russian,fuzzy-matching,data-cleaning
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: Free for non-commercial use
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Operating System :: OS Independent
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
25
|
+
Classifier: Natural Language :: Russian
|
|
26
|
+
Requires-Python: >=3.8
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
Requires-Dist: pyyaml>=6.0
|
|
29
|
+
Requires-Dist: fuzzywuzzy>=0.18.0
|
|
30
|
+
Requires-Dist: python-levenshtein>=0.20.0
|
|
31
|
+
Requires-Dist: pandas>=1.5.0
|
|
32
|
+
Requires-Dist: nltk>=3.8.0
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: ipykernel; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
37
|
+
|
|
38
|
+
[](https://creativecommons.org/licenses/by-nc-sa/4.0/)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# Region Normalizer
|
|
42
|
+
|
|
43
|
+
**Region Normalizer** — инструмент для нормализации и стандартизации наименований российских регионов. Он помогает распознавать регион даже в случаях, когда в названии встречаются опечатки, латинские буквы или другие особенности написания. Инструмент сопоставляет различные формы написания с [эталонным справочником](https://github.com/tochno-st/reg_normalizer/blob/main/data/interim/regions_etalon_v2.0.yaml) и позволяет извлекать дополнительные атрибуты, такие как коды ОКАТО, ISO, английские названия и многое другое.
|
|
44
|
+
|
|
45
|
+
Разные наименования одного и того же региона — частая проблема в реальных данных, например, на портале ЕМИСС встречается до 275 различных вариантов написания регионов. Особенно многообразны варианты у Тюменской и Архангельской областей — по 8 и 7 вариантов соответственно. В состав этих регионов входят автономные округа (ХМАО, ЯНАО, НАО), и часть ведомств отмечает, что данные приведены без автономных округов, но сокращения и формулировки используются самые разные.
|
|
46
|
+
|
|
47
|
+
## Возможности
|
|
48
|
+
- Поиск и нормализация региона по произвольному названию (с учетом опечаток, сокращений, аббревиатур, смешения латиницы и кириллицы)
|
|
49
|
+
- Пакетная обработка больших таблиц с названиями регионов
|
|
50
|
+
- Гибкая настройка весов алгоритмов сопоставления
|
|
51
|
+
- Добавление дополнительных полей из эталонного справочника (ОКАТО, ISO, английское название и др.)
|
|
52
|
+
|
|
53
|
+
## Установка
|
|
54
|
+
|
|
55
|
+
1. Клонируйте репозиторий:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
git clone https://github.com/tochno-st/reg_normalizer.git
|
|
59
|
+
cd reg_normalizer
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
2. Установите зависимости:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pip install -r requirements.txt
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Быстрый старт
|
|
69
|
+
|
|
70
|
+
### 1. Импорт и инициализация
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
import sys
|
|
74
|
+
sys.path.append('src')
|
|
75
|
+
from regions_validator import RegionMatcher
|
|
76
|
+
matcher = RegionMatcher()
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 2. Нормализация одного региона
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
region_name = "московск область"
|
|
83
|
+
match, score = matcher.find_best_match(region_name)
|
|
84
|
+
print(f"Input: {region_name}")
|
|
85
|
+
print(f"Match: {match}")
|
|
86
|
+
print(f"Score: {score:.2f}")
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3. Использование с DataFrame
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
import pandas as pd
|
|
93
|
+
sample_data = pd.DataFrame({
|
|
94
|
+
'region_name': [
|
|
95
|
+
'московск Обл',
|
|
96
|
+
'свердловск',
|
|
97
|
+
'петербург',
|
|
98
|
+
'Mосковская област',
|
|
99
|
+
'татарстан респ.',
|
|
100
|
+
'Свердлов обл',
|
|
101
|
+
'aлтайский к',
|
|
102
|
+
'Республика Алтай',
|
|
103
|
+
'ХМао',
|
|
104
|
+
'Юж федеральный округ',
|
|
105
|
+
'спб',
|
|
106
|
+
'рт',
|
|
107
|
+
'город москва столица российской федерации город федерального значения',
|
|
108
|
+
'тюменская область (кроме ханты мансийского автономного округа югры и ямало ненецкого автономного округа)'
|
|
109
|
+
]
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
result_df = matcher.match_dataframe(
|
|
113
|
+
sample_data,
|
|
114
|
+
'region_name',
|
|
115
|
+
weights={'levenshtein': 0.4, 'token_set': 0.6},
|
|
116
|
+
approach_weights={'original': 0.3, 'stemmed': 0.7},
|
|
117
|
+
threshold=70
|
|
118
|
+
)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 4. Добавление дополнительных полей
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
# Добавить английские названия
|
|
125
|
+
result_df = matcher.attach_field(result_df, 'region_name', 'name_eng')
|
|
126
|
+
# Добавить коды ОКАТО
|
|
127
|
+
result_df = matcher.attach_field(result_df, 'region_name', 'okato')
|
|
128
|
+
# Добавить коды ISO
|
|
129
|
+
result_df = matcher.attach_field(result_df, 'region_name', 'iso_code')
|
|
130
|
+
print(result_df.head())
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Кастомизация
|
|
134
|
+
|
|
135
|
+
- **weights** — веса для алгоритмов сравнения ('levenshtein', 'token_set')
|
|
136
|
+
- **approach_weights** — веса для подходов ('original', 'stemmed')
|
|
137
|
+
- **threshold** — пороговое значение для принятия совпадения
|
|
138
|
+
|
|
139
|
+
Пример:
|
|
140
|
+
```python
|
|
141
|
+
custom_weights = {'levenshtein': 0.3, 'token_set': 0.7}
|
|
142
|
+
custom_approach_weights = {'original': 0.2, 'stemmed': 0.8}
|
|
143
|
+
match, score = matcher.find_best_match(
|
|
144
|
+
"свердловск",
|
|
145
|
+
weights=custom_weights,
|
|
146
|
+
approach_weights=custom_approach_weights,
|
|
147
|
+
threshold=60
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Структура эталонного справочника
|
|
152
|
+
|
|
153
|
+
Файл [`data/interim/regions_etalon_v2.0.yaml`](https://github.com/tochno-st/reg_normalizer/blob/main/data/interim/regions_etalon_v2.0.yaml) содержит ключи:
|
|
154
|
+
- `name_rus` — официальное название региона
|
|
155
|
+
- `name_eng` — английское название
|
|
156
|
+
- `okato` — код ОКАТО
|
|
157
|
+
- `iso_code` — код ISO
|
|
158
|
+
|
|
159
|
+
## Лицензия
|
|
160
|
+
|
|
161
|
+
<a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br />
|
|
162
|
+
Creative Commons License Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0).
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
[](https://creativecommons.org/licenses/by-nc-sa/4.0/)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# Region Normalizer
|
|
5
|
+
|
|
6
|
+
**Region Normalizer** — инструмент для нормализации и стандартизации наименований российских регионов. Он помогает распознавать регион даже в случаях, когда в названии встречаются опечатки, латинские буквы или другие особенности написания. Инструмент сопоставляет различные формы написания с [эталонным справочником](https://github.com/tochno-st/reg_normalizer/blob/main/data/interim/regions_etalon_v2.0.yaml) и позволяет извлекать дополнительные атрибуты, такие как коды ОКАТО, ISO, английские названия и многое другое.
|
|
7
|
+
|
|
8
|
+
Разные наименования одного и того же региона — частая проблема в реальных данных, например, на портале ЕМИСС встречается до 275 различных вариантов написания регионов. Особенно многообразны варианты у Тюменской и Архангельской областей — по 8 и 7 вариантов соответственно. В состав этих регионов входят автономные округа (ХМАО, ЯНАО, НАО), и часть ведомств отмечает, что данные приведены без автономных округов, но сокращения и формулировки используются самые разные.
|
|
9
|
+
|
|
10
|
+
## Возможности
|
|
11
|
+
- Поиск и нормализация региона по произвольному названию (с учетом опечаток, сокращений, аббревиатур, смешения латиницы и кириллицы)
|
|
12
|
+
- Пакетная обработка больших таблиц с названиями регионов
|
|
13
|
+
- Гибкая настройка весов алгоритмов сопоставления
|
|
14
|
+
- Добавление дополнительных полей из эталонного справочника (ОКАТО, ISO, английское название и др.)
|
|
15
|
+
|
|
16
|
+
## Установка
|
|
17
|
+
|
|
18
|
+
1. Клонируйте репозиторий:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
git clone https://github.com/tochno-st/reg_normalizer.git
|
|
22
|
+
cd reg_normalizer
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
2. Установите зависимости:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install -r requirements.txt
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Быстрый старт
|
|
32
|
+
|
|
33
|
+
### 1. Импорт и инициализация
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
import sys
|
|
37
|
+
sys.path.append('src')
|
|
38
|
+
from regions_validator import RegionMatcher
|
|
39
|
+
matcher = RegionMatcher()
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 2. Нормализация одного региона
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
region_name = "московск область"
|
|
46
|
+
match, score = matcher.find_best_match(region_name)
|
|
47
|
+
print(f"Input: {region_name}")
|
|
48
|
+
print(f"Match: {match}")
|
|
49
|
+
print(f"Score: {score:.2f}")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 3. Использование с DataFrame
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
import pandas as pd
|
|
56
|
+
sample_data = pd.DataFrame({
|
|
57
|
+
'region_name': [
|
|
58
|
+
'московск Обл',
|
|
59
|
+
'свердловск',
|
|
60
|
+
'петербург',
|
|
61
|
+
'Mосковская област',
|
|
62
|
+
'татарстан респ.',
|
|
63
|
+
'Свердлов обл',
|
|
64
|
+
'aлтайский к',
|
|
65
|
+
'Республика Алтай',
|
|
66
|
+
'ХМао',
|
|
67
|
+
'Юж федеральный округ',
|
|
68
|
+
'спб',
|
|
69
|
+
'рт',
|
|
70
|
+
'город москва столица российской федерации город федерального значения',
|
|
71
|
+
'тюменская область (кроме ханты мансийского автономного округа югры и ямало ненецкого автономного округа)'
|
|
72
|
+
]
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
result_df = matcher.match_dataframe(
|
|
76
|
+
sample_data,
|
|
77
|
+
'region_name',
|
|
78
|
+
weights={'levenshtein': 0.4, 'token_set': 0.6},
|
|
79
|
+
approach_weights={'original': 0.3, 'stemmed': 0.7},
|
|
80
|
+
threshold=70
|
|
81
|
+
)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 4. Добавление дополнительных полей
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
# Добавить английские названия
|
|
88
|
+
result_df = matcher.attach_field(result_df, 'region_name', 'name_eng')
|
|
89
|
+
# Добавить коды ОКАТО
|
|
90
|
+
result_df = matcher.attach_field(result_df, 'region_name', 'okato')
|
|
91
|
+
# Добавить коды ISO
|
|
92
|
+
result_df = matcher.attach_field(result_df, 'region_name', 'iso_code')
|
|
93
|
+
print(result_df.head())
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Кастомизация
|
|
97
|
+
|
|
98
|
+
- **weights** — веса для алгоритмов сравнения ('levenshtein', 'token_set')
|
|
99
|
+
- **approach_weights** — веса для подходов ('original', 'stemmed')
|
|
100
|
+
- **threshold** — пороговое значение для принятия совпадения
|
|
101
|
+
|
|
102
|
+
Пример:
|
|
103
|
+
```python
|
|
104
|
+
custom_weights = {'levenshtein': 0.3, 'token_set': 0.7}
|
|
105
|
+
custom_approach_weights = {'original': 0.2, 'stemmed': 0.8}
|
|
106
|
+
match, score = matcher.find_best_match(
|
|
107
|
+
"свердловск",
|
|
108
|
+
weights=custom_weights,
|
|
109
|
+
approach_weights=custom_approach_weights,
|
|
110
|
+
threshold=60
|
|
111
|
+
)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Структура эталонного справочника
|
|
115
|
+
|
|
116
|
+
Файл [`data/interim/regions_etalon_v2.0.yaml`](https://github.com/tochno-st/reg_normalizer/blob/main/data/interim/regions_etalon_v2.0.yaml) содержит ключи:
|
|
117
|
+
- `name_rus` — официальное название региона
|
|
118
|
+
- `name_eng` — английское название
|
|
119
|
+
- `okato` — код ОКАТО
|
|
120
|
+
- `iso_code` — код ISO
|
|
121
|
+
|
|
122
|
+
## Лицензия
|
|
123
|
+
|
|
124
|
+
<a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br />
|
|
125
|
+
Creative Commons License Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0).
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "reg-normalizer"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Tool for normalizing and standardizing Russian region names"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
authors = [
|
|
11
|
+
{name = "Your Name", email = "your.email@example.com"}
|
|
12
|
+
]
|
|
13
|
+
license = {text = "CC BY-NC-SA 4.0"}
|
|
14
|
+
requires-python = ">=3.8"
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 4 - Beta",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"Intended Audience :: Science/Research",
|
|
19
|
+
"License :: Free for non-commercial use",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.8",
|
|
22
|
+
"Programming Language :: Python :: 3.9",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Operating System :: OS Independent",
|
|
27
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
28
|
+
"Topic :: Text Processing :: Linguistic",
|
|
29
|
+
"Natural Language :: Russian",
|
|
30
|
+
]
|
|
31
|
+
keywords = ["regions", "normalization", "russian", "fuzzy-matching", "data-cleaning"]
|
|
32
|
+
|
|
33
|
+
dependencies = [
|
|
34
|
+
"pyyaml>=6.0",
|
|
35
|
+
"fuzzywuzzy>=0.18.0",
|
|
36
|
+
"python-levenshtein>=0.20.0",
|
|
37
|
+
"pandas>=1.5.0",
|
|
38
|
+
"nltk>=3.8.0",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[project.urls]
|
|
42
|
+
Homepage = "https://github.com/tochno-st/reg_normalizer"
|
|
43
|
+
Documentation = "https://github.com/tochno-st/reg_normalizer#readme"
|
|
44
|
+
Repository = "https://github.com/tochno-st/reg_normalizer"
|
|
45
|
+
"Bug Tracker" = "https://github.com/tochno-st/reg_normalizer/issues"
|
|
46
|
+
|
|
47
|
+
[project.optional-dependencies]
|
|
48
|
+
dev = [
|
|
49
|
+
"ipykernel",
|
|
50
|
+
"pytest>=7.0",
|
|
51
|
+
"pytest-cov",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
[tool.setuptools]
|
|
55
|
+
packages = ["reg_normalizer"]
|
|
56
|
+
|
|
57
|
+
[tool.setuptools.package-data]
|
|
58
|
+
reg_normalizer = ["data/interim/*.yaml"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Region Normalizer - Tool for normalizing and standardizing Russian region names.
|
|
3
|
+
|
|
4
|
+
This package helps recognize regions even with typos, Latin characters, or various spelling variations.
|
|
5
|
+
It matches different forms of region names against an etalon reference and allows extracting additional
|
|
6
|
+
attributes such as OKATO codes, ISO codes, English names, and more.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .regions_validator import RegionMatcher
|
|
10
|
+
|
|
11
|
+
__version__ = "1.0.0"
|
|
12
|
+
__all__ = ["RegionMatcher"]
|