Skip to content

2. Morfolojik Analiz

ESAT MAHMUT BAYOL edited this page Jun 23, 2020 · 5 revisions

trnlp.morphology.TrnlpWord

TrnlpWord klası sözlük ve kural tabanlı çalışan, kelimenin kök/gövde ve eklerini bulmak için hazırladığım bir algoritmadır.

trnlp bir kelimeyi analiz edebilmek için öncelikle sözlük yardımıyla kelimenin muhtemel köklerini bulur. Kök bulma algoritması şu şekilde çalışır;

  1. Kelimedeki noktalama işaretlerini temizle, şapkalı harfleri çevir, sağ ve sol boşlukları temizle ve küçük harf yap.

  2. Kelimeyi harf eksilterek parçala; ("deneme" kelimesi için ["deneme", "denem", "dene", "den", "de"]

  3. trnlp öncelikle girilen orjinal kelime içerisindeki noktalama işaretlerini kontrol eder.

    • Eğer orjinal kelime içerisinde "." varsa ve kısaltmalar sözlüğü kullanıcı tarafından açıldıysa son noktadan öncesini kök olarak kısaltmalar sözlüğünün içinde arar (Yani önceliği kısaltmalar sözlüğüne verir.) ve sözlükte ifade mevcutsa muhtemel kökler listesine ekler. Noktadan sonra kalan harfleri "ekler" olarak tanımlar.

    • Eğer orjinal kelime içerisinde "'" varsa, özel isimler ve kısaltmalar sözlüğü kullanıcı tarafından açıldıysa son tek tırnak işaretinin öncesini kök olarak özel isimler sözlüğü ve kısaltmalar sözlüğünün içinde arar (Yani önceliği özel isimler sözlüğü ve kısaltmalar sözlüğüne verir.) ve sözlükte ifade mevcutsa muhtemel kökler listesine ekler. Tek tırnak işaretinden sonra kalan harfleri "ekler" olarak tanımlar.

    • Eğer orjinal kelime büyük harf ile başlıyorsa, özel isimler ve kısaltmalar sözlüğü kullanıcı tarafından açıldıysa harf eksiltilerek oluşturulmuş kelime listesi içerisindeki her bir ifadeyi kök olarak özel isimler sözlüğü, ana sözlük ve kısaltmalar sözlüğünün içinde arar (Yani önceliği özel isimler sözlüğü ve ana sözlüğe verir.) ve sözlükte ifade mevcutsa muhtemel kökler listesine ekler. Parçalanmış kelimeden arta kalan harfleri "ekler" olarak tanımlar.

    • Eğer orjinal kelime hiçbir ifade içermiyorsa, özel isimler ve kısaltmalar sözlüğü kullanıcı tarafından açıldıysa harf eksiltilerek oluşturulmuş kelime listesi içerisindeki her bir ifadeyi kök olarak ana sözlük, özel isimler sözlüğü ve kısaltmalar sözlüğünün içinde arar (Yani önceliği ana sözlük ve özel isimler sözlüğüne verir.) ve sözlükte ifade mevcutsa muhtemel kökler listesine ekler. Parçalanmış kelimeden arta kalan harfleri "ekler" olarak tanımlar.

  4. Sırasıyla eklerden yapım ekleri ve çekim ekleri türetilmeye çalışılır. Eğer tüm harfler kullanılarak bir sonuca ulaşılmışsa bir sözlük şeklinde sonuç listesine eklenir. Eğer sonuç bulunamadıysa boş liste döndürür.

TrnlpWord klasından bir obje türetildikten sonra .setword(str) fonksiyonu ile yeni kelime analizi yapılmalıdır. Her bir yeni obje türetildiğinde obje ile birlikte birçok sözlük dosyası da oluşturulduğundan sürekli yeni obje tanımlanması aşırı bellek tüketimine yol açacaktır. Bu yüzden tek bir örnek üzerinden yeni kelimelerin analizinin yapılması daha sağlıklı olacaktır.

Benim bilgisayarımda (İntel i5-2450M işlemci 4GB Bellek) kelime uzunluklarına bağlı olarak 1 saniyede yapılabilen analiz sayısı 2250 ile 3000 arasında değişmektedir.

Kelime kök/gövde ve eklerini bulmak için yazdığım algoritmanın örnek kullanımı şu şekildedir:

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("arkadaşlar")
print(obj)

>> "arka(isim,sıfat)+daş{İi}[4_26]+lar{Çe}[1_1]"

obj.setword("Muvaffakiyetsizleştiricileştiriveremeyebileceklerimizdenmişsiniz")
print(obj)

>> muvaffakiyet(isim)+siz{İi}[4_4]+leş{İf}[5_5]+tir{Ff}[6_11]+ici{Fi}[7_3]+leş{İf}[5_5]+tir{Ff}[6_11]+iver{BfVer}[3_4]+eme{Ytsz}[3_19]+yebil{BfBil}[3_1]+ecek{Fs}[8_9]+ler{Çe}[1_1]+imiz{İe1ç}[1_4]+den{HeUzk}[1_23]+miş{EfGçMiş}[1_38]+siniz{EfKe2ç}[1_50]

Morfolojik analizde temel olarak üç sözlük tipi kullanılır. Bunlar;

  1. Ana Sözlük: Temel kelimelerin bulunduğu sözlüktür. Özel isimleri ve kısaltmaları içermez. İsim, sıfat, fiil vb. türdeki kelimeleri içerir.
  2. Özel İsimler Sözlüğü: Özel isimlerin bulunduğu sözlüktür. Kişi adları, şehir isimleri, ülke isimleri vb. türdeki kelimeleri içerir.
  3. Kısaltmalar Sözlüğü: Kısaltmaların bulunduğu sözlüktür.

Ön tanımlı olarak "Ana Sözlük" ve "Özel İsimler Sözlüğü" aktif, "Kısaltmalar Sözlüğü" pasif durumdadır. Sözlükler istenildiği zaman aktif yada pasif duruma getirilebilir. Tüm sözlükler pasif duruma getirilirse "Ana Sözlük" otomatik olarak aktifleştirilir. Sözlüklerin kullanımını bir örnek ile açıklayalım;

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("esat")
print(obj)

>> "Esat(özel)"

obj.usepron = False
obj.setword("esat")
print(obj)

>> ""

Sözlük kullanımının aktif yada pasif seçiminin kelime girişinden önce yapılması gerekmektedir.


.usemain

Ana sözlüğün kullanımını aktif/pasif duruma getirir. True yada False boolen değerlerine eşitlenebilir.

.usepron

Özel isimler sözlüğünün kullanımını aktif/pasif duruma getirir. True yada False boolen değerlerine eşitlenebilir.

.useabbr

Kısaltmalar sözlüğünün kullanımını aktif/pasif duruma getirir. True yada False boolen değerlerine eşitlenebilir.

Sözlük dosyalarının ayrıntıları için wiki sayfasının Sözlükler bölümünü inceleyebilirsiniz.


.get_base ve .get_base_type

Kelimenin bulunan muhtemel kökünü, ve türünü döndürür.

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("arkadaşlar")
print(obj.get_base)

>> "arka"

print(obj.get_base_type)

>> "isim,sıfat"

.get_stem ve .get_stem_type

Kelimenin bulunan muhtemel gövdesini, ve türünü döndürür.

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("arkadaşlar")
print(obj.get_stem)

>> "arkadaş"

print(obj.get_stem_type)

>> "isim"

.get_morphology

Dilimizin doğası gereği bir kelime için birden fazla doğru çözümleme yapmak mümkündür. trnlp motfolojik çözümleme yaparken her bir çözümleme için bir sözlük değişkeni oluşturur. .get_morphology komutu birçok çözümleme içerisinden en muhtemel çözümün sözlük değişkenini döndürmeye çalışır.

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("koyun")
print(obj.get_morphology)

>> {'base': 'koyun', 'verifiedBase': 'koyun', 'baseType': ['isim'], 'baseProp': ['0'], 'etymon': 'Türkçe', 'event': 0, 'currentType': ['isim'], 'purview': '0', 'orgWord': 'koyun', 'word': 'koyun', 'suffixes': [], 'suffixPlace': [], 'suffixTypes': [], 'suffixProp': [], 'residual': ''}

Sözlük içerisindeki verilerin açıklamaları şu şekildedir:

  1. 'base': Kelimenin bulunan kökünü ifade eder.
  2. 'verifiedBase': Kelimenin doğrulanmış kökünü ifade eder.(Bir sonraki örnekte daha iyi anlaşılacaktır.)
  3. 'baseType': Kelime kökünün türünü ifade eder.
  4. 'baseProp': Kelime kökünün ses olaylarını ifade eden bayrak ifadeler. (bk. Sözlükler)
  5. 'etymon': Kelime kökünün kökenini ifade eder.
  6. 'event': 0 ise kökte ses olayı yoktur. 1 ise kökte ses olayı gerçekleşmiştir.
  7. 'currentType': Kelimenin her ekten sonra dönüştüğü türlerin lisesini ifade eder.
  8. 'purview': Kelime kökünün sınıfını ifade eder. Sınıf sözlükte tanımlanmamışsa '0'dır.
  9. 'orgWord': Kelimenin kullanıcı tarafından girilmiş halini ifade eder.
  10. 'word': Girilen kelimenin işlem görmüş halidir. Girilen kelime küçük harfe çevrilir ve noktalama işaretleri temizlenir.
  11. 'suffixes': Kelimenin eklerinin listesini ifade eder.
  12. 'suffixPlace': Kelimenin eklerinin ek tablolarındaki tablo ve satır numaralarının listesini ifade eder. (bk. Ek Tabloları)
  13. 'suffixTypes': Kelimenin eklerinin tür listesini ifade eder. (bk. Ek Tabloları)
  14. 'suffixProp': Ekin sahip olduğu özelliklerin listesini ifade eder. (bk. Ek Tabloları)
  15. 'residual': Kelime çözümlemesinden sonra arta kalan harfleri ifade eder. Tam çözümlenmiş kelimelerde bu kısım boştur.
from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("oğlununmuş")
print(obj.get_morphology)

>> {'base': 'oğl', 'verifiedBase': 'oğul', 'baseType': ['isim', 'ünlem'], 'baseProp': ['UDUS'], 'etymon': 'Türkçe', 'event': 1, 'currentType': ['isim,ünlem', 'isim', 'isim', 'fiil'], 'purview': '0', 'orgWord': 'oğlununmuş', 'word': 'oğlununmuş', 'suffixes': ['un', 'un', 'muş'], 'suffixPlace': [(1, 6), (1, 17), (1, 38)], 'suffixTypes': ['İe2t', 'HeTyn', 'EfGçMiş'], 'suffixProp': [(0, 6), (0,), (0,)], 'residual': ''}

obj.setword("gelcem")
print(obj)

>> gel(fiil)+eceğ{Gkz}[2_6]+im{Ke1t}[2_20]

print(obj.get_morphology)

>> {'base': 'gel', 'verifiedBase': 'gel', 'baseType': ['fiil'], 'baseProp': ['GZ[ir]'], 'etymon': 'Türkçe', 'event': 0, 'currentType': ['fiil', 'fiil', 'fiil'], 'purview': '0', 'orgWord': 'gelcem', 'word': 'geleceğim', 'suffixes': ['eceğ', 'im'], 'suffixPlace': [(2, 6), (2, 20)], 'suffixTypes': ['Gkz', 'Ke1t'], 'suffixProp': [(0, 5), (0, 6)], 'residual': ''}

.get_inf

Olası tüm çözümlerin listesini verir.

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("arkadaşlar")
print(obj.get_inf)

>> [{'base': 'arka', 'verifiedBase': 'arka', 'baseType': ['isim', 'sıfat'], 'baseProp': ['0'], 'etymon': 'Türkçe', 'event': 0, 'currentType': ['isim,sıfat', 'isim', 'isim'], 'purview': '0', 'orgWord': 'arkadaşlar', 'word': 'arkadaşlar', 'suffixes': ['daş', 'lar'], 'suffixPlace': [(4, 26), (1, 1)], 'suffixTypes': ['İi', 'Çe'], 'suffixProp': [(2, 4), (2,)], 'residual': ''}, {'base': 'arka', 'verifiedBase': 'arka', 'baseType': ['isim', 'sıfat'], 'baseProp': ['0'], 'etymon': 'Türkçe', 'event': 0, 'currentType': ['isim,sıfat', 'isim', 'fiil'], 'purview': '0', 'orgWord': 'arkadaşlar', 'word': 'arkadaşlar', 'suffixes': ['daş', 'lar'], 'suffixPlace': [(4, 26), (1, 52)], 'suffixTypes': ['İi', 'EfKe3ç'], 'suffixProp': [(2, 4), (2,)], 'residual': ''}, {'base': 'arka', 'verifiedBase': 'arka', 'baseType': ['isim', 'sıfat'], 'baseProp': ['0'], 'etymon': 'Türkçe', 'event': 0, 'currentType': ['isim,sıfat', 'isim', 'fiil', 'fiil'], 'purview': '0', 'orgWord': 'arkadaşlar', 'word': 'arkadaşlar', 'suffixes': ['daş', 'la', 'r'], 'suffixPlace': [(4, 26), (5, 2), (2, 8)], 'suffixTypes': ['İi', 'İf', 'Gz'], 'suffixProp': [(2, 4), (2, 10), (1,)], 'residual': ''}]

writeable(inf_dict: dict, long=False) -> str

writeable fonksiyonu çözümleme sonucunda oluşturulan sözlüklerin standart formatta yazılmasını sağlar. "long" parametresi True yada False olabilir. "long" parametresi yazdırılan standart format içerisindeki ek açıklamalarının kısaltma yada normal şekilde yazılmasını sağlar.

from trnlp import TrnlpWord, writeable

obj = TrnlpWord()
obj.setword("arkadaşlar")
print(writeable(obj.get_morphology))

>> arka(isim,sıfat)+daş{İi}[4_26]+lar{Çe}[1_1]

print(writeable(obj.get_morphology, long=True))

>> arka(isim,sıfat)+daş{İsimden İsim Yapım Eki}[4_26]+lar{Çokluk Eki}[1_1]

.spelling()

Kelimenin hecelerini liste içerisinde döndürür. Kelime hecelenemiyorsa boş liste döndürür. Sadece heceleme işlemi yapılacaksa trnlp.helper.syllabification(word: str) -> list fonkiyonu kullanılabilir.

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("arkadaşlar")
print(obj.spelling())

>> ['ar', 'ka', 'daş', 'lar']

.is_negative()

Kelimenin "olumlusuz" olup olmadığını denetler ve 0 ile 1 arasında float değer döndürür.

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("gelmemişler")
print(obj.is_negative())

>> 1.0

obj.setword("gelme")
print(obj.is_negative())

>> 0.5

obj.setword("değil")
print(obj.is_negative())

>> 0.5

obj.setword("hayır")
print(obj.is_negative())

>> 0.5

obj.setword("şekersiz")
print(obj.is_negative())

>> 1.0

.is_plural()

Kelimenin "çoğul" olup olmadığını denetler ve 0 ile 1 arasında float değer döndürür.

from trnlp import TrnlpWord

obj = TrnlpWord()
obj.setword("gelmemişler")
print(obj.is_plural())

>> 0.6666666666666666

obj.setword("orman")
print(obj.is_plural())

>> 1.0

.s_base(rlist=None) -> list

Parametresiz kullanıldığında çözümleme sonucu bulunan tüm sonuçlar içerisinde kökü en kısa olan çözümlemeleri liste içerisinde döndürür. Eğer çözümleme yapılamamışsa boş liste döndürür. s_base(), l_base(), s_suffix(), l_suffix() fonksiyonları birbirlerine parametre olarak gönderilebilir. Örn;

obj.s_base(obj.s_suffix())
# Tüm çözümler içerisinde en az ek almış ve en kısa köke sahip sonuçlar döndürülecektir.

.l_base(rlist=None) -> list

Parametresiz kullanıldığında çözümleme sonucu bulunan tüm sonuçlar içerisinde kökü en uzun olan çözümlemeleri liste içerisinde döndürür. Eğer çözümleme yapılamamışsa boş liste döndürür. s_base(), l_base(), s_suffix(), l_suffix() fonksiyonları birbirlerine parametre olarak gönderilebilir.

.s_suffix(rlist=None) -> list

Parametresiz kullanıldığında çözümleme sonucu bulunan tüm sonuçlar içerisinde en az ek almış olan çözümlemeleri liste içerisinde döndürür. Eğer çözümleme yapılamamışsa boş liste döndürür. s_base(), l_base(), s_suffix(), l_suffix() fonksiyonları birbirlerine parametre olarak gönderilebilir.

.l_suffix(rlist=None) -> list

Parametresiz kullanıldığında çözümleme sonucu bulunan tüm sonuçlar içerisinde en fazla ek almış olan çözümlemeleri liste içerisinde döndürür. Eğer çözümleme yapılamamışsa boş liste döndürür. s_base(), l_base(), s_suffix(), l_suffix() fonksiyonları birbirlerine parametre olarak gönderilebilir.