Natural Language Processing (NLP) konuları üzerinde çalışırken karşılaşacağımız temel problemlerden birisi kelimeleri veya karakterleri makinenin anlayabileceği şekilde sembolize etmektir. Makinelerin vereceğimiz metinlerin üzerinde işlem yapabilmesi için kelime veya karakterlerimizi sayısal olarak ifade edebilmemiz gerekiyor. Makine metnimizi sayısal olarak ifade ettiğimizde metin üzerinde her türlü işlem yapabilecek duruma gelir.
Öncellikle kelimelerin sayısal olarak ifade edildiği kelime sözlüğü oluşturmamız gerekir. Sözlüğün boyutları bize bağlıdır. Örneğin Türkçe veya İngilizcede günlük konuşmalarda en çok geçen 1000 kelimeden oluşan bir sözlük oluşturabiliriz. Sözlüğümüzde her bir kelime için one hot vektör tanımlamamız gerekir. Kelimeyi temsil edecek şekilde bir elemanı 1 diğer elemanları 0 olan vektörlere one hot vektör deniliyor.
Kelime sayısı ile birlikte doğru orantılı olarak vektör uzunluğu da artıyor. 1000 kelime için 1000 uzunluğunda vektörler oluşturulması gereklidir. Text summarization gibi yüksek kapasiteli kelime hazinesi gerektiren uygulamalarda bu sayı çok daha fazla olması gereklidir. Ayrıca kelimeleri sadece one hot vektörler cinsinden ifade edersek, kelimelerin arasındaki anlam kaybolacaktır. Başka bir deyişle one hot vektörler ile kelimeler arasındaki ilişki saklanmıyor.
Bir kelimeyi anlayabilmemiz için diğer kelimelerle olan bağlantısını anlamamız gerekiyor. Örneğin Cell kelimesiyle biology kelimesi ilişkilidir veya cell kelimesi phone kelimesi ilişkilidir. Fakat Cell kelimesi road kelimesinin alakalı düzeyi düşüktür. Kelimeler arasındaki bu anlam ilişkilerini sözlüğümüzde oluşturduğumuz sadece one hot vektörlerimizde saklayamayız ve vektörler üzerinden bir ilişki düzeyi belirleyemeyiz.
Kelimelerin birbiriyle olan ilişkisini belirtebilmek için yine kelimeleri temsil etmesi için vektörler kullanmamız gerekiyor. Fakat bu vektörler one hot vektör gösterimlerinden daha iyi yöntemler üzerinden olmalı. Yani vektör içindeki sayılar yalnızca 0 veya 1 den oluşmayacak.
Sayılar iki kelime arasındaki yakınlığı bağlantıyı tutacak diyebiliriz. Birbirine benzer iki kelimenin vektörleri de birbirine yakın olacaktır. İki kelimenin birbirine olan bağlantısını iki vektörü birbiriyle çarparak buluyoruz. İşlem sonucunda scalar bir sayı elde ediliyor. Bu sayı ne kadar büyükse o iki kelime o kadar birbiriyle alakalıdır diyebiliyoruz. Kelimelerin bu şekilde anlamlarını birbiriyle olan bağlantısını tutacak şekilde gösterilmesine Word Embedding deniyor. Word embedding matrisinde her kelimeye karşılık bir kelime vektörü bulunuyor.

Word representation. (Andrew Ng – Word representation coursera course notes)
Tabloyu incelediğimizde Man -> Woman ikilisi bir arada bulunuyorsa King -> Queen ikilisinin bağlantısını bilmesek bile bir bağlantı kurabiliyoruz. Benzer şekilde Apple -> Orange bağlantısını görebiliyoruz King->Queen ve Man->Woman ikililerinin vektörleri birbirine yakın duruyor. Bu nedenle man – woman yaklaşık olarak King – Queen çıkartma işlemleride doğru orantılıdır diyebiliriz.

Relationships between words–Source: https://www.tensorflow.org/tutorials/representation/word2vec
Man->Woman, King-> Queen benzerliğini bulabilmek için Cosine Similarity veya Euclidian Distance gibi teknikler kullanılabilir. Benzer şekilde insan isimleri, Istanbul-> New York gibi şehir ya da yer isimlerinin arasında bağlantı kurulabilir. Vocabulary size sözlüğümüzde bulunan kelime sayısını, dimension ise embed edilen feature sayısını gösteriyor. Feature’lar işlem yaptığımız corpus’a göre değişiyor, yani gender, age, food gibi feature’larda kullanılabilir ya da place, name gibi feature’larda olabilir.
Word Embedding matrisi oluşturabilmek için popüler olarak kullanılan iki farklı yöntem bulunuyor. Bu yöntemler Word2Vec ve Glove yöntemleridir. Kelime vektörleri oluşturulurken bu iki yöntemden birisi kullanılıyor.
Word2Vec
Bir kelimenin etrafındaki kelimeler o kelimeye ait anlamı bulmakta faydalı olabilir. Kelime vektörlerini oluştururken bu özellikten yararlanabiliriz. Örneğin “cell” kelimesi hangi kelimelerle birlikte kullanıldığına bakılarak ona göre bir vektör oluşturulacak. “Cell” kelimesinin anlamını isabetli tahmin edebilmek için word2vec modelinin içinde “cell” kelimesi geçen birçok cümle üzerinde eğitilmesi gerekli. Bir kelimenin etrafındaki kelimeleri tahmin edebilirsek hedef kelimenin anlamını da bulmuş oluruz. Benzer şekilde insanlarda ilk defa bir kelime duyduklarında cümlenin tamamından anlamını bilmedikleri kelimeyi tahmin etmeye çalışırlar. Word2Vec bu amaçla kullanılan yöntemlerdendir. Wod2Vec Google tarafından bulunmuş gözetimsiz öğrenme yöntemlerinden birisidir. Word2Vec’te kenardaki kelimeler ortadaki kelimeyi temsil eder.
Word2Vec yönteminde iki farklı algoritma bulunuyor. Bu algoritmalar Skip-gram ve Continous bag of words (CBOW) dır. Skip-Gram algoritması ortadaki kelimelerden kenardaki kelimeleri tahmin eder. (Mikalov,2013)

CBOW and Skip-Gram Architectures – Efficient Estimation of Word Representations inVector Space (Mikalov,2013)
SkipGram yapısı input olarak ortadaki kelimeyi alıyor output olarak ise ortadaki kelimenin etrafındaki kelimeleri veriyor. Ortadaki kelimenin sağından ve solundan pencere büyüklüğü adı verilen kelime uzaklığı kadar kelimeyi tahmin etmeye çalışıyor. Pencere büyüklüğü iki ise orta kelimenin sağından ve solundan iki kelime dikkate alınıyor. Eğitim sırasında bu şekilde benzer birçok cümle gördüğü için bu kelimelerin birlikte bulunma olasılığı artırılarak güncelleniyor.

Yukarıdaki denklemde T = kelimenin pozisyonunu, c = pencere büyüklüğünü, w = kelimeleri göstermekte. Amacımız orta kelimeye göre kenardaki kelimelerin bulunma olasılığını maksimize etmek. Softmax kullanan temel skip-gram formülü aşağıdaki şekilde, formülün amacı kelime vektörlerini optimize edip cost’u düşürebilmek.

Denklemde Wo pencere içerisindeki kelimenin indexi, WI merkez kelimenin indexi,V orta kelimenin vektörü,V’ pencere içerisinde ki kelimenin vektörü gösteriyor. Olasılık dağılımı bu formülle hesaplanıyor. Formülde olasılık dağılımı için Softmax kullanılıyor. Softmax kullanıldığında karşılaşılan bir problem bulunuyor. Formüldeki payda tüm kelime vektörünü içeriyor. Corpus üzerinde her kelime için formül hesaplandığında, corpus büyüklüğünü de göz önüne alırsak. Hesaplamaya çalıştığımızda işlem yükü oldukça artıyor. Hesaplamayı hızlandırmak için kullanılan yöntem ise Negative Sampling. (Distributed Representations of Words and Phrasesand their Compositionality, Mikolov,2013)
Örneğin “Cell” kelimesinin bağlantılı olduğu kelimeleri bulabilmek için metin üzerinde dolaşıyoruz. Cell kelimesi aslında çoğu kelimeyle yan yana bulunmayacaktır. Loss fonksiyonumuzda softmax yerine sigmoid kullanarak skipgram modelimizin sadece yüksek kaliteli vektör temsilleri öğrenmekle ilgilenmesini sağlıyoruz. Kelime haznesindeki tüm kelimeleri alıp toplam işlemi uygulamak yerine, daha az kelime üzerinden işlem yapıyoruz. Rastgele seçilen kelimeler ise unigram dağılımı ile bulunuyor. Çok sık geçen kelimelerin seçilme olasılığı daha yüksek oluyor.
Continous bag of words (CBOW) algoritması ise kenardaki kelimelerden ortadaki kelimeyi tahmin eder. CBOW algoritması ise SkipGram’ın oldukça benzer şeklinde çalışıyor. CBOW SkipGram’ın tersi şeklinde cümlede ki kelimelerden verilen pencere büyüklüğüne göre ortadaki kelimeyi tahmin etmeye çalışıyor. Bu işlemler verilen metnin en başından başlayarak sonuna kadar kelime kelime yapılarak tekrarlanıyor.
Glove (Global Vectors for Word Representation)
Glove modeli 2014 yılında Standford Üniversitesi tarafından yayınlandı. Glove için Word2Vec üzerinden örnek vermek gerekirse,Word2vec’te corpus üzerinde “deep learning” kelimeleri yan yana geçtiğinde kelime vektörünü güncelliyoruz ve bu iki kelimenin birlikte bulunma olasılığını arttırıyoruz. Glove’da ise “deep learning” kelimeleri corpus’ta kaç kez birlikte geçmiş sayılıyor. Sonrasında kelime vektörlerini bu sayıma göre optimize ediyoruz.

Cost function of Glove–(GloVe: Global Vectors for Word Representation, Pennington,2014)
Glove için loss fonksiyonu yukarıdaki gibi. Cost’u minimize etmek için Gradient Descent kullanabiliriz. Fonksiyonu incelersek J tüm parametre değerlerini gösteriyor.Word2Vec’te de olduğu gibi wi ve wj vektörleri bulunuyor. wi ve wj vektörleri glove da kelime sayılarını elde ettiğimiz matrisin herhangi bir satırını ve sütununu gösteriyor. Tüm corpus üzerinde kelime sayma yöntemlerini kullanarak bir matris oluşturuyoruz. X oluşturulan matrisi ifade ediyor. f corpus içerisinde çok sık karşılaşılan kelimeler için bir üst limit. Bu sayede stopword’ler bu limite kadar sayılıyor. Bu kelimeler limiti sayısını geçerse sayılmıyorlar. Ayrıca Xij değeri 0 olursa log 0 undefined olması problemi f in de 0 olmasıyla çözülmüş oluyor.
Bu makalemde word embeddings konularına değinmiş oldum. Umarım faydalı olmuştur. Sonraki makalelerimde görüşmek üzere.
Murat 🙂