Bash-kırıntısı: Kelime ayıkla


(yok) #1

Freedict sözlüklerinden kelimeleri ayıklayan, dizeleri kelime benzerliğine göre filtreleyen, iyi denenmemiş, mantığı gelişmemiş bir iki bash-kırıntısı.

Ne yapar:

➊ Freedict-Sözlüğü’nün (tur-eng) kaynağını github-reposundan indirir:
.tei sözlük dosyasını indir.
➋ Kelimeleri ayıklar:
Freedict sözlüğünün kullandığı .tei dosya-türünün tag'lerini temizle.
➌ Kriterlenize göre ayıklanmış kelimeleri filtreler:
Filtre kriterleri sadece betiğin içerisinden değiştirilebilir.
Dizedeki ilk kelimeye göre filtreler. ‘Kelime’ satır başından ilk boşluğa kadar olan karakterlerden oluşur.

Patikalar:

Ev-Dizini’nde kelime-ayikla adında bir dizin oluşturulur:

/home/ISMINIZ/kelime-ayikla/

Betik kelime-ayikla dizininde ayikla.bash adında oluşturulur:

/home/ISMINIZ/kelime-ayikla/ayikla.bash

Kur:
Aşağıdaki “kod-kutusunda” bulunan (tüm) satırları kopyalayıp, bir uçbirim-penceresinde yapıştırın.

#!/usr/bin/env bash
# özgün20180302 | copyleft

# ((! $#)) && echo -e "\n\e[31mHATA:\e[0m\nFreedict-sözlüğünü indirdiğiniz patikayı argüman olarak verin.\n\nMesela\n\t\e[34m./kelime-ayikla.bash \e[1m~/sözlük/\e[0m\n" && exit 1

## değişkenler
fd_tureng='https://raw.githubusercontent.com/freedict/fd-dictionaries/master/tur-eng/tur-eng.tei'

# sözlüğün patikası
fsbaz="$HOME/kelime-ayikla"
(($#)) && fsbaz="${1%/}"

isimler=isimler/all.names
freedict_ham="$fsbaz/tur-eng.tei"
freedict="$fsbaz/tur-eng.txt"
# dolaylı referanslar (döngü için)
# IPTAL: `isimler`i şimdilik iptal.
# process=(isimler freedict)
process=(freedict)

out="$fsbaz/oldu"
outisimler=$out/isimler
outfreedict=$out/freedict
# dizin oluştur
dizinler=(${!out*})
for d in ${dizinler[@]} ; do
    [[ ! -d ${!d} ]] && mkdir -p ${!d}
done

## freedict al (sadece yoksa yeniden al)
[ ! -e "$freedict_ham" ] && wget "$fd_tureng" -O "$freedict_ham"

## ayıkla: meta temizle, içerik al
awk 'NR<80{next}
    $0~/<entry>/{print ""}
    {
        gsub(/^\s*/,"")
        gsub(/<\/form>/,"|")
        gsub(/<cit/," » <cit")
        gsub(/<[^>]+>/,"")
        printf("%s",$0)
    }
    END{print ""
}' "$freedict_ham" > "$freedict"

## filtre: ilk aynı
# Ilk N harfi aynı olan isimler
ayni_ilk(){
    local i=$1 in=$2 out=$3 non=0

    while read -r dize ; do

        local isim="${dize/ *}"
        ((${#isim} < $i)) && continue
        local ilk="${dize:0:$i}"

        # debug
        # echo "      $ilk == $silk  |  $dize"

        if [[ $ilk == $silk ]] ; then
            (($non)) && echo "$sdize"
            echo "$dize"
            non=0
        else
            non=1
        fi

        local silk="$ilk" sdize="$dize"

    done < <(cat $in) > $out
}

i=8
for f in ${process[@]} ; do
    echo ayni_ilk $i ${!f} "$out/${f}/ilk-${i}-harf-aynı.txt"
    ayni_ilk $i ${!f} "$out/${f}/ilk-${i}-harf-aynı.txt"
done

## filtre: ilk ve son aynı
# Ilk N ve son N harfleri aynı olan isimler
ayni_ilkson(){
    local i=$1 s=$2 in="$3" out="$4" non=0

    while read -r dize ; do

        local isim="${dize/ *}" enaz=$((i+s))
        ((${#isim} < $enaz)) && continue

        local ilk="${isim:0:$i}"
        local son="${isim: -$s}"

        # denet:
        # echo "      $ilk == $silk  |  $dize"
        # echo "      $son == $sson  |  $dize"

        if [[ $ilk == $silk ]] && [[ $son == $sson ]] ; then
            (($non)) && echo "$sdize"
            echo "$dize"
            non=0
        else
            non=1
        fi

        local silk="$ilk" sson="$son" sdize="$dize"

    done < <(cat $in) > $out
}

i=2
s=3
for f in ${process[@]} ; do
    echo  ayni_ilkson $i $s ${!f} "$out/${f}/ilk-${i}-ve-son-${s}-harf-aynı.txt"
    ayni_ilkson $i $s ${!f} "$out/${f}/ilk-${i}-ve-son-${s}-harf-aynı.txt"
done

bet="$HOME/kelime-ayikla/ayikla.bash" ; > "$bet" ; mapfile -t cb < <(xclip -selection clipboard -o ); for i in $( seq 0 $((${#cb[@]}-3)) ) ; do echo "${cb[$i]}" >> "$bet" ; done ; chmod ug+x "$bet"

Kullanım:

  • Çalıştırmak için:

    • Herhangi bir yerden
      $HOME/kelime-ayikla/./ayikla.bash
      
    • /home/ISMINIZ/kelime-ayikla” klasöründen
      ./ayikla.bash
      

    olarak çalıştırabilirsiniz.

  • Filtre kriterlerini değiştirmek için:
    Filtre kriterleri sadece betiğin içerisinden değiştirilebilir.

    • ayni_ilk() fonksiyonu için i değişkenini mesela

      i=9
      

      olarak değiştirin.

    • ayni_ilkson() fonksiyonu için i ve s değişkenlerini mesela

      i=3
      s=3
      

      olarak değiştirin.

NOT:

  • Sözlüğü yeniden indirmek için mevcut sözlüğü silin.
  • Filtre kriterlerini betik argümanı olarak değiştirilebilir hale getirmek mantıklı olabilir.
  • isimler'in işlenmesini iptal ettim. TDK’dan izin istedim (listelerini kullanabilmek için) henüz cevap gelmedi. Etkin hale getirmek kolayca yapılabilir.
  • xclip programı kurulu değilse, betik (“fiziki olarak”) oluşturulamaz.
  • Bazı iptal ettiğim satırları, kurcalamak isteyen olur diye, silmeden yorum halinde bıraktım.

Bitti


(system) #2