turkce-adres 0.2.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.
@@ -0,0 +1,10 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ build/
5
+ dist/
6
+ .venv/
7
+ .pytest_cache/
8
+ ham/
9
+ deneme/
10
+ .env
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0 (2026-11-09), first release as turkce-adres
4
+
5
+ - Renamed: package `turkce-adres`, module `turkce_adres`, command `turkce-adres` (the name `tr-adres` on PyPI belongs to an independent project).
6
+ - Neighbourhood/village gazetteer from OpenStreetMap: 66,687 entries in 81 provinces and 973 districts, with centre points. Validates the neighbourhood, infers a missing district or province, restores correct spelling.
7
+ - Offline approximate geocoding (`konum` / `geocode`): street (14,777 OSM streets), neighbourhood/village, district or province level.
8
+ - Address matching (`benzerlik`, `ayni_mi`) and duplicate grouping in the CLI (`--tekil`).
9
+ - Privacy generalisation (`genellestir`) to province, district, neighbourhood or street level.
10
+ - Delivery check (`eksikler`): missing or inconsistent elements.
11
+ - Parser: labelled fields ("Mahalle: X, Cadde: Y"), typo tolerance for province/district names, ASCII spelling restored with a word list from OSM, site/block, village ("Köyü"), dead end, square, "Kat: Zemin", landmark phrases ("X karşısı"), "12/3" read as house 12 unit 3, postcode to district (OSM-derived), aliases (K.Maraş, Antep, İst.).
12
+ - `guven` (confidence) and `notlar` (notes) in every result; official output style (`bicimle(a, "resmi")`).
13
+ - New hand-labelled hard set `bench/zor.tsv` (58 addresses). Held-out OSM set: 99.5% of addresses with every field correct.
14
+
15
+ ## 0.1.0 (2026-11-09)
16
+
17
+ - First release: rule-based parser (`ayristir` / `parse`), formatter (`bicimle` / `format_address`), command line tool with CSV support.
18
+ - Turkish and English field names and CLI messages (`dil="en"`, `--lang en`).
19
+ - 5-digit street names (`14027 Sk.`) are no longer mistaken for postcodes; postcode must start with a valid province code (01-81). Province is inferred from the postcode.
20
+ - Ordinal and slashed street numbers kept as written (`716. Sk.`, `678/2. Sk.`, `451/A Sk.`).
21
+ - "Province District Neighbourhood" prefixes split off (`Samsun 19 Mayıs Fındıklı Mah.`), while real names starting with a place name are kept (`Fatih Sultan Mehmet Mah.`, `Gürpınar Yolu Cad.`).
22
+ - Building names no longer swallow the street before them; house number without "No" after the street (`Ziya Gökalp Cd 12`).
23
+ - Held-out evaluation set (6,000 OpenStreetMap addresses): 99.5% of addresses with every field correct. The earlier browser prototype scored 74.5% on the development set.
@@ -0,0 +1,24 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mehmet Veysel Delibaş
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ The data files in src/turkce_adres/veri/ and bench/*.jsonl are not
24
+ covered by this license; see LICENSE-DATA.md (ODbL 1.0).
@@ -0,0 +1,24 @@
1
+ # Data license / Veri lisansı
2
+
3
+ The following files are derived from OpenStreetMap data and are made available
4
+ under the Open Database License (ODbL) 1.0:
5
+
6
+ - `src/turkce_adres/veri/gazetteer.json` (province and district names)
7
+ - `src/turkce_adres/veri/mahalle.json.gz` (neighbourhoods, villages and their centre points)
8
+ - `src/turkce_adres/veri/sokak.json.gz` (street centre points, postcode to district table)
9
+ - `src/turkce_adres/veri/kelime.json.gz` (spelling list built from OSM place and street names)
10
+ - `bench/gelistirme.jsonl`, `bench/sinama.jsonl` (test sets)
11
+
12
+ © OpenStreetMap contributors. https://www.openstreetmap.org/copyright
13
+
14
+ Full license text: https://opendatacommons.org/licenses/odbl/1-0/
15
+
16
+ If you publicly use a modified version of these files, you must share that
17
+ version under the ODbL as well. The Python code is MIT licensed (see LICENSE).
18
+
19
+ ---
20
+
21
+ Yukarıdaki dosyalar OpenStreetMap verisinden türetilmiştir ve Open Database
22
+ License (ODbL) 1.0 ile sunulur. © OpenStreetMap katkıcıları. Değiştirilmiş
23
+ sürümünü herkese açık kullanırsanız o sürümü de ODbL ile paylaşmanız gerekir.
24
+ Python kodu MIT lisanslıdır.
@@ -0,0 +1,150 @@
1
+ Metadata-Version: 2.5
2
+ Name: turkce-adres
3
+ Version: 0.2.0
4
+ Summary: Turkish address toolkit: parse messy Turkish addresses, fix spelling, validate against 66,000+ neighbourhoods and villages, offline geocoding to street/neighbourhood level, duplicate matching, KVKK-friendly generalisation. Offline, no dependencies.
5
+ Project-URL: Homepage, https://github.com/mveyseldelibas/turkce-adres
6
+ Project-URL: Issues, https://github.com/mveyseldelibas/turkce-adres/issues
7
+ Project-URL: Changelog, https://github.com/mveyseldelibas/turkce-adres/blob/main/CHANGELOG.md
8
+ Author: Mehmet Veysel Delibaş
9
+ License: MIT AND ODbL-1.0
10
+ License-File: LICENSE
11
+ License-File: LICENSE-DATA.md
12
+ Keywords: address,address-parser,adres,deduplication,geocoding,gis,kvkk,mahalle,offline-geocoding,openstreetmap,turkey,turkish
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Natural Language :: English
18
+ Classifier: Natural Language :: Turkish
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Scientific/Engineering :: GIS
25
+ Classifier: Topic :: Text Processing :: Linguistic
26
+ Requires-Python: >=3.10
27
+ Provides-Extra: dev
28
+ Requires-Dist: pytest>=7; extra == 'dev'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # turkce-adres
32
+
33
+ [English](README.en.md)
34
+
35
+ Türkçe adresler için internetsiz, ek paket gerektirmeyen bir Python kütüphanesi ve komut satırı aracı:
36
+
37
+ - **Ayrıştırır:** dağınık yazılmış adresi il, ilçe, mahalle/köy, cadde/sokak/bulvar/çıkmaz/meydan, kapı no, blok, kat, daire, bina, posta kodu ve "Migros karşısı" gibi tarif ifadelerine ayırır.
38
+ - **Düzeltir:** BÜYÜK ASCII yazımı Türkçe harflerine kavuşturur (`CAFERAGA` → `Caferağa`, `BUYUKDERE` → `Büyükdere`), il ve ilçe adlarındaki yazım hatalarını düzeltir (`Istnbul` → `İstanbul`), standart (kargo) ya da resmî yazıma çevirir.
39
+ - **Doğrular:** 66.687 mahalle, köy ve semtlik sözlükle mahallenin o ilçede olup olmadığına bakar; il ya da ilçe yazılmamışsa mahalleden ya da posta kodundan bulur.
40
+ - **Konum verir (internetsiz):** adresin yaklaşık koordinatını sokak, mahalle, ilçe ya da il düzeyinde döndürür. Hiçbir servise istek atmaz.
41
+ - **Eşleştirir:** iki adresin aynı yeri gösterip göstermediğini söyler; CSV'de tekrarlanan kayıtları gruplar.
42
+ - **KVKK için genelleştirir:** paylaşmadan önce kapı no, daire, posta kodu gibi ayrıntıları atıp adresi mahalle, ilçe ya da il düzeyine indirir.
43
+ - **Teslimat denetimi:** kargo için eksik ya da çelişkili öğeleri listeler (kapı no yok, ilçe bu ile ait değil...).
44
+ - **İki dil:** alan adları, notlar ve komut satırı Türkçe ya da İngilizce.
45
+
46
+ ```bash
47
+ pip install turkce-adres
48
+ ```
49
+
50
+ ## Kullanım
51
+
52
+ ```python
53
+ from turkce_adres import ayristir, bicimle, konum, benzerlik, genellestir, eksikler
54
+
55
+ a = ayristir("ISTANBUL BESIKTAS LEVENT MAH. BUYUKDERE CAD NO 185 D 4")
56
+ a["il"], a["ilce"], a["mahalle"], a["yol"], a["no"], a["ic_kapi"]
57
+ # ('İstanbul', 'Beşiktaş', 'Levent', 'Büyükdere', '185', '4')
58
+
59
+ bicimle(a) # 'Levent Mah. Büyükdere Cad. No:185 D:4, Beşiktaş/İstanbul'
60
+ bicimle(a, "resmi") # 'Levent Mahallesi Büyükdere Caddesi Dış Kapı No: 185 İç Kapı No: 4, Beşiktaş/İSTANBUL'
61
+
62
+ konum(a) # {'enlem': ..., 'boylam': ..., 'duzey': 'sokak', 'kaynak': 'OpenStreetMap (ODbL)'}
63
+
64
+ benzerlik("CAFERAGA MH MODA CD NO 12 KADIKOY ISTANBUL",
65
+ "Caferağa Mahallesi, Moda Caddesi No:12, Kadıköy/İstanbul") # 1.0
66
+ benzerlik("Moda Cad. No:12 Kadıköy", "Moda Cad. No:14 Kadıköy") # 0.6 (başka bina)
67
+
68
+ genellestir("Caferağa Mah. Moda Cad. No:12 D:3 Kadıköy/İstanbul 34710")["metin"]
69
+ # 'Caferağa Mah., Kadıköy/İstanbul'
70
+
71
+ eksikler("Moda Cad. Kadıköy")
72
+ # ['mahalle ya da köy yok', 'dış kapı numarası yok', 'posta kodu yok (önerilir)']
73
+ ```
74
+
75
+ Her sonuçta ayrıca `guven` (0-1) ve `notlar` vardır: ne düzeltildi, il nereden bulundu ("il ilçeden bulundu", "yazım düzeltildi: Istnbul -> İstanbul").
76
+ `duzelt=False` verilirse sözcükler yazıldığı gibi kalır. İngilizce alan adları için `parse(metin)` ya da `ayristir(metin, dil="en")`.
77
+
78
+ ### Komut satırı
79
+
80
+ ```bash
81
+ # tek adres
82
+ turkce-adres "kızılay meydanı ziya gökalp cd 12 çankaya ankara" --bicim --konum
83
+
84
+ # CSV: adres sütununun yanına alanları, standart yazımı, konumu, eksikleri ve tekrar gruplarını ekler
85
+ turkce-adres musteriler.csv --sutun adres --bicim --konum --eksik --tekil -o musteriler_ayrik.csv
86
+
87
+ # KVKK: yalnız mahalle düzeyine kadar yaz
88
+ turkce-adres musteriler.csv --sutun adres --genellestir mahalle -o paylasim.csv
89
+
90
+ # İngilizce sütun adları ve mesajlar
91
+ turkce-adres customers.csv --column address --lang en --geocode -o out.csv
92
+ ```
93
+
94
+ Excel'den "CSV UTF-8" olarak kaydedilen dosyalar doğrudan okunur; çıktı Excel'in Türkçe karakterleri doğru açacağı biçimde yazılır. Dosyanızda `il`, `no` gibi aynı adlı bir sütun varsa hiçbir sütun ezilmez, yeni sütunlar `adres_` ön ekiyle yazılır.
95
+
96
+ ## Alanlar
97
+
98
+ | Türkçe | English | Örnek |
99
+ |---|---|---|
100
+ | `il` / `ilce` | `province` / `district` | İstanbul / Kadıköy |
101
+ | `mahalle` / `koy` | `neighbourhood` / `village` | Caferağa / Yeşilyurt |
102
+ | `yol`, `yol_turu` | `street`, `street_type` | Moda, cadde (sokak, cadde, bulvar, cikmaz, meydan, yol) |
103
+ | `ust_yol` | `parent_street` | "Kızılay Meydanı Ziya Gökalp Cd." içindeki Kızılay Meydanı |
104
+ | `no`, `ic_kapi` | `number`, `unit` | 12/3 → no 12/3, iç kapı 3 |
105
+ | `kat`, `blok`, `bina` | `floor`, `block`, `building` | Zemin, B, Levent Plaza |
106
+ | `posta_kodu` | `postcode` | 34710 |
107
+ | `tarif` | `landmark` | Migros karşısı |
108
+ | `kalan` | `unparsed` | ayrılamayan sözcükler |
109
+ | `guven`, `notlar` | `confidence`, `notes` | 0,95, ["il ilçeden bulundu"] |
110
+
111
+ ## Ölçüm
112
+
113
+ Üç sette ölçüldü. Karşılaştırma büyük/küçük harf ve Türkçe karakter farkını yok sayar. "Tüm alanlar doğru", adresin etiketlenmiş bütün alanlarının birlikte doğru olduğu adres oranıdır.
114
+
115
+ | Set | Nasıl üretildi | Tüm alanlar doğru |
116
+ |---|---|---|
117
+ | `bench/sinama.jsonl` (6.000) | OpenStreetMap'teki Türkiye adreslerinden şablonla; geliştirme sırasında hiç bakılmadı | **%99,5 (5.969 / 6.000)** |
118
+ | `bench/gelistirme.jsonl` (6.000) | Aynı yöntem; kurallar bu sette düzeltildi | %99,5 (5.973 / 6.000) |
119
+ | `bench/zor.tsv` (58) | Elle yazılmış ve elle etiketlenmiş dağınık adresler (etiketli yazım, yazım hatası, il yazılmadan ilçe, site/blok, köy, çıkmaz, tarif) | %100 (58 / 58), aşağıdaki nota bakın |
120
+
121
+ Yeniden ölçmek için: `python bench/degerlendir.py sinama` ve `python bench/zor_degerlendir.py`.
122
+
123
+ **Sınırlar, dürüstçe:**
124
+
125
+ - İlk iki set şablonla üretildi. Üçüncü seti bu projeyi geliştiren kişi yazdı ve bazı kurallar o sete bakılarak düzeltildi; bağımsız bir ölçüm değildir. Gerçek kullanıcı yazımında sonuç daha düşük olur. Yanlış ayrılan adres örnekleri (kişisel veri içermeden) çok değerli.
126
+ - Mahalle sözlüğü, konum ve yazım düzeltmesi OpenStreetMap'te ne varsa ona dayanır. OSM'de olmayan mahalle doğrulanamaz; sokak düzeyinde konum yalnız OSM'de adresi girilmiş sokaklarda vardır (14.777 sokak). Konum **yaklaşıktır**: mahalle/köy için OSM'deki merkez noktası, ilçe ve il için mahalle merkezlerinin ortancası.
127
+ - Mahalle adları zamanla değişir, birleşir. Sözlük Kasım 2026 tarihli OSM verisidir; `scripts/` altındaki betiklerle yenilenebilir.
128
+ - Posta kodundan ilçe tablosu yalnız OSM'deki adres etiketlerinden türetildi (792 posta kodu); PTT listesi kullanılmadı.
129
+ - `genellestir` bir **genelleştirmedir**, tek başına anonimleştirme sayılmaz: az nüfuslu bir mahalle ya da başka verilerle birleşince kişi yine belirlenebilir.
130
+ - Resmî adres kaydıyla (UAVT) doğrulama yapmaz; o veri herkese açık değildir.
131
+
132
+ ## Verinin yeniden üretilmesi
133
+
134
+ ```bash
135
+ pip install requests
136
+ python scripts/osm_cek.py # il il adresler ve yer adları (Overpass API, ~125 MB, ham/)
137
+ python scripts/osm_mahalle_cek.py # her ilçenin mahalle ve köyleri, merkez koordinatlarıyla
138
+ python scripts/hazirla.py --ad gelistirme --atla 0
139
+ python scripts/hazirla.py --ad sinama --atla 6000
140
+ python scripts/sozluk_kur.py --ham ham # mahalle, sokak, posta kodu ve yazım sözlükleri
141
+ ```
142
+
143
+ ## Ad hakkında
144
+
145
+ Bu proje GitHub'da önce `tr-adres` adıyla açıldı. PyPI'daki `tr-adres` paketi başka bir geliştiricinin bağımsız projesidir; karışmaması için bu paket `turkce-adres` adıyla yayımlanır (modül `turkce_adres`, komut `turkce-adres`).
146
+
147
+ ## Lisans
148
+
149
+ - Kod: [MIT](LICENSE).
150
+ - `src/turkce_adres/veri/` altındaki sözlükler ve `bench/*.jsonl` sınama setleri OpenStreetMap verisinden türetilmiştir, **© OpenStreetMap katkıcıları**, [ODbL 1.0](LICENSE-DATA.md).
@@ -0,0 +1,76 @@
1
+ # turkce-adres
2
+
3
+ [Türkçe](README.md)
4
+
5
+ An offline, dependency-free Python library and command line tool for Turkish addresses:
6
+
7
+ - **Parse** free-text addresses into province, district, neighbourhood/village, street (street, avenue, boulevard, dead end, square), house number, block, floor, unit, building, postcode, and landmark phrases such as "Migros karşısı" (opposite Migros).
8
+ - **Fix** all-caps ASCII spelling (`CAFERAGA` → `Caferağa`, `BUYUKDERE` → `Büyükdere`) and typos in province and district names (`Istnbul` → `İstanbul`); format to a standard (cargo) or official style.
9
+ - **Validate** the neighbourhood against a list of 66,687 neighbourhoods, villages and quarters; infer a missing district or province from the neighbourhood or postcode.
10
+ - **Geocode offline:** approximate coordinates at street, neighbourhood, district or province level. No request leaves your machine.
11
+ - **Match** two addresses ("same place?") and group duplicates in a CSV file.
12
+ - **Generalise for privacy (KVKK/GDPR):** drop house number, unit and postcode and keep only neighbourhood, district or province before sharing data.
13
+ - **Delivery check:** list what is missing or inconsistent (no house number, district not in this province...).
14
+ - **Two languages:** field names, notes and CLI messages in English or Turkish.
15
+
16
+ ```bash
17
+ pip install turkce-adres
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ```python
23
+ from turkce_adres import parse, format_address, geocode, similarity, generalise, missing
24
+
25
+ a = parse("ISTANBUL BESIKTAS LEVENT MAH. BUYUKDERE CAD NO 185 D 4")
26
+ a["province"], a["district"], a["neighbourhood"], a["street"], a["number"], a["unit"]
27
+ # ('İstanbul', 'Beşiktaş', 'Levent', 'Büyükdere', '185', '4')
28
+
29
+ format_address(a) # 'Levent Mah. Büyükdere Cad. No:185 D:4, Beşiktaş/İstanbul'
30
+ geocode(a, "en") # {'lat': ..., 'lon': ..., 'level': 'street', 'source': 'OpenStreetMap (ODbL)'}
31
+ similarity("CAFERAGA MH MODA CD NO 12 KADIKOY ISTANBUL",
32
+ "Caferağa Mahallesi, Moda Caddesi No:12, Kadıköy/İstanbul") # 1.0
33
+ generalise("Caferağa Mah. Moda Cad. No:12 D:3 Kadıköy/İstanbul 34710", dil="en")["text"]
34
+ # 'Caferağa Mah., Kadıköy/İstanbul'
35
+ missing("Moda Cad. Kadıköy", dil="en")
36
+ # ['neighbourhood or village missing', 'house number missing', 'postcode missing (recommended)']
37
+ ```
38
+
39
+ Every result also carries `confidence` (0-1) and `notes` (what was corrected or inferred). Pass `fix=False` to keep words as written. Turkish field names: `from turkce_adres import ayristir`.
40
+
41
+ ### Command line
42
+
43
+ ```bash
44
+ turkce-adres "kızılay meydanı ziya gökalp cd 12 çankaya ankara" --lang en --format --geocode
45
+ turkce-adres customers.csv --column address --lang en --format --geocode --missing --dedupe -o out.csv
46
+ turkce-adres customers.csv --column address --lang en --generalise mahalle -o shareable.csv
47
+ ```
48
+
49
+ If your file already has a column with the same name as a new field, nothing is overwritten: new columns get the `adres_` prefix.
50
+
51
+ ## Evaluation
52
+
53
+ Comparison ignores case and Turkish diacritics. "All fields correct" is the share of addresses where every labelled field is right.
54
+
55
+ | Set | How it was made | All fields correct |
56
+ |---|---|---|
57
+ | `bench/sinama.jsonl` (6,000) | Turkish OpenStreetMap addresses rendered with templates; never looked at during development | **99.5% (5,969 / 6,000)** |
58
+ | `bench/gelistirme.jsonl` (6,000) | Same method; rules were tuned on this set | 99.5% (5,973 / 6,000) |
59
+ | `bench/zor.tsv` (58) | Hand-written, hand-labelled messy addresses (labelled fields, typos, district without province, site/block, villages, dead ends, landmarks) | 100% (58 / 58), see the note below |
60
+
61
+ **Limits:**
62
+
63
+ - The first two sets are template-generated. The third was written by the author of this project and some rules were fixed after looking at it, so it is not an independent benchmark. Real-world input will score lower.
64
+ - Neighbourhood validation, geocoding and spelling fixes only know what OpenStreetMap knows. Street-level coordinates exist only for streets with addresses in OSM (14,777 streets). Coordinates are **approximate**: OSM centre points for neighbourhoods and villages, medians of those for districts and provinces.
65
+ - The postcode-to-district table is derived only from OSM address tags (792 postcodes); the PTT list is not used.
66
+ - `generalise` is generalisation, not anonymisation on its own.
67
+ - No validation against the official national address registry (UAVT), which is not public.
68
+
69
+ ## About the name
70
+
71
+ This project was first opened on GitHub as `tr-adres`. The `tr-adres` package on PyPI is an independent project by another developer; to avoid confusion this package is published as `turkce-adres` (module `turkce_adres`, command `turkce-adres`).
72
+
73
+ ## License
74
+
75
+ - Code: [MIT](LICENSE).
76
+ - The gazetteers in `src/turkce_adres/veri/` and the test sets in `bench/*.jsonl` are derived from OpenStreetMap data, **© OpenStreetMap contributors**, [ODbL 1.0](LICENSE-DATA.md).
@@ -0,0 +1,120 @@
1
+ # turkce-adres
2
+
3
+ [English](README.en.md)
4
+
5
+ Türkçe adresler için internetsiz, ek paket gerektirmeyen bir Python kütüphanesi ve komut satırı aracı:
6
+
7
+ - **Ayrıştırır:** dağınık yazılmış adresi il, ilçe, mahalle/köy, cadde/sokak/bulvar/çıkmaz/meydan, kapı no, blok, kat, daire, bina, posta kodu ve "Migros karşısı" gibi tarif ifadelerine ayırır.
8
+ - **Düzeltir:** BÜYÜK ASCII yazımı Türkçe harflerine kavuşturur (`CAFERAGA` → `Caferağa`, `BUYUKDERE` → `Büyükdere`), il ve ilçe adlarındaki yazım hatalarını düzeltir (`Istnbul` → `İstanbul`), standart (kargo) ya da resmî yazıma çevirir.
9
+ - **Doğrular:** 66.687 mahalle, köy ve semtlik sözlükle mahallenin o ilçede olup olmadığına bakar; il ya da ilçe yazılmamışsa mahalleden ya da posta kodundan bulur.
10
+ - **Konum verir (internetsiz):** adresin yaklaşık koordinatını sokak, mahalle, ilçe ya da il düzeyinde döndürür. Hiçbir servise istek atmaz.
11
+ - **Eşleştirir:** iki adresin aynı yeri gösterip göstermediğini söyler; CSV'de tekrarlanan kayıtları gruplar.
12
+ - **KVKK için genelleştirir:** paylaşmadan önce kapı no, daire, posta kodu gibi ayrıntıları atıp adresi mahalle, ilçe ya da il düzeyine indirir.
13
+ - **Teslimat denetimi:** kargo için eksik ya da çelişkili öğeleri listeler (kapı no yok, ilçe bu ile ait değil...).
14
+ - **İki dil:** alan adları, notlar ve komut satırı Türkçe ya da İngilizce.
15
+
16
+ ```bash
17
+ pip install turkce-adres
18
+ ```
19
+
20
+ ## Kullanım
21
+
22
+ ```python
23
+ from turkce_adres import ayristir, bicimle, konum, benzerlik, genellestir, eksikler
24
+
25
+ a = ayristir("ISTANBUL BESIKTAS LEVENT MAH. BUYUKDERE CAD NO 185 D 4")
26
+ a["il"], a["ilce"], a["mahalle"], a["yol"], a["no"], a["ic_kapi"]
27
+ # ('İstanbul', 'Beşiktaş', 'Levent', 'Büyükdere', '185', '4')
28
+
29
+ bicimle(a) # 'Levent Mah. Büyükdere Cad. No:185 D:4, Beşiktaş/İstanbul'
30
+ bicimle(a, "resmi") # 'Levent Mahallesi Büyükdere Caddesi Dış Kapı No: 185 İç Kapı No: 4, Beşiktaş/İSTANBUL'
31
+
32
+ konum(a) # {'enlem': ..., 'boylam': ..., 'duzey': 'sokak', 'kaynak': 'OpenStreetMap (ODbL)'}
33
+
34
+ benzerlik("CAFERAGA MH MODA CD NO 12 KADIKOY ISTANBUL",
35
+ "Caferağa Mahallesi, Moda Caddesi No:12, Kadıköy/İstanbul") # 1.0
36
+ benzerlik("Moda Cad. No:12 Kadıköy", "Moda Cad. No:14 Kadıköy") # 0.6 (başka bina)
37
+
38
+ genellestir("Caferağa Mah. Moda Cad. No:12 D:3 Kadıköy/İstanbul 34710")["metin"]
39
+ # 'Caferağa Mah., Kadıköy/İstanbul'
40
+
41
+ eksikler("Moda Cad. Kadıköy")
42
+ # ['mahalle ya da köy yok', 'dış kapı numarası yok', 'posta kodu yok (önerilir)']
43
+ ```
44
+
45
+ Her sonuçta ayrıca `guven` (0-1) ve `notlar` vardır: ne düzeltildi, il nereden bulundu ("il ilçeden bulundu", "yazım düzeltildi: Istnbul -> İstanbul").
46
+ `duzelt=False` verilirse sözcükler yazıldığı gibi kalır. İngilizce alan adları için `parse(metin)` ya da `ayristir(metin, dil="en")`.
47
+
48
+ ### Komut satırı
49
+
50
+ ```bash
51
+ # tek adres
52
+ turkce-adres "kızılay meydanı ziya gökalp cd 12 çankaya ankara" --bicim --konum
53
+
54
+ # CSV: adres sütununun yanına alanları, standart yazımı, konumu, eksikleri ve tekrar gruplarını ekler
55
+ turkce-adres musteriler.csv --sutun adres --bicim --konum --eksik --tekil -o musteriler_ayrik.csv
56
+
57
+ # KVKK: yalnız mahalle düzeyine kadar yaz
58
+ turkce-adres musteriler.csv --sutun adres --genellestir mahalle -o paylasim.csv
59
+
60
+ # İngilizce sütun adları ve mesajlar
61
+ turkce-adres customers.csv --column address --lang en --geocode -o out.csv
62
+ ```
63
+
64
+ Excel'den "CSV UTF-8" olarak kaydedilen dosyalar doğrudan okunur; çıktı Excel'in Türkçe karakterleri doğru açacağı biçimde yazılır. Dosyanızda `il`, `no` gibi aynı adlı bir sütun varsa hiçbir sütun ezilmez, yeni sütunlar `adres_` ön ekiyle yazılır.
65
+
66
+ ## Alanlar
67
+
68
+ | Türkçe | English | Örnek |
69
+ |---|---|---|
70
+ | `il` / `ilce` | `province` / `district` | İstanbul / Kadıköy |
71
+ | `mahalle` / `koy` | `neighbourhood` / `village` | Caferağa / Yeşilyurt |
72
+ | `yol`, `yol_turu` | `street`, `street_type` | Moda, cadde (sokak, cadde, bulvar, cikmaz, meydan, yol) |
73
+ | `ust_yol` | `parent_street` | "Kızılay Meydanı Ziya Gökalp Cd." içindeki Kızılay Meydanı |
74
+ | `no`, `ic_kapi` | `number`, `unit` | 12/3 → no 12/3, iç kapı 3 |
75
+ | `kat`, `blok`, `bina` | `floor`, `block`, `building` | Zemin, B, Levent Plaza |
76
+ | `posta_kodu` | `postcode` | 34710 |
77
+ | `tarif` | `landmark` | Migros karşısı |
78
+ | `kalan` | `unparsed` | ayrılamayan sözcükler |
79
+ | `guven`, `notlar` | `confidence`, `notes` | 0,95, ["il ilçeden bulundu"] |
80
+
81
+ ## Ölçüm
82
+
83
+ Üç sette ölçüldü. Karşılaştırma büyük/küçük harf ve Türkçe karakter farkını yok sayar. "Tüm alanlar doğru", adresin etiketlenmiş bütün alanlarının birlikte doğru olduğu adres oranıdır.
84
+
85
+ | Set | Nasıl üretildi | Tüm alanlar doğru |
86
+ |---|---|---|
87
+ | `bench/sinama.jsonl` (6.000) | OpenStreetMap'teki Türkiye adreslerinden şablonla; geliştirme sırasında hiç bakılmadı | **%99,5 (5.969 / 6.000)** |
88
+ | `bench/gelistirme.jsonl` (6.000) | Aynı yöntem; kurallar bu sette düzeltildi | %99,5 (5.973 / 6.000) |
89
+ | `bench/zor.tsv` (58) | Elle yazılmış ve elle etiketlenmiş dağınık adresler (etiketli yazım, yazım hatası, il yazılmadan ilçe, site/blok, köy, çıkmaz, tarif) | %100 (58 / 58), aşağıdaki nota bakın |
90
+
91
+ Yeniden ölçmek için: `python bench/degerlendir.py sinama` ve `python bench/zor_degerlendir.py`.
92
+
93
+ **Sınırlar, dürüstçe:**
94
+
95
+ - İlk iki set şablonla üretildi. Üçüncü seti bu projeyi geliştiren kişi yazdı ve bazı kurallar o sete bakılarak düzeltildi; bağımsız bir ölçüm değildir. Gerçek kullanıcı yazımında sonuç daha düşük olur. Yanlış ayrılan adres örnekleri (kişisel veri içermeden) çok değerli.
96
+ - Mahalle sözlüğü, konum ve yazım düzeltmesi OpenStreetMap'te ne varsa ona dayanır. OSM'de olmayan mahalle doğrulanamaz; sokak düzeyinde konum yalnız OSM'de adresi girilmiş sokaklarda vardır (14.777 sokak). Konum **yaklaşıktır**: mahalle/köy için OSM'deki merkez noktası, ilçe ve il için mahalle merkezlerinin ortancası.
97
+ - Mahalle adları zamanla değişir, birleşir. Sözlük Kasım 2026 tarihli OSM verisidir; `scripts/` altındaki betiklerle yenilenebilir.
98
+ - Posta kodundan ilçe tablosu yalnız OSM'deki adres etiketlerinden türetildi (792 posta kodu); PTT listesi kullanılmadı.
99
+ - `genellestir` bir **genelleştirmedir**, tek başına anonimleştirme sayılmaz: az nüfuslu bir mahalle ya da başka verilerle birleşince kişi yine belirlenebilir.
100
+ - Resmî adres kaydıyla (UAVT) doğrulama yapmaz; o veri herkese açık değildir.
101
+
102
+ ## Verinin yeniden üretilmesi
103
+
104
+ ```bash
105
+ pip install requests
106
+ python scripts/osm_cek.py # il il adresler ve yer adları (Overpass API, ~125 MB, ham/)
107
+ python scripts/osm_mahalle_cek.py # her ilçenin mahalle ve köyleri, merkez koordinatlarıyla
108
+ python scripts/hazirla.py --ad gelistirme --atla 0
109
+ python scripts/hazirla.py --ad sinama --atla 6000
110
+ python scripts/sozluk_kur.py --ham ham # mahalle, sokak, posta kodu ve yazım sözlükleri
111
+ ```
112
+
113
+ ## Ad hakkında
114
+
115
+ Bu proje GitHub'da önce `tr-adres` adıyla açıldı. PyPI'daki `tr-adres` paketi başka bir geliştiricinin bağımsız projesidir; karışmaması için bu paket `turkce-adres` adıyla yayımlanır (modül `turkce_adres`, komut `turkce-adres`).
116
+
117
+ ## Lisans
118
+
119
+ - Kod: [MIT](LICENSE).
120
+ - `src/turkce_adres/veri/` altındaki sözlükler ve `bench/*.jsonl` sınama setleri OpenStreetMap verisinden türetilmiştir, **© OpenStreetMap katkıcıları**, [ODbL 1.0](LICENSE-DATA.md).
@@ -0,0 +1,61 @@
1
+ # Elle yazılmış ve elle etiketlenmiş "zor" adresler. Şablonla üretilmedi. Kişisel veri yoktur; adresler genel
2
+ # örneklerdir, gerçek bir kişiyi ya da kurumu göstermez. Sütunlar: metin, sonra alan=değer çiftleri.
3
+ # no = dış kapı numarası; "12/3" yazımı dış kapı 12, iç kapı 3 sayılır. mahalle alanı köyleri de kapsar.
4
+ caferaga mh moda cd no 12 d 3 kadikoy istanbul il=İstanbul ilce=Kadıköy mahalle=Caferağa yol=Moda yol_turu=cadde no=12 ic_kapi=3
5
+ ISTANBUL BESIKTAS LEVENT MAH. BUYUKDERE CAD NO 185 il=İstanbul ilce=Beşiktaş mahalle=Levent yol=Büyükdere yol_turu=cadde no=185
6
+ Kızılay Mah. Atatürk Bulvarı No:115 Kat:4 Çankaya/ANKARA il=Ankara ilce=Çankaya mahalle=Kızılay yol=Atatürk yol_turu=bulvar no=115 kat=4
7
+ alsancak mah 1469 sk no 8 d 2 konak izmir il=İzmir ilce=Konak mahalle=Alsancak yol=1469 yol_turu=sokak no=8 ic_kapi=2
8
+ Bağdat Caddesi No:350 Daire:12 Kat:5 Suadiye Mahallesi Kadıköy İstanbul 34740 il=İstanbul ilce=Kadıköy mahalle=Suadiye yol=Bağdat yol_turu=cadde no=350 ic_kapi=12 kat=5 posta_kodu=34740
9
+ Kadikoy Caferaga Mah Moda Cad 12/3 il=İstanbul ilce=Kadıköy mahalle=Caferağa yol=Moda yol_turu=cadde no=12 ic_kapi=3
10
+ Levent Mah. Büyükdere Cad. No:185 Besiktas/Istnbul il=İstanbul ilce=Beşiktaş mahalle=Levent yol=Büyükdere yol_turu=cadde no=185
11
+ Mahalle: Caferağa, Cadde: Moda, No: 5, İlçe: Kadıköy, İl: İstanbul il=İstanbul ilce=Kadıköy mahalle=Caferağa yol=Moda yol_turu=cadde no=5
12
+ Bostanlı Mah. 1203/2 Sk. No:6 D:3 Karşıyaka İzmir il=İzmir ilce=Karşıyaka mahalle=Bostanlı yol=1203/2 yol_turu=sokak no=6 ic_kapi=3
13
+ Moda Cad. No:5 34710 il=İstanbul ilce=Kadıköy yol=Moda yol_turu=cadde no=5 posta_kodu=34710
14
+ 100. Yıl Mah. 29 Ekim Cad. No:4 Bağlar/Diyarbakır il=Diyarbakır ilce=Bağlar mahalle=100. Yıl yol=29 Ekim yol_turu=cadde no=4
15
+ Hayrullah Mah. Trabzon Cad. No:20 Onikişubat/K.Maraş il=Kahramanmaraş ilce=Onikişubat mahalle=Hayrullah yol=Trabzon yol_turu=cadde no=20
16
+ adapazarı tığcılar mahallesi uzun çarşı no 45 il=Sakarya ilce=Adapazarı mahalle=Tığcılar no=45
17
+ 600 Evler Mah. 2114 Sk. no 3 Bandırma/Balıkesir il=Balıkesir ilce=Bandırma mahalle=600 Evler yol=2114 yol_turu=sokak no=3
18
+ kızılay meydanı ziya gökalp cd 12 çankaya ankara il=Ankara ilce=Çankaya yol=Ziya Gökalp yol_turu=cadde no=12
19
+ Fatih Sultan Mehmet mah, Poligon Caddesi, No.8C/1, Ümraniye, İstanbul il=İstanbul ilce=Ümraniye mahalle=Fatih Sultan Mehmet yol=Poligon yol_turu=cadde no=8C ic_kapi=1
20
+ Esentepe Mahallesi Büyükdere Caddesi Levent Plaza No 173 Şişli İstanbul Türkiye il=İstanbul ilce=Şişli mahalle=Esentepe yol=Büyükdere yol_turu=cadde no=173
21
+ Yıldız Sit. B Blk. Kat 2 D:5, Çankaya / ANKARA il=Ankara ilce=Çankaya kat=2 ic_kapi=5 blok=B
22
+ Cumhuriyet Mah. Gazi Cad. No:15-A Kat: Zemin Bayraklı İzmir il=İzmir ilce=Bayraklı mahalle=Cumhuriyet yol=Gazi yol_turu=cadde no=15/A
23
+ Merkez mah. Okul sok. no 3 Kuyucak Aydın il=Aydın ilce=Kuyucak mahalle=Merkez yol=Okul yol_turu=sokak no=3
24
+ Atatürk Mah. Cumhuriyet Cad. No:15/3 Serdivan/Sakarya il=Sakarya ilce=Serdivan mahalle=Atatürk yol=Cumhuriyet yol_turu=cadde no=15 ic_kapi=3
25
+ Yeni Mah. 1203 Sok. No 4 Daire 7 Merkez/Kırşehir il=Kırşehir ilce=Kırşehir Merkez mahalle=Yeni yol=1203 yol_turu=sokak no=4 ic_kapi=7
26
+ Bahçelievler mh 7. sk no5 kat3 daire9 bahçelievler istanbul il=İstanbul ilce=Bahçelievler mahalle=Bahçelievler yol=7. yol_turu=sokak no=5 ic_kapi=9 kat=3
27
+ KONAK MAH. 1453 SOKAK NO:22 D:4 NILUFER/BURSA 16110 il=Bursa ilce=Nilüfer mahalle=Konak yol=1453 yol_turu=sokak no=22 ic_kapi=4 posta_kodu=16110
28
+ Barbaros Bulvarı Yıldız İş Merkezi No:145 Kat:4 Beşiktaş il=İstanbul ilce=Beşiktaş yol=Barbaros yol_turu=bulvar no=145 kat=4
29
+ Yeşilyurt Köyü Merkez Sokak No:7 Kızılcahamam Ankara il=Ankara ilce=Kızılcahamam mahalle=Yeşilyurt yol=Merkez yol_turu=sokak no=7
30
+ Şemsi Paşa Çıkmazı No:4 Üsküdar İstanbul il=İstanbul ilce=Üsküdar yol=Şemsi Paşa yol_turu=cikmaz no=4
31
+ ANKARA CANKAYA KAVAKLIDERE MAH TUNALI HILMI CAD NO 88 D 4 il=Ankara ilce=Çankaya mahalle=Kavaklıdere yol=Tunalı Hilmi yol_turu=cadde no=88 ic_kapi=4
32
+ Göztepe mahallesi, Fahrettin Kerim Gökay caddesi no:120/5 Kadıköy il=İstanbul ilce=Kadıköy mahalle=Göztepe yol=Fahrettin Kerim Gökay yol_turu=cadde no=120 ic_kapi=5
33
+ Kemeraltı Cad. No 12 Kat 3 Daire 6 Beyoğlu İst. il=İstanbul ilce=Beyoğlu yol=Kemeraltı yol_turu=cadde no=12 kat=3 ic_kapi=6
34
+ Sanayi Mah. 1. Sanayi Sitesi 5. Blok No:12 Eskişehir il=Eskişehir mahalle=Sanayi no=12 blok=5
35
+ Mimar Sinan Mah. Ankara Yolu Cad. No:45 Osmangazi/Bursa il=Bursa ilce=Osmangazi mahalle=Mimar Sinan yol=Ankara Yolu yol_turu=cadde no=45
36
+ Ziya Gökalp Mah. Süleyman Demirel Blv. No:7 Başakşehir İSTANBUL il=İstanbul ilce=Başakşehir mahalle=Ziya Gökalp yol=Süleyman Demirel yol_turu=bulvar no=7
37
+ Konyaaltı/Antalya, Hurma Mahallesi, 195/1 Sokak, No: 5 il=Antalya ilce=Konyaaltı mahalle=Hurma yol=195/1 yol_turu=sokak no=5
38
+ Çarşı Mah. Uzunçarşı Cad. No:24 Ortahisar Trabzon il=Trabzon ilce=Ortahisar mahalle=Çarşı yol=Uzunçarşı yol_turu=cadde no=24
39
+ inönü mah. atatürk cad. no:67 merkez/afyon il=Afyonkarahisar ilce=Afyonkarahisar Merkez mahalle=İnönü yol=Atatürk yol_turu=cadde no=67
40
+ Kültür Mah. 1375. Sk. No:8/2 Konak/İzmir 35220 il=İzmir ilce=Konak mahalle=Kültür yol=1375. yol_turu=sokak no=8 ic_kapi=2 posta_kodu=35220
41
+ Hürriyet Mah, Dr. Sadık Ahmet Cad. No:12, Bağcılar, İstanbul il=İstanbul ilce=Bağcılar mahalle=Hürriyet yol=Dr. Sadık Ahmet yol_turu=cadde no=12
42
+ GAZIOSMANPASA MAH. CINNAH CAD. NO:30/7 CANKAYA ANKARA il=Ankara ilce=Çankaya mahalle=Gaziosmanpaşa yol=Cinnah yol_turu=cadde no=30 ic_kapi=7
43
+ Selçuklu Konya Yazır Mah. Kule Sk. No 3 il=Konya ilce=Selçuklu mahalle=Yazır yol=Kule yol_turu=sokak no=3
44
+ Atakum Samsun Mimar Sinan mh. 105. sk no 9 daire 2 il=Samsun ilce=Atakum mahalle=Mimar Sinan yol=105. yol_turu=sokak no=9 ic_kapi=2
45
+ Turgutreis Mah. Atatürk Cad. No: 52 Bodrum MUĞLA il=Muğla ilce=Bodrum mahalle=Turgutreis yol=Atatürk yol_turu=cadde no=52
46
+ Yenimahalle Ankara Demetevler mah 402. cad no 15 il=Ankara ilce=Yenimahalle mahalle=Demetevler yol=402. yol_turu=cadde no=15
47
+ Mustafa Kemal Paşa Bulvarı No:200 Merkezefendi Denizli il=Denizli ilce=Merkezefendi yol=Mustafa Kemal Paşa yol_turu=bulvar no=200
48
+ Akçaabat Trabzon, Yaylacık Mah. Sahil Cad. 14/1 il=Trabzon ilce=Akçaabat mahalle=Yaylacık yol=Sahil yol_turu=cadde no=14 ic_kapi=1
49
+ Harbiye Mah. Kurtuluş Cd. Nu:5 Antakya-Hatay il=Hatay ilce=Antakya mahalle=Harbiye yol=Kurtuluş yol_turu=cadde no=5
50
+ Zafer Mh. Gazi Blv. No:44 Bağlar DİYARBAKIR 21100 il=Diyarbakır ilce=Bağlar mahalle=Zafer yol=Gazi yol_turu=bulvar no=44 posta_kodu=21100
51
+ Ataşehir Barbaros Mah. Begonya Sk. No: 3 Kat:-1 il=İstanbul ilce=Ataşehir mahalle=Barbaros yol=Begonya yol_turu=sokak no=3 kat=-1
52
+ Eskişehir Odunpazarı Vişnelik Mah. Cumhuriyet Blv. No:18 il=Eskişehir ilce=Odunpazarı mahalle=Vişnelik yol=Cumhuriyet yol_turu=bulvar no=18
53
+ Yalı Mah. Sahil Yolu No:3 Mudanya/Bursa il=Bursa ilce=Mudanya mahalle=Yalı yol=Sahil yol_turu=yol no=3
54
+ Cumhuriyet Mh 2250 Sk No:5 Daire:2 Esenyurt İstanbul il=İstanbul ilce=Esenyurt mahalle=Cumhuriyet yol=2250 yol_turu=sokak no=5 ic_kapi=2
55
+ Sahrayıcedit mah. atatürk cad. no.45 d.3 kadıköy/ist il=İstanbul ilce=Kadıköy mahalle=Sahrayıcedit yol=Atatürk yol_turu=cadde no=45 ic_kapi=3
56
+ Kocatepe Mahallesi Mithatpaşa Caddesi No: 33/6 06420 Çankaya Ankara il=Ankara ilce=Çankaya mahalle=Kocatepe yol=Mithatpaşa yol_turu=cadde no=33 ic_kapi=6 posta_kodu=06420
57
+ Merkez Mah. Hal Yolu Cad. No:2 Silivri İstanbul il=İstanbul ilce=Silivri mahalle=Merkez yol=Hal Yolu yol_turu=cadde no=2
58
+ İzmir Karşıyaka Mavişehir Mah. 2050 Sk. No:9 K:3 D:12 il=İzmir ilce=Karşıyaka mahalle=Mavişehir yol=2050 yol_turu=sokak no=9 ic_kapi=12 kat=3
59
+ Bahçelievler Mah. 3. Cadde No:22 Sur Diyarbakır Kaya Market karşısı il=Diyarbakır ilce=Sur mahalle=Bahçelievler yol=3. yol_turu=cadde no=22
60
+ Sakarya Mah. Necatibey Cd. No:5 Çankaya Ankara il=Ankara ilce=Çankaya mahalle=Sakarya yol=Necatibey yol_turu=cadde no=5
61
+ Aydın Mah. 1500 Sk. No:3 Turgutlu Manisa il=Manisa ilce=Turgutlu mahalle=Aydın yol=1500 yol_turu=sokak no=3
@@ -0,0 +1,51 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "turkce-adres"
7
+ version = "0.2.0"
8
+ description = "Turkish address toolkit: parse messy Turkish addresses, fix spelling, validate against 66,000+ neighbourhoods and villages, offline geocoding to street/neighbourhood level, duplicate matching, KVKK-friendly generalisation. Offline, no dependencies."
9
+ readme = "README.md"
10
+ license = { text = "MIT AND ODbL-1.0" }
11
+ requires-python = ">=3.10"
12
+ authors = [{ name = "Mehmet Veysel Delibaş" }]
13
+ keywords = ["turkish", "turkey", "address", "address-parser", "adres", "geocoding", "offline-geocoding", "deduplication", "kvkk", "gis", "openstreetmap", "mahalle"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Developers",
17
+ "Intended Audience :: Science/Research",
18
+ "Natural Language :: Turkish",
19
+ "Natural Language :: English",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ "Topic :: Scientific/Engineering :: GIS",
27
+ "Topic :: Text Processing :: Linguistic",
28
+ ]
29
+ dependencies = []
30
+
31
+ [project.optional-dependencies]
32
+ dev = ["pytest>=7"]
33
+
34
+ [project.scripts]
35
+ turkce-adres = "turkce_adres.cli:main"
36
+
37
+ [project.urls]
38
+ Homepage = "https://github.com/mveyseldelibas/turkce-adres"
39
+ Issues = "https://github.com/mveyseldelibas/turkce-adres/issues"
40
+ Changelog = "https://github.com/mveyseldelibas/turkce-adres/blob/main/CHANGELOG.md"
41
+
42
+ [tool.hatch.build.targets.wheel]
43
+ packages = ["src/turkce_adres"]
44
+
45
+ [tool.hatch.build.targets.sdist]
46
+ include = ["src", "tests", "bench/zor.tsv", "README.md", "README.en.md", "LICENSE", "LICENSE-DATA.md", "CHANGELOG.md"]
47
+
48
+ [tool.pytest.ini_options]
49
+ testpaths = ["tests", "src"]
50
+ pythonpath = ["src"]
51
+ addopts = "--doctest-modules"