Yazının devamını daha iyi anlayabilmeniz için bazı kavramları açıklamakta fayda var.

Named Entity Recognition, metinlerden bilgi çıkarımı anlamına gelmektedir. Daha ayrıntılı bilgi için bu bağlantıyı inceleyebilirsiniz.

Stanford NER, Stanford Üniversitesinin NLP topluluğu tarafından geliştirilen CRF tabanlı bir NER aracıdır ve Java’da yazılmıştır.

Bu yazıda Stanford NER kullanarak Ruby’de verilen metinden Türkiye’deki şehirleri çıkarabilen bir Named Entity Recognition’ı nasıl geliştirdiğimi anlatmaya çalışacağım.

Proje için gerekli kurulumlar

  • Java 1.8 veya daha yüksek bir sürüm
  • Ruby

Stanford NER’i şu şekilde indirelim ve zip’ten çıkartalım. Sonrasında Ruby tarafında kullanacağımız gem’leri kuralım

Yapacağımız proje genel olarak iki aşamadan oluşuyor. İlk aşama NER için sınıflandırıcının oluşturulması. İkinci aşama ise oluşturduğumuz sınıflandırıcıyı bir metin ile test edilmesi.

İlk Aşama

NER için sınıflandırıcıyı oluşturabilmemiz için gerekli etiketlemelerin yapıldığı bir veri seti gerekiyor. Bu veri setinin belli bir şablonu var. Bu şablon boşluk ile ayrılmış her kelimenden sonra tab karakteri gelir sonra da entity’nin ismi gelir. Bir sonraki kelime için de aynı şekilde bir alt satıra yazılır ve bu şekilde devam eder.

Yukarıdaki görselde bu şablonu nasıl olduğunu görebilirsiniz. Veri setini bu şablona uygun olarak manuel olarak da hazırlayabilirsiniz fakat biz internetteki verilerden faydalanarak veri setini oluşturacağız. Bu aşamada Web Scraping olarak adlandırılan en basit tabirle Web üzerindeki verirlerin işlenmesi konusuna giriyoruz.

Web Scraping için Nokogiri adlı gem’i kullanacağız.

İlk olarak bir web sayfasından bütün şehirlerin listesini alalım. Bunun için gerekli tanımlamaları yapıp ardından bu listenin yer aldığı web sayfasını open-uri ile erişiyoruz daha sonra nokogiri ile ayrıştırıyoruz. Daha sonra bu ayrıştırılmış web sayfasından CSS Selector tanımlamaları ile şehir isimlerinin yer aldığı bu cümleleri alıyoruz. Ardından birkaç string filtreleme işlemi ile şehir isimlerini bir diziye kaydediyoruz.

Bu aldığımız cümleleri ilk olarak kelimelere ayırıyoruz. Ardından kelimeleri şehirlerin isimlerinin bulunduğu dizi üzerinden bir karşılaştırma yaparak tsv uzantılı bir dosyaya kaydediyoruz. (Stanford NER’in veri seti şablonuna uygun olarak) Son olarak oluşturduğumuz veri seti ile sınıflandırıcıyı Stanford NER’in sağladığı CLI API’sini Ruby içerisinden çağırarak oluştururuz. java kodunu çalıştırırken kullanacağı bellek miktarı parametre olarak geçebiliyoruz. Bu proje için 1000 Mb fazlasıyla yeterli olacaktır ama daha büyük veri setleri için bu rakamı artırabilirsiniz. classifier.prop dosyasında ise oluşacak sınıflandırıcının ismi ve kullanılacak veri setinin ismi gibi gerekli ayarlamalar mevcut.

Bu işlemin ardından city-classifier.ser.gz adlı sınıflandırıcımızı oluşturmuş olduk.

İkinci Aşama

Oluşturduğumuz sınıflandırıcıyı test etmek için bir text dosyası oluşturduk. Ardından oluşurduğumuz sınıflandırıcıyı test ettik. Çıktı dosyanının formatı olarak slashTags , inlineXML , xml , tsv ve tabbedEntities seçeneklerinden birini seçebilirsiniz.

Bu işlemin ardından verdiğimiz input.txt’den output.txt dosyasını oluşturmuş olduk. Çıktı dosyasını incelersek Konya’yı başarılı bir şekilde bulduğunu görebilirsiniz. Veri setinizdeki örnekleri çoğaltarak ve farklı entity’ler ekleyerek daha kapsamlı Named Entity Recognition geliştirebilirsiniz. Eğer projenin tamamını incelemek isterseniz şuradan kodlara ulaşabilirsiniz.

Emre Durukan

Teknoloji Meraklısı

emredurukn

emredurukn


Published