Perşembe, Ağustos 29, 2019

FastText ile hızlı metin sınıflandırma - 1

 

 

 Girizgah :

Önce bu konuya nerden girdik ondan bahsetmek istiyorum. Blogda duyuru şeklinde yazmamış olsamda Linkedin hesabımdan beni takip edenler biliyor ki artık bir dökümcü değilim. 2016 yılı Temmuz ayın dan beri Sefamerve.com un ArGe kısmında çalışmaktayız. Bu yılın başından beride bölümümüz ArGe merkezi statüsüne kavuştu. "Bir dökümcü ve bir simitçiyle"  başlayan macera bizi nerelere götürecek ? Kısmetimizde ne tür vavlar çizmek var göreceğiz bakalım...

2017 yılında metin sınıflandırma ile ilgili bir ihtiyacımız oldu. Bu konu daha öncesinda tecrübemizin olmadığı bir alandı.  Hızlıca bu problemi nası çözeriz diye araştırır ken FastText'e ulaştık. Çokda beğendik. O zamanlar sadece komut satırından program olarak çalışan hali yayınlanmıştı. Kullanımını kolaylaştırmak için üzerine çala kalem bir GUI yazdık ve kendi işlerimizde kullandık.

FastText i kullanarak makale çalışmasıda yaptık. Deniz Kılınç hocamızın yayınladığı TTC-3600 veri seti üzerinde bir uygulama yaptık. Bu konuda Deniz hocamızın zaten öncesinde yaptığı çalışmalarda vardı. Makalede ismi geçmiyor olsada emekleri büyüktür, teşekkür ederiz. Bu makaleyi biz Japonyada Tokushima üniversitesinde düzenlenen NLPIR 2019 konferansına yolladık ve kabul aldık. Yakın zamanda da makalemiz  ACM (Association for Computing Machinery) Digital Library altında  yayınlandı.

"An automated new approach in fast text classification (fastText): A case study for Turkish text classification without pre-processing"

FastText:

Uzunca girizgahdan sonra esas konumuza dönüyoruz.  Elimizde pek çok Yapay Öğrenme  - Makine Öğrenmesi - algoritması var. Fakat Bu metodların hepsi sayılar üzerinde çalışıyor. Doğal Dil İşleme üzerinde ki ana problem de burda başlıyor. Metin verisini nasıl sayısallaştırabiliriz ?  Kelime bazlı, harf bazlı yada bunların gurupları -ngram-  şeklinde yaklaşımlar olmuştur.  Kategorik dönüşüm şeklinde ilk akla sistemdir. Kelime sayısının çok büyük olmasıyla devasa vektör uzunluklarıyla sonuçlanabilir.

Sonra Kelime vektörü - word2vec - denen bir kavram çıkmış ortaya.  Her kelime için sabit uzunlukta bir vektör kullanmak. "Birlikte geçen kelimeler anlamca yakındır" var sayımından yola çıkılıyor.  Başlangıçda aynı yapay sinir ağlarındaki gibi kelimeler için rastgele seçilmiş vektör değerleri atanıyor. Devasa derlem - corpus - kullanarak danışmansız şekilde - unsupervised - her kelime için birlikte geçtiği kelimelere göre bu vektörler güncelleniyor. Bu öğrenme sürecinin iki ana şekli var. CBOW ve skipgram 

bu iki yapının şematik gösterimi şöyle




cbow da  hedef kelime vektörüne  o kelimenin etrafında geçen kelimelerin vektörlerinin toplamıyla ulaşılmaya çalışıyor ve bu hedef doğrultusunda vektörler güncelleniyor
skipgramda ise tersine hedef kelimeyle birlikte geçebilecek kelime yada kelime ngramlarına ulaşılmaya çalışıyor ve bu hedef doğrultusunda vektörler güncelleniyor


Bir rivayete göre cbow daha hızlı eğitilir ve  sık geçen kelimeleri daha iyi temsil eden vektörlere ulaşabilir. Skipgram  eğitim veriniz az da olsa iyi çalışır, nadir geçen kelimeleri bile yeterince iyi temsil edebilecek vektörlere ulaşabilir.

Eğitim sonucunda vektör uzayında benzer anlamlara gelen kelimeler yakın yerlerde kümelendiği gibi
kelime vektörleri uzayında yapılan işlemler de anlammı sonuçlar verebilmektedir. Meşhur örnekler


Erkek kelimesinin vektöründen Kral keliimesinin vektörünü çıkarıp Kadın kelimesini ilave edine ulaştığımız vektörel değer Kraliçe kelimesinin vektörel kaşılığına ulaşıyor



yada ülkeler ve başkentleri arasında  böyle bir vektörel ilişki görülebiliyor. 

Kelimelerin bu tür anlamsal bağ  içeren vektörel dönüşümleri elbette doğal dil işleme için elbette çok önemlidir.

Word2vect metodu  2013 yılında googleda  Mikolov un liderlik ettiği bir gurup tarafından yapılmıştır. Sonrasında Mikolov  Facebook a geçmiş ve FastText bir anlamda bu metodun daha gelişkin halidir.
Temel üstünlüğü kelimeleri  harf engramları olarakda görebilmesinden gelmektedir. Halen geliştirilmeye devam edilmektedir. FastText in detayları için aşağıdaki makaleleri incelemenizi tavsiye ederiz.


Epeyde teoriden bahsetmişiz gelelim pratiğe.  FastText in "supervised" kısmıyla çok başarılı Metin sınıflandırma işleri yapabiliyorsunuz.  Hemde küçük harfe dönüştürmek dışında hiç bir ön işlem yapmadan mümkün oluyor. GPU istemiyor. GPU nuz olsa bile RNN bazlı sistemlere göre çok çok çok daha hızlı eğitiliyor.

Bu yazıy burada noktalayalım bir sonraki yazımızda örnek  uygulama yapacağız. Her türlü görüş ve önerilerinizi bekleriz.

Hiç yorum yok: