Giriş
Doğal dil işleme (NLP), bilgisayarların insan dilini anlamasına, yorumlamasına ve manipüle etmesine yardımcı olan bir yapay öğrenme dalıdır . NLP, insan iletişimi ve bilgisayar anlayışı arasındaki boşluğu doldurma arayışında, bilgisayar bilimi ve hesaplamalı dilbilim dahil olmak üzere birçok disiplinden yararlanır.
NLP yani Doğal Dil İşleme, doğal dillerin kurallı yapısının çözümlenerek anlaşılması veya yeniden üretilmesi amacını taşır.Bu çözümlemenin insana getireceği kolaylıklar, yazılı dokümanların otomatik çevrilmesi, soru-cevap makineleri, otomatik konuşma ve komut anlama, konuşma sentezi,, otomatik metin özetleme, bilgi sağlama gibi birçok başlıkla özetlenebilir. Bilgisayar teknolojisinin yaygın kullanımı, bu başlıklardan üretilen uzman yazılımların gündelik hayatımızın her alanına girmesini sağlamıştır. Örneğin, tüm kelime işlem yazılımları birer imlâ düzeltme aracı taşır. Bu araçlar aslında yazılan metni çözümleyerek dil kurallarını denetleyen doğal dil işleme yazılımlarıdır. Bu yazıda, temel string işlemlerinden, düzenli ifadelerle yapılan işlemlerden, metin ön işlemenin temel adımlarından, kelime temsil yöntemlerinden ve kelime benzerliği bulma yöntemlerinden bahsedeceğiz.
İÇİNDEKİLER
Temel String İşlemleri
Oluşturma Biçimlendirme
Dizi İçi Tip Sorgulamaları
Elemanlarına ve Eleman Indexlerine Erişmek
Başlangıç ve Bitiş Karakterlerini Sorgulamak: startswith() & endswith()
Count
Sorted
Split
Join
Replace, str.maketrans, translate
Contains
REGEX İŞLEMLERİ
Herhangi bir karakteri eşleştirme:
Diğer fonksiyonlar:
Metin Ön işleme – Giriş
Büyük-Küçük Harf Dönüşümü
Noktalama İşaretlerinin Silinmesi
Sayıların Silinmesi
METİN ÖN İŞLEME ADIMLARI
Chunking
KELİME TEMSİLİ
Word2Vec
Doc2Vec
FastText
KELİME BENZERLİĞİ
Jaccard Benzerliği
Jaro Mesafesi
Öklid Mesafesi
Kosinüs Benzerliği
Kelime Taşıyıcının Mesafesi (Word Mover’s Distance)
Levenshtein Mesafesi
Temel String İşlemleri
Burada temel string işlemleri Python programlama dilinde yazılan örnekler ile açıklanmıştır.
Oluşturma Biçimlendirme
Dizi İçi Tip Sorgulamaları
Elemanlarına ve Eleman Indexlerine Erişmek
Başlangıç ve Bitiş Karakterlerini Sorgulamak: startswith() & endswith()
Count
Sorted
Split
Join
Replace, str.maketrans, translate
Contains
REGEX İŞLEMLERİ
Regular Expressions (Regex veya Düzenli / Kurallı İfadeler) modern programlama dillerinin neredeyse tamamında yer bulan, aynı söz dizimine (syntax) sahip olan, genellikle harflerden oluşan karakterler dizisinin (string) belirtilen kurallar çerçevesinde kısa yoldan ve esnek bir biçimde belirlenmesini sağlayan bir yapıdır.
Bu tür ön işleme görevleri için manuel komut dosyaları yazmak çok çaba gerektirir ve hatalara açıktır. Bu ön işleme görevlerinin önemini göz önünde bulundurarak, bu metin ön işleme görevlerini kolaylaştırmak için Düzenli İfadeler (Regex) farklı dillerde geliştirilmiştir.
Düzenli İfadelerin Kullanım Amacı
-
Yoğun veri yığını içerisinden ihtiyaç duyulan bilginin çekilmesi
-
Kullanıcı tarafından girilen girdinin denetimi
-
Verilerin kullanım amacına uygun biçime sokulması
Herhangi bir karakteri eşleştirme:
Diğer fonksiyonlar:
Metin Ön işleme – Giriş
Metin ön işleme adımları, daha sonraki işlemler için metni insan dilinden makine tarafından okunabilir bir biçime aktarmak için gereklidir.
-
Tüm harfleri küçük veya büyük harfe dönüştürme
-
Sayıları kaldırmak
-
Noktalama işaretlerini, vurgu işaretlerini ve diğer aksan işaretlerini kaldırma
-
Beyaz boşlukların kaldırılması
-
Durak sözcüklerini, seyrek terimleri ve belirli sözcükleri kaldırma
Büyük-Küçük Harf Dönüşümü
Noktalama İşaretlerinin Silinmesi
Sayıların Silinmesi
METİN ÖN İŞLEME ADIMLARI
Normalization:
Normalleştirme bir kelime listesini daha düzgün bir sıraya dönüştüren bir işlemdir. Bu, metnin daha sonra işlenmek üzere hazırlanmasında yararlıdır. Sözcükleri standart bir biçime dönüştürerek, diğer işlemler verilerle çalışabilir ve süreci tehlikeye atabilecek sorunlarla uğraşmak zorunda kalmaz. Örneğin, tüm kelimeleri küçük harfe dönüştürmek arama işlemini basitleştirecektir.
Tokenization:
Metin verileriyle çalışma söz konusu olduğunda Tokenization en yaygın olarak kullanılan işlemlerden biridir. Tokenization işleminin temel görevi bu işleme verilen kalıpları, cümleleri, paragrafları ve bütün bir metni kelime veya terimler gibi küçük birimlere ayırmaktır. Bu küçük birimler ”token” olarak adlandırılır. Token adı verilen bu birimler stemming ve lemmatization işlemlerinin ilk adımıdır.
Tokenization işleminin önemli bir adım olmasının nedeni bütün bir metni anlamak için bu küçük birimleri analiz etmemiz gerekmektedir ve böylece metni anlamak kolaylaşacaktır.
Removing Stop Words :
Bilgisayar dilinde, etkisiz kelimeler, doğal data dilinin (text) işlenmeden önce veya sonra filtrelenmiş kelimeleridir.[1] Genelde etkisiz kelimeler bir dildeki sık kullanılan kelimeleri kapsar, etkisiz kelimeler için işleme araçları tarafından kullanılan tek evrensel bir liste bulunmamaktadır, hatta tüm araçların böyle bir liste kullandığı bile söylenemez. Bazı kullanılan araçlar cümle aramalarını daha iyi destekleyebilmek için etkisiz kelimelerin çıkarılmasından kaçınmaktadır.
Herhangi bir kelime grubu, belirli bir amaç için etkisiz kelime olarak seçilebilir. Bazı arama motorlarında için İngilizce’de en yaygın, kısa işlevsel kelimeler söyledir ; “such as”, “the”, “is”, “at”, “which” ve “on”. Bu durumlarda belirtilen etkisiz kelimelerin olduğu cümleler ve isimler arandığında bazı sorunlar yaşanmaktadır, adların bazıları ; “The Who”, “The The”, veya “Take That”. Diğer arama motorları performanslarını arttırmak için bazı genel kelimeleri de – sözlüksel kelimeler de buna dahildir, “want” (istemek) kelimesi gibi- çıkarmaktadırlar.
Stemming:
Stemming algoritmaları, ekli bir kelimede bulunabilen ortak ön eklerin ve son eklerin bir listesini dikkate alarak kelimenin başlangıcını veya sonunu kesmeye çalışır. Bu ayrım gözetmeksizin kesim, bazı durumlarda başarılı olabilir, ancak her zaman değil.
Stemming sürecinde kullanılabilecek farklı algoritmalar vardır, İngilizce’de en yaygın olanı Porter Stemmer’dır. Bu algoritmada yer alan kurallar 1 ile 5 arasında numaralandırılmış beş farklı aşamaya bölünmüştür. Bu kuralların amacı kelimeleri köküne kadar azaltmaktır.
Bir kelimeyi köklerine ayırmak için kullanıyoruz, köküne indirgemeyi sağlıyor. Gözlük, Göz, Gözlükçü, Gözler gibi hepsi Göz kelimesinden türemiştir.
İndirgetikten sonra dolap gözü mü, yoksa insan gözü mü problemi var onun için de farklı şeyler uygulanıyor.
Lemmatization:
Bu işlem Stemming işlemine göre daha fazla tercih ediliyor, Çünkü örneğin, adventure kelimesinde ” e ” harfini de silme işlemini yapıyor.
Bu metodolojinin anahtarı dilbilimdir. Doğru lemma’yı çıkarmak için her kelimenin morfolojik analizine bakmak gerekir. Bu, böyle bir analiz sağlanacak her dil için sözlüklere sahip olunmasını gerektirir.
Chunking
Parçalama, cümlelerin kurucu parçalarını (isimler, fiiller, sıfatlar, vb.) tanımlayan ve bunları ayrı gramer anlamları olan daha yüksek dereceli birimlere (isim grupları veya deyimler, fiil grupları vb.) bağlayan doğal bir dil sürecidir. Parçalama, cümlelerin kurucu parçalarını (isimler, fiiller, sıfatlar, vb.) tanımlayan ve bunları ayrı gramer anlamları olan daha yüksek dereceli birimlere (isim grupları veya deyimler, fiil grupları vb.) bağlayan doğal bir dil sürecidir
KELİME TEMSİLİ
Bilgisayarların herhangi bir makine öğrenmesi görevini gerçekleştirebilmesi için verilerin sayısal formata dönüştürülmesi gerekir. Metinlerle çalışıldığında bu dönüştürme işlemi, doğal dil işlemenin temel tekniklerinden biri olan kelime temsil yöntemleriyle gerçekleştirilir. Bu yöntemlerin bazılarından aşağıda bahsedilmiştir.
Word2Vec
Word2Vec tahmin tabanlı kelime temsil yöntemlerindendir ve temelinde birer girdi ve çıktı katmanıyla gizli katmandan oluşan bir yapay sinir ağıdır. Kelimeleri vektör uzayında temsil etmeye çalışır ve bunu yaparken de kelime ile kelimenin belirli bir pencere genişliğindeki komşularıyla yakınlık ilişkisi kurar ve anlamca yakın kelimeleri vektör uzayında birbirine yakın olacak şekilde konumlandırır. Pencere genişliği ve temsil (embedding) boyutu önemli hiperparametrelerindendir. Pencere genişliği hedef kelimenin sağında solunda ve kaç kelime olması gerektiğini belirlerken temsil boyutu ise kelimeleri tanımlayacak vektörün boyutunu belirler ki bu gizli katmanda bulunacak nöron sayısına karşılık gelecektir.
Kullandığı iki model bulunmaktadır: CBoW (Continuous Bag of Words) ve SkipGram. CBoW yönteminde komşu kelimelere (hedef kelimenin sağında ve solunda bulunan kelimelere) bakılarak merkezdeki kelime tahmin edilmeye çalışılırken, SkipGram yönteminde merkezdeki kelimeye bakılarak komşu kelimeler tahmin edilmeye çalışılır. Şekil 1’de bu yapı görülmektedir.
Şekil 1: CBoW ve SkipGram
Doc2Vec
Doc2Vec modeli yine Word2Vec tabanlı bir model olup, kelime vektörlerinin yanısıra her bir doküman için de doküman vektörleri oluşturulması prensibiyle çalışır. Word2Vec’e benzer olarak, Doc2Vec de iki farklı model kullanmaktadır. Bunlar: PV-DM (Distributed Memory Model of Paragraph Vectors) ve PV-DBoW (Distributed Bag of Words-Paragraph Vector). Burada PV-DM CBoW mimarisine, PV-DBoW ise SkipGram mimarisine benzer şekilde çalışmaktadır.
Şekil 2: PV-DM Şekil 3: PV-DBoW
Doc2Vec, Word2Vec’ten farklı olarak, girdiye bir vektör daha ekler; paragraf ID (Şekil 2 ve 3’te bu ‘Doküman id’). Genel yapısına Şekil 4’te yer verilmiştir.
Şekil 4: Doc2Vec
FastText
FastText modeli Word2Vec’in SkipGram modeline dayanan bir modeldir fakat farklı olarak kelimeleri n-gramlara ayırır ve kelime olmayan terimleri de (out-of-vocabulary) yakalar. Böylece Word2Vec ile sağlanamayan anlam yakınlığı bu yöntemle sağlanabilir.
GloVe
GloVe kelime temsilini oluşturmak için birlikte oluşum matrisinden (co-occurance matrix) gelen global bilgileri kullanır. Bu modelin amacı, model tarafından tahmin edilen birlikte oluşma istatistikleri ile eğitim korpusunda gözlemlenen küresel birlikte oluşma istatistiklerinden faydalanarak vektör yerleştirmelerini öğrenmektir. Kelimelerin sayısı ve birlikte kullanımları anlamını ortaya çıkarabilir. Kelime anlamları birlikte oluşma olasılıklarının oranları tarafından yakalanır.
KELİME BENZERLİĞİ
Bilgisayarların herhangi bir makine öğrenmesi görevini gerçekleştirebilmesi için verilerin sayısal formata dönüştürülmesi gerekir. Metinlerle çalışıldığında bu dönüştürme işlemi her bir metni bir dizi kelime sayısı olarak temsil ederek ve bu kelime sayılarını özellik olarak kullanıp, aralarındaki mesafeyi hesaplayarak yapılabilir. Doğal dil işlemenin temel tekniklerinden biri olan kelime benzerliği, iki metin parçası arasındaki benzerliği kelimelerin anlamına, dizilişine veya tekrar sayısına göre bulmak için kullanılır. Sadece kelimelere bakarak ifadelerin ne kadar benzediğini bulmak, anlamsal olarak kelimelerin arkasındaki gerçek anlamı hesaba katmamak bazen yanlış sonuçlara yol açabilir. Bir örnekle açıklamak gerekirse;
The cat ate the mouse.
The mouse ate the cat food.
Yukarıdaki iki cümleye bakıldığında, 4 eşsiz kelimeden 3’ü örtüştüğü için cümleler benzer görünür. Fakat kelimelerin önemli ölçüde örtüşmesine rağmen, bu iki cümlenin aslında farklı anlamlara sahip olduğu bilinmektedir. Burada önemli olan kelime karşılaştırması yapmak yerine, anlambilimi yakalayabilmek için bağlama da dikkat etmektir. Anlamsal benzerliği göz önünde bulundurmak için, benzerliği hesaplamadan önce bir metin parçasının ilişkili bir kelime grubuna bölündüğü kelime öbeği veya paragraf seviyelerine odaklanılması gerekir.
Kelime benzerliklerinin bulunmasına çeşitli alanlarda ihtiyaç duyulabilir. Mesela sıkça sorulan sorulardan anlamsal olarak benzer soruları çıkarmak için iki cümle arasındaki benzerlik bulunabilir, veritabanındaki benzer belgeler aranabilir ya da anlamsal olarak benzer olan makalelerin önerilmesi istenebilir. Arama motorları da bir belgenin sorulan soruyla olan ilgisini bulmak için soru ve belge arasındaki kelimelerin benzerliğini dikkate alır. Örneğin Quora veya Stackoverflow gibi soru-cevap sitelerinde sorunun daha önce sorulup sorulmadığını bu şekilde belirlenebilir.
Kelime benzerliklerini bulmak için kullanılan yöntemlerin bazılarından aşağıda bahsedilmiştir.
Jaccard Benzerliği
Jaccard benzerliğinde ortak kelime kümelerine göre bir benzerlik oranı hesaplanır. Jaccard benzerliği ile kelime benzerliği hesaplanırken ‘lemmatization’ işlemi yapılması gerekmektedir, yani kelimelerin köklerine inilmelidir. Bir örnekle açıklamak gerekirse;
AI is our friend and it has been friendly.
AI and humans have always been friendly.
Bu iki cümlenin benzerlik oranı, iki cümlede bulunan ortak kelime sayısının toplam kelime sayısına bölünmesiyle: 5 / (3 + 5 + 2) = 0.5 olarak hesaplanır.
Jaccard benzerliği, benzer anlama sahip cümleler için ortak kelime kullanılmaması durumunda benzerlik oranını 0 olarak bulur. Ayrıca incelenen kelime sayısı arttıkça, kelimeler farklı konular hakkında bile olsa ortak kelimelerin sayısı artma eğilimi gösterir ki bu da benzerlik oranını yanlış şekilde artırır. Bu sebeplerle Jaccard benzerliğinin kelime benzerliği bulma açısından verimli bir yöntem olmadığı söylenebilir.
Jaro Mesafesi
Jaro Benzerliği, iki dizi arasındaki benzerliğin ölçüsüdür. Jaro mesafesinin değeri 0 ile 1 arasındadır; burada 1, dizilerin eşit olduğu ve 0, iki dizi arasında benzerlik olmadığı anlamına gelir.
Algoritma:
Jaro Benzerliği aşağıdaki formül kullanılarak hesaplanır.
nerede:
-
m , eşleşen karakterlerin sayısıdır
-
t , aktarım sayısının yarısıdır
-
nerede | s1 | ve |s2| sırasıyla s1 ve s2 dizisinin uzunluğudur
Karakterler aynıysa ve karakterler daha uzak değilse eşleştiği söylenir.
Hesaplama:
-
s1=”arnab”, s2=”raanb” olsun, bu nedenle her karakterin eşleştirilebileceği maksimum mesafe 1’dir.
-
Her iki dizenin de 5 eşleşen karaktere sahip olduğu açıktır, ancak sıra aynı değildir, bu nedenle sırayla olmayan karakter sayısı 4, dolayısıyla aktarım sayısı 2’dir.
-
Bu nedenle, Jaro benzerliği şu şekilde hesaplanabilir:
Jaro Benzerliği = (1/3) * {(5/5) + (5/5) + (5-2)/5 } = 0.86667
Öklid Mesafesi
Kelime temsili (word embedding) yöntemlerinden (BoW, TF-IDF, Word2Vec, (Word2Vec bunları kullanır: CBoW, Skip-Gram), Glove) biri ile metinleri sayısal ifadelere dönüştürme işlemi yapıldıktan sonra, kelime benzerliğini bulmak için uzaklık bazlı yöntemler kullanılabilir. Oluşturulan kelime vektörleri arasında anlamsal benzerlik bulmak için kullanılan yöntemlerden biri Öklid mesafesidir. Pisagor teoremiyle hesaplanan Öklid mesafesi, iki vektörü birbirine bağlayan yolun uzunluğudur. Burada benzerliği bulmak için sorulması gereken soru ‘Bu noktalar birbirine ne kadar yakın?’ sorusudur ve birbirine en yakın noktalar en yüksek benzerliğe sahip olacaktır.
Kosinüs Benzerliği
Kosinüs benzerliği, iki vektör arasındaki açının kosinüsünü ölçerek benzerliği hesaplar. Bu açı ne kadar küçükse kosinüs benzerliği o kadar yüksek olur. Bu yöntem iki nokta arasındaki uzaklıktan ziyade noktaların yönelimiyle ilgilenir. Kosinüs benzerlik oranı 0 ile 1 arasında değerler alabilir. Bu oran 1’e eşitse vektörlerin aynı olduğu, oran 0’a yaklaştıkça vektörler arasındaki benzerliğin azaldığı söylenebilir. İki cümle arasındaki kosinüs benzerliğinin nasıl hesaplanacağına ilişkin bir örnek vermek gerekirse;
Aynı örneğin Jaccard benzerliği ile hesaplanması;
Aşağıda Öklid mesafesi ve kosinüs benzerliğini karşılaştıran bir örnek bulunmaktadır. (Bu nasıl yorumlanır?)
Kelime Taşıyıcının Mesafesi (Word Mover’s Distance)
Kelime taşıyıcının mesafesi yöntemi kelimelerin benzerliklerini hesaba katarak, benzer anlama sahip cümleler için ortak kelime kullanılmaması durumunda benzerlik oranının düşük çıkması problemini çözer. Bir örnekle açıklamak gerekirse;
Bu yöntem bir metindeki kelimelerin diğer metindeki kelimelere ulaşmak için anlamsal alanda seyahat etmesi gereken minimum mesafeyi ölçmek için iki metindeki kelimelerin kelime vektörlerini kullanır.
Levenshtein Mesafesi
Levenshtein mesafesinde problem verilen iki kelime arasında, birinden diğerine ulaşmak için en az kaç değişiklik yapılması gerektiğiyle ilgilidir. Örneğin Burak kelimesinden kulak kelimesine geçmek için en az 2 harf değişikliği yapmak gerekmektedir, burada Levenshtein mesafesi 2’dir. (Bir bulmaca tipine benziyor, adını hatırlayamadım.) Benzer işlemler harf eklenerek ya da çıkarılarak da yapılabilir. Örneğin yine Burak kelimesinden orak kelimesine Levenshtein mesafesi 2’dir.
YAZARLAR:
İSMET CAN ŞAHİN
OKTAY SAMUR
ELİF OĞUZ
HANDENUR ŞEN
DOĞAÇ CEM İŞOĞLU
REFERANSLAR
[1] https://medium.com/codable/word2vec-fasttext-glove-d4402fa8cce0
[2] https://www.veribilimiokulu.com/word2vec/
[3] Çelik, Ö., Koç, B.C. (2021). TF-IDF, Word2vec ve Fasttext Vektör Model Yöntemleri ile Türkçe Haber Metinlerinin Sınıflandırılması. DEUFMD, 23(67), 121-127.
[4] Kınık, D., Güran, A. (2021). TF-IDF ve Doc2Vec Tabanlı Türkçe Metin Sınıflandırma Sisteminin Başarım Değerinin Ardışık Kelime Grubu Tespiti ile Arttırılması. Avrupa Bilim ve Teknoloji Dergisi, (21), 323-332.
[5]https://shuzhanfan.github.io/2018/08/understanding-word2vec-and-doc2vec/
[7]https://programminghistorian.org/en/lessons/common-similarity-measures
[8] https://medium.com/@adriensieg/text-similarities-da019229c894
[9] https://studymachinelearning.com/cosine-similarity-text-similarity-metric/
[10]https://www.slideshare.net/jchoi7s/cs571-vector-space-models
[11] https://stackabuse.com/levenshtein-distance-and-text-similarity-in-python/
[12]https://towardsdatascience.com/find-the-difference-in-python-68bbd000e513
[13]https://dev.to/coderasha/compare-documents-similarity-using-python-nlp-4odp
[14] İhttps://www.kaggle.com/rftexas/ml-cheatsheet-a-mind-map-for-nlp
[15]: https://www.kaggle.com/rftexas/nlp-cheatsheet-master-nlp
[16]https://www.analyticsvidhya.com/blog/2019/03/learn-to-use-elmo-to-extract-features-from-text/
[17]https://www.hyugen.com/article/transformers-in-pytorch-from-scratch-for-nlp-beginners-113cb366a5
[18]https://stackabuse.com/using-regex-for-text-manipulation-in-python/
[19]https://medium.com/@datamonsters/text-preprocessing-in-python-steps-tools-and-examples-bf025f872908