Python ile Zemberek Kütüphanesini Kullanmak
http://www.b4deploy.com/sorular/zemberek-example-for-python/ adresindeki örneklerden yararlanarak yaptığım denemelerin sonunda jpype modülünü kullanarak zemberek-tum-2.0.jar kütüphanesini sorgulayabilen kodları elde ettim.
Bu çalışmalar sırasında jnius kütüphanesini ne Python2.x serisinde, ne de Python 3.x serisinde yüklemem mümkün oldu. Pek çok deneme yaptım ama bu kütüphaneyi yükleyip test edemedim.
Oysa jpype modülü kolayca yüklendi. Aşağıdaki kodları da bu sayede Python 3.5.1 üzerinde sorunsuz bir şekilde çalıştırabildim.
# -*- coding: utf-8 -*-
"""
Kod : Ahmet Aksoy
Sistem: Ubuntu 14.04 LTS
Python: Python 3.5.1
Modül : JPype1-py3 0.5.5.2
"""
import jpype
# JVM başlat
# Aşağıdaki adresleri java sürümünüze ve jar dosyasının bulunduğu klasöre göre değiştirin
jpype.startJVM("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libjvm.so",
"-Djava.class.path=/home/ax/PycharmProjects/trdp/zemberek-tum-2.0.jar", "-ea")
# Türkiye Türkçesine göre çözümlemek için gerekli sınıfı hazırla
Tr = jpype.JClass("net.zemberek.tr.yapi.TurkiyeTurkcesi")
# tr nesnesini oluştur
tr = Tr()
# Zemberek sınıfını yükle
Zemberek = jpype.JClass("net.zemberek.erisim.Zemberek")
# zemberek nesnesini oluştur
zemberek = Zemberek(tr)
#Çözümlenecek örnek kelimeleri belirle
kelimeler = ["merhabalaştık","dalgalarının","habercisi","tırmalamışsa"]
for kelime in kelimeler:
if kelime.strip()>'':
yanit = zemberek.kelimeCozumle(kelime)
if yanit:
print("{}".format(yanit[0]))
else:
print("{} ÇÖZÜMLENEMEDİ".format(kelime))
#JVM kapat
jpype.shutdownJVM()
Programın çıktısı şöyle:
/home/ax/evp35/bin/python /home/ax/PycharmProjects/trdp/zemberek-ornek.py {Icerik: merhabalaştık Kok: merhaba tip:ISIM} Ekler:ISIM_KOK + ISIM_DONUSUM_LES + FIIL_BELIRTME_DIK {Icerik: dalgalarının Kok: dalga tip:ISIM} Ekler:ISIM_KOK + ISIM_COGUL_LER + ISIM_SAHIPLIK_O_I + ISIM_TAMLAMA_IN {Icerik: habercisi Kok: haber tip:ISIM} Ekler:ISIM_KOK + ISIM_ILGI_CI + ISIM_SAHIPLIK_O_I {Icerik: tırmalamışsa Kok: tırmala tip:FIIL} Ekler:FIIL_KOK + FIIL_GECMISZAMAN_MIS + IMEK_SART_SE JVM activity report : classes loaded : 25 JVM has been shutdown Process finished with exit code 0
zemberek-tum-2.0.0.jar dosyasını http://www.java2s.com/Code/Jar/z/zemberek.htm adresinden indirebilirsiniz.
jar dosyasının içeriği:
Files contained in zemberek-tum-2.0.jar: META-INF/MANIFEST.MF kaynaklar/tm/bilgi/ek_tm.xml kaynaklar/tm/bilgi/harf_tm.txt kaynaklar/tm/bilgi/kokler_tm.bin kaynaklar/tr/bilgi/ek_tr.xml kaynaklar/tr/bilgi/harf_tr.txt kaynaklar/tr/bilgi/kelime_cebi_tr.txt kaynaklar/tr/bilgi/kokler_tr.bin net.zemberek.araclar.IstatistikAraclari.class net.zemberek.araclar.JaroWinkler.class net.zemberek.araclar.KayitBicimleyici.class net.zemberek.araclar.Kayitci.class net.zemberek.araclar.MetinAraclari.class net.zemberek.araclar.TimeTracker.class net.zemberek.araclar.TimerElement.class net.zemberek.araclar.TusTakimi.class net.zemberek.araclar.XmlYardimcisi.class net.zemberek.araclar.turkce.TurkceMetinOkuyucu.class net.zemberek.araclar.turkce.TurkishTokenStream.class net.zemberek.araclar.turkce.YaziBirimi.class net.zemberek.araclar.turkce.YaziBirimiTipi.class net.zemberek.araclar.turkce.YaziIsleyici.class net.zemberek.bilgi.KaynakYukleyici.class net.zemberek.bilgi.ZemberekAyarlari.class net.zemberek.bilgi.araclar.DuzYaziKokOkuyucu.class net.zemberek.bilgi.araclar.DuzYaziKokYazici.class net.zemberek.bilgi.araclar.IkiliKokOkuyucu.class net.zemberek.bilgi.araclar.IkiliKokYazici.class net.zemberek.bilgi.araclar.KokOkuyucu.class net.zemberek.bilgi.araclar.KokYazici.class net.zemberek.bilgi.kokler.AgacSozluk.class net.zemberek.bilgi.kokler.AsciiKokAdayiBulucu.class net.zemberek.bilgi.kokler.KesinKokAdayiBulucu.class net.zemberek.bilgi.kokler.KokAdayiBulucu.class net.zemberek.bilgi.kokler.KokAdayiBulucuUretici.class net.zemberek.bilgi.kokler.KokAgaci.class net.zemberek.bilgi.kokler.KokAgaciYuruyucu.class net.zemberek.bilgi.kokler.KokDugumu.class net.zemberek.bilgi.kokler.Sozluk.class net.zemberek.bilgi.kokler.ToleransliKokAdayiBulucu.class net.zemberek.demo.CikisAlani.class net.zemberek.demo.DemoMain.class net.zemberek.demo.DemoPaneli.class net.zemberek.demo.DemoYonetici.class net.zemberek.demo.GirisAlani.class net.zemberek.demo.IslemTipi.class net.zemberek.demo.MainFrame.class net.zemberek.demo.SwingFactory.class net.zemberek.demo.TurkDiliTuru.class net.zemberek.erisim.Zemberek.class net.zemberek.islemler.AsciiDonusturucu.class net.zemberek.islemler.BasitDenetlemeCebi.class net.zemberek.islemler.DenetlemeCebi.class net.zemberek.islemler.HataliKodlamaTemizleyici.class net.zemberek.islemler.HeceIslemleri.class net.zemberek.islemler.KelimeKokFrekansKiyaslayici.class net.zemberek.islemler.KelimeTabanliKokBulucu.class net.zemberek.islemler.KelimeUretici.class net.zemberek.islemler.KokBulucu.class net.zemberek.islemler.TurkceYaziTesti.class net.zemberek.islemler.cozumleme.AsciiToleransliHDKiyaslayici.class net.zemberek.islemler.cozumleme.BasitKelimeYigini.class net.zemberek.islemler.cozumleme.CozumlemeYardimcisi.class net.zemberek.islemler.cozumleme.HarfDizisiKiyaslayici.class net.zemberek.islemler.cozumleme.KelimeCozumleyici.class net.zemberek.islemler.cozumleme.KesinHDKiyaslayici.class net.zemberek.islemler.cozumleme.OneriUretici.class net.zemberek.islemler.cozumleme.StandartCozumleyici.class net.zemberek.islemler.cozumleme.ToleransliCozumleyici.class net.zemberek.istatistik.BinaryIstatistikOkuyucu.class net.zemberek.istatistik.BinaryIstatistikYazici.class net.zemberek.istatistik.DosyaRaporlayici.class net.zemberek.istatistik.EkFrekansBilgisi.class net.zemberek.istatistik.EkIstatistikBilgisi.class net.zemberek.istatistik.EkIstatistikleri.class net.zemberek.istatistik.EkZinciri.class net.zemberek.istatistik.GenelKokIstatistikBilgisi.class net.zemberek.istatistik.Hece.class net.zemberek.istatistik.HeceIstatistikleri.class net.zemberek.istatistik.IkiliIstatistikleri.class net.zemberek.istatistik.Istatistik.class net.zemberek.istatistik.IstatistikRaporlayici.class net.zemberek.istatistik.IstatistikToplayici.class net.zemberek.istatistik.IstatistikYazici.class net.zemberek.istatistik.Istatistikler.class net.zemberek.istatistik.KarakterIstatistikleri.class net.zemberek.istatistik.KelimeBilgisi.class net.zemberek.istatistik.KelimeIstatistikleri.class net.zemberek.istatistik.KelimeTipZinciri.class net.zemberek.istatistik.KelimeZinciri.class net.zemberek.istatistik.KokCebi.class net.zemberek.istatistik.KokIstatistikBilgisi.class net.zemberek.istatistik.KokIstatistikleri.class net.zemberek.istatistik.KonsolRaporlayici.class net.zemberek.istatistik.TemelIstatistikYazici.class net.zemberek.istatistik.TemelRaporlayici.class net.zemberek.istatistik.UcluIstatistikleri.class net.zemberek.tm.islemler.TurkmenceCozumlemeYardimcisi.class net.zemberek.tm.yapi.Turkmence.class net.zemberek.tm.yapi.TurkmenceHeceleyici.class net.zemberek.tm.yapi.TurkmenceSesliUretici.class net.zemberek.tm.yapi.ek.EdilgenOzelDurumu.class net.zemberek.tm.yapi.ek.EkUreticiTm.class net.zemberek.tm.yapi.ek.KiEkOzelDurumu.class net.zemberek.tm.yapi.ek.MeEkOzelDurumu.class net.zemberek.tm.yapi.ek.SonHarfDusumOzelDurumu.class net.zemberek.tm.yapi.ek.TurkmenceEkAdlari.class net.zemberek.tm.yapi.ek.TurkmenceEkOzelDurumUretici.class net.zemberek.tm.yapi.kok.TurkmenceKokOzelDurumBilgisi.class net.zemberek.tm.yapi.kok.TurkmenceKokOzelDurumTipleri.class net.zemberek.tr.HarfDizisiUretici.class net.zemberek.tr.islemler.SoruEkiIsleyici.class net.zemberek.tr.islemler.TurkceCozumlemeYardimcisi.class net.zemberek.tr.yapi.DenemeTurkceHeceleyici.class net.zemberek.tr.yapi.TurkceHeceleyici.class net.zemberek.tr.yapi.TurkceSesliUretici.class net.zemberek.tr.yapi.TurkiyeTurkcesi.class net.zemberek.tr.yapi.ek.BeraberlikIsOzelDurumu.class net.zemberek.tr.yapi.ek.EdilgenOzelDurumu.class net.zemberek.tr.yapi.ek.EkUreticiTr.class net.zemberek.tr.yapi.ek.GenisZamanEkOzelDurumuTr.class net.zemberek.tr.yapi.ek.SimdikiZamanEkOzelDurumuTr.class net.zemberek.tr.yapi.ek.SuOzelDurumu.class net.zemberek.tr.yapi.ek.TurkceEkAdlari.class net.zemberek.tr.yapi.ek.TurkceEkOzelDurumUretici.class net.zemberek.tr.yapi.kok.TurkceKokOzelDurumBilgisi.class net.zemberek.tr.yapi.kok.TurkceKokOzelDurumTipleri.class net.zemberek.tr.yapi.kok.YumusamaNk.class net.zemberek.yapi.Alfabe.class net.zemberek.yapi.CokluKok.class net.zemberek.yapi.Cumle.class net.zemberek.yapi.DilAyarlari.class net.zemberek.yapi.DilBilgisi.class net.zemberek.yapi.DilBilgisiUretici.class net.zemberek.yapi.EkSiralayici.class net.zemberek.yapi.HarfDizisi.class net.zemberek.yapi.Heceleyici.class net.zemberek.yapi.Kelime.class net.zemberek.yapi.KelimeTipi.class net.zemberek.yapi.Kok.class net.zemberek.yapi.SesliUretici.class net.zemberek.yapi.TurkceDilBilgisi.class net.zemberek.yapi.TurkceHarf.class net.zemberek.yapi.ek.Ek.class net.zemberek.yapi.ek.EkOzelDurumTipi.class net.zemberek.yapi.ek.EkOzelDurumUretici.class net.zemberek.yapi.ek.EkOzelDurumu.class net.zemberek.yapi.ek.EkUretici.class net.zemberek.yapi.ek.EkUretimBileseni.class net.zemberek.yapi.ek.EkUretimKurali.class net.zemberek.yapi.ek.EkYonetici.class net.zemberek.yapi.ek.OldurganEkOzelDurumu.class net.zemberek.yapi.ek.OnEkOzelDurumu.class net.zemberek.yapi.ek.SonHarfYumusamaOzelDurumu.class net.zemberek.yapi.ek.TemelEkOzelDurumUretici.class net.zemberek.yapi.ek.TemelEkYonetici.class net.zemberek.yapi.ek.XmlEkOkuyucu.class net.zemberek.yapi.ek.ZamanKiOzelDurumu.class net.zemberek.yapi.kok.AraSesliDusmesi.class net.zemberek.yapi.kok.BosHarfDizisiIslemi.class net.zemberek.yapi.kok.Ciftleme.class net.zemberek.yapi.kok.HarfDizisiIslemi.class net.zemberek.yapi.kok.KokOzelDurumBilgisi.class net.zemberek.yapi.kok.KokOzelDurumTipi.class net.zemberek.yapi.kok.KokOzelDurumu.class net.zemberek.yapi.kok.SonHarfDusmesi.class net.zemberek.yapi.kok.SonSesliIncelt.class net.zemberek.yapi.kok.TemelKokOzelDurumBilgisi.class net.zemberek.yapi.kok.Ulama.class net.zemberek.yapi.kok.YeniIcerikAta.class net.zemberek.yapi.kok.Yumusama.class zemberek_tr.properties
Bu yöntemle, kısmen de olsa zemberek kütüphanesini Python programı üzerinden kullanmak mümkün. Diliyorum ki daha ileride bu güzel kütüphaneyi doğrudan Python ile kullanmamız mümkün olsun!
Ahmet Aksoy
Hocam selam, zemberek’le alakalı; örneğinizde, “habercisi” kelimesi dikkatimi çekti. Kökü “haberci” olmasına rağmen “haber” olarak çıktı üretilmiş. Burada, sizce doğru sonuca nasıl ulaşabiliriz? Zemberek-nlp kütüphanesi daha tutarlı sonuç üretiyor mu, test etme şansınız oldu mu?
Merhaba Fatih bey,
Haberci kelimesi, haber köküne -ci yapım eki eklenerek türetilmiş. (Arkadaşlar bunu İLGİ_EKİ olarak tanımlamışlar) Bu tür belirgin yapım eklerini kodlara ekleyerek kök dosyasının boyutlarını küçültmek mümkün oluyor. Aksi halde hemen hemen her isim köküne bir de -ci eklemek lazım. Böyle bir kullanım tercih edilmiş olabilir.
Ana hatlarıyla zemberek kütüphanesinin çok başarılı bir çalışma olduğuna inanıyorum.
Ayrıca, özel isimlerin ve bazı temel kavramların kök listesine dahil edilmediğinin de farkında olmak lazım.
Zemberek aracı ile cümlenin Sözdizimsel (Syntaxial) analiz yapılabiliyor mu? Örneğin “Ali ata baktı” cümlesini verdiğim zaman Ali = Özne, Ata = Nesne, Baktı = Fiil eşlemesini yapabiliyor mu?
Bildiğim kadarıyla hayır. Zemberek sadece kelime bazında işlevsel. Sözcüklerin tipini belirleyip, kök ve eklerini ayırabiliyor. Cümle bazında çalışmıyor.
Merhaba, öncelikle yaptığınız katkıdan dolayı çok teşekkürler. Ben javayı pek bilmiyorum ve açıkçası yazdığınız kodu nasıl editleyeceğimi bilmiyorum. Ben sadece çıktı olarak kök kelimeyi alıp, veritabanına ekleyeceğim. Diğer açıklama kısımlarını nasıl silebilirim ?
Merhaba siz yukarıdaki örnekte kelimeCozumle adlı bir fonksiyon kullanmışsınız, bu fonksiyonun hangi sınıfa ait olduğunu nereden buldunuz ?,Başka sınıflarda hangi fonksiyonların olduğuna dair bilgiyi nereden alabiliriz acaba ?
Merhaba Can bey,
kelimeCozumle metodu net.zemberek.tr.yapi.TurkiyeTurkcesi sınıfında olmalı.
Fonksiyon listelerini bulabileceğiniz bir kaynak bilgisi bende de yok.
Java konusuna yeterince hakim değilim. Ama jar dosyasının içinde bu bilgiler olmalı.
İnterneti bu konuya ilişkin sorgularsanız bir yanıt bulabilirsiniz.
Kolay gelsin.
Merhaba jpype modülünü yükledim. Ancak yukarıdaki kodu çalıştırdığımda “ImportError: No module named jpype” hatası veriyor. Sorun neden kaynaklabilir, çözümü nedir?
jpype modülünü sisteminize yüklememişsiniz. Import etmeden önce, kullandığınız python sürümüne bu modülü yüklemeniz gerekir.
Merhaba,
Bir kelimede olumsuzluk eki olup olmadığını öğrenebileceğimiz bir metod var mı?
Ne yazık ki bu konuda bir bilgim yok.
Ancak zemberek ile bu sözcükleri çözümlediğimizde:
{Icerik: iştahlı Kok: iştah tip:ISIM} Ekler:ISIM_KOK + ISIM_BULUNMA_LI
{Icerik: iştahsız Kok: iştah tip:ISIM} Ekler:ISIM_KOK + ISIM_YOKLUK_SIZ
yanıtlarını alıyoruz. Buradaki ISIM_YOKLUK_SIZ eki, olumsuzluğu tanımlayan eklerden biri.
Merhaba,
2 sorum olacak, umarım yardımcı olabilirsiniz.
1) Zemberek ile aynı kökten farklı yapım eki alarak türemiş kelimeleri nasıl ayırt edebilirim? Örneğin iştahlı ve iştahsız kelimelerini nasıl ayırabilirim?
2) Zemberek ile bir kelimenin olumsuzluk eki alıp almadığını nasıl kontrol edebilirim? Uygun bir method var mı?
Merhaba Gökhan bey,
Zemberek mekanizmasının tüm ayrıntılarını bilmediğimi baştan söyleyeyim.
Benim örnekte kullandığım kadarıyla verilen sözcükler zemberek tarafından çözümlendikten sonra çıkan sonuç standart bir formatla geri döndürülüyor. Bu çıktıda kök, tip ve ekler ayrı ayrı yer alıyor.
Dolayısıyla çıktıyı regex vb ile istediğiniz bilgileri alacak şekilde ayrıştırabilir ve karşılaştırmaları buna göre yapabilirsiniz.
Her iki sorunuza da bu şekilde yanıt üretilebilir.
Python konusunda yardıma ihtiyacınız olursa, zamanım elverdiğince destek olmaya çalışırım.
Tekrar merhaba,
Zemberek ile tokenization yapabiliyor muyuz?
Bildiğim kadarıyla hayır. Sadece kök-ek ayrıştırma var. Bir de heceleme olmalı.
Bir sorum daha olacak. Zemberek’e yüz kelimesini yazdığımda çıkış alanında
{Icerik: yüz Kok: yüz tip:FIIL} Ekler:FIIL_KOK
{Icerik: yüz Kok: yüz tip:SAYI} Ekler:SAYI_KOK
sonucunu alyorum. İlk sonucun fiil ikincinin ise sayı tipinde olduğunu görüyorum. Bu sıralamayı olasılık dağılımına göre mi belirliyor?
Ne yazık ki bu konuda da kesin bir bilgiye sahip değilim.
Çoklu yanıt üreten örnekleri inceleyerek bu sorunuza bir yanıt bulmak mümkün olabilir.
Birden fazla jpype.jclass’ı aynı anda kullanmak mümkün mü?
Eğer mümkünse birden fazla jclass için path vererek ayrı ayrı tar dosyalarından aynı anda birden fazla jpype.jclass kullanmak mümkün olabilir mi?
Merhaba Hocam,
Anlatımınız ve örneğiniz için öncelikle teşekkür ederim. jnius kütüphanesini pip ile kurabildim.
Fakat, autoclass metodu ile oluşturduğum java nesnelerine ait kelimeCozumle ve kelimeDenetle metodlarından sonuç
alamadım. kelimeDenetle herzaman false döndürürken kelimeCozumle kok bulamıyor.
Elinize sağlık teşekkür ederim.
A.Kemal
Merhaba,
Jpype kütüphanesini niçin kullanmıyorsunuz?
Fonksiyon dönüşlerini birer değişkene atayın ve type() ile dönüş değerlerinin tipine bakın.
Dönen değerler string olmayabilir.
Kullandığınız kodları paylaşırsanız, sorunu daha kolay buluruz.
Selamlar.
Ahmet Aksoy
jype modulu nasıl yükleyeceğin yardım edebilir misiniz?
pip install jpype1
komutuyla yükleyebilmeniz lazım.
Merhaba windows’ta jvm’i aşağıdaki şekillerde başlatmaya denediğimde ‘JVM cannot be restarted’ hatası alıyorum. Yardımcı olabilir misiniz? Teşekkürler
jpype.startJVM(“C:\\Program Files\\Java\\jdk1.8.0_161\\jre\\bin\\server\\jvm.dll”,
“C:\\Users\\b\\zemberek-tum-2.0.jar”, “-ea”)
jpype.startJVM(“/C:/Program Files/Java/jdk1.8.0_161/jre/bin/server/jvm.dll”,
“-Djava.class.path=/C:/Users/b/zemberek-tum-2.0.jar”, “-ea”)
Sisteminizde jdk 8 kurulu mu? Lütfen önce onu kontrol edin.
Merhabalar, şu an acaba zemberek ile pos tagging yapmak mümkün mü? Eğer değil ise hangi kütüphaneyi kullanabiliriz Türkçe pos tagging için bir öneriniz var mı?