Nüve ile Türkçe Cümle Sonu Tespiti

Önceki yazımda Türkî diller için bir doğal dil işleme kütüphanesi olan Nüve‘den bahsetmiştim. Nüve 1.1 versiyonu ile birlikte cümle sonu tespit yeteneği de kazanmış durumda. Nüve’nin cümleleme modülü kural tabanlı çalışıyor ve mükemmel olduğu söylenemez ancak bir çok metin için iş görecek kadar başarılı olduğunu söyleyebilirim. Kullanacak arkadaşlar da gördükleri hataları bildirirerek başarımın artmasına yardımcı olabilir ve projeye katkıda bulunabilirler.

Nüve’yi projenize 2 şekilde ekleyebilirsiniz.

1-Visual Studio->Tools->Library Package Manager->Package Manager Console yolu ile açılan pencerede

PM> Install-Package Nuve

komutunu girmek.

2- Solution Explorer’da projenizin References düğümüne sağ tıklayarak Manage Nuget packages’ı seçmek ve sağ üstteki arama çubuğuna Nuve yazarak “Install” düğmesine basmak.

Nüve için cümleleme kod örneği ise şu şekilde:

var paragraph = "Prof. Dr. Ahmet Bey 1.6 oranında artış var dedi 2. kez. E-posta adresi ahmet.bilir@prof.dr imiş! Doğru mu?";
 Splitter splitter = new RegexSplitter(RegexSplitter.ClassicPattern);
 var segmenter = new TokenBasedSentenceSegmenter(splitter);
 var sentences = segmenter.GetSentences(paragraph);
 foreach (string sentence in sentences)
 {
      Console.WriteLine(sentence);
 }     

Faydalı olması dileğiyle. Herkese kolay gelsin

Türkçe Cümle Sonu Tespit Araçları için bir Karşılaştırma

Bu yazıda cümle sonu tespiti problemini ve Nüve başta olmak üzere Türkçe için belli başlı cümle sonu tespit araçlarını (Zemberek, OpenNLP, ITU Pipeline) incelemeye çalıştım.

Doğal dil işleme ve metin analizi çalışmalarında zaman zaman metni cümlelerine ayırmaya (cümlelemeye) ihtiyaç duyulur. Literatürde bu probleme “cümle sonu tespiti” (sentence boundary detection) denir. Metindeki satırsonu karakterleri (newline, \n, \r) paragrafları birbirinden ayırır. Cümleleme işlemi paragraflar üzerinde yapılır. Bir paragraf bir ya da daha fazla cümleden oluşabilir.

Türkçe bir paragrafı cümlelerine ayırmak sanıldığından sanıldığı kadar kolay değildir. Zira nokta, ünlem, soru işareti gibi karakterler her zaman cümlenin sonunda gelmezler. Aşağıdaki rastgele cümlelerden oluşan paragrafa bir göz atalım. Karakterlerden cümle sonu olanlar yeşil olmayanlar ise kırmızı ile işaretlenmiştir.
Uluslar, bu ekonomik buhran sonucunda 2. Dünya Savaşı’nı yaşamıştır. Bu sezon kaybedilen maç sayısı 2. Dünya Kupası’na katılma şansı azalıyor. Cumhuriyetimizin 75. yılı coşkuyla kutlandı. Tahta çıkan IV. Murat emirler yağdırdı. Uzun zamandır çalışan Ahmet koşuda 2. uzun atlamada ise ancak 4. olabildi. A. Mehmet YILDIZ size uğradı. Alfabenin ilk harfi A. Mehmet’e bunu öğretmeniz gerekiyor. Genel Müdür Mehmet Bey her fırsatta muhteşem! faaliyetlerini anlatıyor. Devlet içinde devlet olmuşlar, devlet adına çalışıyorlar, devlet adamlarıyla ahbap çavuşlar.. şu, bu! Cumartesi akşam 5 p.m.’de geldi. www.cs.hun.edu.tr okulumuzun web sitesidir. E-posta adresi bilgi@cs.deu.edu.tr'dir. Prof. Dr. Ahmet Bey ile görüsecegiz. Daha sonra Arş. Gör. Özlem hanım da katılacak bize.  Enflasyonda 1.6 oranında artıs var.

Şimdi paragrafın farklı araçlar tarafından nasıl cümlelendiğini inceleyelim.

Zemberek

Zemberek’i Java projenize burada anlatıldığı gibi ekleyebilirsiniz. Cümleleme kullanımı için kod örneği ise burada mevcut.  Zemberek paragrafımızı şu şekilde cümleledi. (Kaçırılanlar kırmızı, yanlış alarmlar ise pembe ile belirtildi ):

Uluslar, bu ekonomik buhran sonucunda 2. Dünya Savaşı’nı yaşamıştır.
Bu sezon kaybedilen maç sayısı 2.(kaçırıldı) Dünya Kupası’na katılma şansı azalıyor.
Cumhuriyetimizin 75. yılı coşkuyla kutlandı.
Tahta çıkan IV. Murat emirler yağdırdı.
Uzun zamandır çalışan Ahmet koşuda 2. uzun atlamada ise ancak 4. olabildi.
A. Mehmet YILDIZ size uğradı.
Alfabenin ilk harfi A. (kaçırıldı) Mehmet’e bunu öğretmeniz gerekiyor.
Genel Müdür Mehmet Bey her fırsatta muhteşem! (yanlış alarm)
faaliyetlerini anlatıyor.
Devlet içinde devlet olmuşlar, devlet adına çalışıyorlar, devlet adamlarıyla ahbap çavuşlar.
. (yanlış alarm)
şu, bu!
Cumartesi akşam 5 p. (yanlış alarm)
m. (yanlış alarm)
’de geldi.
www. (yanlış alarm)
cs. (yanlış alarm)
hun. (yanlış alarm)
edu. (yanlış alarm)
tr okulumuzun web sitesidir.
E-posta adresi bilgi@cs. (yanlış alarm)
deu. (yanlış alarm)
edu. (yanlış alarm)
tr'dir.
Prof. Dr. Ahmet Bey ile görüsecegiz.
Daha sonra Arş. (yanlış alarm)
Gör. (yanlış alarm)
Özlem hanım da katılacak bize.
Enflasyonda 1.6 oranında artıs var.

Zemberek’in cümleleme modülü kural tabanlı çalışıyor. Sonuçlardan anladığım kadarıyla URL ve e-posta adresleri hesaba katılmamış.

Apache OpenNLP

OpenNLP’nin  yapay öğrenme yöntemleri ile cümleleme yaptığını hatırlatalım. Aracı Türkçeye uygun olarak eğitmek için elimizde yeteli miktarda manuel olarak cümlelenmiş Türkçe paragraf olması gerekiyor.  Ben maalesef böyle bir veri bulamadım. Bu nedenle aşağıdaki paragrafı burada anlatıldığı gibi, İngilizce için eğitilmiş OpenNlp ile cümlelettim.

Uluslar, bu ekonomik buhran sonucunda 2. Dünya Savaşı’nı yaşamıştır.
Bu sezon kaybedilen maç sayısı 2.(kaçırıldı) Dünya Kupası’na katılma şansı azalıyor.
Cumhuriyetimizin 75.(yanlış alarm)
yılı coşkuyla kutlandı.
Tahta çıkan IV.(yanlış alarm)
Murat emirler yağdırdı.
Uzun zamandır çalışan Ahmet koşuda 2. uzun atlamada ise ancak 4. olabildi.
A. Mehmet YILDIZ size uğradı.
Alfabenin ilk harfi A.(kaçırıldı) Mehmet’e bunu öğretmeniz gerekiyor.
Genel Müdür Mehmet Bey her fırsatta muhteşem!(yanlış alarm)
faaliyetlerini anlatıyor.
Devlet içinde devlet olmuşlar, devlet adına çalışıyorlar, devlet adamlarıyla ahbap çavuşlar.. şu, bu!(kaçırıldı)Cumartesi akşam 5 p.m.’de geldi.
www.cs.hun.edu.tr(yanlış alarm)
okulumuzun web sitesidir.
E-posta adresi bilgi@cs.deu.edu.tr'dir.
Prof. Dr. Ahmet Bey ile görüsecegiz.
Daha sonra Arş.(yanlış alarm)
Gör.(yanlış alarm)
Özlem hanım da katılacak bize.
Enflasyonda 1.6 oranında artıs var.

İngilizce için eğitilmiş olmasına rağmen sonuçlar

Nüve

Nüve ile ilgili ayrıntılı bilgiye buradan erişebilirsiniz. C# projenize nasıl ekleyebileceğinizi ve kod örneklerini ise bu sayfadan görebilirsiniz.

Uluslar, bu ekonomik buhran sonucunda 2. Dünya Savaşı’nı yaşamıştır.
Bu sezon kaybedilen maç sayısı 2.(kaçırıldı) Dünya Kupası’na katılma şansı azalıyor.
Cumhuriyetimizin 75. yılı coşkuyla kutlandı.
Tahta çıkan IV. Murat emirler yağdırdı.
Uzun zamandır çalışan Ahmet koşuda 2. uzun atlamada ise ancak 4. olabildi.
A. Mehmet YILDIZ size uğradı.
Alfabenin ilk harfi A.(kaçırıldı)Mehmet’e bunu öğretmeniz gerekiyor.
Genel Müdür Mehmet Bey her fırsatta muhteşem!(yanlış alarm)
faaliyetlerini anlatıyor.
Devlet içinde devlet olmuşlar, devlet adına çalışıyorlar, devlet adamlarıyla ahbap çavuşlar.. şu, bu!
Cumartesi akşam 5 p.m.(yanlış alarm)
’de geldi.
www.cs.hun.edu.tr okulumuzun web sitesidir.
E-posta adresi bilgi@cs.deu.edu.tr'dir.
Prof. Dr. Ahmet Bey ile görüsecegiz.
Daha sonra Arş. Gör. Özlem hanım da katılacak bize.
Enflasyonda 1.6 oranında artıs var.

Mükemmel değil ama iş görür :)

ITU Pipeline

İncelenen araçlar arasında açık kaynak olmayan tek araç. Dışarıdan erişim için bir web API‘si mevcut ancak şifre talep etmeniz gerekiyor. Deneme amaçlı olarak ise web arayüzünden kullanabilirsiniz.

Uluslar, bu ekonomik buhran sonucunda 2. Dünya Savaşı’nı yaşamıştır.
Bu sezon kaybedilen maç sayısı 2.
Dünya Kupası’na katılma şansı azalıyor.
Cumhuriyetimizin 75. yılı coşkuyla kutlandı.
Tahta çıkan IV. Murat emirler yağdırdı.
Uzun zamandır çalışan Ahmet koşuda 2. uzun atlamada ise ancak 4.(yanlış alarm)
olabildi.
A. Mehmet YILDIZ size uğradı.
Alfabenin ilk harfi A.(kaçırıldı)Mehmet’e bunu öğretmeniz gerekiyor.
Genel Müdür Mehmet Bey her fırsatta muhteşem! faaliyetlerini anlatıyor.
Devlet içinde devlet olmuşlar,(yanlış alarm)
devlet adına çalışıyorlar,(yanlış alarm)
devlet adamlarıyla ahbap çavuşlar.. şu, bu!(kaçırıldı) Cumartesi akşam 5 p.m.’de geldi.
www.cs.hun.edu.tr okulumuzun web sitesidir. (kaçırıldı)E-posta adresi bilgi@cs.deu.edu.tr'dir.
Prof. Dr. Ahmet Bey ile görüsecegiz.
Daha sonra Arş. Gör.(yanlış alarm)
Özlem hanım da katılacak(yanlış alarm)
bize. Enflasyonda 1.6 oranında artıs var.

Görebildiğim kadarıyla İTU Pipeline cümleleri noktalama işaretlerinden ziyade yüklemlere göre belirleme eğiliminde. Bu dil kuralları açısından doğru bir yaklaşım aslında. Mesela “Geldim, gördüm ve gidiyorum.” cümlesini bir Türkçeciye tahlil ettirseniz burada aslında üç cümlenin olduğundan bahseder. Bu nedenle bunu bir hatadan çok bir yaklaşım farklı olarak görmek gerek.

Sonuç olarak bu incelemede kullanılan paragrafın biraz zorlu olduğunu kabul edersek 4 aracında normal metinlerde %90′ın üzerinde bir başarımla çalışacağını söyleyebiliriz.

Türkî Diller için Doğal Dil İşleme Kütüphanesi: Nüve

İnsan dili veya doğal dil günlük yaşantımızdaki en önemli iletişim kanalımız. Bilgiyi doğal dil biçiminde duyarak ya da okuyarak beynimize alır (input) , beynimizde işler (processing) ve yazılı ya da sözlü olarak dışarı aktarırız (output). İletişim organlarımız ile birlikte beynimiz, bu işi mükemmel biçimde yerine getirirken bilgisayarlar doğal dili işleyebilme konusunda henüz emekleme aşamasındalar. Yine de son 10 yıldır günlük yaşantımızda giderek artan biçimde doğal dil işleme tabanlı uygulamalardan istifade ediyoruz. MS Word gibi kelime işlemciler imla denetimi yaparken, Google Translate gibi uygulamalar otomatik çeviri yapıyor. E-posta hizmeti sağlayıcıları e-postalarımızın istenmeyen (spam) olup olmadığını bizim okumamıza gerek kalmadan tespit edebiliyor. Milyonlarca kullanıcının tweet ya da yorumlarını tek tek okumak zorunda olmadan bir ürün, kişi ya da kurum hakkındaki genel kanaati otomatik olarak tespit edebiliyoruz. Okumaya devam et

Linux’ta Toplu Dosya İsimlendirme

Bir klasördeki çok sayıda dosyanın ismini dizisel biçimde 01.txt, 02.txt olarak değiştirmeniz gerektiğinde aşağıdaki komutu kullanabilirsiniz:

find *.txt |
 
gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.txt\n", $0,  a++ }' |
 
bash

-name parametresinden sonraki ‘.txt’ değeri yalnızca txt uzantılı dosyaların isimlerinin değiştirileceğini belirtir.
%04d.txt ifadesi ise 4 haneli olarak, yine txt uzantılı isimler verileceğini belirtir. 0001.txt, 0002.txt gibi.

Mesela uzantısına bakmaksızın tüm dosyaları 2 haneli (dosyalarımızın sayısı 100′den az ise) ve .dat uzantılı olarak isimlendirmek istersek:

find * |
 
gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %02d.dat\n", $0,  a++ }' |
 
bash

Eğer .txt uzantılı dosyalar haricindeki tüm dosyaları html olarak değiştirmek istersek:

find \! -name *.txt |
 
gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %02d.html\n", $0,  a++ }' |
 
bash

Uyarı: Kullanmadan önce mutlaka dosyalarınızın bir yedeğini alın!

Yazıyı bitirirken, bu tür linux komutlarına çok hakim olmadığımı belirteyim. Zaman zaman ihtiyaç duyduğumda bakabilmek için buraya yazıyorum. Umarım sizlerin de işini kolaylaştırır.

Kaynak: http://stackoverflow.com/questions/3211595/renaming-files-in-a-folder-to-sequential-numbers

Java OutOfMemoryError için Netbeans JVM Ayarları

Yaklaşık 650 MB’lık bir text dosyasını okumaya çalışınca aşağıdaki hatayı aldım:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Java sanal makinesi varsayılan olarak 256 MB maksimum bellek ayırıyor. Programınız ihtiyacı bunun üzerinde olunca yukarıdaki hatayı alıyorsunuz. Ancak JVM’ye aşağıdaki komutlarla ilk ve maksimum bellek miktarını belirtebiliyorsunuz.

java -Xmx2048m -Xms256m Okumaya devam et

Visual Studio’da Projeye Gömülü Kaynak Eklemek

C#’ta yazmakta olduğum kütüphane bazı bilgileri dosyadan okuyor. Kütüphanenin dll’ini dağıtırken bu dosyanın da dll’e gömülü (embedded) olmasını istiyorum. Bu tür dosyalara kaynak dosyalar (resources) ismini verebiliriz. Kaynak dosyaların yalnızca okuma yapmak için kullanılabileceğini, yazma yapılamayacağını (readonly) hatırlattıktan sonra bunun nasıl yapılabileceğine geçelim:

1- Öncelikle kaynak dosyayı projeye dahil etmek için  projemize “Resources” isimli bir klasör açalım. Okumaya devam et

Türkçe Fiil Çekimleri Uygulaması

Türkçe fiillerin çekimlerini otomatik üreten bir programı kodlamayı uzun zaman önce düşünmüştüm. O zamandan beri vakit buldukça azar azar geliştirdiğim uygulamanın ilk sürümünü sonunda yayınlayabildim. Uygulama bu hali ile kime ne kadar fayda sağlar bilemiyorum. Ama ileriki sürümlerinin ilk-orta-lise öğrencilerine ve Türkçe öğrenmek isteyen yabancılara yararlı olmasını hedefliyorum. Bu bağlamda sizin de görüş ve önerilerinizi bekliyorum:

http://fiilcek.apphb.com/

Teknik detaylara gelecek olursak:

Uygulama Asp.Net (C#) ile yazıldı ve AppHarbor bulutu üzerinde çalışıyor. Java ve Ruby için de benzer bir platform (PAAS) sağlayan Heroku bulutu var. AppHarbor basit kullanımlarda ücretsiz ve Github, BitBucket gibi ortamlardaki kodunuzu otomatik çekip, derleyip yayınlayabiliyor.

Şimdilik olumsuz çekimler yok, soru çekimleri, edilgen ve ettirgen fiiller yok. Ve bu en sade haliyle bile bir fiil için tam 197 adet çekim dönüyor. Bir de bunları ekleyince arayüzün hala sade ve anlaşılır olmasını nasıl sağlayacağım bilemiyorum :)

Uygulamanın faydalı olması dileğiyle.

Windows Netbeans Maven Türkçe Karakter Problemi

Windows’ta Netbeans ile yeni bir Maven projesi açtığınızda Türkçe karakterlerin doğru görüntülenmediğini farkettim. Yaklaşık 3 saat süren çabalardan sonra bulabildiğim tek çözüm:

System.out.println( "ÇİĞÇŞÜçığöşü--" );

kodunun çıktısı

Ç??Ç?Üç??ö?ü--

şeklinde görünüyor. Aynı şey dosyaya yazma yaparken de geçerli. Görebildiğim kadarıyla bu henüz çözülmemiş bir bug. Sorunun Netbeans’ten kaynaklandığını teyid etmek adına aynı kodu IntelliJIdea ile de çalıştırdım ve sorun olmadığını gördüm. Aynı şekilde linux ortamındaki Netbeans de sorunsuz çalışıyor. Lafı fazla uzatmadan işe yarayan tek çözümü açıklayayım: Okumaya devam et

Türkçe Metinlerin Sınıflandırılması için Deney Ortamı: Prizma

Bundan önceki metin sınıflandırma çalışmamızı kısaca özetleyerek başlayalım. 10 yazara ait 100’er köşe yazısı toplamış bunlardan bir kısmı ile sistemi eğitmiş diğer kısmını ise test için kullanarak köşe yazılarını yazarlarına göre sınıflandırmaya çalışmıştım. Bunun için yazdığım Java kodu her bir yazıdan 13 adet nitelik (attribute) değeri çıkarıyordu. Mesela ortalama kelime uzunluğu, cümle uzunluğu, noktalama işareti kullanım oranı bu niteliklerden bazılarıydı. Sonuçlar ise %95 oranında isabetliydi. Rakamlarla konuşmak gerekirse 10×100 = 1000 köşe yazısından 50×10= 500 adedini eğitim (training) için kullandığımızda kalan 500 yazıdan yaklaşık 475 kadarının hangi yazara ait olduğu doğru şekilde tahmin edilebiliyordu. Okumaya devam et

Bir Metin Sınıflandırma Çalışması

İki yıl kadar önce Doğal Dil İşleme dersi kapsamında yaptığım ve burada paylaştığım metin sınıflandırma çalışmasına devam etme şansı buldum. Aynı dersi alan ve proje arayan bir arkadaşa mevcut çalışmayı ilerletmeyi teklif ettim. O da kabul edip üzerine düşeni yerine getirince bu vesile ile hem Prizma ortaya çıkmış oldu hem de çalışma daha sağlam bir zemine oturdu.

Çalışmanın önceki versiyonunda 10 yazara ait köşe yazılarını, yazarlarına göre sınıflandırmayı denemiş ve %95’e varan bir isabet oranı yakalamıştım. Yeni çalışmamızda yazar sayısını 30’a çıkardık ve her yazar için 40 adet köşe yazısı topladık. Daha sonra 30’a yakın (belki de daha fazla) niteliği test ederek en verimli 19 tanesini tespit ettik. İlk olarak yazıların yarısını eğitim yarısını test (20×20) için kullandık. Daha sonra eğitim için kullanılan yazı sayısını önce 15’e sonra da 10’a düşürdük. Aşağıdaki tabloda da görüldüğü gibi sonuçlarda ciddi bir fark oluşmadı. Buradan hareketle 10 köşe yazısının bir yazarın yazım stilini tanımak için 10 yazı yeterli. Okumaya devam et