www.mamboteam.com
aptitude : me and my debian - a work in progress  
Startsida arrow bash arrow Bokstavspar - frekvens
2008-07-09
 
 
Huvudmeny
Startsida
debian
bash
Forum
Användarmeny
tidigare material
nyheter
grafik
Artikeltips
BadVista
Bokstavspar - frekvens  E-post

För att lite grand knyta ihop påsen kring artiklarna Textbehandling och Graphviz - en fallstudie, tänkte jag avsluta med ett script som använder sig av kommandona awk, sed, tr, sort, head, uniq samt programmen dot, och eog. Det sistnämnda är 'Eye Of Gnome', en bildvisare. Vill du använda en annan så ändra variabeln 'IV' till det du vill ha.
Scriptet bryter ner text i bokstavspar och visar grafisk frekvensanalys.

Här följer ett exempel på hur scriptet används. Rader som inleds med # är mina kommenter. Rader som inleds med $ är kommandon att skriva in i terminalen. Det förutsätts att bash-filen 'pairs' gjorts exekverbar (sudo chmod u+x pairs) och att katalogen där det ligger finns i $PATH.
För att lägga till katalogen 'bin' i din hemkatalog till $PATH utförs följande:

$ gedit ~/.bashrc

Sedan läggs raden nedan till...

export PATH=$PATH:$HOME/bin/

...och filen sparas
graphviz installeras med kommandot sudo apt-get install graphviz.

åter till ämnet...

Nedan visas ett exempel på hur pairs används:

 
# skapa pair-filen
$ pairs -p strindberg_roda_rummet_kap1.vim >res.p
 
# kolla frekvensen av bokstavspar där den andra bokstaven
# utgör prefix till 'v'
$ pairs -qp res.p v

Resultatet blir detta:

 
# kolla frekvensen av bokstavspar där den andra bokstaven
# utgör suffix till 'v'
$ pairs -qs res.p v

Och det ser ut såhär:

Scriptet i sin helhet nedan:

 
#!/bin/bash
 
# image viewer
IV=eog
 
function count() {
  CNT=`awk '{c+=$1} END {print c}' $PF`
  echo "digraph letter {" >dotfile.dot
}
 
function turnPng() {
  dot dotfile.dot -Tpng >dotfile.png
  echo "ok"
  $IV dotfile.png
 
}
 
case "$1" in
"-p")
  TXT=$2
  sed 's/[^a-zåäöA-ZÅÄÖ ]//g' ${TXT} | \
  tr 'A-ZÅÄÖ' 'a-zåäö' | \
  sed 's/\(.\)/\1\n\1/g' | sed '/\w\w/!d' | \
  sort | uniq -c | sort -nr
  echo "ok"
  exit 0
;;
"-qp")
  PF=$2
  LETTER=$3
  count
  cat $PF | grep " .${LETTER}" | \
  head -n 5 | \
  awk '{printf("'${LETTER}' -> %s \
  [label=\"%.1f\"]\n"),$2,100*($1/'${CNT}')}' >>\
  dotfile.dot
  echo "}" >> dotfile.dot
  turnPng
  exit 0
;;
 
"-qs")
  PF=$2
  LETTER=$3
  count
  cat $PF | grep " ${LETTER}." | \
  head -n 5 | \
  awk '{printf("'${LETTER}' -> %s \
  [label=\"%.1f\"]\n"),$2,100*($1/'${CNT}')}' >>\
  dotfile.dot
  echo "}" >> dotfile.dot
  turnPng
  exit 0
;;
*)
  echo "unknown command"
  echo "-------------------------------"
  echo "# to build a pair-file"
  echo "pairs -p <textfile> > <p-file>"
  echp ""
  echo "# query letter prefix"
  echo "pairs -qp <p-file> <letter>"
  echo ""
  echo "# query letter suffix"
  echo "pairs -qs <p-file> <letter>"
  exit 0
;;
esac
 

Jag hade ett tag problem med att få in variabeln $CNT i awk:s printf-sats. Den kunskap jag hämtade in iom detta problem är att strängar i bash kan brytas och återupptas - något jag inte kände till tidgare.
Antalet bokstavspar som visas är hårdkodat till fem ('head -n 5'). Ändra den siffran om fler träffar behövs.

EDIT:

Ett litet tillägg:
Analysen visar hur vanligt det är att en viss bokstav följs av en annan baserad på den totala textmängdens bokstavspar. För att se frekvensen för ett visst bokstavspar kan man lägga in följande kod (mellan case / esac):

 
"-lp")
  PF=$2
  LETTER=$3
  cat $PF | grep ' .'${LETTER}
  exit 0
;;
 
"-ls")
  PF=$2
  LETTER=$3
  cat $PF | grep ' '${LETTER}'.'
  exit 0
;;
De nya kommandona används på följande sätt:
 
# skapa pair-fil
$ pairs -p strindberg.txt >pairs.p
 
# visa graf över suffix till bokstaven 'f'
$ pairs -qs pairs.p f
 
# skapa letter-fil för suffix till bokstaven 'f'
$ pairs -ls pairs.p >pairs_s.l
 
# visa samma graf fast endast baserad på
# förekomster av suffix till bokstaven 'f' (f.)
$ pairs -qs pairs_s.l f

Nu går det att se att 'fö' (36,0%) är mer än dubbelt så frekvent som 'fr'(17,2%), och att 'fa' har en frekvens av 9,0% bland bokstavspar i texten som inleds med 'f'.

Läs mer om frekvensanalys av bokstäver
Från svenska Wikipedia
Inom kryptografi har under lång tid använt sig av frekvensanalys. Man utnyttjar hur vanligt förekommande en bokstav är i ett visst språk. Bokstaven 'i' är exempelvis vanligare i engelska än i svenska. Känner man till - eller kvalificerat kan gissa - vilket språk som kryptot är skrivet på är det ofta möjligt att använda frekvensanalys.
Kommentarer (1)Add Comment
he-he
skriven av bubblan, februari 24, 2007
det är nån som har alldeles för mycket fritid!

Skriv kommentar

busy
 
< Föregående   Nästa >
 
Top! Top!