NLP — Semantic Search Engine — 1
Merhaba arkadaşlar,
Uzun zamandır yazı paylaşamıyordum iş yoğunluğu covid derken pek fırsatım olmadı ama öyle ya da böyle aranıza döndüm :) Bugun ki konumuz NLP güzel, nadide konularından biri olan Semantic Search olacak. İlk bölümde teorik konulardan bahsedeceğim inşallah daha sonraki bölümlerde uygulamalı paylaşımlarımda olacak.
Arama motorları, yaşantımızın artık ayrılmaz bir parçası gibi, günde onlarca yüzlerce arama yapıyoruz. Çeşitli kaynaklardan bilgi almak ve paylaşmak için milyarlarca web sayfasını rastgele arıyoruz. Elbette şirketlerde bu aramaları daha iyi sonuçlar verebilmesi için sürekli bu arama motorlarını geliştirme ihtiyacı duyuyorlar. Bundan sonraki mottomuz Daha az arama yap ama daha çok şey bul :)
Öncelikle kavramlara bakalım.
Bu makalede, amacımız bağlama duyarlı aramalara modern NLP teknikleriyle cevap bulabilmek.
Cümleler için Neden Bağlam gereklidir?
Transformatör modellerinin mimarisi, kelime gömmelerini(embedding) temsil edecek şekildedir, ancak bazı NLP görevleri paragraf bazlı veya cümle bazlı gömmelerdir.
Örneğin, borsa ile ilgili bir makale arıyorsam ve ‘son dönemde yükselen hisse senetleri’ arıyorum, ancak ‘yükselen hisselerden’ bahseden bir başka makale var. Birebir arama, buradaki ilgili makaleyi bulmakta zorlanacaktır. Bu noktada anlamsal arama bizi istediğimiz sonuca götürebilir.
Semantik Nedir ?
Anlambilimsel analiz, sözdizimini oluşturan morfolojik ögelerin ayrılması, yani sözdizimsel analiz ile anlam taşıyan kelimelerin sınıflandırılması işleminden sonra gelen anlamlandırma veya anlama sürecidir. (Kaynak: Wikipedia)
Semantik search öncesinde keyword search denilen yöntemlerle arama motorları çalışırdı. Sorgunun anlamına bakılmadan yanlızca sözcüksel olarak uyuşmaya bakılırdı. Zaman içerisinde NLP nin hayatımıza girmesiyle birlikte yavaş yavaş anlamsal arama sistemlerine geçildi.
Bugün 2 ve ya 3 yaklaşım üzerinde duracağım ve bu yaklaşımlardaki tecrübelerimi aktaracağım.
Artık biraz teknik konuşmanın zamanı geldi…
İlk tecrübe ettiğim algoritma daha basit gördüğüm ve uygulamasıda basit olan Latent Semantic Index ve ya Latent Semantic Analysis olarak geçen LSI veya LSA algoritması.
Nedir bu LSI ?
Bir dizi belge ile, bu belgelerde geçen anahtar kelimeler arasında kavram üreterek analiz eden bir tür algoritmadır. LSI, aynı bağlamlarda kullanılan kelimelerin benzer anlamlara gelebileceğini düşünür. Benzer bağlamlarda ortaya çıkan terimler arasında ilişki kurar.
Latent Semantic Index algoritmasını kullanırken genelde klasik veri adımlarını uyguladıktan sonra TF-IDF + LSI uygulayarak semantic search engine sisteminizi yaratabilirsiniz. Klasik veri adımlarından kastım, eğer kirli veriniz varsa önce önişleme adımlarını geçmiş olmalısınız. Şayet bu adımları atlarsanız istenilen başarılara çıkmanız çok güç. Ben bu adımları tamamen gerçekleştirmeme rağmen yinede istenilen başarıyı alamadım.Bu yüzden benim tecrübelerim bu yaklaşımın başarısız olduğu yönünde. Ben yeterince iyi bir çıktı alamamıştım. Bu nedenle yaklaşımımı değiştirmek zorunda kaldım. Ancak eğer siz sonuçları merak edip denemek isterseniz. Bu linki takip ederek sizde deneyebilirsiniz.
LSI ile bir sonuç elde ettiğimizi varsayıyorum lakin bu sonuç bizi tatmin etmedi. Daha iyi çözümlerimiz var mı diye soruyorsanız bu sorunun cevabı BERT olabilir. Peki ya BERT nedir ?
Nedir bu BERT?
Embeddingler, Transformatörler, Attention mekanizmaları, NLP’deki son gelişmelerden bir kaçı. Bu terimleri burada açıklamayacağım lakin eğer merak ederseniz bu konuda yazılmş gayet güzel ve akıcı makaleler mevcut. BERT’te Transformatör tabanlı bir algoritma,yaklaşım veya bir teknik diyebilirsiniz. Açılımı Bidirectional Encoder Representations from Transformers’dir. Gördüğünüz gibi oldukça etkileyici bir açılımı var :)
Transformer’in uzun süreli kelime bağımlılıklarının tespit etme yeteneği ve başarımının bir hayli yüksek olması, bu modelin mimarisinde de tercih edilmesine sebep olmuştur. Ayrıca çift yönlü kodlayıcı, BERT’i OpenAI GPT’den ve ELMo’dan ayıran bir diğer özellik olarak karşımıza çıkmaktadır.
BERT, 24 Transformer bloğu, 1024 gizli katmanı ve 340M parametresi ile oldukça büyük bir modeldir.
BooksCorpus (800 milyon kelime) ve İngilizce Wikipedia (2.5 milyar kelime) dahil, toplam 3.3 milyar kelimelik bir korpus üzerinden 40 epoch ile önceden eğitilmiştir.
Model, eğitim için 16 TPU üzerinde çalışmıştır.
Eğer BERT hakkında daha detaylı bilgi almak isterseniz Başak hocanın harika yazısına kaynak kısmındaki linkten ulaşabilirsiniz.
Elbette string verilerle çalıştığınız için, her kelimeyi bir şekilde vektör olarak temsil etmeniz gerekir. BERT’te her kelime 300 lü vektörlü şekilde temsil edilir.
Aşağıdaki görselde örnek bir temsil vardır.
Kelime gömme işlemleri genellikle büyük, etiketsiz büyük kelime grupları üzerinde eğitilir ve daha sonra alt görevler için etiketli veriler üzerinde modeller geliştirmek için kullanılır.
BERT kullanarak iki farklı arama motoru yapabilirsiniz, diyelimki daha önceden google tarafından eğitilmiş dil modelini direk kullanmak istediniz ki bu mümkün. Eğer genel bir domain üzerinde cevap arıyorsanız genel bir BERT dil modeliyle çalışabilirsiniz. Şayet, domain bazlı arama motoru yapıyorsunuz örnek vermek gerekirse Eğlence içerikleri için bir arama motoru yapıyorsanız Google’ın eğittiği BERT’i kullanmak elbette size LSI’a göre daha iyi başarı sağlayacaktır. Lakin yinede bu başarıyı artırmanın bir yolu daha var.
Fine-Tune Edilmiş BERT
Eğer İngilizce arama motoru yapıcaksanız internette çokca BERT dil modelini bulabilirsiniz. Başka konularda göreve özgü dil modelleride bulabilirsiniz örnek vermek gerekirse Question answering, text summarization , classification, Single sentence tagging gibi konularda çalışan dil modellerini. Hemde fine-tune edilmiş haliyle domaine özgü dil modellerini bulabilirsiniz.
Elbette Türkçe’de maalesef bu kadar gelişmiş değil dil modelleri, ancak Türkçe eğitilen dil modelleri mevcut örnek bir dil modeline buradan ulaşabilirsiniz. Bu dil modelini kendiniz fine-tune edebilir, kendi projeleriniz için kullanabilirsiniz.Yukarıda bahsettiğim gibi Eğlence içerikleri için bir arama motoru yaptığımızı düşünelim. İnternetten eğlence içeriklerini çekiyoruz ve Google’ın eğittiği BERT’i bu sefer kendi verimizle üstüne eğitiyoruz. İşte buna Fine-Tuning deniyor. Sizde internetten veri çekip Türçe için paylaştığım dil modelini üzerine eğitim yapabilirsiniz. Bu dil modellerinin HuggingFace üzerinde olmasıda kullanım olarak kolaylık sağlamaktadır. Eğer dil modelini fine-tune etmek isterseniz bu konuda detaylı olan bir yazıya buradan ulaşabilirsiniz.
Ben henüz BERT ile çalışan bir arama motoru yapmadım. Ancak bir sonraki yazımda bu konuda deneyimlerimi paylaşacağım. Yukarıda LSI kullanarak yaptığım çalışmanın sonuçlarını beğenmediğimi söylemiştim. Bu nedenle daha gelişmiş tekniklerle çalışmamı ilerleteceğim. Tabi siz yinede benzer çalışmaları görmek isterseniz. BERT ile yapılan örnek bir semantik arama motoruna buradan ulaşabilirsiniz. Klasik BERT’i kullanmaktansa Fine-Tune edilmiş BERT’i kullanmak daha mantıklı. Ancak dil modelini Fine-Tune etmeninde bir maliyeti var ve gerçekten sağlam GPU-TPU istiyor. Eğer böyle bir imkanınız yoksa klasik BERT dil modellerini kullanabilirsiniz.
Bu yazı giriş niteliğinde bir yazıdır. Bu nedenlerle kavramları tanıtmaya çalıştım. Bir sonraki yazımda uygulama yaparak kendi arama moturumuzu yapıcaz. Takipte kalın!!
SEVGİYLE KALIN…