Word2Vec [ Bana arkadaşlarını söyle, sana kim olduğunu söyleyeyim.]

Bu yazıda Word2Vec modelini anlamaya çalışıyoruz. Bu modelde kelimeleri koordinat sisteminde bir nokta gibi düşünüp aralarındaki uzaklığı vektörel olarak hesaplıyoruz. Bu yolla kelimeler arasında da analoji yani benzerlik kuruyoruz.

Aşağıdaki görselden de bu durumu görebiliriz.

Bu modelin arkasındaki düşünce şu. “Bir kelimenin anlamı içerisinde bulunduğu kelime grubundan çıkarılabilir.” Tabiri caizse “Bana arkadaşlarını söyle, sana kim olduğunu söyleyeyim.”

Modelin daha rahat anlaşılması için buradaki anlatımdan ve kodlardan yola çıkarak devam edelim.

İlk olarak kütüphaneleri içe aktarıyoruz.

# kütüphane aktaralım
import gzip
import gensim 
import logging
 
logging.basicConfig(format=’%(asctime)s : %(levelname)s : %(message)s’, level=logging.INFO)
 

Şimdi bu kütüphanelerin fonksiyonlarına yakından bakalım.

Gzip nedir ?


Gzip kütüphanesi dosyaları sıkıştırmak veya sıkıştırılan dosyaları çıkartmak için kullanılıyor.


Gzip kütüphanesi dosyaları sıkıştırmak veya sıkıştırılan dosyaları çıkartmak için kullanılıyor.

Gensim nedir?

Gensim kütüphanesi bizim için önemli. Çünkü gözetimsiz öğrenme modellerinde sıklıkla kullanılan bir makine öğrenmesi kütüphanesi. Özellikle büyük metinleri konu bazlı modelleme ve doğal dil işleme konusund kullanılıyor. 1400’ün üzerinde akademik çalışmada kullanılan kütüphane ücretsiz olarak Github üzerinden indirilebiliyor.

Logging nedir ?

Logging kütüphanesi isminden de anlaşılacağı gibi geliştirme sırasında akışları daha rahat görebilmemizi sağlıyor.

Bu noktadan sonra iyi bir veri setine ihtiyacımız var. Yazılımımız ne kadar iyi olursa olsun veriseti iyi olmadığı sürece başarısız olabileceğimizi unutmayalım. Bu projede ise sıkıştırılmış hali 97 megabayt sıkıştırılmamış hali 229 megabayt olan oteller ve arabalar hakkındaki 225.000 yorum yer alıyor.

Verisetimizin ilk satırına bakalım.

with gzip.open (input_file, 'rb') as f:
        for i,line in enumerate (f):
            print(line)
            break
 
b"Oct 12 2009 \tNice trendy hotel location not too bad.\tI stayed in this hotel for one night. As this is a fairly new place some of the taxi drivers did not know where it was and/or did not want to drive there. Once I have eventually arrived at the hotel, I was very pleasantly surprised with the decor of the lobby/ground floor area. It was very stylish and modern. I found the reception's staff geeting me with 'Aloha' a bit out of place, but I guess they are briefed to say that to keep up the coroporate image.As I have a Starwood Preferred Guest member, I was given a small gift upon-check in. It was only a couple of fridge magnets in a gift box, but nevertheless a nice gesture.My room was nice and roomy, there are tea and coffee facilities in each room and you get two complimentary bottles of water plus some toiletries by 'bliss'.The location is not great. It is at the last metro stop and you then need to take a taxi, but if you are not planning on going to see the historic sites in Beijing, then you will be ok.I chose to have some breakfast in the hotel, which was really tasty and there was a good selection of dishes. There are a couple of computers to use in the communal area, as well as a pool table. There is also a small swimming pool and a gym area.I would definitely stay in this hotel again, but only if I did not plan to travel to central Beijing, as it can take a long time. The location is ok if you plan to do a lot of shopping, as there is a big shopping centre just few minutes away from the hotel and there are plenty of eating options around, including restaurants that serve a dog meat!\t\r\n"

Şeklinde bir çıktı aldık bu bizim ilk yorumumuz. Bunun gibi 225 bin yorum mevcut. Şimdi gensim kütüphanesinin gensim.utils.simple_preprocess metoduyla küçük harfe çevirme, çok uzun veya çok kısa ifadeleri atma işlemlerini yapıyoruz.

def read_input(input_file):
    """This method reads the input file which is in gzip format"""
 
    logging.info("reading file {0}...this may take a while".format(input_file))
    with gzip.open(input_file, 'rb') as f:
        for i, line in enumerate(f):
 
            if (i % 10000 == 0):
                logging.info("read {0} reviews".format(i))
            # do some pre-processing and return list of words for each review
            # text
            yield gensim.utils.simple_preprocess(line)
 

Sıra verisetimizi Word2Vec modeli ile eğitmeye geldi.

# build vocabulary and train model
    model = gensim.models.Word2Vec(
        documents,
        size=150,
        window=10,
        min_count=2,
        workers=10)
    model.train(documents, total_examples=len(documents), epochs=10)

Bu kısımda modelimizi oluşturuyor ve eğitiyoruz. Eğitim süresi yaklaşık 10 ile 15 dakika sürüyor. Modelimizdeki parametrelere yakından bakalım.

Size: Size parametresi vektörün her simgeyi veya kelimeyi temsil edecek boyutu için kullanılıyor. Komşu kelime seçim sayısı buradan yapılıyor. Büyük veri setlerinde çeşitli denemeler yaparak sınırlandırmak işinize yarayabilir. Bu sette 100 ile 150 arası değerler iyi çalışmış ve 150 seçimi yapılmış.

Window: Hedeflenen kelime ile komşu kelimeler arasındaki maksimum uzaklığı belirliyor. Bunu şöyle düşünelim. Büyük veri setinde mesafe ne kadar küçükse o kadar birbirine yakın kelimeleri sonuçlarda görebilirsiniz. Fakat veri setinizin küçük olduğu durumda ise bu aleyhinize dönebilir birbirine alakalı olmayan kelimeleri de yakınlıklarından dolayı benzer diye tanımlayabilir. Dolayısıyla veri setinin büyüklüğüne, içeriğine göre denemeler yaparak Window parametresini ayarlamakta fayda var.

min_count: Kelimenin geçtiği minumum frekans. Veri setiniz çok küçük olmadığı sürece min_count sonuçları çok etkilemiyor.

workers: Arka tarafta kaç thread ( iş parçacığı ) çalışacağını belirliyor.

Şimdi sonuçlara bakabiliriz. Örneğin “dirty” kelimesi için most_similar fonksiyonunu kullanarak en benzer 10 kelimeyi bulmaya çalışalım.

Görüldüğü gibi çok pis anlamına gelen filthy ve lekeli anlamına gelen stained kelimeleri dirty ye en benzer kelimeler olarak bulundu. Başka bir kelime için deneyelim ve polite kelimesi için sonuçlara bakalım.

Sonuçlar bu şekilde. Peki sadece sıfatlar için mi bu durum var yoksa bir özel isim için de güzel sonuçlar alabilir miyiz ?

Fransa’ya verisetimiz içerisinde en benzer kelime sırasıyla Kanada, Almanya, İspanya, Barselona çıktı.

Eğer iki kelime arasında benzerlik istersek de similarity fonksiyonunu kullanıyoruz.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir