turk-nlp-prep 0.1.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.
- turk_nlp_prep-0.1.0/PKG-INFO +74 -0
- turk_nlp_prep-0.1.0/README.md +57 -0
- turk_nlp_prep-0.1.0/pyproject.toml +26 -0
- turk_nlp_prep-0.1.0/setup.cfg +4 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep/__init__.py +14 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep/multi_label_encoder.py +75 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep/normalizer.py +108 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep.egg-info/PKG-INFO +74 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep.egg-info/SOURCES.txt +10 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep.egg-info/dependency_links.txt +1 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep.egg-info/requires.txt +2 -0
- turk_nlp_prep-0.1.0/src/turk_nlp_prep.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: turk-nlp-prep
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Transformer modelleri için C-optimize Türkçe NLP veri ön işleme ve çoklu etiket kodlayıcısı.
|
|
5
|
+
Author-email: Ahmet Salih Madenci <salih1967ahmet@hotmail.com>
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Intended Audience :: Science/Research
|
|
11
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
12
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
Requires-Dist: numpy>=1.20.0
|
|
16
|
+
Requires-Dist: pandas>=1.3.0
|
|
17
|
+
|
|
18
|
+
# 🇹🇷 turk-nlp-prep
|
|
19
|
+
|
|
20
|
+
Transformer tabanlı NLP modelleri (Turkish BERT, XLM-RoBERTa vb.) için C-seviyesinde optimize edilmiş, yüksek performanslı Türkçe veri ön işleme ve çoklu etiket (multi-label) kodlama kütüphanesi.
|
|
21
|
+
|
|
22
|
+
## 🚀 Özellikler
|
|
23
|
+
|
|
24
|
+
- **Akıllı Metin Normalizasyonu:** Türkçe'ye özgü şapkalı harf (`KÂĞIT` -> `kağıt`) ve büyük/küçük harf (`İ/I`) dönüşümlerini hatasız yönetir.
|
|
25
|
+
- **Anti-Gürültü:** Sosyal medya verilerindeki karakter uzamalarını (`çoooook` -> `çook`), HTML etiketlerini ve URL/E-posta sızıntılarını temizler.
|
|
26
|
+
- **Kesme İşareti Zekası:** `İstanbul'da` gibi yapıları `istanbul da` olarak ayırarak kelime köklerinin (tokenizer tarafından) doğru tanınmasını sağlar.
|
|
27
|
+
- **O(1) Vektörizasyon (Advanced Indexing):** Dinamik sınıf sayısına sahip çoklu etiketleri (multi-label) NumPy Advanced Indexing kullanarak milisaniyeler içinde ikili (binary) matrislere çevirir.
|
|
28
|
+
- **Tip Güvenliği & Hata Toleransı:** Eğitimde görülmeyen yepyeni bir etiket (out-of-vocabulary label) geldiğinde sistemi çökertmez, sessizce izole eder.
|
|
29
|
+
|
|
30
|
+
## 📦 Kurulum
|
|
31
|
+
|
|
32
|
+
Projeyi klonladıktan sonra bağımlılıkları yüklemek için:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git clone [https://github.com/KULLANICI_ADIN/turk-nlp-prep.git](https://github.com/KULLANICI_ADIN/turk-nlp-prep.git)
|
|
36
|
+
cd turk-nlp-prep
|
|
37
|
+
pip install -r requirements.txt
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
*(Not: Yakında PyPI üzerinden `pip install turk-nlp-prep` ile indirilebilir olacaktır.)*
|
|
41
|
+
|
|
42
|
+
## 💻 Kullanım (Hızlı Başlangıç)
|
|
43
|
+
|
|
44
|
+
Kütüphane, Pandas DataFrame'leri ile tam uyumlu çalışacak şekilde tasarlanmıştır.
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
import pandas as pd
|
|
48
|
+
from turk_nlp_prep import TurkishTextNormalizer, MultiLabelMatrixEncoder
|
|
49
|
+
|
|
50
|
+
# 1. Örnek Veri Seti
|
|
51
|
+
df = pd.DataFrame({
|
|
52
|
+
'metin': ["İSTANBUL'daki yeni YAZILIM yatırımları harikaaa!!! [www.ornek.com](https://www.ornek.com)"],
|
|
53
|
+
'etiketler': [["Teknoloji", "Yazılım"]]
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
# 2. Modülleri Başlat (Esnek parametrelerle)
|
|
57
|
+
normalizer = TurkishTextNormalizer(remove_numbers=True, fix_elongations=True)
|
|
58
|
+
encoder = MultiLabelMatrixEncoder()
|
|
59
|
+
|
|
60
|
+
# 3. Boru Hattını (Pipeline) Çalıştır
|
|
61
|
+
df['temiz_metin'] = df['metin'].apply(normalizer.normalize)
|
|
62
|
+
hedef_matris = encoder.fit_transform(df['etiketler'].tolist())
|
|
63
|
+
|
|
64
|
+
print(df['temiz_metin'].iloc[0])
|
|
65
|
+
# Çıktı: "istanbul daki yeni yazılım yatırımları harikaa"
|
|
66
|
+
|
|
67
|
+
print(hedef_matris)
|
|
68
|
+
# Çıktı: [[1 1]] (Teknoloji ve Yazılım sınıfları aktif)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 🧠 Sistem Mimarisi
|
|
72
|
+
|
|
73
|
+
* **`TurkishTextNormalizer`:** Tüm regex (düzenli ifade) kurallarını `__init__` bloğunda C seviyesinde önceden derleyerek (pre-compiled) döngü maliyetini sıfıra indirir.
|
|
74
|
+
* **`MultiLabelMatrixEncoder`:** `__slots__` bellek yönetimi ve `np.int8` (8-bit) veri tipi kullanarak milyonlarca satırlık eğitim verilerinde RAM tüketimini minimize eder.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# 🇹🇷 turk-nlp-prep
|
|
2
|
+
|
|
3
|
+
Transformer tabanlı NLP modelleri (Turkish BERT, XLM-RoBERTa vb.) için C-seviyesinde optimize edilmiş, yüksek performanslı Türkçe veri ön işleme ve çoklu etiket (multi-label) kodlama kütüphanesi.
|
|
4
|
+
|
|
5
|
+
## 🚀 Özellikler
|
|
6
|
+
|
|
7
|
+
- **Akıllı Metin Normalizasyonu:** Türkçe'ye özgü şapkalı harf (`KÂĞIT` -> `kağıt`) ve büyük/küçük harf (`İ/I`) dönüşümlerini hatasız yönetir.
|
|
8
|
+
- **Anti-Gürültü:** Sosyal medya verilerindeki karakter uzamalarını (`çoooook` -> `çook`), HTML etiketlerini ve URL/E-posta sızıntılarını temizler.
|
|
9
|
+
- **Kesme İşareti Zekası:** `İstanbul'da` gibi yapıları `istanbul da` olarak ayırarak kelime köklerinin (tokenizer tarafından) doğru tanınmasını sağlar.
|
|
10
|
+
- **O(1) Vektörizasyon (Advanced Indexing):** Dinamik sınıf sayısına sahip çoklu etiketleri (multi-label) NumPy Advanced Indexing kullanarak milisaniyeler içinde ikili (binary) matrislere çevirir.
|
|
11
|
+
- **Tip Güvenliği & Hata Toleransı:** Eğitimde görülmeyen yepyeni bir etiket (out-of-vocabulary label) geldiğinde sistemi çökertmez, sessizce izole eder.
|
|
12
|
+
|
|
13
|
+
## 📦 Kurulum
|
|
14
|
+
|
|
15
|
+
Projeyi klonladıktan sonra bağımlılıkları yüklemek için:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
git clone [https://github.com/KULLANICI_ADIN/turk-nlp-prep.git](https://github.com/KULLANICI_ADIN/turk-nlp-prep.git)
|
|
19
|
+
cd turk-nlp-prep
|
|
20
|
+
pip install -r requirements.txt
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
*(Not: Yakında PyPI üzerinden `pip install turk-nlp-prep` ile indirilebilir olacaktır.)*
|
|
24
|
+
|
|
25
|
+
## 💻 Kullanım (Hızlı Başlangıç)
|
|
26
|
+
|
|
27
|
+
Kütüphane, Pandas DataFrame'leri ile tam uyumlu çalışacak şekilde tasarlanmıştır.
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
import pandas as pd
|
|
31
|
+
from turk_nlp_prep import TurkishTextNormalizer, MultiLabelMatrixEncoder
|
|
32
|
+
|
|
33
|
+
# 1. Örnek Veri Seti
|
|
34
|
+
df = pd.DataFrame({
|
|
35
|
+
'metin': ["İSTANBUL'daki yeni YAZILIM yatırımları harikaaa!!! [www.ornek.com](https://www.ornek.com)"],
|
|
36
|
+
'etiketler': [["Teknoloji", "Yazılım"]]
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
# 2. Modülleri Başlat (Esnek parametrelerle)
|
|
40
|
+
normalizer = TurkishTextNormalizer(remove_numbers=True, fix_elongations=True)
|
|
41
|
+
encoder = MultiLabelMatrixEncoder()
|
|
42
|
+
|
|
43
|
+
# 3. Boru Hattını (Pipeline) Çalıştır
|
|
44
|
+
df['temiz_metin'] = df['metin'].apply(normalizer.normalize)
|
|
45
|
+
hedef_matris = encoder.fit_transform(df['etiketler'].tolist())
|
|
46
|
+
|
|
47
|
+
print(df['temiz_metin'].iloc[0])
|
|
48
|
+
# Çıktı: "istanbul daki yeni yazılım yatırımları harikaa"
|
|
49
|
+
|
|
50
|
+
print(hedef_matris)
|
|
51
|
+
# Çıktı: [[1 1]] (Teknoloji ve Yazılım sınıfları aktif)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 🧠 Sistem Mimarisi
|
|
55
|
+
|
|
56
|
+
* **`TurkishTextNormalizer`:** Tüm regex (düzenli ifade) kurallarını `__init__` bloğunda C seviyesinde önceden derleyerek (pre-compiled) döngü maliyetini sıfıra indirir.
|
|
57
|
+
* **`MultiLabelMatrixEncoder`:** `__slots__` bellek yönetimi ve `np.int8` (8-bit) veri tipi kullanarak milyonlarca satırlık eğitim verilerinde RAM tüketimini minimize eder.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "turk-nlp-prep"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Transformer modelleri için C-optimize Türkçe NLP veri ön işleme ve çoklu etiket kodlayıcısı."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
authors = [
|
|
12
|
+
{ name = "Ahmet Salih Madenci", email = "salih1967ahmet@hotmail.com" }
|
|
13
|
+
]
|
|
14
|
+
dependencies = [
|
|
15
|
+
"numpy>=1.20.0",
|
|
16
|
+
"pandas>=1.3.0"
|
|
17
|
+
]
|
|
18
|
+
classifiers = [
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"License :: OSI Approved :: MIT License",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Intended Audience :: Developers",
|
|
23
|
+
"Intended Audience :: Science/Research",
|
|
24
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
25
|
+
"Topic :: Text Processing :: Linguistic"
|
|
26
|
+
]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
turk-nlp-prep: Transformer modelleri için evrensel Türkçe NLP veri ön işleme aracı.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from .normalizer import TurkishTextNormalizer
|
|
6
|
+
from .multi_label_encoder import MultiLabelMatrixEncoder
|
|
7
|
+
|
|
8
|
+
__version__ = "0.1.0"
|
|
9
|
+
|
|
10
|
+
# Kullanıcı 'from turk_nlp_prep import *' dediğinde sadece bu sınıfların dışa aktarılmasını sağlar
|
|
11
|
+
__all__ = [
|
|
12
|
+
"TurkishTextNormalizer",
|
|
13
|
+
"MultiLabelMatrixEncoder"
|
|
14
|
+
]
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from typing import Sequence, Dict, List, Set
|
|
3
|
+
|
|
4
|
+
class MultiLabelMatrixEncoder:
|
|
5
|
+
"""
|
|
6
|
+
Transformer model eğitim boru hatları (pipeline) için C-seviyesinde indeksleme
|
|
7
|
+
(Advanced Indexing) yapan, ultra-optimize çoklu etiket matris kodlayıcısı.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
__slots__ = ['_classes', '_class_to_index', 'is_fitted']
|
|
11
|
+
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self._classes: List[str] = []
|
|
14
|
+
self._class_to_index: Dict[str, int] = {}
|
|
15
|
+
self.is_fitted: bool = False
|
|
16
|
+
|
|
17
|
+
def fit(self, label_data: Sequence[Sequence[str]]) -> None:
|
|
18
|
+
"""O(N) karmaşıklığında sınıf tespiti ve deterministik sıralama."""
|
|
19
|
+
# KUSURSUZLUK 1: Set Union Optimizasyonu
|
|
20
|
+
# Her bir kelimeyi listeye 'append' etmek yerine 'update' kullanarak
|
|
21
|
+
# iterasyon yükünü C motoruna devrediyoruz.
|
|
22
|
+
unique_classes: Set[str] = set()
|
|
23
|
+
for labels in label_data:
|
|
24
|
+
unique_classes.update(labels)
|
|
25
|
+
|
|
26
|
+
self._classes = sorted(list(unique_classes))
|
|
27
|
+
self._class_to_index = {cls_name: idx for idx, cls_name in enumerate(self._classes)}
|
|
28
|
+
self.is_fitted = True
|
|
29
|
+
|
|
30
|
+
def transform(self, label_data: Sequence[Sequence[str]]) -> np.ndarray:
|
|
31
|
+
"""NumPy Advanced Indexing ile matris dönüşümünü paralelize eder."""
|
|
32
|
+
if not self.is_fitted:
|
|
33
|
+
raise RuntimeError("Kritik Hata: Encoder henüz fit() edilmedi.")
|
|
34
|
+
|
|
35
|
+
num_samples = len(label_data)
|
|
36
|
+
num_classes = len(self._classes)
|
|
37
|
+
|
|
38
|
+
# Matrisi en düşük bellek tipinde (8-bit) başlatıyoruz
|
|
39
|
+
matrix = np.zeros((num_samples, num_classes), dtype=np.int8)
|
|
40
|
+
|
|
41
|
+
row_indices = []
|
|
42
|
+
col_indices = []
|
|
43
|
+
|
|
44
|
+
# KUSURSUZLUK 2: Pointer Ataması (Local Variable Caching)
|
|
45
|
+
# Python'da nesne içindeki bir metodu (self.dict.get) döngü içinde
|
|
46
|
+
# yüz binlerce kez çağırmak (dot lookup) zaman kaybettirir.
|
|
47
|
+
# Referansını yerel bir değişkene atamak %15-20 hız artışı sağlar.
|
|
48
|
+
fast_get = self._class_to_index.get
|
|
49
|
+
|
|
50
|
+
for row_idx, labels in enumerate(label_data):
|
|
51
|
+
for label in labels:
|
|
52
|
+
col_idx = fast_get(label)
|
|
53
|
+
# KUSURSUZLUK 3: Hızlı 'None' Kontrolü
|
|
54
|
+
# 'if label in dict' kullanmak yerine, get() ile hem arama yapıp
|
|
55
|
+
# hem değeri alarak arama maliyetini yarıya indiriyoruz.
|
|
56
|
+
if col_idx is not None:
|
|
57
|
+
row_indices.append(row_idx)
|
|
58
|
+
col_indices.append(col_idx)
|
|
59
|
+
|
|
60
|
+
# KUSURSUZLUK 4: NumPy Advanced Indexing (Vektörizasyon)
|
|
61
|
+
# Eskiden yaptığımız matrix[satir, sutun] = 1 atamasını döngü içinde bırakmadık.
|
|
62
|
+
# Tüm koordinatları (row_indices, col_indices) toplayıp, devasa tensör atamasını
|
|
63
|
+
# tek bir hamlede, paralelize edilmiş C koduna yaptırıyoruz.
|
|
64
|
+
matrix[row_indices, col_indices] = 1
|
|
65
|
+
|
|
66
|
+
return matrix
|
|
67
|
+
|
|
68
|
+
def fit_transform(self, label_data: Sequence[Sequence[str]]) -> np.ndarray:
|
|
69
|
+
"""Sistemi eğitir ve tek seferde matrisi döndürür."""
|
|
70
|
+
self.fit(label_data)
|
|
71
|
+
return self.transform(label_data)
|
|
72
|
+
|
|
73
|
+
def get_classes(self) -> List[str]:
|
|
74
|
+
"""Sınıf isimlerini döndürür (Model konfigürasyonu için)."""
|
|
75
|
+
return self._classes
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Dict
|
|
3
|
+
|
|
4
|
+
class TurkishTextNormalizer:
|
|
5
|
+
"""
|
|
6
|
+
Transformer modelleri (BERT, XLM-RoBERTa) için yüksek performanslı,
|
|
7
|
+
önceden derlenmiş (pre-compiled) regex mimarisine sahip Türkçe ön işleme sınıfı.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# Bellek optimizasyonu: Python'ın dinamik sözlük yapısı yerine __slots__ kullanarak
|
|
11
|
+
# milyonlarca metin işlenirken RAM tüketimini minimuma indiriyoruz.
|
|
12
|
+
__slots__ = [
|
|
13
|
+
'remove_html', 'remove_urls_emails', 'remove_numbers',
|
|
14
|
+
'remove_punctuation', 'normalize_carets', 'fix_elongations',
|
|
15
|
+
'_tr_upper_to_lower', '_caret_map',
|
|
16
|
+
'_re_html', '_re_url_email', '_re_number',
|
|
17
|
+
'_re_apostrophe', '_re_punctuation', '_re_whitespace', '_re_elongation'
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
def __init__(self,
|
|
21
|
+
remove_html: bool = True,
|
|
22
|
+
remove_urls_emails: bool = True,
|
|
23
|
+
remove_numbers: bool = False,
|
|
24
|
+
remove_punctuation: bool = True,
|
|
25
|
+
normalize_carets: bool = True,
|
|
26
|
+
fix_elongations: bool = True):
|
|
27
|
+
|
|
28
|
+
self.remove_html = remove_html
|
|
29
|
+
self.remove_urls_emails = remove_urls_emails
|
|
30
|
+
self.remove_numbers = remove_numbers
|
|
31
|
+
self.remove_punctuation = remove_punctuation
|
|
32
|
+
self.normalize_carets = normalize_carets
|
|
33
|
+
self.fix_elongations = fix_elongations # YENİ: "çoooook" -> "çook" dönüşümü
|
|
34
|
+
|
|
35
|
+
self._tr_upper_to_lower: Dict[str, str] = {
|
|
36
|
+
"I": "ı", "İ": "i", "Ş": "ş", "Ç": "ç",
|
|
37
|
+
"Ğ": "ğ", "Ö": "ö", "Ü": "ü"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
self._caret_map: Dict[str, str] = {
|
|
41
|
+
"â": "a", "Â": "a", "î": "i", "Î": "i", "û": "u", "Û": "u"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# KUSURSUZLUK 1: Regex Ön Derleme (Pre-compilation)
|
|
45
|
+
# Regex motoru bu kuralları sınıf başlatıldığında sadece bir kez C seviyesinde derler.
|
|
46
|
+
# Bu işlem O(1) maliyetlidir ve döngü içinde tekrar tekrar derleme yükünü ortadan kaldırır.
|
|
47
|
+
self._re_html = re.compile(r'<[^>]+>')
|
|
48
|
+
self._re_url_email = re.compile(r'(https?://\S+|www\.\S+|\S+@\S+)')
|
|
49
|
+
self._re_number = re.compile(r'\d+')
|
|
50
|
+
|
|
51
|
+
# KUSURSUZLUK 2: Akıllı Kesme İşareti Yönetimi
|
|
52
|
+
# "İstanbul'da" kelimesini "istanbulda" yerine "istanbul da" olarak ayırır.
|
|
53
|
+
self._re_apostrophe = re.compile(r"['’]")
|
|
54
|
+
self._re_punctuation = re.compile(r'[^\w\s]')
|
|
55
|
+
self._re_whitespace = re.compile(r'\s+')
|
|
56
|
+
|
|
57
|
+
# KUSURSUZLUK 3: Karakter Uzaması Filtresi
|
|
58
|
+
# 3 veya daha fazla tekrar eden karakteri 2'ye düşürür (örn: "süpppeeeer" -> "süppeer")
|
|
59
|
+
self._re_elongation = re.compile(r'(.)\1{2,}')
|
|
60
|
+
|
|
61
|
+
def _to_lower_tr(self, text: str) -> str:
|
|
62
|
+
for buyuk, kucuk in self._tr_upper_to_lower.items():
|
|
63
|
+
text = text.replace(buyuk, kucuk)
|
|
64
|
+
return text.lower()
|
|
65
|
+
|
|
66
|
+
def _remove_carets(self, text: str) -> str:
|
|
67
|
+
for sapkali, normal in self._caret_map.items():
|
|
68
|
+
text = text.replace(sapkali, normal)
|
|
69
|
+
return text
|
|
70
|
+
|
|
71
|
+
def normalize(self, text: str) -> str:
|
|
72
|
+
# KUSURSUZLUK 4: Tip Güvenliği (Type Hinting & Exception Handling)
|
|
73
|
+
# Model eğitimi saatlerce sürdükten sonra araya karışan bir 'float' (NaN) değerinin
|
|
74
|
+
# tüm sistemi çökertmesini engeller.
|
|
75
|
+
if not isinstance(text, str):
|
|
76
|
+
raise TypeError(f"Kritik Hata: Beklenen tip 'str', ancak '{type(text).__name__}' alındı.")
|
|
77
|
+
|
|
78
|
+
if not text.strip():
|
|
79
|
+
return ""
|
|
80
|
+
|
|
81
|
+
if self.remove_html:
|
|
82
|
+
text = self._re_html.sub(' ', text)
|
|
83
|
+
|
|
84
|
+
if self.remove_urls_emails:
|
|
85
|
+
text = self._re_url_email.sub(' ', text)
|
|
86
|
+
|
|
87
|
+
if self.normalize_carets:
|
|
88
|
+
text = self._remove_carets(text)
|
|
89
|
+
|
|
90
|
+
text = self._to_lower_tr(text)
|
|
91
|
+
|
|
92
|
+
if self.fix_elongations:
|
|
93
|
+
# Tekrar eden karakterleri referans alıp maksimum 2'ye indirger
|
|
94
|
+
text = self._re_elongation.sub(r'\1\1', text)
|
|
95
|
+
|
|
96
|
+
if self.remove_numbers:
|
|
97
|
+
text = self._re_number.sub(' ', text)
|
|
98
|
+
|
|
99
|
+
if self.remove_punctuation:
|
|
100
|
+
# Önce kesme işaretlerini boşlukla değiştir ki kelime kökü ve ek ayrışsın
|
|
101
|
+
text = self._re_apostrophe.sub(' ', text)
|
|
102
|
+
# Ardından geri kalan tüm noktalamaları temizle
|
|
103
|
+
text = self._re_punctuation.sub(' ', text)
|
|
104
|
+
|
|
105
|
+
# En son adımda aralarda oluşan devasa boşlukları tek standarda indir
|
|
106
|
+
text = self._re_whitespace.sub(' ', text).strip()
|
|
107
|
+
|
|
108
|
+
return text
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: turk-nlp-prep
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Transformer modelleri için C-optimize Türkçe NLP veri ön işleme ve çoklu etiket kodlayıcısı.
|
|
5
|
+
Author-email: Ahmet Salih Madenci <salih1967ahmet@hotmail.com>
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Intended Audience :: Science/Research
|
|
11
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
12
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
Requires-Dist: numpy>=1.20.0
|
|
16
|
+
Requires-Dist: pandas>=1.3.0
|
|
17
|
+
|
|
18
|
+
# 🇹🇷 turk-nlp-prep
|
|
19
|
+
|
|
20
|
+
Transformer tabanlı NLP modelleri (Turkish BERT, XLM-RoBERTa vb.) için C-seviyesinde optimize edilmiş, yüksek performanslı Türkçe veri ön işleme ve çoklu etiket (multi-label) kodlama kütüphanesi.
|
|
21
|
+
|
|
22
|
+
## 🚀 Özellikler
|
|
23
|
+
|
|
24
|
+
- **Akıllı Metin Normalizasyonu:** Türkçe'ye özgü şapkalı harf (`KÂĞIT` -> `kağıt`) ve büyük/küçük harf (`İ/I`) dönüşümlerini hatasız yönetir.
|
|
25
|
+
- **Anti-Gürültü:** Sosyal medya verilerindeki karakter uzamalarını (`çoooook` -> `çook`), HTML etiketlerini ve URL/E-posta sızıntılarını temizler.
|
|
26
|
+
- **Kesme İşareti Zekası:** `İstanbul'da` gibi yapıları `istanbul da` olarak ayırarak kelime köklerinin (tokenizer tarafından) doğru tanınmasını sağlar.
|
|
27
|
+
- **O(1) Vektörizasyon (Advanced Indexing):** Dinamik sınıf sayısına sahip çoklu etiketleri (multi-label) NumPy Advanced Indexing kullanarak milisaniyeler içinde ikili (binary) matrislere çevirir.
|
|
28
|
+
- **Tip Güvenliği & Hata Toleransı:** Eğitimde görülmeyen yepyeni bir etiket (out-of-vocabulary label) geldiğinde sistemi çökertmez, sessizce izole eder.
|
|
29
|
+
|
|
30
|
+
## 📦 Kurulum
|
|
31
|
+
|
|
32
|
+
Projeyi klonladıktan sonra bağımlılıkları yüklemek için:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git clone [https://github.com/KULLANICI_ADIN/turk-nlp-prep.git](https://github.com/KULLANICI_ADIN/turk-nlp-prep.git)
|
|
36
|
+
cd turk-nlp-prep
|
|
37
|
+
pip install -r requirements.txt
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
*(Not: Yakında PyPI üzerinden `pip install turk-nlp-prep` ile indirilebilir olacaktır.)*
|
|
41
|
+
|
|
42
|
+
## 💻 Kullanım (Hızlı Başlangıç)
|
|
43
|
+
|
|
44
|
+
Kütüphane, Pandas DataFrame'leri ile tam uyumlu çalışacak şekilde tasarlanmıştır.
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
import pandas as pd
|
|
48
|
+
from turk_nlp_prep import TurkishTextNormalizer, MultiLabelMatrixEncoder
|
|
49
|
+
|
|
50
|
+
# 1. Örnek Veri Seti
|
|
51
|
+
df = pd.DataFrame({
|
|
52
|
+
'metin': ["İSTANBUL'daki yeni YAZILIM yatırımları harikaaa!!! [www.ornek.com](https://www.ornek.com)"],
|
|
53
|
+
'etiketler': [["Teknoloji", "Yazılım"]]
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
# 2. Modülleri Başlat (Esnek parametrelerle)
|
|
57
|
+
normalizer = TurkishTextNormalizer(remove_numbers=True, fix_elongations=True)
|
|
58
|
+
encoder = MultiLabelMatrixEncoder()
|
|
59
|
+
|
|
60
|
+
# 3. Boru Hattını (Pipeline) Çalıştır
|
|
61
|
+
df['temiz_metin'] = df['metin'].apply(normalizer.normalize)
|
|
62
|
+
hedef_matris = encoder.fit_transform(df['etiketler'].tolist())
|
|
63
|
+
|
|
64
|
+
print(df['temiz_metin'].iloc[0])
|
|
65
|
+
# Çıktı: "istanbul daki yeni yazılım yatırımları harikaa"
|
|
66
|
+
|
|
67
|
+
print(hedef_matris)
|
|
68
|
+
# Çıktı: [[1 1]] (Teknoloji ve Yazılım sınıfları aktif)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 🧠 Sistem Mimarisi
|
|
72
|
+
|
|
73
|
+
* **`TurkishTextNormalizer`:** Tüm regex (düzenli ifade) kurallarını `__init__` bloğunda C seviyesinde önceden derleyerek (pre-compiled) döngü maliyetini sıfıra indirir.
|
|
74
|
+
* **`MultiLabelMatrixEncoder`:** `__slots__` bellek yönetimi ve `np.int8` (8-bit) veri tipi kullanarak milyonlarca satırlık eğitim verilerinde RAM tüketimini minimize eder.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
src/turk_nlp_prep/__init__.py
|
|
4
|
+
src/turk_nlp_prep/multi_label_encoder.py
|
|
5
|
+
src/turk_nlp_prep/normalizer.py
|
|
6
|
+
src/turk_nlp_prep.egg-info/PKG-INFO
|
|
7
|
+
src/turk_nlp_prep.egg-info/SOURCES.txt
|
|
8
|
+
src/turk_nlp_prep.egg-info/dependency_links.txt
|
|
9
|
+
src/turk_nlp_prep.egg-info/requires.txt
|
|
10
|
+
src/turk_nlp_prep.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
turk_nlp_prep
|