Word embedding, doğal dil işlemenin temel kavramlarındandır. Word embedding yöntemleri ile ilgili yapılan paylaşımlar genel olarak fazla teknik olduğundan, bu konulara yeni başlamış kişiler için anlaması zor olabiliyor. Bu yüzden, kullanılan birkaç yöntemin nasıl çalıştıklarından ziyade, sade bir şekilde ne yaptıklarından ve hangi amaçla kullanıldıklarından bahsedeceğim.

Makine öğrenmesi algoritmaları ile model oluşturmak için, verilerin nümerik halde olması yani sayılardan oluşması gerekmektedir. Bu yüzden diğer tiplerde bulunan veriler de nümerik hale çevrilmeli. Kategorik veriler farklı şekillerde nümerik hale dönüştürülebilir. Aralarında büyüklük ilişkisi olan {“az”, “orta”, “çok”} değerleri {1, 2, 3} rakamları ile yine sıralı bir şekilde temsil edilebilir. Ya da elimizde haftanın günleri varsa bunlar da 1–7 arası numaralandırılabilir. Bu durumda da 1. ve 7. gün aslında art arda olmasına rağmen 7. gün 1. günden uzak bir değere sahip oluyor. Bu tür durumlarda kategorik değerler bir sinüs ya da cosinus dalgası üzerine oturtularak, değerler arasındaki mesafe daha gerçekçi bir hal alır.

Tabi ki kategorik verilerin hepsi sıralı olmak zorunda değil. Elimizde film türleri varsa, {“korku”, “gerilim”, “romantik”, “komedi”} gibi, bunlar için sıralı sayılar verme şansımız yok. Bu durumda da, yani aralarında sıralı bir ilişki bulunmayan kategorik değerler ise one-hot encoding ile 0 ya da 1 ile temsil edilebilir. Bahsettiğimiz üç durumun olduğu kolonlara sahip bir tablodaki verilerin nümerik hale dönüştürülmesi Şekil 1'de görülebilir (kod örneği *).

Şekil 1. Kategorik verilerin nümerek hale dönüştürülmesi

Şu ana kadar bahsettiğimiz kısımda bir kelime bir sayısal değer ile eşleştirildi, yani encoding yapmış olduk. Ama bazı durumlarda bu kadar basit bir dönüşüm yeterli olmayabiliyor. Örnekteki veriyi kümelemek istesek, korku ve gerilim türünden filmlerin tür bazında yakın olması gerekirken değerler arasındaki anlamsal ilişkiler için bir şey yapmadık.

Peki değişkenlerimiz cümle olsa, bu durumda o cümleleri nasıl temsil ederdik? Akla ilk gelebilecek yöntem, encoding’e benzer şekilde cümledeki her bir kelime için bir kolon oluşturmak (bag of words). Sonra da kelimelerin geçme sıklığına göre de puan verilebilir (TF-IDF). Ama burada da kelimeler arasındaki ilişkiyi yakalayamıyoruz. Ayrıca her bir değer için yeni bir kolon oluşturmamız gerekeceğinden, daha karmaşık problemler için bu yöntem pek uygulanabilir değil (curse of dimensionality). O zaman embedding’e geçiyoruz.

Embedding’te, kelimeler en fazla beraber bulundukları kelimeler ile yakın olacak şekilde konumlandırılır. Bu yakınlık farklı birçok kategoride olabilir. Örneğin İngiltere ülke adı olarak diğer ülke isimleriyle yakın olmalı, aynı zamanda İngiltere’ye özgü olan ifadelere de. Bu sayede bir embedding modeli oluştururken yüzlerce katmanlı bir yapı kurulabilir. Aşağıdaki örnekte birkaç ülke, başkentleri ve ülkenin bir futbol takımıyla ilişkisi görülüyor. 1 numaralı doğru ülke yakınlıklarını, 2. numaralı doğru başkentleri, 3. numaralı doğru futbol takımlarını tutarken; 4, 5 ve 6 numaralı doğrular ise o ülkenin kendi başkenti ve futbol takımına olan yakınlığını temsil ediyor (Şekil 2).

Şekil 2. Kelime uzayı temsili

Tabi bu yakınlık hepsinde aynı olmayacaktır. Ülkeler birbirleriyle ya da bir ülke başkenti ile daha fazla anılabilir. Şekil 3 bu açıdan daha doğru bir temsil.

Şekil 3. Daha gerçekçi bir kelime uzayı temsili

Embedding’in ne olduğunu öğrendikten sonra birkaç embedding yöntemine değinelim. Bahsedildiği gibi, kelimelerin birbirlerine olan yakınlıklarında, beraber geçtikleri kelimeler baz alınır. Wikipedia’dan “yapay zeka” konulu birkaç içerik çekip bir deneme yapalım. Burada n-gram kullanacağız. “n” değişebilen bir değer olmakla beraber, yan yana olan n kelimeyi üretir.

“word embedding konusunun ilk örneği”

Cümlesinin 2-gram’ları;

“word embedding”

“embedding konusunun”

“konusunun ilk”

“ilk örneği”

Wikipedia’dan çektiğimiz verilerle oluşturduğumuz derlem (corpus) üzerinde ön işleme adımlarını yaptıktan sonra içerik gerekli formata sokulduktan sonra, 2-gram ile yan yana geçen kelimeleri bulup, frekanslarına bakalım. “yapay” kelimesi ile beraber en fazla geçen 8 kelime Şekil 4’te görülüyor.

Şekil 4. “yapay” kelimesine yakın olan kelimeler

Derlemimiz küçük olsa da çıkan sonuçlar makul. Buna göre kelime uzayımızda “yapay” kelimesine en yakın “zeka” kelimesi olmalı.

En çok kullanılan embedding yöntemlerinden word2Vec & FastText, derlemdeki kelimelerin, CBOW ya da skip-gram ile eğitilmiş olduğu yapay sinir ağı modelleridir. Birçok farklı dil için hazır olarak eğitilmiş embedding modelleri bulunuyor. Ama bunlar genel ifadeleri içerdiklerinden, bir alana özgü yapılacak çalışmalarda fazla verimli olmayabiliyor. Alana özgü yapılacak çalışmalarda, yeterli miktarda veri bulunması halinde o alana özgü bir model eğitmek de bir seçenek. Hatta çoğu durumda gerekli.

Wikipedia’dan bu sefer de kimya ile ilgili bir içerik çekip 2-gram ile “yapay” kelimesine en yakın olan kelimeleri bulalım. Şekil 5’te yapay zeka ve kimya içerikleri için “yapay” kelimesine en yakın kelimeler bulunuyor. Görüldüğü gibi tamamen içeriğe bağlı ve farklı çıktılar üretiliyor.

Şekil 5. “yapay zeka” ve “kimya” içerikli derlemler ile oluşturulan 2-gram çıktıları

Elimizdeki derlem ile bu sefer bir FastText modeli eğitelim. Eğitilen model sonucunda kelimeler birçok farklı kategoriye göre uzaya yerleştiriliyor. Şekil 6’da “yapay” kelimesi için oluşturulmuş 60 boyutlu vektör görülüyor (kod örneği *).

Şekil 6. “yapay” kelimesinin kelime uzayındaki konumunu gösteren vektör

Ve yine kurulan modele göre “yapay” kelimesine yakın olan kelimeler Şekil 7’de mevcut.

Şekil 7. FastText modeli ile “yapay” kelimesine yakın olan kelimeler

Derlemde geçen kelimeler ile kurulan modelin oluşturduğu kelime uzayları https://projector.tensorflow.org/ sitesinden görselleştirilebilir. Bunun için model’den oluşturulan .tsv uzantili dosya yeterli (kod örneği *). Eğittiğimiz FastText modelinin kelime uzayı ise şu şekilde aşağıdaki gibi (Şekil 8). Derlem fazla deniş olmadığından küçük bir uzay. Şekil 3'te basitçe gösterilen ilişkiler, aslında bu şekilde çok daha fazla katmandan oluşuyor.

Şekil 8. Modeldeki kelime uzayı

“yapay zeka” ve “kimya” derlemleri ile oluşturduğumuz modellerin, içeriğe özgü çıktı ürettiğini tekrar vurgulamak için, modeller için “yapay” kelimesine en yakın kelimeleri de Şekil 9’da görüyoruz.

Şekil 9. “yapay zeka” ve “kimya” modellerinde “yapay” kelimesine yakın olan kelimeler

Son olarak, kısaca FastText modelinin avantajlarından bahsedelim. Word2Vec’i baz alarak çalışan FastText derlemde bulunmayan ya da yanlış yazılan kelimeler için de çalışıyor. FastText ile “yapy” kelimesine en yakın kelimeleri bulmak istediğimizde Şekil 10’daki gibi bir sonuç alıyoruz.

Şekil 10. Yanlış yazılmış “yapy” kelimesine yakın olan kelimeler

Aynı ifadeyi word2Vec modeli ile denediğimizde ise şu hatayı alıyoruz:

KeyError: “word ‘yapy’ not in vocabulary”

FastText’e bu özelliği veren, model eğitimi sırasında, kelimelerin küçük parçalar (karakter gramları) halinde eğitilmesi. Daha gelişmiş bir model olması sebebiyle word2Vec’e göre, hem eğitilmesi daha uzun sürüyor ve hafızada daha fazla yer kaplıyor. İhtiyaca ve zaman/hafıza kısıtlarına göre hangisinin seçileceği karar verilebilir.

Word embedding kavramını fazla detaya girmeden, sade bir şekilde anlatmaya çalıştım. Kod örnekleri ile farklı derlemler üzerinde denemeler yapılabilir. Sonraki yazımda, embedding yöntemlerinden daha detaylı bahsedip, kullanılan yöntemleri karşılaştıracağım.

Teşekkürler:)

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