Python ile Metin Ön İşleme, WordCloud & Word2Vec Model

Kübra Kurt
6 min readDec 24, 2020

--

Herkese merhabalar, sizlere ilk öncelikle kısaca “Word2Vec” modelinden bahsedeceğim. Ardından da “Dan Brown — Da Vinci’nin Şifresi” kitabının özetini internetten kazıyarak, üzerinde metin ön işleme uygulayıp kelime bulutları oluşturacağım. Son olarak da Word2Vec modellemesinin nasıl yapıldığını göstereceğim.

Doğal Dil İşleme eğitim süreleri oldukça uzun sürmektedir. Bir çözüm yolu olarak vektör boyutları sınırlandırılabilir fakat bu da modelin doğruluğunu olumsuz yönde etkileyecektir. Buna ise çözüm olarak hem vektör boyutlarının aynı kalmasını sağlayacak hem de işlem hızını arttırmak amacıyla Google araştırmacıları Word2Vec adlı bir teknik geliştirmişlerdir.

Word2Vec kelimeler arasındaki uzaklıkları vektörel olarak ortaya koymaktadır. Denetimsiz öğrenmeye dayalı bir tekniktir. İki katmanlı ağ yapısına sahiptir. Bunun sebebi ise hesaplama karmaşıklığını daha az bir seviyeye indirgemektir. Ayrıca iki farklı algoritmadan meydana gelmektedir. Bu algoritmalardan bahsedecek olursak:

  1. Ardışık Kelimeler Topluluğu (CBOW)

Etrafındaki (sağındaki ve solundaki) kelimelerden, merkezdeki (ortadaki) kelimeyi tahmin etmeyi amaçlamaktadır.

Kaynak

2. Komşu Kelimeler Tahmini (Skip-gram)

Merkezdeki (ortadaki) kelimeden, etrafındaki (sağındaki ve solundaki) kelimeleri tahmin etmeyi amaçlamaktadır.

Kaynak

Bu iki algoritma arasından çoğunlukla Skip-gram algoritması tercih edilmektedir. Bunun sebebi ise daha iyi benzerlik uygulayarak, daha iyi sonuçlar vermesidir.

Metin Ön İşleme

Sizlere bir önceki yazımda internet üzerinden nasıl metin kazıyacağımızı anlatmıştım. Burada tekrar anlatmayacağım, eğer bu konuda bilginiz yoksa yazıma buradan ulaşabilirsiniz.

Öncelikle gerekli kütüphaneleri import ediyoruz.

Metin kazıma için gerekli işlemleri uyguluyoruz.

Metin ön işleme uygulamalarına geçiş yapıyoruz. İlk önce text içerisindeki bütün karakterleri küçültüyoruz. Bunun için corpus_lower adlı bir fonksiyon yazıyoruz. Bu fonksiyona text ile giriş yapıldığı zaman lower modülü ile bütün karakterler küçük boyuta geçecektir.

Şimdi ise noktalama işaretlerini text içerisinden kaldıracağız. İlk öncelikle gerekli kütüphaneyi import ediyoruz.

remove_punctuation adlı bir fonksiyon yazıyoruz. Bu fonksiyon text içerisinde dolanacak ve eğer gezindiği karakter noktalama işareti değil ise bunu word_wo_punc değişkenine atacak. Ardından da biz bu fonksiyon içerisine text ile giriş yaptığımızda bize noktalama işaretleri kaldırılmış bir şekilde çıktısını verecek.

Sırada numerik karakterleri kaldırmamız gerekiyor. Bunun içinde remove_numeric isimli bir fonksiyon yazıyoruz. Bu fonksiyon da text içerisinde dolanacak ve numerik olmayan her şeyi output değişkeninin içerisine atacak. Ardından bize de numerikler kaldırılmış olarak bir çıktı verecek. Fakat ilk ifade de °c bu şekilde bir karakter bulunmaktadır. Numerikleri kaldırdıktan sonra onu da text içerisinden kaldırıyoruz.

Şimdi de elimizdeki text’i işlemlere alabilmek adına parçalara ayırıyoruz. Bunu da split() modülü ile gerçekleştiriyoruz.

Text içerisinde çok fazla durdurma kelimeleri mevcut. Bunlar text analizi yaparken ve model kurarken olumsuz etkileyecektir. Ayrıca da işlemlerin sürelerini gereksiz yere uzatacaktır. O yüzden bunları kaldırmamız gerekiyor. Türkçe için burada güzel sonuç alabileceğimiz stopwordsler mevcut değil. O yüzden ben de Github üzerinden hazırlanmış olan stopwordsleri alacağım. Ardından da onu kullanarak elimizdeki text içerisinden onları çıkaracağım. Öncelikle Github üzerinden stopwordsleri alalım. En başta kazıma için gerekli kütüphaneleri import etmiştik. Burada direkt olarak uygulayabiliriz.

Şimdi de textimizi bu stopwordsler ile sadeleştirelim. Öncelikle boş bir filtered_text değişkeni oluşturuyoruz. Ardından bir for döngüsü ile text içerisinde dolaşıyoruz ve eğer text içerisindeki kelimeler stopwords kelimeleri arasından birisi değilse bunu filtered_text değişkenine atıyoruz.

WordCloud

Şimdi ise WordCloud ile bir kelime bulutu oluşturarak göz atalım. Yine öncelikle bunun için gerekli kütüphaneleri import ediyoruz.

Burada da öncelikle sentence isimli boş bir değişken oluşturuyoruz. Ardından bir for döngüsü ile bizim kelimelerimiz içerisinde dolanıp onları sentence değişkenine atıyoruz. Sonrasında da text_ adlı bir değişken oluşturup map() modülü içerisinde onları birleştiriyoruz. wordcloud adlı bir değişkene WordCloud modülü ile kelime bulutumuzu oluşturuyoruz. Burada width ve height kelime bulutunun boyutlarını ayarlamamız için girilmesi gereken parametrelerdir. max_font_size en fazla kaç kelime alacağımıza karar vereceğimiz parametredir. Bu parametrelerin girişini yaptıktan sonra gerekli işlemleri yaparak kelime bulutunun çıktısını alıyoruz.

Bir farklılık olarak Mona Lisa şablonu üzerine kelime bulutu oluşturacağım. Bunun için öncelikle gerekli kütüphaneleri yüklüyoruz.

Bu şablonu buraya alarak bunun üzerine kelime bulutu oluşturacağım.

Şablonu buraya almak için Image.open() modülünü kullanıyoruz. Aldıktan sonra bir numpy array tipine çevirip movie_mask değişkenine atıyoruz.

Ek olarak yapmamız gereken tek şey mask parametresine oluşturduğumuz movie_mask değişkenini atamak.

Şimdi ise kelimeleri modele alabilmek için tekrar bir split etme işlemi uygularak tokenize ediyoruz.

Word2Vec Model

Sıra geldi modeli kurmaya. Biz modelimizi Skip-gram algoritmasına göre kuracağız. Bunun için öncelikle gerekli kütüphaneyi import ediyoruz.

Elimizde son olarak ön işlemeden geçirilmiş bir corpus tokenleri kaldı. Modele ilk olarak corpus girişi yapıyoruz. size parametresi ile vektörlerin uzunluğunu belirliyoruz. window parametresi ile ortadaki kelimenin sağından ve solundan kaçar kelime alınacağına karar veriyoruz. min_count parametresi ile en az kaç defa geçen kelimeleri alacağımıza karar veriyoruz. Son olarak sg Skip-gram kullanacağımız için 1 olarak alıyoruz. Fakat sizler sg parametresinin değerini arttırarak farklı versiyonları ile de kullanabilirsiniz.

Modelimizi kurduk. Şimdi modelin içerisinden müze kelimesinin vektör yapısını inceleyelim.

Şimdi de sırası ile dünya, ajan, kutsal ve müze kelimelerine en yakın 10 kelimeyi listeyerek modelimizin sonuçlarını inceleyelim.

Şimdi ise bir fonksiyon yazacağız ve bu fonksiyon sayesinde bir kelimeye yakın olan diğer kelimeleri grafikte görsel olarak göreceğiz. Bunun için öncelikle gerekli kütüphaneleri import ediyoruz.

closestwords_tsneplot isimli bir fonksiyon yazıyoruz. İlk parantez içerisinde model ve bir kelime alıyoruz. Boş numpy array ile boyutu tuple olarak veriyoruz (0,150). word_labels listesini oluşturuyoruz ve bu liste içerisinde kelimelerin kendisini saklayacağız. close_words değişkenine fonksiyona girilen kelimeye en yakın olan kelimeleri atıyoruz. word_vectors değişkenine kelime vektörlerini alıp, fonksiyona gelen kelimenin vektörünü eklemiş oluyoruz. Tüm kelimelerin ayrı ayrı matris olarak tutulabilmesi için axis parametresini sıfır vermemiz gerekiyor. Şimdi kelimeye yakın olan kelimelerin vektörlerini de ekleyelim. Bunu for döngüsü ile yapıyoruz. model_similar ile aldıklarımız tuplelar halinde liste içerisinde tutuluyor. Tuplelar içerisinde hem kelimenin kendisi hem de skor değeri tutuluyor. Tupleları for döngüsü ile açacağız. İlk eleman kelimenin kendisi, ikincisi kelimelerin ne kadar yakın olduğunun değeri olacak. Skor değerine ihtiyacımız olmadığı için “_” koyuyoruz. Sadece kelimenin kendisini kullanacağız. Kelime döngü döndükçe w değişkenine atanacak. word_labels.append(w) ile döngü içerisinde aldığımız kelimeyi listeye ekliyoruz. Ardından aldığımız kelime vektörünü oluşturduğumuz diziye ekliyoruz ve word_vectors değişkenine atıyoruz. random_state = 0 olarak giriyoruz. Bu sayede tsne her çalıştırdığımızda aynı sonucu alırız. Sonuç koordinatlarını Y isimli değişkene atıyoruz. Tüm kelimelerin x ve y koordinatları burada tutuluyor. Biz x koordinalarını ayrı, y koordinatlarını ayrı bir yerde tutacağız. plt.scatter(x_coords, y_coords) grafiği noktalı bir şekilde çizdirecek. Bunu yaptıktan sonra grafik sadece noktalardan oluşuyor olacak. Biz bir for döngüsü ile noktaların olduğu yerlere kelimeleri yazdıracağız. Öncelikle yazacağımız yazıyı label olarak giriyoruz. Daha sonra yazının yazılacağı yerler için x ve y koordinatlarını giriyoruz. xytext ile yazdığımız kelimeyi kenara kaydırıyoruz. Bu sayede nokta ve kelime üst üste gelmez. textcoords girişini x ve y ile belirlediğimiz değerlerin noktalar üzerinde uygulanacağını belirtiyoruz. Arından da grafiğin çıktısını alıyoruz.

Yukarıda incelediğimiz benzerlikleri sırasıyla grafik ile inceleyelim.

Son olarak da modelimizde kelimelerin nasıl dağıldığına, bir kelimeye en yakın kelimelerin neler olduğuna grafik üzerinden bakabiliriz. Bunun için yine gerekli kütüphaneleri import ediyoruz.

Bunun için bir tsne_plot adlı bir fonksiyon oluşturuyoruz.

min_count parametresini arttırarak da incelersek bu şekilde bir sonuç elde edeceğiz.

--

--