FastText ile Türkçe Metinlerin Sınıflandırılması

Doğal Dil İşleme (Natural Language Processing, NLP) alanında metin sınıflandırma, metin belgelerini belirli kategorilere veya sınıflara ayırma sürecini ifade eder. Örnek vermek gerekirse, bir e-posta’nın spam olup olmadığını belirlemek veya bir müşteri yorumunu pozitif veya negatif olarak etiketlemek gibi görevler bu tür sınıflandırmalara örnektir. Bu yazıda sınıflandırmaya çalıştığımız metinler taranmış Türkçe dökümanlar (tapu belgesi, kimlik belgesi vb.) olacaktır ve bu yazıda, metin sınıflandırma görevlerini gerçekleştirmek için güçlü ve hızlı bir araç olan FastText’i inceleyeceğiz. Şekil 1’de kullanılan örnek dökümanlar gösterilmektedir.

Şekil 1 Döküman Örnekleri

FastText Nedir?

FastText, Facebook tarafından geliştirilen ve NLP alanında kullanılan bir açık kaynaklı bir metin sınıflandırma ve kelime gömme (word embedding) aracıdır. Temel olarak, metin verilerini işlemek, sınıflandırmak ve kelime temsilleri oluşturmak için kullanılır. Hem hızlı hem de etkili olması nedeniyle araştırmacılar ve geliştiriciler tarafından çokça kullanılır.

FastText’in Avantajları
  • 1. Hızlı Eğitim ve Tahminler: Büyük veri kümelerini hızlı bir şekilde işleyebilir ve tahminler yapabilir. Bu, büyük ölçekli metin sınıflandırma projeleri için önemlidir.
  • 2. Kelime Gömme (Word Embedding): FastText, metindeki her kelimenin anlamsal temsilini yakalar. Bu, kelimenin anlamını ve benzerliklerini öğrenme yeteneği sağlar. Özellikle kelime seviyesinde dil analizi gerektiren görevler için idealdir.
  • 3. Çoklu Dil Desteği: FastText, birçok farklı dilde çalışabilir ve bu diller için özel kelime gömme (word embedding) matrisleri oluşturabilir. 157 farklı dilde Common Crawl ve Wikipedia içerikleri ile eğitilmiş hazır modelleri mevcuttur.

FastText ile Metin Sınıflandırma Nasıl Yapılır?

Adım 1: Veri Toplama ve Hazırlama

İlk adım veri toplamak ve bu veriyi işlemektir. Eğitim verileri, metin belgelerini ve ilgili sınıf etiketlerini içermelidir. Verileri temizlemek ve özellikleri çıkarmak da bu aşamada yapılır. Verileriniz hali hazırda bilgisayar tarafından okunabilecek bir metin formatında ise ön işlem olarak sadece tek karakterden oluşan yazıların, rakamların, noktalama işaretlerinin, fazla boşlukların kaldırılması, tüm kelimeleri küçük harfe çevirme ve hatalı yazılmış kelimelerin düzeltilmesi ön işlemlerinin yapılması gerekir. Malesef Fasttext veri ön işlemesi yapma yeteneğine sahip değildir. Bu işlemleri biz farklı kütüphanelerin yardımı ile sağladık. Özellikle yanlış yazılmış kelimelerin düzeltilmesi anlam açısından büyük önem taşımaktadır. Bu işlem için TurkishNLP kütüphanesini kullandık. Aşağıdaki kod parçasında örnek yanlış yazılmış bir cümlenin düzeltilmesi için gereken adımlar ve elde edilen sonuç gösterilmektedir.

from turkishnlp import detector
obj = detector.TurkishNLP()
obj.download()
obj.create_word_set()
lwords = obj.list_words("vri kümsi idrae edre ancaka daha güezl oalbilir")
corrected_words = obj.auto_correct(lwords)
corrected_string = " ".join(corrected_words)
print(corrected_string)

"veri kümesi idare eder ancak daha güzel olabilir"

Ancak verilerinin taranmış dökümanlarsa, yani resim formatında ise öncelikle görüntülerdeki metinlerin bilgisayar tarafından okunacak formata dönüştürülmesi gerekmektedir. Görüntüyü metne dönüştürmek için kullanılan en yaygın yöntemlerden biri olan Optik Karakter Tanıma (Optical Character Recognition, OCR) uygulamaları ile görüntülerdeki metinler elde edilebilir. Tesseract OCR, EasyOCR, GOCR en yaygın OCR kütüphaneleri arasındadır. Bu projede metinlerin elde edilebilmesi için biz EasyOCR kütüphanesini kullandık. 

OCR ile elde ettiğimiz metinleri ön işlemden geçirip, temizleyip dökümanlarımızı sınıflandırma modelini eğitmeye başlayabiliriz.

Adım 2: Verileri FastText Formatına Dönüştürme

FastText, özel bir veri formatı kullanır. Eğitim verilerinizi bu formata dönüştürmelisiniz. Her satırda bir metin belgesi ve bu belgeye ait sınıf etiketleri bulunur. Sınıf etiketleri “__örnek-etiket__” şeklinde olmalıdır. Bu formata bu proje için örnek şu şekilde verilebilir:

__tapu__ Tapu belgesi içeriği 

__kimlik__ Kimlik belgesi içeriği

Adım 3: FastText Modeli Eğitme

FastText modelini eğitmek için, gerekli formata dönüştürülen eğitim verilerini kullanırız. Bu, metin belgelerini ve bunların sınıf etiketlerini (tapu, kimlik vb.) içeren bir eğitim veri kümesini içerir. FastText, verileri işler, kelime gömme (word embedding) matrisini öğrenir ve bir sınıflandırma modeli oluşturur. FastText eğitim modelinin nasıl çalıştığına dair basitleştirilmiş bir genel bakış şu şekildedir:

  • Kelime Gömme (Word Embedding): FastText, eğitim verilerindeki her kelimenin word embedding temsillerini öğrenerek başlar. Word embedding, kelimelerin anlamsal anlamını temsil eder ve continuous bag-of-words (CBOW) veya skip-gram teknikleri kullanılarak öğrenilir. FastText, bu gömme temsillerini metin temsili için temel bir bileşen olarak kullanır.
  • Model Seçimi: FastText, iki tür modeli destekler: supervised ve unsupervised. Supervised model, etiketli veriler üzerinde sınıflandırma yapmak için kullanılırken, unsupervised model metinler arasındaki benzerlikleri bulmak için kullanılır.
  • Lineer Sınıflandırma: Denetimli model eğitiminde, kelime ve etiketler vektörlerle temsil edilir. Kelimelerin ve ilgili etiketlerin benzer vektör temsillerine sahip olmasını sağlamak için bu vektör temsillerini öğrenir. Öğrenme işlemi, kelimenin vektörünün ilgili etiket vektörüne ne kadar yakın olduğunu belirlemeyi içerir.
  • Yüksek Hiyerarşik Sınıflandırıcı: FastText, sınıflar arasındaki karmaşık ilişkileri yönetmek ve büyük sınıflandırma görevlerini hızlandırmak için yüksek hiyerarşik sınıflandırıcı (Hierarchical Classifier) kullanır. Bu, sınıfların hiyerarşik bir ağaç yapısına yerleştirilmesiyle gerçekleşir. Her düğüm, ilgili sınıfın olasılığını temsil eder. Etiketler, bu ağaç yapısındaki belirli düğümlerle ilişkilendirilir. 

Aşağıda örnek eğitim kodu gösterilmektedir. train_supervised fonksiyonu sayesinde eğitim yapılır. Bu bu sınıflandırma uygulamasında fonksiyonun kullandığı şu parametreler değiştirilmiştir: “input”: eğitim verilerinin olduğu metin dosyasının konumu, “learning rate”: bir modelin ne kadar hızlı veya yavaş öğrenme yapacağını belirler, “epoch”: bir eğitim veri kümesinin tamamının bir kez model tarafından işlendiği ve ağırlıkların güncellendiği bir eğitim dönemini ifade eder, “dim”: elde etmek istediğimiz vektörlerin uzunluğu. Model eğitilip kaydedildikten sonra yüklenip kullanılabilir.

import fasttext
model = fasttext.train_supervised(input=”trainin-text-path”, lr=1.0, epoch=25, dim=50)
model.save_model(“my_fasttext_model.bin”)

Adım 4: Modeli Değerlendirme ve Ayarlama

Eğitim sonrası modeli test verileriyle değerlendirmeliyiz. Modelin performansını ölçmek için doğruluk, f-1 score gibi metrikleri kullanabiliriz. Elde edilen sonuca göre model performansını artırmak için hiperparametreleri ayarlayabiliriz. 

model = fasttext.load_model(“my_fasttext_model.bin”)
model.predict(“test_metni”)

Model yüklenip metinin sınıfı tahmin ettirildiğinde elde edilen sonuç şu şekilde olur sınıflandırma kategorilerimiz ve benzerlik oranları: 

((u’’__label__tapu, u’__label__kimlik’ …), array([0.939923, 0.592677 …]))

Sonuç

FastText, metin sınıflandırma görevlerini hızlı ve etkili bir şekilde gerçekleştirmek için güçlü bir araçtır. Hem hızlı eğitim hem de hızlı tahmin yetenekleri sayesinde, büyük veri kümeleriyle çalışırken bile başarılı sonuçlar elde etmek mümkündür. Bu nedenle, FastText’i metin sınıflandırma projelerinizde değerlendirmeniz önerilir.

FastText hakkında daha fazla bilgi edinmek ve uygulama örnekleri görmek için resmi dökümantasyonunu ve örnek projeleri inceleyebilirsiniz. Başarılar dilerim!