├── 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('