iOS Geliştiriciler için Makine Öğrenmesi 2.Bölüm: CreateML ile Yazı Sınıflandırma

Apple doğal dil işleme tekniklerini iOS’da çeşitli yerlerde kullanıyor. Doğal dil işleme sayesinde hatalı metinler otomatik düzeltiliyor ve Siri ne demek istediğimizi tahmin ediyor. Apple’ın 2018'deki geliştirici konferansında duyurduğu CreateML aracıyla artık geliştiriciler de kendi dil işleme modellerini kolaylıkla eğitebiliyorlar.

Yazı dizisinin ilk bölümünde CreateML kullanarak görüntü sınıflandıran bir uygulama geliştirmiştik bu yazıda ise Türkçe haberleri sınıflandıran bir uygulama geliştireceğiz.

Yazı sınıflandırma; doğal dil işleme tekniklerinden faydalanarak yazıları kategorilere ayırmamızı sağlar. Bu yöntemle spam mesajlarını ayırt edebilir, tweetler üzerinde duygu analizi (pozitif, negatif, nötr vb.) yapabilir ve Github issuelarını kategorize edebiliriz.

Yeter ki elimizde yeterince yazı ve ve bu yazıların kategorileri olsun herhangi bir yazıyı sınıflandırabiliriz. Yazının yazarını tespit edebilir, firmaların en çok şikayet alan ürünlerini bulabilir ve yazıda geçen varlıkları (insan isimleri, yerler, organizasyonlar vb.) tespit edebiliriz. Burası hayal gücünüze ve veri toplama yeteneklerinize kalmış. Sky is the limit.

https://developer.apple.com/documentation/createml/creating_a_text_classifier_model

Yazılım ve makine öğrenmesi dünyasında en son çıkan araçları takip etmek çok önemli. Çok uğraştığınız bir işi kolaylıkla yapmanızı sağlayacak yeni bir araç çıkmış olabilir ne kadar erken haberdar olursanız o kadar iyi.

Bu yazıda, geliştiricilerin kolaylıkla makine öğrenmesi modelleri eğitmesini sağlayan CreateML’i kullanacağız. CreateML macOS 10.14 ve üzeri işletim sistemlerindeki Xcode Playground’ları üzerinden kullanılabiliyor. Basit bir örnek üzerinden bu aracı inceleyelim.

Hemen Kodlamaya Geçelim!

Xcode’u açalım ve MacOS şablonunda boş bir Playground oluşturalım.

CreateML ve Foundation kütüphanelerini import edelim.

Eğitim Verisi Kullanımı

Burada veri seti olarak Deniz KILINÇ hocanın TTC-3600 isimli veri kümesi kullanılacaktır. Hocamızın Uygulamalarla Veri Bilimi kitabı da yayınlanmış kitabın tüm gelirleri de Lösev’e gidecekmiş, buradan hayırlı olsun diyelim:)

Veri seti; 6 kategoriyi (ekonomi, kültür-sanat, sağlık, siyaset, spor ve teknoloji) içerip her kategoride 600 haber olmak üzere toplam 3600 dokümandan oluşmaktadır. Veri setindeki bu haberler, Mayıs-Temmuz 2015 tarihleri arasında, 6 tanınmış haber portalının Rich Site Summary (RSS) özet akışlarından elde edilmiştir.

TTC-3600 Örnek Dokümanlar

Veri setini buradan indirebilirsiniz. İndirdikten sonra, klasör yolunu aşağıdaki gibi URL nesnesine parametre olarak geçirelim. Burada elle yazmak yerine tırnak işaretlerinin arasına veri klasörünü sürükleyip bırakabilirsiniz, Xcode otomatik olarak yolu yazacaktır.

CreateML iki şekilde direkt veri okuyabiliyor. Klasörlenmiş formatta ve de CSV, JSON gibi formatlarda.

Klasörlenmiş dokümanları okumak için aşağıdaki gibi bir URL nesnesi oluşturuyoruz. Bu şekildeki kullanımda CreateML klasörleri kategori olarak algılıyor.

CSV veya JSON formatındaki veriyi ise aşağıdaki gibi okuyabiliyoruz. Bu formatlarda labelColumn olarak kategori kolonunu, textColumn olarak da veri kolonunu belirtmemiz gerekiyor.

Not: Bu dosya formatlarda ilk satırı başlık olarak okuyor bundan dolayı verinizde kolonların başlıkları yoksa bunu eklemelisiniz.


Makine Öğrenmesi Modeli Eğitimi

Yazı tipinde verileri sınıflandırmak için Apple MLTextClassifier adında bir model sağlıyor. MLTextClassifier 57 dili destekliyor. Türkçe de bu diller arasında. Bu modeli eğiterek cümle, paragraf veya dokümanları sınıflandırabiliyoruz.

Model gözetimli öğrenme ile çalışıyor bu yüzden verilerinizin etiketlenmiş (hangi yazının hangi kategoriye ait olduğu) olması gerekiyor. “Gözetimli öğrenme de nedir?” diyorsanız buradan buyrun.

Modeli eğitmeye başlamak için aşağıdaki kodu çalıştırmanız yeterli.

Default değerlerle modeli eğitmek için yukarıdaki satır yeterli ama modeli özelleştirmek ve bazı parametrelerle oynamak istiyorsak aşağıdaki gibi kullanıyoruz. Mesela Türkçe diline göre bir model oluşturmak için aşağıdaki gibi language parametresini belirtmemiz gerekiyor. Apple CreateML üzerinde çok az parametreyi değiştirmemize olanak sağlıyor ve metin sınıflandırıcı olarak sadece iki algoritmayı destekliyor: maksimum entropi ve koşullu rastgele alanlar (‘conditional random field’) algoritmaları.

Apple, daha özelleştirilmiş modeller için biraz daha alt seviyeye inip bir Python kütüphanesi olan TuriCreate kütüphanesini kullanmamızı öneriyor. Apple makine öğrenmesi ve yapay zeka alanında çalışan Turi firmasını 2016 Ağustos’ta satın aldı ve 2017 Aralık’ta TuriCreate’i açık kaynak haline getirdi. Bu aracın kullanımını başka bir yazıda anlatacağım.

Eğitim için kodun solunda çıkan mavi butona basalım. Bu aşamada aşağıdaki panelde eğitim ile bilgileri anlık olarak görebiliriz. Eğitim bittiğinde model satırının yanındaki bölümdeki yuvarlak butona butona basarak model eğitim sonuçlarını görebiliriz.

CreateML default olarak eğitimden önce verinin %5'ini doğrulama verisi olarak ayırır. Doğrulama verisi eğitime dahil edilmez bu şekilde modelin daha önceden görmediği veri üzerinde de başarılı çalışması hedeflenir. Doğrulama başarımı yüksek olacak şekilde model eğitilir ve yeterince yüksek olduğunda eğitim otomatik olarak durabilir. Doğrulama verisi üzerindeki başarım modelin bilgiyi ne kadar iyi genelleştirdiğini gösterir. Aşağıda görüldüğü gibi eğitim verisi üzerinde %99.97 başarım sağlanırken doğrulama verisi üzerinde %93.92 başarım sağladık.

Model eğitilirken süreci aşağıdaki gibi izleyebiliyoruz.

Bu eğitimde 5 adımlık bir eğitim sadece 4.48 saniye sürüyor.

Model Eğitim Süreçleri

Eğitimden önce bazı ön işlemler (pre-processing) otomatik olarak yapılıyor. Bu aşamada yazıdaki imla işaretleri temizleniyor ve tokenlara ayrılıyor (tokenization).

https://nlp.stanford.edu/IR-book/html/htmledition/tokenization-1.html

Burada öznitelik çıkarımı ve eğitim için Apple fazla bir detay vermiyor ama arka planda TuriCreate kütüphanesini kullanıyor. TuriCreate’in yazı sınıflandırıcısı ise iki bileşenden oluşuyor: öznitelik mühendisliği (feature engineering) ve istatiksel modelleme.

Öznitelik mühendisliği aşamasında Kelime/Sözcük Çantası(bag-of-words) dönüşümü yapılarak kelimelerin frekansları bulunuyor.

https://apple.github.io/turicreate/docs/userguide/text/analysis.html

İkinci aşamada ise yukarıdaki öznitelikler kullanılarak bir lojistik regresyon (multinomial logistic regression) modeli eğitiliyor. Bu yöntemde öznitelikler parametre olarak kullanılarak bu değerlerden oluşturulan lineer bir kombinasyonla hedef sınıflara (bizim örneğimizde ise haber kategorisine) ait olma olasılıkları bulunuyor.

Daha basit anlatmak gerekirse; lojistik sınıflandırıcı her bir kelimenin o sınıfa ne kadar katkı sağladığını olasılıksal olarak hesaplar (0 ile 1 arasında). Bu olasılığı hesaplarken her bir kelimenin o sınıfa yaptığı katkıyla, kelimenin o sınıfta görülme sayısını çarpar.

Örneğin şu iki cümleyi inceleyelim:

Spor kategorisinden bir cümle alalım: “İlk günündeki 20 yarış heyacanlıydı.”

Teknoloji kategorisinden bir cümle alalım: “Teknoloji devi Google hatasını düzeltti.”

Sadece bu metinler eğitime girdi olarak verilseydi, cümlelerde geçen her bir kelime ilgili kategoriye katkı sağlayacaktı. Çünkü iki cümle arasında çakışan sözcük yok. Eğer ikinci cümle “Teknoloji devi Google ilk hatasını düzeltti.” olsaydı “ilk” sözcüğü her bir kategoriye 50/50 katkı sağlayacaktı.

Modelimiz Ne Kadar İyi Çalışıyor?

Eğitilen modelin detaylarını görmek için print fonksiyonuyla yazdıralım. Hem eğitim hem test verisi üzerindeki başarımını kontrol edelim. Modelimizin başarımı hızlı bir prototip için gayet yeterli. Hiç görmediği veri üzerinde yaptığı her 10 tahminden yaklaşık 9'u doğru.

Model üzerinde biraz da kendimiz denemeler yapalım bakalım doğru bilecek mi? Model üzerinde prediction metodunu çağırarak tahminleme yapmasını sağlayabiliriz. Aşağıdaki gibi bazı örnekler çağıralım ve sağdaki panelden sonuçlarını kontrol edelim.

Görüldüğü gibi modelimiz gayet başarılı :). Modelimizi kaydederek iOS projesinde kullanabiliriz.

Öncelikle metadata bilgisi oluşturalım bu adım zorunlu değil, buraya yazdığımız bilgiler modeli Xcode’da açtığımızda görünüyor.

Model üzerinde write metodunu çağırarak kaydedeceğimiz yolu ve metadata verisini verelim. Bu satırları çalıştırdığımızda CoreML modelimiz oluşturulacaktır.

Xcode üzerinden yeni bir SingleViewApp iOS projesi oluşturalım ve model dosyasını proje içine sürükleyip bırakalım. Modeli seçtiğimizde sağdaki bölümde detayları görebiliriz. Modelimiz sadece 2.5 mb.

Makine öğrenmesi modelimizi projeye sürüklediğimizde Xcode otomatik olarak ona ait bir sınıf (class) oluşturuyor ve kodlarını yazıyor. Aşağıdaki oka tıklayarak oluşturulan sınıfa göz atabiliriz.

Oluşturulan sınıf aşağıdaki gibi. Bu sınıf modelin yüklenmesini ve tahminleme yapmasını sağlayacak metotları direkt oluşturuyor.

Not: Bu sınıf içeriğinin değiştirilmemesi gerekiyor.

Modeli kullanmak için ViewController dosyasında aşağıdaki gibi bir sınıf örneği oluşturalım.

Model üzerinde prediction çağrısını aşağıdaki gibi yaparak tahmin sonucunu dönmesini sağlıyoruz. Burada basit bir yazı alanı (textField) oluşturmuştum ona yazılan değeri parametre olarak geçiriyorum.

Projeye basit bir buton ekledim ve bu tahminleme işlemini butonun basılmasıyla çalışacak şekilde programladım. Projeyi Github’ta paylaştım buradan indirebilirsiniz.

Ve haberleri sınıflandıran uygulamamız hazır.

Bir yazının daha sonuna geldik. Benzer yazılardan haberdar olmak için beni Medium’da ve Twitter’da takip edebilirsiniz.

iOS ve makine öğrenmesi alanında uzmanlaşmak yeni yazılarımdan ilk siz haberdar olmak isterseniz aşağıdan mail bültenime kayıt olabilirsiniz. Bu yazı dizisi sonunda Udemy kursu yayınlamayı planlıyorum. Mail grubum bu eğitimden de ilk önce faydalanma fırsatını yakalayacak. Esenlikle kalın :)

Kaynaklar