ML.NET kullanarak çoklu dil sınıflandırma

Veri kümesinin hazırlanması

Veri kümemizi oluşturmak için Wikipedia sayfalarını kullandım. Bu blog yazısı için python üzerinde bir script dosyası hazırladım. Python üzerinde bulunan wikipedia kütüphanesi ile istenilen sayfaların içeriğini çekerek bunları test ve eğitim kümesi olarak ayırıyorum. Ben bu makale için üç dil seçtim; Türkçe, İngilizce ve İspanyolca. Bu her üç dil için neredeyse aynı oranda başlık seçmeye çalıştım. Bu script dosyası ile önceden belirlemiş olduğum sayfaların içeriklerini alıp python nltk (natural language toolkit) kütüphanesini kullanarak cümlelere bölüyorum. Ve ardından 1/4 oranında test/eğitim verilerimi ayırıyorum. Eğer veri kümesini genişletmek istersek script dosyamıza yeni makaleler ekleyebiliriz. Örneğin;

titles.append((“Mustafa Kemal Atatürk”, “tr”))
titles.append(("Pablo Picasso", "es"))
titles.append(("Abraham Lincoln", "en"))
tr Cumhuriyet Dönemi Türkiye Ansiklopedisi.
es Picasso finalizó el poema en seis actos...
en Native Americans were also often...

Modelin hazırlanması

Sıra modelimizi hazırlayamaya geldi. Ben bu makaleyi ML.NET 0.5.0 versiyonu ile hazırlamaya başlamıştım ancak 0.6.0 versiyonunda eski API’ların hepsi Legacy namespace’inin altına taşınarak yeni yapıya geçince, ben de bu yeni halinin oturmasını bekledim ve sonunda 0.9.0 versiyonu ile birlikte kodumu yeniden düzenleyerek makaleme devam edebildim.

Pipeline ve Model

Hazırlamış olduğumuz verileri ML.NET API tarafından tanıtmamız gerekiyor. ML.NET temel olarak bir ana sınıf ile ilerliyor o da MLContext sınıfı, bu sınıf ile birlikte verilerimizi tanımlıyoruz.

  1. Öncelikle, “Label” değişkeni string kabul edilmemekte bu yüzden onu ML.NET içerisinde bulunan KeyType tipine çeviriyoruz. MapValueToKey(“Label”)
  2. Daha sonra verilen cümlelerdeki özel karakterleri/büyük küçük harfleri kaldırıyoruz (normalize) ediyoruz. NormalizeText(“Sentence”, “NormalizedSentence”). Burada yakalanması gereken nokta, normalize edilmiş veri artık “NormalizedSentence” olarak adlandırılması.
  3. Burada ML.NET’in bir özelliği olan FeaturizeText methodunu kullanacağız. Verilen text değerini n-gramlara ayırmakta, örneğin 2-gram için “merhaba” kelimesini “me”, “er”, “rh”, “ha”, “ab”, “ba”. Şeklinde ayırıp bir dizi oluşturmaktadır. Burada dikkat edilmesi gereken nokta pipeline üzerinde ML algoritması verilmeden önce “Features” alanının oluşması lazım. O yüzden bu methottan çıkan değere “Features” ismini veriyoruz.
  4. Sıra ML algoritmasını seçmekte, ben Naive Bayes algoritması ile devam edeceğim.
  5. En son olarak da yaptığımız tüm bu iş hattından çıkan KeyType tipindeki sonucumuzu “Label” da ki değerlere geri çeviriyoruz.
Predicted language es

Modelimiz ne kadar başarılı oldu ?

Sıra modelimizi değerlendirme sürecine geldi. Veri kümesinin hazırlanması kısmında gerçek verinin 1/4'ünü bu aşama için ayırmıştık.

Model quality metrics evaluation
— — — — — — — — — — — — — — — — — — — — —
Accuracy Macro: 0.985645367576614
Getting @NetflixES's recent tweets..
Last 78 tweets from 80 are in 'es' class
Getting @netflix's recent tweets..
Last 116 tweets from 121 are in 'en' class
Getting @netflixturkiye's recent tweets..
Last 53 tweets from 56 are in 'tr' class

Sonuç

Bu yöntem ile metinleri belirli özniteliklere göre sınıflandırabilirsiniz. Son olarak bu makaledeki kaynak koda aşağıdan ulaşabilirsiniz.

Kaynaklar

http://www.diva-portal.org/smash/get/diva2:839705/FULLTEXT01.pdf

--

--

ITU. CE. LCWaikiki www.alimozdemir.com

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store