├── LICENSE ├── PyTurkish.py ├── PyTurkish_utf8.py └── README.md /LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PythEch/PyTurkish/ec424ab062d3929c4d8a5cd2869ad5c10abc4d84/LICENSE -------------------------------------------------------------------------------- /PyTurkish.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PythEch/PyTurkish/ec424ab062d3929c4d8a5cd2869ad5c10abc4d84/PyTurkish.py -------------------------------------------------------------------------------- /PyTurkish_utf8.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | ################################################################## 5 | # 6 | # Copyright (C) 2011-2014 PythEch 7 | # 8 | # This Source Code Form is subject to the terms of the Mozilla 9 | # Public License, v. 2.0. If a copy of the MPL was not distributed 10 | # with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 11 | # 12 | ################################################################## 13 | 14 | # Private/Public simulasyonu için teşekkürler: 15 | # http://en.literateprograms.org/Private_class_variables_%28Python%29?oldid=19190 16 | 17 | __all__ = ['Ek', '__version__'] 18 | __version__ = '2.0' 19 | 20 | # == Sabitler == # 21 | # Ünsüzler 22 | SERT_UNSUZ = ('p', u'ç', 't', 'k', 's', u'ş', 'h', 'f') 23 | YUMUSAMA = {'p': 'b', u'ç': 'c', 't': 'd', 'k': u'ğ'} 24 | BENZESME = {'c': u'ç', 'd': 't', 'g': 'k'} 25 | # Ünlüler 26 | UNLU = ('a', 'e', u'ı', 'i', 'u', u'ü', 'o', u'ö') 27 | KALIN_UNLU = ('a', u'ı', 'u', 'o') 28 | INCE_UNLU = ('e', 'i', u'ü', u'ö') 29 | DUZ_UNLU = ('a', u'ı', 'e', 'i') 30 | YUVARLAK_UNLU = ('o', 'u', u'ö', u'ü') 31 | 32 | class Ek(object): 33 | def __init__(self, sozcuk, ozel_isim=False): 34 | if isinstance(sozcuk, str): 35 | sozcuk = sozcuk.decode('utf-8', 'ignore') 36 | sozcuk = sozcuk.replace(u'İ', 'i').replace('I', u'ı').lower() 37 | 38 | _sozcuk = sozcuk #isle() fonksiyonun görmesi için 39 | 40 | def __repr__(self): 41 | if not ozel_isim: 42 | return sozcuk 43 | else: 44 | return sozcuk[0].replace('i', u'İ').replace(u'ı', 'I').upper() + sozcuk[1:] 45 | Ek.__repr__ = __repr__ 46 | 47 | # == Analiz Fonksiyonları == # 48 | 49 | def unlu_sayisi(harfler): 50 | return len([x for x in harfler if x in UNLU]) 51 | 52 | # ! Optimize edilebilir ! # 53 | def hecele(): 54 | harf_sayisi=len(sozcuk) 55 | heceler=[] 56 | son_indeks=n=0 57 | while n < (harf_sayisi - 1): 58 | # 3 ünsüz yanyana 59 | if n+3 < harf_sayisi and unlu_sayisi(sozcuk[n:n+3]) == 0: 60 | heceler.append(sozcuk[son_indeks:n+2]) 61 | son_indeks=n=n+2 62 | # 2 ünlü veya ünsüz yanyana 63 | elif n+2 < harf_sayisi and unlu_sayisi(sozcuk[n:n+2]) in (0,2): 64 | heceler.append(sozcuk[son_indeks:n+1]) 65 | son_indeks=n=n+1 66 | # tek ünsüz 67 | elif not sozcuk[n] in UNLU and n != 0 and unlu_sayisi(sozcuk[n:]) != 0: 68 | heceler.append(sozcuk[son_indeks:n]) 69 | son_indeks=n 70 | n+=1 71 | # son hece sanitasyonu 72 | if unlu_sayisi(sozcuk[-2:]) == 2: # 'video' gibi kelimeler için 73 | heceler.append(sozcuk[son_indeks:-1]) 74 | heceler.append(sozcuk[-1]) 75 | else: 76 | heceler.append(sozcuk[son_indeks:]) 77 | return heceler 78 | self.hecele = hecele 79 | 80 | # == Ek Fonksiyonları == # 81 | 82 | #Durum (Hâl) Ekleri 83 | def i(): 84 | "Belirtme durum eki" 85 | return isle('i', 'y') 86 | self.i = i 87 | 88 | def e(): 89 | u"Yönelme durum eki" 90 | return isle('e', 'y') 91 | self.e = e 92 | 93 | def de(): 94 | "Bulunma durum eki" 95 | return isle('de') 96 | self.de = de 97 | 98 | def den(): 99 | u"Ayrılma durum eki" 100 | return isle('den') 101 | self.den = den 102 | 103 | #Çoğul Eki 104 | def ler(): 105 | u"Çoğul eki" 106 | return isle('ler') 107 | self.ler = ler 108 | 109 | #Eşitlik eki 110 | def ce(): 111 | u"Eşitlik eki" 112 | return isle('ce') 113 | self.ce = ce 114 | 115 | #İyelik Ekleri 116 | def benim(): 117 | u"1. tekil şahıs iyelik eki" 118 | return isle('m', 'i') 119 | self.benim = benim 120 | 121 | def senin(): 122 | u"2. tekil şahıs iyelik eki" 123 | return isle('n', 'i') 124 | self.senin = senin 125 | 126 | def onun(): 127 | u"3. tekil şahıs iyelik eki" 128 | return isle('i', 's') 129 | self.onun = onun 130 | 131 | def bizim(): 132 | u"1. çoğul şahıs iyelik eki" 133 | return isle('miz', 'i') 134 | self.bizim = bizim 135 | 136 | def sizin(): 137 | u"2. çoğul şahıs iyelik eki" 138 | return isle('niz', 'i') 139 | self.sizin = sizin 140 | 141 | def onlarin(): 142 | u"3. çoğul şahıs iyelik eki" 143 | return isle('leri') 144 | self.onlarin = onlarin 145 | 146 | #Tamlayan Eki 147 | def tamlayan(): 148 | u"İlgi (tamlayan) eki" 149 | return isle('in', 'n') 150 | self.tamlayan = tamlayan 151 | 152 | #Tamlanan Eki (İyelik Eki) 153 | def tamlanan(): 154 | u"Tamlanan eki, 3. tekil şahıs iyelik ekiyle aynıdır" 155 | return onun() 156 | self.tamlanan = tamlanan 157 | 158 | def isle(ek, kaynastirma=''): 159 | sozcuk = _sozcuk 160 | 161 | try: 162 | son_unlu=next(x for x in reversed(sozcuk) if x in UNLU) 163 | except: 164 | raise ValueError("'%s' sözcüğü uygunsuz, hiç ünlü bulunamadı!" % sozcuk) 165 | 166 | #Kaynaştırma Ünlüsü 167 | if not (ek.startswith(UNLU) or sozcuk.endswith(UNLU)): 168 | ek = kaynastirma + ek 169 | 170 | #Ünsüz Sertleşmesi (Benzeşmesi) 171 | if sozcuk.endswith(SERT_UNSUZ) and ek[0] in BENZESME: 172 | ek = BENZESME[ek[0]] + ek[1:] 173 | 174 | #Ünsüz Yumuşaması 175 | if not ozel_isim and sozcuk[-1] in YUMUSAMA and sozcuk[-2] in UNLU \ 176 | and ek.startswith(UNLU) and unlu_sayisi(sozcuk) > 1: #and len(hecele()) > 1: 177 | sozcuk = sozcuk[:-1] + YUMUSAMA[sozcuk[-1]] 178 | 179 | #Düzlük-Yuvarlaklık (Küçük Ünlü) Uyumu 180 | if not son_unlu in DUZ_UNLU: 181 | ek = ek.replace('i', u'ü') 182 | 183 | #Kalınlık-İncelik (Büyük Ünlü) Uyumu 184 | if not son_unlu in INCE_UNLU: #and not self.sozcuk in self._istisna[u'büu']: 185 | for i, j in zip(INCE_UNLU, KALIN_UNLU): 186 | ek = ek.replace(i, j) 187 | 188 | #Su, Ne sözcükleri istisnası 189 | if sozcuk in ('su', 'ne'): 190 | kaynastirma = 'y' 191 | 192 | #Kaynaştırma Ünsüzü 193 | if sozcuk.endswith(UNLU) and ek.startswith(UNLU): 194 | ek = kaynastirma + ek 195 | 196 | #Özel İsim 197 | if ozel_isim and not "'" in sozcuk: 198 | ek = "'" + ek 199 | 200 | return Ek(sozcuk + ek, ozel_isim) 201 | 202 | 203 | if __name__ == '__main__': 204 | import requests, re, random 205 | get=requests.get('http://www.birsozluk.com/') 206 | get.encoding='cp1254' 207 | s=re.search('(.*)
', get.text).groups()[0] 208 | s=re.findall(r'href="([^\'">]+)', s) 209 | for sozcuk in s: 210 | rand = random.randint(0,13) 211 | sozcuk = sozcuk.strip() 212 | if rand == 0: 213 | ekli='-'.join(Ek(sozcuk).hecele()), "hecele" 214 | elif rand == 1: 215 | ekli=Ek(sozcuk).i(), "i" 216 | elif rand == 2: 217 | ekli=Ek(sozcuk).e(), "e" 218 | elif rand == 3: 219 | ekli=Ek(sozcuk).de(), "de" 220 | elif rand == 4: 221 | ekli=Ek(sozcuk).den(), "den" 222 | elif rand == 5: 223 | ekli=Ek(sozcuk).ler(), "ler" 224 | elif rand == 6: 225 | ekli=Ek(sozcuk).ce(), "ce" 226 | elif rand == 7: 227 | ekli=Ek(sozcuk).benim(), "benim" 228 | elif rand == 8: 229 | ekli=Ek(sozcuk).senin(), "senin" 230 | elif rand == 9: 231 | ekli=Ek(sozcuk).onun(), "onun" 232 | elif rand == 10: 233 | ekli=Ek(sozcuk).bizim(), "bizim" 234 | elif rand == 11: 235 | ekli=Ek(sozcuk).sizin(), "sizin" 236 | elif rand == 12: 237 | ekli=Ek(sozcuk).onlarin(), "onlarin" 238 | else: 239 | ekli=Ek(sozcuk).tamlayan(), "tamlayan" 240 | print('%15s: %30s (%s)' % (sozcuk, ekli[0], ekli[1])) 241 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | PyTurkish 2 | ======= 3 | 4 | PyTurkish, adından da anlaşılacağı üzere Python ile yazılmış bir çekim ekleri kütüphanesidir. Örnek kullanım: 5 | ```python 6 | from PyTurkish import * 7 | 8 | print "%s mesaj at." % Ek("Hakan", True).e() 9 | print "%s selam söyle..." % Ek("Mustafa", True).benim().e() 10 | ``` 11 | 12 | Şu anda kısıtlı bir Hâl Ekleri, Çoğul ve Eşitlik Eki, İyelik Ekleri, Tamlayan ve Tamlayan Ekleri desteği var. 13 | 14 | Github varsayılan ANSI versiyonu görüntülerken encoding sorunları yaşıyor, bunun için raw olarak indirmeniz gerek. 15 | 16 | Değişiklikler 17 | -------------- 18 | - 2.0 19 | + Sıfırdan yazıldı, kod kalabalığı kaldırıldı, okunabilirlik arttırıldı. 20 | + Heceleme fonksiyonu eklendi. 21 | + Artık 'string' yerine Ek 'class'ı döndürülüyor, yani zincirleme eklemeler tek satırda mümkün. 22 | + Bazı gereksiz şeyler kaldırıldı. 23 | + Python 3.x desteği. 24 | + Timeit testlerine göre bilgisayarımda bu sürüm 5 kat daha hızlı. 25 | 26 | Yapılacaklar 27 | -------------- 28 | + İstisnalar ve sayılar tekrar eklenecek 29 | + Tamlama kaynaştırma ekleri desteği 30 | + Bağlaç desteği --------------------------------------------------------------------------------