Anasayfa » Mühendis Çantam

Doğal Dil İşleme/Yazar Tanıma Projesi

4 Şubat 2013 17.903 views 8 Yorum

which one

Üniversitede yüksek lisans dersi olarak almış olduğum NLP (Natural Language Processing) dersi yani Doğal Dil İşleme dersi için proje yapmam gerekiyordu. Bu konuyla ilgilenenler hocalardan fikir almak istedim ve asistanımız olan Harun Reşit Zafer hocaya gittim. Harun hoca da yüksek lisans yıllarında aynı derste yapmış olduğu Yazar Tahmin Sistemi ile ilgili olan projesini geliştirmeyi önerdi, ben de kabul ettim. Yapacağımız konu Author Categorization, yani Yazar Sınıflandırma. Author Categorization’a Author Prediction da denilmektedir. NLP computer science, artificial intelligence, ve linguistics’in çalışma alanına girmektedir. Author Prediction da Text Prediction’ın bir alanıdır, NLP’nin de alt dalıdır. Amacımız verilen dokümanın karakteristik özelliklerini çıkartmaya çalışarak, daha önceden yazılarını Machine Learning algoritmaları ile tanımış olduğumuz yazarlardan hangisinin bu yazıyı yazdığını doğru bir şekilde tahmin etmek. Popüler bir dal olmaya başlasa bile Türkçe dilde yapılan çok çalışma bulunmamaktadır.

Öncelikle Training ve testing datalarımı toplayarak işe başladım. Hocamın da fikrini alarak 30 yazarın kim olacağını belirleyip bu yazarların 40’ar tane köşe yazısını online olarak topladım.

Yazarlar;

Ahmet AltanAslı AydıntaşbaşAhmet HakanAhmet Turan AlkanAdem Yavuz ArslanBekir CoşkunCengiz ÇandarCüneyt ÖzdemirDücane CündioğluDeniz Ülke ArıboğanEngin ArdıçElif ÇakırGülay GöktürkHaşmet BabaoğluHasan CemalHıncal Uluç, İsmail KüçükkayaMehmet Ali Birand (Rahmetle anıyoruz.), Mehmet BaransuMehmet BarlasM. Nedim HazarMutlu TönbekiciNihal Bengisu KaracaNazlı IlıcakPerihan MağdenRuhat MengiSüleyman ÖzışıkTaha AkyolYasemin ÇongarYılmaz Özdil

 

Var olan projede, 10 tane yazar vardı ve verilen yazının kime ait olduğunu %95 gibi bir doğruluk oranıyla buluyordu. Biz bu sayıyı 30’a çıkarmayı düşündük. Yazar tahmininin yanı sıra cinsiyetin ve yaşın makalelere etkisi olup olmadığını da görmek istedik. Yazarları konuları birbirine yakın olanlardan seçtim, hepsi politik ve güncel olaylar hakkında yazan yazarlardı. Böylece araştırma daha doğru sonuç verecekti. Toplamda 1200 tane makale topladım. Bunlar 30 yazarın 40 tane köşe yazısıydı.

Bu dataset, yazar dataset’iydi. İki tane daha dataset oluşturdum gender ve age için. Gender dataset’im iki klasöre sahipti ve yazarları cinsiyetlerine göre gruplandırdım. Age dataset’im de 3 klasöre sahipti; genç, orta yaş ve yaşlı olarak 3 sınıfa ayırdım. Köşe yazısı yazanlar genellikle yüksek yaşlarda oldukları için 50 yaşından küçükleri genç, 50-65 arasını orta yaşlı, 65’in yukarısındakiler de yaşlı olarak sınıflandırdım. İki dataset’in içlerine de yazar dataset’imde oluşturduğum yazar klasörlerini attım. Sonuç olarak 3 tane dataset’im oldu.Şimdi dataset klasörü oluşturma vaktiydi.

file formatfile format2

Bu klasörün içerisine 30 tane alt klasör koydum, her biri birer yazarı temsil ediyor. Her yazarın içine bulmuş olduğum köşe yazılarını txt formatında koydum. Bu txt uzantılı dosyaların her birine belirli bir format verdim. İlk satır title dediğimiz başlık. Ve sonraki satırlar da yazarın yazdığı içerik. Her bir satır bir paragrafı içeriyor. Her txt’nin adı makalenin yazıldığı tarihten oluşuyor. Bütün yazarların 40 köşe yazısı için bu işlemi yaptım. Bu 1200 tane köşe yazısı demek:) Bilgisayarda kullandığım bütün programların arkaplanını siyah, üstündeki yazıları açık renk yaptım ki gözlerim dayansın diye, çok faydası oldu. Yoksa bitmezdi bu proje, çünkü dünyam dönüyordu 50-60 makaleden sonra:)

Bu tip çalışmalarda WEKA kullanmak şart gibidir. Machine learning algoritmalarını WEKA aracılığıyla kullanabilmek için datalarımızı arff file olarak oluşturmamız gerekir. Biz arff oluşturma işini kendi yazdığımız Prizma adındaki program ile yaptık. WEKA’daki işimizi kolaylaştırmak için bu program yazıldı. Prizma arkaplanda WEKA’yı kullanıyor. Harun hocada büyük bir kısmı hazırdı programın. Prizma programında, kullanıcı dataset’in bulunduğu konumu seçiyor, oluşturulacak arff’ye isim veriyor ve verilen dataların training percentage’ını seçiyor. İsterse sıralarını bozmadan training datalarını alma seçeneği de mevcut. Programdan bir görsellik:

prizma preprocessing

Kodlama kısmında, eskiden yazılmış attribute’ler vardı. Ancak yazar sayısını 3 katına çıkarınca, ve bir de yazar tahmininin yanı sıra yaş ve cinsiyetin etkisini de görmek isteyince bu attribute’lar çok yetersiz kaldı. Doğru yazar tahmini yapmak ve yazarın yazma stilini kavrayabilmek için yeni attribute’ler düşünmeye başladık. Eklenebilir yeni attribute’leri düşündük, bunları deneyip katkısı mı var, etkisiz mi bunları ölçtük. (Ki bu kısım projenin en çok vakit harcayan yeri. ) 30’dan fazla attribute bulduk ve en son olarak optimum olarak 19 attribute‘te karar kıldık. Kullanıcı arff dosyasında sahip olmak istediği attribute’leri seçip işlemi başlatabiliyor. Program training percentage kadar datayı alıp seçilen attribute’leri hesaplayıp arff dosyasına ekliyor. Training’ler bitince test için olan dataları da dosyanın sonuna ekliyor. Böylece klasörler WEKA’da machine learning algoritmaları uygulanmaya hazır hale geliyor. Bu arff oluşturma yapısı şu şekilde işliyor. Verilen dataset location’ına bakıyor. Eğer içinde klasör varsa, klasörleri teker teker alıp hesaplıyor. Eğer sadece dosya varsa bunları data olarak alıyor. Verilen training percentage kadarını training, geri kalanları da test datası olarak kullanıyor. Arff dosyası oluşturmak için kullanıcının en az bir tane attribute seçmesi yeterli.

Şimdi ise test zamanı. WEKA programını kullanabiliriz. Ancak biz WEKA’da sadece kendi kullanacağımız kısımları kendi Prizma programımıza ikinci bir tab olarak ekledik. Şu şekilde görselliği bulunuyor:

prizma experiment

Programımızda WEKA’nın library’sini kullandık. Ve sonuçları da ekrana bastık. Machine Learning algoritmalarını da test ettik, bizim yapımıza en uygun olan Naïve Bayes, Naïve Bayes Multinomial, Sequential Minimal Optimization ve Neural Networks algoritmalarını kullandık. Ekrana ekstradan confusion matrix, doğruluk yüzdeleri gibi işimize yarayacak verileri de ekledik. Confusion matrix hangi yazarları iyi tanıyıp, hangi yazarları benzettiğini gösterdiği için, sınıflandırmada çok işe yaramaktadır. Bir tane confusion matrix örneği göstereyim hemen:

Confusion Matrix

19 attribute belirleyene kadar çok uğraştık. Kaç gecemi sırf bu özellikleri tek tek test etmek için harcadım hiç sormayın. Bir özellik katkı sağlamayınca tüm uğraş boşa gidiyor, kötü oluyor insan:)

Kullandığımız attribute’ler ve ne olduklarını açıklayacak olursak;

Ortalama paragraf uzunluğu (Boşluklu): Yazıda bulunan tüm paragrafların ortalama uzunluğu
Ortalama paragraf uzunluğu (Boşluksuz): Yazıda bulunan ve boş olmayan paragrafların ortalama uzunluğu
Ortalama cümle uzunluğu: Yazıdaki tüm cümlelerin uzunluklarının ortalama uzunluğu
?Fakat? ve “Ancak” kelimelerinin sayısı: Yazıdaki “fakat” ve “ancak” kelimelerinin sayısı
Boş paragraf yüzdesi: Boş paragraf sayısının tüm paragraf sayısına oranı
Birinci tekil kişi sayısı: Birinci tekil kişi ile çekimlenmiş cümle sayısı
Başlığın uzunluğu: Başlığın kaç karakterden oluştuğu
Kaç adet sayı içerdiği: Yazıda kaç adet sayı bulunduğu
Kaç adet paragraf içerdiği: Yazıda bulunan paragraf sayısı
Özel isim yüzdesi: Yazıdaki özel isim sayısının tüm kelime sayısına oranı
Yıldız işareti(*) yüzdesi: Yazıdaki yıldız işareti sayısının tüm noktalama işaretlerine oranı
Nokta (.) yüzdesi: Yazıdaki nokta sayısının tüm noktalama işaretlerine oranı
Virgül işareti(,) yüzdesi: Yazıdaki virgül işareti sayısının tüm noktalama işaretlerine oranı
Başlıktaki noktalama işareti sayısı: Yazının başlığında bulunan noktalama işareti sayısı
Çizgi (-) sayısı: Yazıdaki çizgi sayısının tüm noktalama işaretlerine oranı
Çift tırnak işareti(“) yüzdesi: Yazıdaki çift tırnak işareti sayısının tüm noktalama işaretlerine oranı
Üç nokta işareti(?) yüzdesi: Yazıdaki üç nokta işareti sayısının tüm noktalama işaretlerine oranı
Ünlem işareti(!) yüzdesi: Yazıdaki ünlem işareti sayısının tüm noktalama işaretlerine oranı
Soru işareti(?) yüzdesi: Yazıdaki soru işareti sayısının tüm noktalama işaretlerine oranı
Noktalama işaretleri yüzdesi: Yazıdaki noktalama işaretlerinin tüm harf ve sayıların toplamına oranı
Noktalı virgül işareti(;) yüzdesi: Yazıdaki noktalı virgül işareti sayısının tüm noktalama işaretlerine oranı
Stopword yüzdesi: Yazıda bulunan alt başlık sayısının toplam kelime sayısına oranı
Altbaşlık yüzdesi: Yazıda bulunan alt başlık sayısının toplam paragraf sayısına oranı
Undefined word yüzdesi: Yazıdaki tanımlanmamış kelimelerin toplam kelime sayısına oranı
“Neden”, “Niçin” ve “Niye” kelimelerinin sayısı: Yazı içerisinde geçen “neden”, “niçin” ve “niye” kelimelerinin sayısı
Başlıktaki kelime sayısı: Yazının başlığında bulunan kelime sayısı
Ortalama kelime uzunluğu: Yazıdaki kelimelerin uzunluğunun ortalaması
Kelime uzunluklarının varyansı: Yazıdaki kelimelerin uzunluğunun varyansı

Özelliklerin çoğunu oran olarak tuttuk. Hem daha doğru olacağını düşündük, hem de ileride tüm makale değil de yazının bir parçası bile verilse daha doğru sonuçlar almayı düşündük. Ancak yine de bazı ölçümler için sayı önemliydi, mesela kaç paragraf yazdığı, yazıların uzunluğu büyük bir ayırt edici özellik. Veya başlığın uzunluğu..

Training ve testing dataları için 4 çeşit oran denedik.

? 75% training, 25% testing
? 50% training, 50% testing
? 37.5% training, 62.5% testing
? 25% training, 75% testing

Bir yazarı tahmin etmek için elimizdeki dataların ne kadar fazlasını trainin olarak kullanırsak o kadar daha iyi tanıyoruz demektir. Ancak biz en düşük miktarda trainingle tahmin yaptık. Amacımız olabilecek en küçük training’le yazarı tanıyabilmekti. Sonuçlar aşağıdaki tablodaki gibidir:

Author Result

 İlk kısımdaki “30×10, 20×20…” gibi değerlerin ilk kısmı training ikinci kısmı testing datanın sayısı. Mesela 30×10 demek, bir yazarın 40 köşe yazısının 30 tanesini training, 10 tanesini testing olarak kullandık demek. Bu da %75 training percentage’a denk gelmektedir. Sizlerin de sonuçtan göreceği gibi, 15 tane makaleyi training olarak kullanmakla 30 tane makaleyi training olarak kullanmak arasında çok büyük bir fark yok. Bu bize attribute’lerin iyi çalıştığını gösteren bir başka delil. 10 tane köşe yazısı bile yazarı tanımama yetmişse, bu iyi bir sonuçtur.

Yazar tahmini için doğru  tahmin etmek önemlidir ama yeterlidir de. Ancak gender ve age için durum biraz daha farklı. Arff dosyası oluşturmak için dataset location’ıma gender için olan dataset’imi seçtim ve sonuçları onda da test ettim. Sonuçlara baktığımda onlar da %70-%80 civarında değişen bir yüzdeye sahipti. Gerçekten cinsiyete göre mi ayırdığını, yoksa gruplandırıp mı yaptığını anlamak için 4 tane fake gender dataset‘i oluşturup sonuçlara tekrar baktım. Bu işlemi üç kere yaptım. İlk denemede sırayı koruyarak yaptım. İkinci ve üçüncüde trainingleri sıradan değil randomly seçtim. Sırayı koruyarak yaptığım sonuç şu şekildeydi:

fake_dataset

Randomly olan ikinci ve üçüncü denememin sonuçları ise şöyleydi:

fake_dataset_2_randomly
fake_dataset_3_randomly

 Sonuçlara baktığımız zaman, çok da fark olduğu söylenemez. Bundan çıkarılacak sonuç da, cinsiyetlerine göre gruplandırdığımız insanları bir kişi gibi düşünüp, onları tanımaya çalıştığıdır. Age için de denediğimiz zaman, o da 3 gruba ayırıp gruptakileri tanımaya çalışmaktadır diyebiliriz. Demek ki cinsiyet için projeyi daha çok geliştirip ona göre attribute’ler eklemek gerekir. Ama yine de az bir farkla bile olsa original dataset daha yüksek yüzdeye sahip. Bu da bayan yazarların birbirlerine daha benzer, erkeklerin de kendilerine daha yakın yazdığı gerçeğini az da olsa destekliyor.

Son olarak şunları ekleyeyim: bir text categorization çalışmasında en önemli kısım attribute belirlemekmiş ve testing kısmı gerçekten çok zaman alıyormuş, bunu gördüm. Bazı attribute’lerde (mesela Zemberek kullanarak yapılanlarda) execute süremiz çok arttığı ve sonuç olarak çok da aşırı bir artış göstermediğini gördük. Zaman da çok önemli bir etken, bu da kesinlikle hesaba katılmalı. Trade-off’ları iyi ayarlamalı. En son olarak da, hiç bilgim olmayan bir konuda başladığım bu çalışmada bana destek olan Harun Reşit Zafer hocama emeklerinden dolayı çok teşekkür ederim.

Bu çalışmam için yazmış olduğum article’ın pdf’ine şu linkten ulaşabilirsiniz (Dili ingilizcedir): ZiynetNesibe-Author_Prediction_for_Turkish_Texts.pdf

NOT: Linke tıkladığınız zaman pdf’in açılması gerekiyor. Eğer açılmıyorsa, Google Chrome’a “Doküman, PDF/PowerPoint Görüntüleyici” eklentisini ekleyip deneyiniz.

Prezi’deki sunumum da bu linkte: Prezi NLP Project Presentation

Web uygulaması linki de bu: PrizmaDemo. Siz de köşe yazısı yapıştırıp projeyi deneyebilirsiniz. (Linki açtığınız zaman sağ tarafta bulunan yazarlara tıklayarak, makalelerine ulaşabilirsiniz.)

Şimdilik hoşçakalın..

Ziynet Nesibe

8 Yorum »

  • Bir Metin Sınıflandırma Çalışması | Harun Reşit Zafer dedi ki:

    […] Nesibe?ye katkılarından dolayı teşekkür ederim. Başta belirttiğim gibi çalışmanın bu bölümü aynı zamanda kendisinin bir yüksek lisans doğal dil işleme dersi için hazırladığı […]

  • NLP / Author Prediction | Ziynet Nesibe dedi ki:

    […] everyone, I have explained my NLP project in detail here. However, some friends sent me an e-mail about that they do not know Turkish, so they do not […]

  • Betül Aslan dedi ki:

    Merhaba, bende bitirme projemde buna benzer bir konuyla ilgileniyorum. Belirli bir sınıflar oluşturdum. Weka’yı bu şekilde eğittim fakat bundan sonrasıyla ilgili bir kaynak bulamıyorum belki yardımcı olabilirsiniz. Verdiğim, Weka’yı eğittiğim sınıflara göre artık bir metin verdiğimde o metnin sınıfını direk olarak Weka söylesin istiyorum. Weka’nın Api’ini kullanmam gerektiğini öğrendim sadece fakat nasıl yapacağım hangi adımları izleyeceğim bilmiyorum. Yardımcı olursanız sevinirim.İyi çalışmalar…

  • BitirmeTalihsizi dedi ki:

    Öncelikle cok güzel bir çalışma ortaya çıkarmışsınız tebrikler.
    Projenizin kodlarını herhangi bir yerde paylaştınız mı?
    Bu konu ile ilgili kaynak bulmak gerçekten cok sıkıntı.Önerebileceğiniz bir video kanalı bir web site veya açık kaynak örnek projeler varmı??
    İyi günler…

  • Ziynet (admin) dedi ki:

    @BitirmeTalihsizi hrzafer.com sitesinde projeyle ilgili farklı konular da bulabilirsin. Sitede projeyi test etme imkanı vardı, hala var mı bakabilirsin.
    Kolaylıklar

  • erdem dedi ki:

    Öncelikle sizlere(harun reşit bey de dahil) çok teşekür ederim.Yaptığınız çalışmayı anlattığınız ,paylaştığınız için.
    Ben branş(bilgisayar) olarak sizinle aynı meslek grubundan değilim.Ancak sormak istediğim bazı sorular var,cevaplarsanız sevinirim.
    1.Sizinde zorluğunu belirttiğiniz üzere bir çalışmada özelliklerin neler olacağını belirlemek,test etmek oldukça zor ve bir kaç disipline birden hakim olmak gerektiğini düşünüyorum. Bu attribute/özellikleri siz nasıl belirlediniz? harun reşit beyin yapmış olduğu çalışma size bir altlık olmuş muhakkak.Ancak literatürde daha önce yapılmış ve bir şekilde denenmiş olan özellikleri bulabileceğimiz bir kaynak varmı?
    2.Benim kafamda yapmak istediğim bazı planlarım var.Örneğin bir işletmenin ürünlerine bakarak(sattığı,ürettiği,ithal ettiği,ünvanından) onun faaliyetini/ait olduğu sektörü belirlemek istiyorum.Bu durumda sizin yapmış olduğunuz çalışmada olduğu gibi özellikleri nasıl belirleyeceğim.

    3.Kişilerin/deneklerin/anket uygulanan bireylerin sorulara vermiş oldukları cevaplara göre mesleklerini,siyasi görüşlerini,devlet mi özel demi çalıştıklarını belirleyecek bir çalışma yapmak istesem bunları nasıl sınıflandıracağım/kümeleyeceğim? Hangi mesleğe ait olduğunu hangi özelliklerle atayacağım?
    4.Anket firmaları kişilere anket uygularken ne iş yaptıklarını soruyorlar(genelde kategorik sorular) onların vermiş olduğu ve seçenekte olmayanları,açık açık yazıyorlar.Ben bu text olan alanı kullanarak bu kişilerin yapmış oldukları işlerin hangi meslek grubuna girdiğini nasıl belirleyebilirim.Bunları belirlerken ayırt edici özellikleri nasıl belirleyebilirim?

    Genel olarak bunların mutlaka literatürde yeri vardır.Ancak internette çok aramama rağmen bulamadım.(ingilizce eksikliğide bir etken tabi).

    Bu konularda yardımcı olabilirseniz sevinirim.

  • gizem dedi ki:

    merhaba bu konu ile ilgili görüşebilirimiyiz ? gisem_bngl@hotmail.com

  • Tugba dedi ki:

    Ayrıntılı anlatım için teşekkürler 🙂

Yoruma Açığız! :)

Be nice. İçeriği çirkin olmadığı sürece her yoruma, öneriye ve soruya "evet" :)

Etiketler: , , , , , , , ,