Word Embedding Teknikleri-Word2Vec Nedir ? TF-IDF Nedir ?

Adem Akdogan
Bilişim Hareketi
Published in
9 min readJul 25, 2021

Sözel ifadelerin makine öğrenmesi veya derin öğrenme algoritmaları için anlamlı bir hale getirilmesi gerekir. Bu sebeple kelimeler, sayısal olarak ifade edilmelidir. One Hot Encoding, TF-IDF, Word2Vec, FastText gibi algoritmalar, bu tarz problemlerin çözümü için kullanılan word embedding teknikleri olarak, kelimelerin matematiksel olarak ifade edilebilmesini sağlar.

Unsplash

Word Embeddings

Sözel ifadelerin matematiksel olarak ifade edilmesi için kullanılan tekniklerdir. One Hot Encoding, TF-IDF, Word2Vec, FastText, yöntemleri sıklıkla kullanılan Word Embedding yöntemleridir. Verilerin durumu, boyutu ve işlenme amacına göre bu tekniklerden birisi (bazı durumlarda birkaçı) tercih edilerek kullanılır.

* One Hot Encoding

Verilerin sayısal olarak ifade edilebilmesi için kullanılan en temel tekniklerden birisi One Hot Encoding tekniğidir[1]. Bu yöntemde sözel ifadelerin toplam sayısı boyutunda vektör oluşturulur. Vektörlerin değeri, her bir sözel ifadenin kendi indeksine ait olan değeri 1 diğerleri 0 olacak şekilde atanır. Örnek olarak Şekil 1 incelenebilir.

Şekil 1. One Hot Encoding Örneği

Şekil 1'de “X” isimli kolon 3 farklı sözel ifadeden oluşmaktadır. Bu kolona One Hot Encoding uygulandığında her ifadeyi temsil eden 3 farklı kolon daha meydana gelir (diğer bir ifadeyle her satır için 3 birimlik vektörler satıra eklenir). Her satırdaki sözel ifadeye karşılık gelen kolon 1 diğerleri 0 değerleriyle doldurulur. Böylelikle bu ifadeler sayısallaştırılmış olur. Genellikle sözel veri çeşitliliğinin fazla olmadığı, veriler arasındaki anlamsal ve istatistiksel ilişkilerin temsil edilmesine ihtiyaç duyulmayan durumlarda kullanılır.

* TF-IDF

TF-IDF, kelimelerin dokümanlar içerisindeki matematiksel önemini belirlemeye yarayan istatistiksel bir ölçüdür[2]. Vektörizasyon işlemi One Hot Encoding’e benzer şekilde gerçekleşir. Farklı olarak sözel ifadeye karşılık gelen değere 1 yerine TF-IDF değeri atanır. TF-IDF değeri TF ve IDF değerlerinin çarpımı sonucunda elde edilir. Örnek olarak 1 er cümleden oluşan 3 adet doküman için TF-IDF değerlerini bulalım.

[Bu bir sayıdır],

[Bu bir kelimedir],

[Bu sayı ve kelime değildir]

Yukarıdaki örnekte “Bu” ifadesi 3 dokümanda da geçerken “bir” ifadesi 2 dokümanda ve “sayıdır” ifadesi de yalnızca bir dokümanda geçmektedir. Bunlara göre önce TF sonra IDF değerlerini sırasıyla bulalım.

  • TF (Term Frequency)

En basit ifadeyle terim sıklığı, doküman içindeki hedef terim sayısının dokümandaki toplam terim sayısına oranıdır. Yukarıdaki örneğe göre TF değerleri hesaplanacak olursa;

[0.33, 0.33, 0.33],

[0.33, 0.33, 0.33],

[0.20, 0.20, 0.20, 0.20, 0.20] şeklinde olacaktır.

  • IDF (Inverse Documet Frequency)

IDF değeri, toplam doküman sayısının hedef terimin geçtiği doküman sayısına olan oranının logaritmasıdır. Bu aşamada doküman içerisinde terimin kaç defa geçtiğinin bir önemi yoktur. Geçip geçmediğinin tespit edilmesi yeterlidir. Bu örnekte alınacak logaritmanın taban değeri 10 olarak belirlenmiştir. Ancak farklı değerlerin kullanılmasında da herhangi bir sakınca yoktur.

“Bu”: Log(3/3)= 0,

“bir”: Log(3/2):0.1761,

“kelimedir, sayıdır vb.”: log(3/1) : 0.4771

Böylelikle hem TF hem de IDF değerleri elde edilmiştir. Bu değerler ile vektörizasyon işlemi yapılacak olursa öncelikle her bir doküman için bütün dokümanlardaki unique kelime sayısı kadar elemandan oluşan bir vektör oluşturulur (Bu örnekte 8 terim vardır). Bu aşamada çözülmesi gereken bir problem vardır. “Bu” teriminde de görüldüğü üzere IDF değerinin 0 olmasından dolayı TF-IDF değeri de sıfır olacaktır. Ancak vektörizasyon işlemi sırasında doküman içerisinde geçmeyen kelimelere de (örnek olarak 1.cümlede “kelimedir” ifadesi geçmemektedir) 0 değeri atanacaktır. Buradaki karışıklığın önüne geçebilmek adına vektörleştirme sırasında TF-IDF değerlerine smoothing işlemi uygulanır. En yaygın kullanılan yöntem elde edilen değerlere 1 eklenmesidir. Amaca göre daha sonra bu değerlere normalizasyon işlemi de uygulanabilir. Yukarıda anlatılanlara göre vektörizasyon işlemi yapılacak olursa;

[1. , 1.1761 , 1.4771 , 0. , 0. , 0. , 0. , 0.],

[1. , 1.1761 , 0. , 1.4771 , 0. , 0. , 0. , 0.],

[1. , 0. , 0. , 0. , 1.4771 , 1.4771, 1.4771 , 1.4771], sonuçları elde edilir.

* Word2Vec

Word2vec, sıklıkla kullanılan word embedding tekniklerinden bir diğeridir. Bütün corpus taranarak hedef kelimenin daha çok hangi kelimelerle birlikte geçtiği tespit edilerek vektör oluşturma işlemi gerçekleştirilir[3]. Bu sayede kelimelerin anlamsal olarak birbirlerine yakınlıkları da ortaya çıkmış olur. Örnek vermek gerekirse her harf bir kelimeyi temsil edecek şekilde ..x y A z w.. ve .. x y B z k.. dizilimindeki A ve B kelimelerinin birbirlerine olan yakınlıkları, bu kelimelerin ..x l C d m… dizilimindeki C kelimesine olan yakınlıklarından daha fazladır. Vektör oluşumunda bu durum göz önünde bulundurulduğu için kelimeler arasındaki anlamsal yakınlık matematiksel olarak ifade edilmiş olur.

Şekil 2. Kelime benzerlikleri

Şekil 2'de Word2Vec konularında en sık kullanılan görsellerden birisi görülmektedir. Bu kelimeler arasındaki anlamasal yakınlık vektörel değerlerin birbirlerine olan yakınlığından başka bir şey değildir. Hatta sıklıkla verilen örneklerden birisi de “king- man + woman = queen” denklemidir. Burada gerçekleşen olay vektörlerin birbirlerinden çıkartılması ve toplanması sonucunda elde edilen vektörel değerin “queen” ifadesine karşılık gelen vektöre eşit olmasıdır. Buradan “king” ve “queen” kelimelerinin birbirlerine çok benzer olduğu ancak yalnızca cinsiyetleri sebebiyle vektörel farklılıkların ortaya çıktığı anlaşılabilir.

Word2Vec yönteminde One Hot Encoding ve TF-IDF yöntemlerinden farklı olarak unsupervised learning işlemi gerçekleştirilir. Etiketsiz veriler yapay sinir ağları aracılığıyla eğitilerek kelime vektörleri üreten Word2Vec modeli oluşturulur. Yine diğer yöntemlerden farklı olarak vektör boyutu corpus içerisindeki unique kelimelerin sayısı kadar olmaz. Burada vektörün boyutu corpus büyüklüğüne ve proje türüne göre seçilebilir. Bu da özellikle çok büyük verilerde büyük fayda sağlamaktadır. Örnek olarak büyük bir corpus içerisinde 300 000 adet unique kelimenin olduğunu varsayarsak One Hot Encoding ile vektör oluşturma işlemi yapıldığında her bir kelime için 300 000 boyutlu yalnızca bir elemanın değeri 1 diğerlerinin 0 olan bir vektör oluşturulması gerekir. Ancak Word2Vec işleminde vektör boyutu 300 (kullanıcı seçimine bağlı olarak daha fazla veya daha az da olabilir) seçilerek gereksiz büyük boyutlu vektörel işlemlerden kaçınılmış olur.

Şekil 3. Word2Vec modelinde kelimenin vektörleştirilmesi

Şekil 3'te “Royal” kelimesinin vektörleştirilmesi görülmektedir. 5 kelimelik cümle içerisinde bulunan “Royal” kelimesi One Hot Encoding ile vektörleştirilecek olursa en soldaki vektör ifadesi elde edilir. Görüleceği üzere bu vektörün boyutu cümledeki toplam kelime sayısı kadardır. Ancak vektörizasyon işlemi Word2Vec ile yapılacak olursa bu defa 3 birimlik [5,12,2] vektörü oluşturulur.

Uygulamalı Word2Vec model eğitimi için kaggle’daki otel yorumları veri seti (https://www.kaggle.com/anu0012/hotel-review) kullanılmıştır. Örnek olarak verilen kodların tamamına buradan ulaşılabilir.

Büyük/küçük harf duyarlılığı olduğu için öncelikle bütün kelimeler küçük harfli durumlarına çevrilir. Sonrasında özel karakterler ve etkisiz kelimeler (stopwords) temizlenir. Etkisiz kelimeler için nltk kütüphanesi kullanılmıştır. İstenirse bu kelimeler tamamen manuel olarak da belirlenebilir. Bu işlemler yapılmadan önceki örnek bir cümle şöyledir.

“My husband and I have stayed in this hotel a few times. Though not the fanciest hotel, we love the fact that we can walk the — or so miles to Fenway. It is clean and the staff is very accomodating. My only complaint is that the fan in the bathroom was noisy and went on automatically when you turned the light on and we tried to keep the light off as much as possible. We’ve stayed in pricier hotels which charged for internet and breakfast and these are both included. Will stay there again.”

Verilerin ön işlemesinden sonra oluşacak yeni durum aşağıdaki gibidir.

“husband stayed hotel times though fanciest hotel love fact walk miles fenway clean staff accomodating complaint fan bathroom noisy went automatically turned light tried keep light much possible weve stayed pricier hotels charged internet breakfast included stay”

Bu işlemler tamamlandıktan sonra Word2Vec eğitimi gerçekleştirilir. Eğitim esnasında kullanılan parametreler;

min_count : Hedef ifadenin corpus içerisinde minimum geçme sayısıdır. Bu koşulu sağlamayan kelimeler, Word2Vec’in sözlüğüne dahil edilmez. Özellikle çok büyük copruslar için bu sınırın yüksek tutulması başarının daha da artmasını sağlar. Ancak küçük veri setleri için küçük tutulması daha doğru olacaktır.

window : Hedef ifadenin vektör hesaplamalarına doğrudan etki edecek olan komşu kelimelerin sayısıdır. Örnek olarak “O çok iyi bir insandır.” cümlesini ele alacak olursak “iyi” kelimesinin matematiksel olarak ifade edilmesinde doğrudan etkili olan kelimeler window:1 için “çok” ve “bir” iken window :2 olduğunda “O”,”çok”,”bir” ve “insandır.” kelimeleri hesaplamalara doğrudan dahil olur.

size : Her bir eleman için oluşturulacak vektörün boyutudur.

alpha : Başlangıç öğrenme oranı değeri (initial learning rate olarak geçmektedir.

min_alpha : Eğitim esnasında learning rate değeri lineer şekilde düşeceği minimum değerdir.

sg : Training algoritmasının nasıl çalışacağını belirtir. Eğer 1 seçilerse skip-gram aksi takdirde CBOW algoritması kullanılır.

Şekil 4. Skip-gram vs CBOW

Şekil 4'te CBOW (Continuous Bag of Words) vs Skip-gram algoritmalarının farklılığı görülmektedir. CBOW algoritması kullanılan eğitimlerde input olarak hedef kelimeye komşu olan kelimeler verilip output olarak da hedef kelimenin kendisi elde edilir. Skip-gram algoritmasında ise input olarak hedef kelimenin kendisi verilirken, output olarak komşu kelimeler elde edilir.

workers : Traning işlemi paralel şekilde gerçekleştirilebilir. Bunun için kullanılacak çekirdek sayısı workers parametresiyle belirlenebilir.

Eğitim sonucunda elde edilen modeli kullanarak “great” kelimesinin vektörü görülmek istenirse;

w2v_model["great"]
>>>array([ 3.03658217e-01, -1.56424701e-01, -8.23674500e-01,
.
.
.
-1.36196673e-01, 8.55127215e-01, -7.31807232e-01, 1.36362463e-01],
dtype=float32)
print(w2v_model["great"].shape)
>>>(300,)

Ayrıca aşağıda örnek olarak seçilen kelimelere en yakın 10 kelimeyi görmek için;

w2v_model.wv.most_similar(positive=["great"])
>>>[('excellent', 0.8094755411148071),
('fantastic', 0.7735758423805237),
('perfect', 0.7473931312561035),
('wonderful', 0.7063912153244019),
('good', 0.7039040327072144),
('amazing', 0.6384587287902832),
('loved', 0.6266685724258423),
('nice', 0.6253951787948608),
('awesome', 0.6186609268188477),
('enjoyed', 0.5889394283294678)]
---------------------------------
w2v_model.wv.most_similar(positive=["terrible"])
>>>[('bad', 0.5275813341140747),
('poor', 0.504431962966919),
('horrible', 0.4722219705581665),
('awful', 0.42389577627182007),
('worst', 0.40153956413269043),
('dirty', 0.3467090427875519),
('disgusting', 0.32588857412338257),
('horrendous', 0.3157917261123657),
('lousy', 0.30114778876304626),
('uncomfortable', 0.3005620837211609)]
---------------------------------
w2v_model.wv.most_similar(positive=["boston"])
>>>[('chicago', 0.519180417060852),
('seattle', 0.5126588940620422),
('dc', 0.4830571711063385),
('bostons', 0.4459514617919922),
('copley', 0.4455355107784271),
('city', 0.44090309739112854),
('newbury', 0.4349810481071472),
('fenway', 0.4237935543060303),
('philadelphia', 0.40892332792282104),
('denver', 0.39840811491012573)]
---------------------------------
w2v_model.wv.most_similar(positive=["valet"])
>>>[('parking', 0.7374086380004883),
('car', 0.6263512969017029),
('garage', 0.6224508285522461),
('retrieving', 0.5173929929733276),
('self', 0.5013973712921143),
('inandout', 0.4847780168056488),
('selfpark', 0.47603434324264526),
('fee', 0.47458043694496155),
('per', 0.4741314947605133),
('parked', 0.4707031846046448)]

* FastText

FastText algoritmasının çalışma mantığı Word2Vec’e benzemekle birlikte en büyük fark training esnasında kelimelerin N-gramlarını da işleme dahil etmesidir [4]. Bu durum modelin boyutunu ve işlem süresini artırırken, modele kelimelerin farklı varyasyonlarını da tahmin edebilme yeteneğini kazandırır. Örnek olarak training veri seti içinde “Windows” kelimesinin geçtiğini ve eğitim bittikten sonra “Wndows” kelimesinin vektörünü elde etmek istediğimizi varsayalım. Bu işlemler için Word2Vec modeli kullanıldığı takdirde “Wndows” kelimesi sözlük içinde yoktur hatası verecektir ve herhangi bir vektör geriye döndürmeyecektir. Ancak bu işlem FastText modeli ile yapılırsa hem vektör dönecek hemde en yakın kelimeler arasında “Windows” kelimesi olacaktır. Bunun sebebi de yukarıda anlatıldığı üzere eğitime sadece kelimenin kendisi değil aynı zamanda N-gram varyasyonlarının da girmesidir (Örnek olarak “Windows” kelimesi için 3-gram ifadeleri -> Win, ind, ndo, dow, ows). FastText modeli günümüzde birçok farklı alanda kullanılmasıyla birlikte özellikle OCR çalışmalarında word embedding tekniklerine ihtiyaç duyulduğunda sıklıkla tercih edilmektedir. Özellikle en ufak bir OCR hatasına toleransı olmayan diğer tekniklere göre FastText, kendi kelime dağarcığında doğrudan olmayan kelimelerin bile vektörlerini elde edebilmesi büyük avantaj sağlamaktadır. Bu sebeple kelime hatalarının olabileceği problemlerde diğer alternatiflerinin bir adım önündedir.

Yukarıda anlatılan vektörleştirme yöntemleri günümüzde en sık kullanılan tekniklerdir. Her birinin farklı kullanım alanları vardır. Kelime vektörleştirilmesine ihtiyaç duyulan çalışmalarda öncelikle problem tespit edilmeli ve yukarıda bu probleme en çok uyan teknik tercih edilmelidir. Nitekim her bir tekniğin güçlü olduğu farklı durumlar vardır.

Bunların yanı sıra bir de ELMO, BERT gibi bağlamsal olan gösterimler de mevcuttur[5]. Bağlamsal duruma örnek vermek gerekirse, Dolu bardağı yere düşürdü” ve “Dışarıda dolu yağıyor” cümleleri incelenebilir. İki cümlede de aynı kelime geçmesine rağmen cümle içinde kullanılma şekillerindeki (birlikte kullanıldığı kelimeler, cümledeki yeri …) farklılıktan dolayı farklı anlamlara gelmektedirler. Bu tarz bağlamsal durumlara çözüm olan teknikler ise sonraki çalışmalarda işlenecektir.

Github

Kodların tamamına https://github.com/ademakdogan/word2vec_generator adresinden ulaşılabilir. Bu projede istenilen herhangi bir csv dosyasında, belirlenecek olan kolona göre word2vec eğitimi otonom şekilde yaptırılabilir. İşlemler sonucunda oluşacak word2vec modeli “model” klasörünün altına kaydedilir. Örnek kullanım aşağıda görülebilir. Bu proje aynı zamanda docker üzerinden de çalışabilecek durumdadır. Veri büyüklüğüne göre src/training.py içerisindeki parametreler optimize edilebilir.

python3 src/w2vec.py -c </Users/.../data.csv> -t <target_column_name>

Github : https://github.com/ademakdogan

Linkedin : https://www.linkedin.com/in/adem-akdo%C4%9Fan-948334177/

Referanslar

[1]Stevens, S. S. (1946). “On the Theory of Scales of Measurement”. Science, New Series, 103.2684,677–680.

[2]Aizawa Akiko, (2003). “An information-theoretic perspective of tf–idf measures”. Information Processing and Management. 39 (1), 45–65. doi:10.1016/S0306–4573(02)00021–3

[3]Tomas Mikolov, et al. (2013). “Efficient Estimation of Word Representations in Vector Space”. arXiv:1301.3781

[4]Armand Joulin, Edouard Grave, Piotr Bojanowski, Tomas Mikolov,(2017). “Bag of Tricks for Efficient Text Classification”, Conference: Proceedings of the 15th Conference of the European Chapter of the Association for Computational Linguistics: Volume 2.

[5]Devlin Jacob, Chang Ming-Wei, Lee Kenton, Toutanova Kristina,(2018). “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”

--

--