• ingilizce meali term frequency and the inverse document frequency'dir. metinlerin vektorlere dokulebilmesi icin kullanilabilecek agirliklandirma islemlerden biridir.

    populer scikit learn modulunde gosterilen sekilde hesaplaniyor, baska uygulamalarda (+1) konulmadigi oluyor:

    kelimenin dokumandaki frekansi * ("ters dokuman freakansi" + 1)

    "ters dokuman frekansi" da su sekilde hesaplaniyor:

    log(corpustaki dokuman sayisi / 1 + corpusta verilen kelimenin gectigi dokuman sayisi)

    yani bu napiyor: diyelim ki elinizde bir "sey abi buralarda sicaklar cok, su verenlerin cok olsun." diye metin var. bunu rakamlara dokerken buyuk ihtimalle elinizdeki datasette "sey", "abi" ve "cok" kelimeleri bolca olacagindan bu kelimelerin agirligini azaltiyor. neden cunku bunlar her metinde gecen amiyane kelimeler. *

    tabii bu problemi cozmeye yarayan baska metodlar da var:

    ornegin, bunlari yok etmek adina maksimum dokuman frekansi belirleyebilir ya da stop word olarak yukaridaki hosunuza gitmeyen bu kelimeleri ekleyebilirsiniz. bazi durumlarda bu kelimelerin yok edilmemesi * daha cok isinize de yarayabilir. dilerseniz uzerine bir de stemming, lemmatization, n-gram falan da kullanabilirsiniz. her seyi ayri ayri ve kombinasyonlarini alip denerseniz belki sirinleri bile gorebilirsiniz.

    isbu entry kicimin keyfine yazilmistir, bilimsel bir kaynak yol gosterici vesaire degildir.

    yol gosterici ararsaniz:

    1. stanford'un boyle efsane bedava bir kitabi var.

    2. ay yok ben illa uygulama gormek istiyorum, hem de python olsun derseniz su cok iyiydi.

    * rahmetli zeki muren kullanmazdi boyle kelimeleri.
  • bir metni (dokumani) sayisallastirirken normalde yapacagimiz ilk sey metindeki her bir cumleyi bag of words ile vektörize etmektir. bunun icin, ilk once metinde gecen tüm unique kelimelerden (farkli kelimelerden) bir küme (yani çanta) olustururuz. bu kümenin eleman sayisi cumlelerin vektörlerinin boyutu olur. baslangicta her cumle çantadaki toplam kelime sayisi uzunlugunda ve elemanlarinin tamami 0 olan birer vektöre dönüştürülür. daha sonra her cumle icin, o cumledeki her unique kelime icin, o unique kelimenin o cumlede kac defa gectigi sayilir, bu sayi o cumleye ait vektörde o kelimeye karsilik gelen boyuta yazilir. ornegin iki cumleden olusan bir metnimiz olsun:

    c1: kar yagar kar ustune.
    c2: derdim var dert ustune.

    bu metinde gecen unique kelimelerin olusturudugu kelimeler çantasi={kar, yagar, ustune, dert, var} olup, bu kumenin eleman sayisi 5'tir. o halde c1 ve c2 cumleleri 5 uzunlugunda ve elemanlarinin tamami 0 olan vektorlerle initialize edilebillir:
    c1: 0 0 0 0 0
    c2: 0 0 0 0 0
    daha sonra her bir cumle icin bu cumlede yer alan her kelime bu cumlede kac defa gectigi sayilip bu sayi vektörde ilgili boyuttaki 0 elemani ile yer degistirir:

    kar yagar ustune dert var
    c1: 2 1 1 0 0
    c2: 0 0 1 2 1

    bu sekilde cumleleri sayisallastirmis olduk. bu en klasik bag of words'tur. eger her bir cumle icin gorulme sayilarini cumlede gecen toplam kelime sayisina bolersek (bu ornekteki her iki cumle icin 5) kelime sıklığını (term frequency: tf)
    elde ederiz:

    kar yagar ustune dert var
    c1: 2/5 1/5 1/5 0 0
    c2: 0 0 1/5 2/5 1/5

    cumleleri bu sekilde vektörize edip represent ederken, metinde çokça geçen fakat hic bir anlam tasimayan kelimeler ( türkçe'de ornegin şey, bir, aa, ...yada ingilizce'deki article'lar) işimize salça olur. cumleleri hakkiyla sayisallastirmayiz. yani bir cumlede 3 defa "şey" geçmesinin o cumlenin duygusunu ögrenme yada başka bir temel nlp taski icin bir faydasi yoktur. stopwords olarak da bilinen bu tarz faydasiz kelimelerin etkisini azaltmak icin yapacagimiz iki seyden ikincisi (birincisi bu tarz kelimeleri direkt atmaktir), kelimelerin cumle icindeki gorulme sıklıklarını (term frequency) direkt kullanmak yerine bu frequencyleri agirliklandirarak kullanmaktir. burda kullanacagimiz agirlik frequency ile ters orantili olmalidir. yani sık gecen bir kelimenin ağrırlığı düşük olmalı ki, sıklık bu ağırlıkla çarpıldığında ortaya çıkan sayısal değer düşük olmalıdır. yada nadir gecen kelimelerin ağrliklari fazla olmali ki boylece bu degerli kelimeler cumleyi sayisallastirmada daha onemli roller oynasin.

    ılgilendigimiz bu katsayinin adi inverse document frequency (idf) 'dir. bir kelimeye ait idf aslında basitce metindeki toplam cumle sayisinin, bu kelimeyi iceren cumle sayisina bolunmesiyle ortaya cikar. bu ham haldir. bu katsayi'nin logartimasi alinarak (genelde taban 2'dir) , ortaya cikan katsayinin toplam cumle sayisindan fazla etkilenmemesi saglanir. sonuc olarak belirli bir kelimeye ait idf katsayisi su sekildedir:

    log(metindeki tum cumlelerin sayisisi / (kelimeyi iceren cumlelerin sayisi )

    seklinde olur.

    ornegimize donersek kelime cantamizda 5 kelime vardi: {kar, yagar, ustune, dert, var} . buradaki her kelimenin idf'sini bulmamiz gerekir. ornek olarak iki dokumaninn birinde gecen kar kelimesnin idf katsayisi soyle olur:

    idf(kar)= log(2/1)=0.69

    iki dokumanin ikisinde de gecen ustune kelimesinin idf katsayisi ise log(2/2)=0

    olup, cumlerin term frequencyleri (tf) ile bag of words'teki kelimelere ait idf katsayilari carpilirsa her bir cumlenin tf-idf degerleriyle sayisal gosterimi yaklasik olarak soyle olur:

    kar yagar ustune dert var
    c1: 0.27 0.13 0.13 0 0
    c2: 0 0 0 0.13 0.13
  • idf, inverse document frequency demektir, tf, term frequency demektir.
    bir index ve bir query (sorgu) icin idf soyle hesaplanir:

    ornek sorgu: "ali ata bak"

    q: query; aslinda query'nin tamami degil de sadece bir kelimesi (mesela ali)
    n: index'teki toplam dokuman sayisi
    nq: icinde q'yu barindiran dokuman sayisi (icinde ali gecen dokuman sayisi)
    ln: dogal logaritma

    idf = ln ( ((n - nq + 0.5) / (nq + 0.5)) + 1 )

    aciklama olarak: bir kelimeyi barindirmayan dokumanlarin, o kelimeyi barindiran dokumanlara oraninin logaritmasi.
    yani kisaca, bir kelime index'te ne kadar az dokumanda gecmis ise, o kelimenin idf'i o kadar yuksek olur; ayni sekilde bir kelime index'te ne kadar cok dokumanda gecmis ise o idf'i o kadar dusuktur.

    butun dokumanlarda gecen bir kelime icin ln(1)'e yakinsar o da 0'dir. buyuk bir index'te sadece bir dokumanda gecen bir kelime icin de ln (n)'e yakinsar; diyelim ki n sonsuz o zaman o kelimenin idf'i de sonsuzdur.

    -----------------

    bir dokuman ve bir query tf ise soyle hesaplanir:

    (query'den kasit yine bir kelime burada da)

    tf = dokumandaki_query_sayisi / dokumandaki_query_olmayan_kelime_sayisi

    aciklama olarak, bir query bir dokumanda ne kadar siklikla geciyorsa, o query icin o dokumanin tf'i o derecede yuksektir. ornek vermek gerekiyorsa, bir dokumanda n kelime varsa sadece verilen kelimeden olusuyorsa verilen formul n / 0 olacagindan tanimsiz olur. ama dokumana bir tane farkli bir kelime eklerseniz sonsuza yakinsar. ayni sekilde, o kelime o dokumanda hic gecmiyorsa o kelime icin o dokumanin tf'i 0 olur.

    -------------

    further reading: https://en.wikipedia.org/wiki/tf–idf
  • tüm dökümanlarda çok sık geçen kelimelerin ağırlığını düşüren bir vektörleştirme modelidir.

    w= tf x log(df+1) olduğunu düşündüğümüzde; bunu log(n/df+1) kısmıyla yapar. logaritmanın içi 1'e yaklaştıkça sonuç 0'a yakınsar. df'e 1 eklememizin nedeni ise paydanın 0 olup tanımsızlık oluşturmaması içindir.
hesabın var mı? giriş yap