Metin Madenciliği

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

# bir string oluşturmak
isim = “ics”;isim

 

# bir harfini değiştirme
“K” + isim[1:]

 

# iki string’i birleştirme
“ics” + “ali”

 

# numbering function : enumerate
print(*enumerate(isimler))

 

Dizi İçi Tip Sorgulamaları

# alfabetik mi, sayısal mı gibi
“ics”.isalpha()

 

# bu normalde string ama siz sorgu function’ları ile anlayabilirsiniz, numeric değer olup olmadığını
“123”.isnumeric()

 

# bir sayı mı değil mi sorgusu
“123”.isdigit()

 

Elemanlarına ve Eleman Indexlerine Erişmek

# bir string oluşturun
isim = “ismetcsahin”

 

# ilk 2 dilimi alın
isim[0:2]

 

# index’e göre erişmek
isim.index(“n”)

 

Başlangıç ve Bitiş Karakterlerini Sorgulamak: startswith() & endswith()

# bir string oluşturun
isim = “ismet can sahin”

 

# python büyük, küçük harf duyarlılığına dikkat ediyor
isim.startswith(“i”)
isim.startswith(“N”)
isim.endswith(“n”)

 

Count 

# kaç tane a olduğunu saydırın
isim.count(“a”)

 

Sorted

# bir string’i sıralayın
sorted(“kitap”)

 

# string fortmatında alıyor, ( * ) unpacking işlemi yapıyor
print(*sorted(“kitap”), sep = “”)

 

Split

# bir string oluşturun
isim = “ismet can sahin”

 

# default olarak whitespace’e göre bölün
isim.split()

 

Join

# bir string oluşturun
isim = “ismet can sahin”

 

# string’i bölün
ayrik = isim.split()

 

# verdiğimiz işarete veya boşluğa göre birleştiriyor
joiner = ” “
joiner.join(ayrik)

 

# burada yıldıza göre birleştirmiş olduk.
joiner = “*****”
joiner.join(ayrik)

Replace, str.maketrans, translate

# bir string oluşturun
isim = “ismet can sahin”

 

# s harfi ile c harfinin yerini değiştirin
isim.replace(“s”,“c”)

 

# bir string oluşturun
ifade = “Bu ifade İçerisinde bağzı TÜrkçe karakterler vardır”

 

# Türkçe karakterleri düzeltmek için bir string oluşturun
duzeltilecek_harfler = “çÇğĞıİöÖşŞüÜ”
duzeltilmis_harfler = “cCgGiIoOsSuU”

 

# bir function oluşturmamıza yardımcı olur, maketrans
alfabe_duzeltme = str.maketrans(duzeltilecek_harfler, duzeltilmis_harfler)

 

# burada dönüştürme ve içerisinde ise dönüştürme kuralları olur
ifade.translate(alfabe_duzeltme)

 

Contains

# bir seri oluşturun
import pandas as pd
isimler = [“ayse”,“Ayşe”,“ismet”,“iismet”,“Ismet”,“sadık”,“koray”,“enes”]
v = pd.Series(isimler)

 

# içinde var mı yok mu diye seride sorgulayın
v.str.contains(“is”)

 

# boolean veriyi size içerisinde olanları döndürür, vektör halinde
v[v.str.contains(“is”)]

 

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ı

 

import re
# pip install regex

text=“Meier Maier Maayer MYER Myer”
#text=”Meeeeeeeeeeeeeeeier Maaaaaaaaaaaaaier Maayer MYER mYER”

pattern = “M[ae]?[iy]er”

# (+) ifadesi bir veya daha fazla ifadeyi dönüyor, iki farklı a veya e olduğunu düşünebilirsiniz
# ilk harfi M olsun, köşeli parantez size veya işlemini yapıyor aslında
# {2} a veya e’den iki tane dönsün, istiyorsak süslü parantez kullanıyoruz
# { 1,2 } eğer 1  veya 2 tane de varsa dönebilir
# ( * ) ise ae’den olmayadabilir, oladabilir diyebiliyorsunuz
# ( ? ) ise 0 ya da 1 kez oluyor

result = re.findall(pattern,text)
# findall ise şunu yapıyor, pattern ve string ise nerede arayacağı oluyor

result
[‘Meier’, ‘Maier’, ‘Myer’]

 

Herhangi bir karakteri eşleştirme: 

text=“abc akc adc adbc”
# alfabetik karakterler bize lazım ise

pattern=“a.c”
# (.) joker bir karakter herhangi bir karakter ile eşleşebiliyor.
# yani size nokta herhangi bir şey olabileceğini söylüyor
# iki nokta da koyabilirsin

re.findall(pattern,text)
[‘abc’, ‘akc’, ‘adc’]

text=“ABC12 DEK222 FGHLY 1010”
pattern=“[a-z]”
# bize alfabetik karakterler varsa, A’dan Z’ye size bütün harfler dönebiliyor

re.findall(pattern,text,flags=re.IGNORECASE)
# re.findall(pattern,text, flags=re.IGNORECASE)
# flags ile re.IGNORECASE yaparsanız eğer, büyük, küçük harf sınırı kalkıyor

[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘K’, ‘F’, ‘G’, ‘H’, ‘L’, ‘Y’]

pattern=“\d”
# size rakamları döndürüyor, “”\d” ise 

 

Diğer fonksiyonlar: 

st= ‘python c++’
st1 = re.sub(,,st)
st1
‘python c++’

re.sub(“a”,“*”,“ababababa”)
# pattern kuralımız
# repl ise değiştirmek istediğimiz şey
# string ise size hangi text ise onu söylüyor
‘*b*b*b*b*’

k = re.split(“a”,“abacbababa”);k
[, ‘b’, ‘cb’, ‘b’, ‘b’, ]

“a”.join(k)
‘ababababa’

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

# Sherlock Holmes romanlarının isimleri, biraz gürültü eklenmiş hali
# Amacımız şu elimizde 10 tane roman olduğunu düşünelim, bu romanlara analitik bir işlem uygulamak istiyoruz.
# Bu romanları ölçülebilir, numeric değerlere dönüştürmemiz gerekir. Bunları dönüştürmek demek frekanslarını almak demek
# Bu durumda ise bu saf kelime, tekil kelime ve onların dışındaki büyük,küçük harf noktalama işaretleri kaldırılması diyebiliriz.
# Bütün kelimelerin yalın bir şekilde bırakılıp, sayılması durumunda biz bir kitabı numeric olarak temsil edecek vektör oluşturmuş oluruz.
# Bir romanın içinde belirli kelimeden 10 tane var diğer kitapta da 8 tane var, mesela burada bir similarity yakalamış oluyoruz.
# Metinlerin içindeki bir amacımız bu sonuçta, numeric değerlere dönüştürmeye çalışıyoruz. Bunun içinde veriyi anlayıp, bu gürültüleri kaldırmalıyız.

metin = “””
A Scandal in Bohemia! 01
The Red-headed League,2
A Case, of Identity 33
The Boscombe Valley Mystery4
The Five Orange Pips1
The Man with? the Twisted Lip
The Adventure of the Blue Carbuncle
The Adventure of the Speckled Band
The Adventure of the Engineer’s Thumb
The Adventure of the Noble Bachelor
The Adventure of the Beryl Coronet
The Adventure of the Copper Beeches”””
metin

# aradaki boşluklara göre ayırdık
text = metin.split(“\n”)

# metni seriye çevirdik
t = pd.Series(text)

# seriyi dataframe’e çevirdik
tdf = pd.DataFrame(t1, columns = [“romanlar”]);tdf

 

Büyük-Küçük Harf Dönüşümü

# satırı bölecek, küçük harfe dönüştür sonra boşluk ile birleştir.
# girmiş olan array’i parçalayacak ve küçük harfe çevirecek
tdf[“romanlar”] = tdf[“romanlar”].apply(lambda x: ” “.join(x.lower() for x in x.split()))
tdf[“romanlar”]

 

Noktalama İşaretlerinin Silinmesi

tdf[“romanlar”] = tdf[“romanlar”].str.replace(“[^\w\s]”,“”);tdf[“romanlar”]

 

Sayıların Silinmesi

tdf[“romanlar”] = tdf[“romanlar”].str.replace(“\d”,“”);tdf[“romanlar”]

 

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/

[6]https://intellica-ai.medium.com/comparison-of-different-word-embeddings-on-text-similarity-a-use-case-in-nlp-e83e08469c1c

[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

Data Science Earth

Data Science Earth ekibi, üst düzey Veri Bilim çözümleri üretmek amacı ile toplanmış akademisyenler ve uzmanlardan oluşmaktadır. Öncelikli olarak veri bilincini geliştirmeyi ve küreselleşen rekabet ortamında verinin gücünün doğru kullanılmasını sağlamayı amaçlamaktadır.

Sponsor

QuestionPro 35 farklı soru seçim özelliği ile anket çalışmalarımıza güç katmaktadır.