Perl, hasher? Hente ut ord fra filer.

Kategori overført fra Linux1

Perl, hasher? Hente ut ord fra filer.

Innleggav lars-e » tir 27.03.2007 10:15

Heisann!

Trenger litt hjelp her, håper noen kan hjelpe meg ... :)

Jeg har to ganske store tekstfiler (ordlister), med et ord i hver linje. Det er ordlister, med manglende ord i den ene, og ord med riktig ordbrytning og en masse godjente og ikke godkjente ord i den andre.

Filene har altså dette innholdet:
Missing inneholder feks: brannmann
mens
Source inneholder: brann-mann

Det jeg ønsker å gjøre, er å få hentet ut alle ordene fra Source med riktig ordbrytning, som samsvarer med de som finnes i Missing uten ordbrytning til en egen fil. I tillegg er det en god del ord i filen Missing som ikke har noen oppføring med ordbrytning i Source, disse vil jeg også ta vare på i samme fil.

Denne filen skal så legges til i den "store ordboksfilen", som har ordet plassert i begynnelsen av hver linje, etterfulgt av frekvens og en tagg for å plassere ordet i de forskjellige ordgruppene. Eventuelle dobbeltoppføringer her må også kontrolleres, slik at det ordet som har ordbrytningen (brann-mann) blir beholdt, fremfor ordet (brannmann). Oppbyggingen av de forskjellige filene er slik:
Missing:
brannmann

Source
brann-mann

norsk.words (Ordbok)
brann-mann * 19 B
brann-mannen * 17 B

Så, jeg ønsker ordene fra Source som også har en oppføring i Missing (uten ordbrytning) trukket ut til en egen fil, som også blir tillagt de ordene fra Missing som ikke har oppføringer i Source. Denne filen må så kontrolleres opp imot filen norsk.words, slik at det ikke blir lagt til dobbeltoppføringer, og at ord som ikke har ordbrytning i norsk.words, blir erstatet med ord med ordbrytning fra den nye filen.

Er det noen måte å få gjort dette på, på en enkel måte?

Meget takknemlig for tilbakemeldinger! Og håper jeg klarte å gjøre meg forstått?

Lars-Erik

Brukerens avatar
medlem i 214 måneder
 

Innleggav TO » tir 27.03.2007 20:22

Innfløkt, skal prøve å skissere kode, som bruker assosiative array:
Kode: Merk alt
$ cat Missing
brannmann
brannmenn

Kode: Merk alt
$ cat Source
brann-mann


Ideen/pseudokode:

Kode: Merk alt
les delingsord fra Source inntil ferdig# inn i assosiativt array S
      tmp=delingsord                     # f.eks. brann-mann
      nøkkel= tmp uten bindestrek  # gsub(/-/."",tmp), f.eks. brannman   
      # nøkkelen er nøyaktig slik den vil komme fra Missing, se under
      S[nøkkel]=delingsord           

lukk(Source)

les mangelord fra Missing inntil ferdig# inn i assosiativt array M
      tmp=mangelord    # f.eks. brannmann
      nøkkel= tmp        # hvis noe skal gjøres med tmp først
      M[nøkkel]++

lukk(Missing)

# iterer over nøklene i M
for hvert mangelord i M
     hvis mangelord i S
             skriv S[mangelord]   # delingsord, f.eks. brann-mann
     ellers
              skriv mangelord       # f.eks. brannmenn


Dette håndterer ikke frekvens og slikt, håper dette hjelper litt.
medlem i 213 måneder
 

Innleggav geirendre » tir 27.03.2007 21:39

Litt vanskelig å finne tråden i oppsettet og problemet ditt, sikkert jeg som er litt sløv ;) hehe.

Kan du paste inn eksempel på hva du har, og hvordan du ønsker resultatet.
Altså et utsnitt av source-fila, et utsnitt av missing-fila og et utsnitt av hvordan du vil
at resultatet skal bli når de to eksemplene er behandlet av program/script (mer enn bare et par ord i hver helst).

Trikset er nok å dele jobben opp i flere mindre oppgaver først, og løse de hver for seg, steg for steg,
og så sy det sammen til et ferdig program/script når alt virker.

Erfaren
Brukerens avatar
medlem i 230 måneder
 

Innleggav lars-e » tor 29.03.2007 10:03

Joda, sånn ligger det ann:

Jeg har en fil som heter norsk.word Denne filen inneholder hele den norske ordboken for blant annet Open Office. Den er formatert slik:
Kode: Merk alt
du
jeg
brann
brann-mann
brann-mannen
brann-stifter
høyeste-retts-justitiarius
ord-bok
ord-bøker
ord-bøkene
osv
tull

Denne listen inneholder rundt 800 000 linjer/ord, om jeg ikke husker helt feil. Bindestreken er orddelingspunktet til ordet, altså hvor det går ann å dele ordet.

Fra alle ord som er blitt godkjent den siste tiden, er det nå på tide å få disse inn i ordboken. Dette er ca 8 000 ord, så det er en jobb jeg nødig har lyst til å gjøre manuelt.. He he he.

Alle ordene som er godkjente og mangler fra ordlistefilen ligger i en fil jeg har kalt Missing. Der ligger de uten orddelingspunkter. Feks:
Kode: Merk alt
abonnementskontrakten
brannsjef
brannmester
brannmesteren
databasegrensesnittets
hoppsjef
landslag
operaskoler
ps
sensurfri
tv-skjerm


Filen Source.gz inneholder stort sett alle ordene, både fra missing og norsk.word med all informasjon om ordene. Denne informasjonen er tilknyttet til forskjellige tagger, men ikke alle er i bruk for alle ord. Det er ikke alle ord som blir sendt inn og registrert i Source.gz som har orddelingspunkt. Men de som har det har det registrert i sitt egne avsnitt (dårlig forklart, jeg veit.. men se eksempelet.. :))
Eksempel på Source.gz filen:

Kode: Merk alt
WORD: abonnementskontrakten
STATUS: +
EDITOR: En eller annen fyr <hans_mail@domenet.no>
DATE: 20060422

WORD: databasegrensesnittets
STATUS: +
COMPOSITE-WORD: database=grense=snittets
EDITOR: Lars-Erik Aunevik Labori <meg@mittdomene.nu>
DATE: 20070329

WORD: operaskoler
STATUS: +
COMPOSITE-WORD: opera~skoler
EDITOR: Lars-Erik Aunevik Labori <meg@mittdomene.nu>
DATE: 20070329

WORD: sensurfri
STATUS: +
EDITOR: Lars-Erik Aunevik Labori <meg@mittdomene.nu>
DATE: 20070329


Etter hva jeg forstår, kaan Source.gz også inneholde andre tagger, men det er jo kun WORD og COMPOSITE-WORD linjene som er interesante for uthentingen av ordene.

Det jeg trenger fra disse filene er: De ordene i Missing, som står oppført i Source.gz med COMPOSITE-WORD, ønsker jeg at blir importert til en egen fil, der = og ~ tegnene blir erstattet med et - tegn (de skal heller ikke forekomme to ganger, altså som feks. : operaskoler og opera-skoler). I tillegg ønsker jeg at de ordene som er oppført i Missing, men som det ikke finnes orddeling for i Source.gz også blir importert til samme fil. Det betyr at jeg i den nye filen, la oss kalle den nye_ord vil ha dette oppsettet, utifra eksemplene over:
Kode: Merk alt
abonnementskontrakten
brannsjef
brannmester
brannmesteren
database-grense-snittets
hoppsjef
landslag
opera-skoler
ps
sensurfri
tv-skjerm


På den måten kan jeg da legge til alle nye og godkjente ord til filen norsk.word, samtidig som jeg har en oversikt over ordene som ble lagt til i filen den gangen. Er på en eller annen måte nødvendig med en endringslogg, slik at man kan se hva som er blitt lagt til i norsk.word

Håper jeg kanskje klarte å forklare meg skikkelig nå?

Er meget takknemlig for alle tilbakemeldinger!

Brukerens avatar
medlem i 214 måneder
 

Innleggav geirendre » fre 30.03.2007 23:02

Hei, hvordan går det med dette prosjektet?

Her er et forslag:
Det jeg trenger fra disse filene er: De ordene i Missing, som står oppført i Source.gz med COMPOSITE-WORD, ønsker jeg at blir importert til en egen fil, der = og ~ tegnene blir erstattet med et - tegn
Prøv med noe slikt:
Kode: Merk alt
grep -A3 -f Missing Source.gz | grep 'COMPOSITE-WORD' | cut -d" " -f2 | sed 's/[~|=]/-/g' >> nyeord.txt
Forutsetter at du har en fil som heter Missing og en Source.gz
og står i samme mappe som disse når du kjører kommandorekken.
Skal da lage en ny fil nyeord.txt med de ordene som er funnet.

Kan være en begynnelse for å jobbe videre med...
:-)

Erfaren
Brukerens avatar
medlem i 230 måneder
 

Innleggav TO » fre 30.03.2007 23:16

Her er pseudo-koden omsatt til en awk-versjon, kun en liten justering var nødvendig - står i koden:
Kode: Merk alt
#!/bin/bash

<<'EOF'   awk -f '-' -v source=Source -v missing=Missing  | sort
BEGIN {
    # les source
    word=""
    compword=""
    while (getline<source){
        if ($1=="WORD:") {
            word=$2
            compword=word  # avvik fra pseudo-kode
            continue
        }
        if ($1=="COMPOSITE-WORD:") {
            compword=$2
            gsub(/[=~]/,"-",compword)
            continue
        }
        if (NF==0 && word != ""){
            S[word]=compword
            word=""
            compword=""
            continue
        }
    }
    close(source)

    # les  missing
    while (getline<missing){
        if (NF==1){
            word=$1
            M[word]=word
        }
    }
    close(missing)

    # iterer over ordene i missing
    for ( word in M){
        if (word in S){
            printf "%s\n",S[word]
        }
        else{
            printf "%s\n",M[word]
        }
    }
} # end of BEGIN
EOF
exit 0


Prøvekjøring:
Kode: Merk alt
$ bash skript.bash
abonnementskontrakten
brannmester
brannmesteren
brannsjef
database-grense-snittets
hoppsjef
landslag
opera-skoler
ps
sensurfri
tv-skjerm


Hvis dette nå er riktig, så vil du vel legge til i 'norsk.word' i neste omgang. Foreslår dog å få logikken først, jeg skjønner ikke hva som skal inn av ovenstående - er f.eks. 'abonnementskontrakten' uten ordbrytning god og akseptabel?
    medlem i 213 måneder
     

    Innleggav lars-e » lør 31.03.2007 1:12

    For det første, jeg er utrolig imponert over hjelpen dere yter!

    Prøvde først forslaget til geirendre, det fungerte helt topp for å hente ut de ordene som er oppført i begge filene med orddeling. Men det tok ikke med seg videre de ordene som ikke hadde orddeling.

    Skriptet til TO ser ut til å gjøre akkurat det jeg var ute etter! :) Happy!
    abonnementskontrakten som den står oppført er godtatt, siden det ikke finnes noen orddelingsregler for det ordet i Source, derfor må det bare tas med videre uten orddeling. Så ja, alle ordene som kommer fra bash skriptet skal legges til i norsk.word

    Neste steg da, er jo å få ordene inn i norsk.word, samtidig som jeg får en liste med de endringene som utføres. Slik at dette kan oppføres i endringsloggen. Hadde også vært en fordel om det finnes noen måte å kontrollere at ordene som tilføyes ikke finnes oppført der ifra før, og om de gjør det, så må det ordet som har orddeling beholdes, mens det andre fjernes.


    Takknemlige hilsener fra en imponert søring

    Brukerens avatar
    medlem i 214 måneder
     

    Innleggav geirendre » lør 31.03.2007 1:16

    Med et bash-script kan det se slik ut:
    Kode: Merk alt
    #!/bin/bash
    # Formål: Ordliste-oppdatering
    # dato: 31.03.2007
    # Forfatter: Geir

    # Filer som skal brukes, tilpass etter behov.
    missing=~/ordliste/Missing       #Missingfilen
    sourcefil=~/ordliste/Source.gz   #Sourcefilen
    norskword=~/ordliste/norsk.word  #Hoved Ordlisten. Ikke brukt...
    loggfil=~/ordliste/loggfil.txt   #Logg over forandringer. Oppdateres hver gang scriptet kjøres.
    nyeord=~/ordliste/nye_ord.txt     #Her legges de nye ordene.
    clear
    echo "  ---> Oppdatering startet   `date` <--- " >> $loggfil  # Merke i loggfile for start.
    echo "  **** Ord fra Source.gz lagt til. **** " >> $loggfil      # Legger Source-ord til i nyeord listen.
    for i in `grep -A3 -f $missing $sourcefil | grep 'COMPOSITE-WORD' | cut -d" " -f2 | sed 's/[~|=]/-/g'`
    do
      uod=`echo $i | cut -d" " -f2 | sed 's/-//g'`                # Fjerner orddeler fra ordet
      if ( ! grep -qw $i $missing ) || ( ! grep -qw $uod $missing ) # Sjekk om ordet finnes i Missing
      then                                                          # med eller uten orddeler.
        if ( ! grep -qw $i $nyeord ) && ( ! grep -qw $uod $nyeord ) # Sjekker om den allerede er i nyeord listen.
        then
        echo $i >> $nyeord                                        # Legger ordet til i nyeord listen
        echo "$i" >> $loggfil                # og noterer det i loggfilen.
        fi
      fi
    done

    # Så legger vi ord fra Missing som ikke finnes i Source inn i listen med nye ord.
    echo "  **** Ord fra Missing lagt til. **** " >> $loggfil        # Legger Missing-ord til i nyeord listen.
    grep 'COMPOSITE-WORD' $sourcefil | cut -d" " -f2 | sed 's/[~|=]//g' | sort -u > tmp.fil
    for resten in `grep -vw -f tmp.fil $missing`
    do
      if ( ! grep -qw $resten $nyeord )
      then
        echo "$resten" >> $nyeord
        echo "$resten" >> $loggfil
      fi
    done
    rm tmp.fil

    echo "  ---> Oppdatering avsluttet `date` <--- " >> $loggfil  # Merke i loggfile for stopp.
    #END


    Gir dette resultatet ved testkjøring mot filene:
    database-grense-snittets
    opera-skoler
    abonnementskontrakten
    brannsjef
    brannmester
    brannmesteren
    hoppsjef
    landslag
    ps
    sensurfri
    tv-skjerm


    Lager en egen loggfil der endringer blir registrert.

    Obs. Obs. Ikke grundig testet =-O
    Spesielt med tanke på kjøring mot store filer...
    Kan sikkert gjøres mere elegant også.
    ;)
    Sist endret av geirendre den lør 31.03.2007 12:52, endret 3 ganger.

    Erfaren
    Brukerens avatar
    medlem i 230 måneder
     

    Innleggav TO » lør 31.03.2007 2:55

    lars-e skrev:
    Neste steg da, er jo å få ordene inn i norsk.word, samtidig som jeg får en liste med de endringene som utføres. Slik at dette kan oppføres i endringsloggen. Hadde også vært en fordel om det finnes noen måte å kontrollere at ordene som tilføyes ikke finnes oppført der ifra før, og om de gjør det, så må det ordet som har orddeling beholdes, mens det andre fjernes.


    Du viser i et eksempel at norsk.word inneholder kun ord med delingstegn, før det fortalte du et sted at den også inneholder bl.a. frekvens og ordgruppemerke, se følgende om norsk.word:
    du
    jeg
    brann
    brann-mann
    brann-mannen
    brann-stifter
    høyeste-retts-justitiarius
    ord-bok
    ord-bøker
    ord-bøkene
    osv
    tull


    norsk.words (Ordbok)
    brann-mann * 19 B
    brann-mannen * 17 B


    Selve prinsippet som jeg tenker på vil være likt som i awk-koden over, den potensiellt ytterligere ordinformasjonen må dog også håndteres. Kan du avklare/bekrefte hvordan fila egentlig er, et reellt eksempel er igjen flott?
    Videre, hva er størrelsen (MB/antall linjer) på denne fila (størrelsesorden)?
    medlem i 213 måneder
     

    Innleggav lars-e » lør 31.03.2007 13:01

    Hei igjen!

    Filen som inneholder alle ord brukt i ordboken, het norsk.words (jeg som var litt for kjapp i skrivingen tidligere)
    Den er på 13.7 MB, og har slik den er idag 747 882 linjer, med ord og annen informasjon. Den ser slik ut for de første sidene:
    Kode: Merk alt
    # norsk.words --- list of Norwegian words, version 2.0.
    #
    # Copyright (C) 2000, Rune Kleveland
    #
    # Maintainer: Rune Kleveland, runekl at opoint.com
    # Keywords: Norwegian, Dictionary
    #
    # This file is free software; you can redistribute it and/or modify it
    # under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2, or (at your option)
    # any later version.
    #
    # This file is distributed in the hope that it will be useful, but
    # WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    # General Public License for more details.
    #
    #
    # Commentary
    #
    # This file contains a list of Norwegian words.  Each word is
    # hyphenated at compound points, and has a frequency indicator
    # essentially of log log type.  Words requiring special hyphenation,
    # like `spisslede', are marked spi"sslede.  There is also a group
    # indicator for each `bokmål' word:
    #
    #   B Normal words
    #   A `newspaper' words.
    #   N Words from NOU
    #   M Words from mathematics
    #   S Samnorsk, radical forms
    #   K Conservative writing
    #   D Words from Dagbladet
    #   O Words from technical oil business
    #   C Sammendragning, like `idag'.
    #
    # This tagging should not be taken too seriously!
    #
    # The words marked with `*' are allowed in nynorsk (modulo a large but
    # finite number of bugs).  There is no frequency information
    # available for nynorsk, since I have not been able to collect a
    # sufficient amount of nynorsk text to generate a useful index.
    #
    # Some special words has suffixes indicating this.  This information is
    # most useful for generating dictionaries for Ispell, and the tagging is
    # not complete.
    #
    # yyyy   Word is allowed as first part of a compound word, and all its
    #        derived forms are allowed as the second part.
    # xxxx   Word allowed as first part of a compound word.
    # zyzyzy Word allowed as first part of a compound word, but not alone.
    #
    #
    Aasane *
    Aase * 24 B
    Aasen * 23 B
    Aasens 19 B
    Aaser * 20 A
    Aasers 15 B
    Aasheim * 22 A
    Aasmund * 23 B
    Aasmunds 2 B
    Aass * 20 B
    Abadan * 10 B
    Abadans 0 B
    Abba * 19 B
    Abbas 19 B
    Abdul * 20 B
    Abduls 4 B
    Abeba * 20 B
    Abebe * 12 B
    Abel * 21 B
    Abel-haugen * 17 A
    Abel-konkurransen * 11 A
    Abel-konkurransens 1 A
    Abel-vær * 5 B
    Abel-værs 0 B
         |
         |
    pidestall * 17 B
    pidestallen * 16 B
    pidestallens 1 B
    pidestaller 12 B
    pidgin-engelsk *
    pidgin-engelsken *
    pidgin-språk *
    pidgin-språka *


    Som dere ser, er det både ord med orddelingsmarkør og ikke i denne filen. Noen ord har blitt tagget med en tag, som ikke er så veldig viktig, og frekvensinformasjon. Hovedsaken er da å få inn de nye ordene i norsk.words, all frekvensinformasjon o.l. blir lagt til senere av et eget frekvens-skript.

    Og det jeg da også tenkte på, var at: Om ordet pide-stallen skulle forekomme i den nye listen med nye ord (skal i teorien ikke skje, men kan være greit å ha kontrollert det), så skulle man også få byttet ut ordet pidestallen i norsk.words med det nye ordet med orddeling. Optimalt så hadde man da også beholdt informasjonen bak ordet ( * 16 B).

    Ps. De to strekene (|) i eksempelet for norsk.words, er bare lagt til for å indikere at jeg hoppet over et par hundre linjer.

    Brukerens avatar
    medlem i 214 måneder
     

    Innleggav TO » lør 31.03.2007 17:02

    Her er et forslag for å endre 'norsk.word' basert på informasjonen gitt i
    fila: nyeord.txt . Dette skriver en ny 'norsk-dato.word' samt en logg-fil.
    norsk-dato.log, loggen skrives også ut til skjerm ved slutt.

    Litt modifisert norsk.words:
    Kode: Merk alt
     
    $ cat norsk.word
    databasegrensesnittets
    du
    jeg
    brann
    brann-mann * 19 B
    brann-mannen * 17 B
    brann-stifter
    høyeste-retts-justitiarius
    ord-bok
    ord-bøker
    ord-bøkene
    osv
    tull


    Prøvekjøring:
    Kode: Merk alt
    $ bash ny2norsk.bash
    NYTT:     sensurfri
    NYTT:     abonnementskontrakten
    NYTT:     landslag
    NYTT:     ps
    NYTT:     brannmester
    NYTT:     opera-skoler
    NYTT:     brannsjef
    ENDRING:  databasegrensesnittets          =>  database-grense-snittets
    NYTT:     brannmesteren
    NYTT:     hoppsjef
    NYTT:     tv-skjerm


    Her er skriptet ny2norsk.bash
    Kode: Merk alt
    #!/bin/bash

    #innfiler
    nyeord=nyeord.txt
    norskword=norsk.word

    # utfiler
    norskwordny=norsk-$(date +%Y.%m.%d-%H).word
    log=norsk-$(date +%Y.%m.%d-%H).log

    for i in $nyeord $norskword
    do
        if [ ! -f "$i" ]; then
            echo "feil: kan ikke finne filen: $i" >&2
            exit 1
        fi
    done

    # skrive ut kommentarlinjer (alle vil komme på toppen)
    awk '/^[ \t]*\#/' "$norskword" >"$norskwordny"

    # leser nyeord og norskword og skriver til norskwordny
    <<'EOF'   awk -f '-' -v nyeord="$nyeord" -v norskword="$norskword"   2>"$log" 1>>"$norskwordny"
    BEGIN {
        stderr="/dev/stderr"

        # les nyeord
        flag=0
        word=""
        while ( (getline<nyeord)>0){
            flag++
            word=$1
            compword=word
            gsub(/[-]/,"",word) # word uten bindestrek (nøkkelen)
            Nyeord[word]=compword
        }
        close(nyeord)
        if (flag==0) {
            print "error: ingen ord lest fra filen: " nyeord >stderr
            exit 1
        }

        # les  norskword
        flag=0
        while ( (getline<norskword)>0 ){
            flag++
            gsub(/^[ \t]*\#.*$/,"",$0) # fjerner kommentarer
            if (NF==0) continue        # dropper tomme linjer
            #
            word=$1
            gsub(/[-]/,"",word)     # word uten bindestrek (nøkkelen)
            if (word in Norskword){ # håndterer ord med flere brytningsmønster ?
                 word = word " x"
            }     
            rest=$0                        # $0 =  'compword rest'
            sub(/^[ \t]*[^ \t]+/,"",rest)  # fjerner compword, rest gjenstår
             
            Ordindeks[word]++
            Norskword[word,"compword"]   = $1
            Norskword[word,"rest"    ]   = rest
        }
        close(missing)
        if (flag==0) {
            print "error: ingen ord lest fra filen: " norskword >stderr
            exit 1
        }

        # itererer over Nyeord, setter inn brytningsmønstre og legger inn nye ord
        for (word in Nyeord){
            newcompword=Nyeord[word]
            if (word in Ordindeks){ # mulig endring i brytningsmønster
               if (newcompword~/-/) # et nytt og forbedret brytningsmønster
                   printf("ENDRING:  %-30s  =>  %s\n",
                           Norskword[word,"compword"],newcompword) >stderr
                   # denne 'resten' under er modifisert kun for
                   # kvalitetssikringsformål, bør kommenteres ut
                   Norskword[word,"rest"]=sprintf("%s #ENDRET: var %s",
                                 Norskword[word,"rest"],Norskword[word,"compword"])
                   Norskword[word,"compword"]= newcompword
            }
            else{ # legger inn et helt nytt ord
                printf("NYTT:     %-30s\n", newcompword) >stderr
                Ordindeks[word]++
                # denne 'resten' under er modifisert kun for 
                # kvalitetssikringsformål, bør kommenteres ut
                Norskword[word,"rest"]=sprintf("%s #NYTT",Norskword[word,"rest"])
                Norskword[word,"compword"]=newcompword
            }
        }

        # skriver ut alle ordene i sortert rekkefølge
        for (word in Ordindeks){
            printf("%s%s\n",Norskword[word,"compword"],
                   Norskword[word,"rest"]) | "sort -k1,1"
        }   
    } # end of BEGIN
    EOF

    cat "$log"
    exit 0


    Jeg tror denne møter spesifikasjonen, det er en liten "debug" inne i
    printen til ny "norsk-dato.word", denne bør bort, jeg la den inn av
    bekvemmelighetshensyn. Tror du bør lage et verifisert mini-eksempel
    som du sjekker mot før du setter ting i produksjon.

    Jeg har antatt at du har nok RAM til å håndtere hele fila i minnet, men
    jeg syns ikke filstørrelsen er urovekkende så det vil nok gå bra. Lykke til,
    som OpenOffice bruker så er det hyggelig å kunne bidra.
    medlem i 213 måneder
     

    Innleggav geirendre » man 02.04.2007 0:12

    Hvis jeg har forstått oppgaven rett, så kan du prøve med dette lille bash-scriptet.
    Det legger ordene fra en fil med nye ord til i norsk.word dersom ordet
    ikke finnes fra før, eller finnes men uten orddeler.
    Ordlisten sorteres til slutt, og det opprettes en loggfil
    der alt blir logget, samt at endringer skrives til skjermen.
    Kode: Merk alt
    #!/bin/bash
    # Formål: Ordliste-oppdatering
    # dato: 02.04.2007
    # Forfatter: Geir Endre

    # Variabler først. Gjør endringer her for å tilpasse scriptet til systemet.
    norskword=~/ordliste/norsk.word        # Ordlisten.
    nyeord=~/ordliste/nye_ord.txt          # Fil med nye ord som skal inn i ordlisten.
    loggfil=~/ordliste/oppdateringer.log   # Logger oppdateringer i en fil
    skigard="########################################################"
    teller=0                               # Teller antall ord som legges til i ordlisten.
    tid=`date +%d-%m-%Y_%H:%M`

    clear
    # Fancy overskrift:
    echo $skigard | tee -a $loggfil
    echo "      Synkronisering av ordliste $tid         " | tee -a $loggfil
    echo $skigard | tee -a $loggfil

    cp $norskword $norskword.$tid          # Tar backup av den originale ordlisten.
    echo "Backup av gammel ordliste lagret som $norskword.$tid" | tee -a $loggfil
    echo $skigard | tee -a $loggfil

    # Så til jobben:
    for i in `cat $nyeord`
    do 
       oud=`echo $i | sed 's/-//g'`
       if ( grep -qw $oud $norskword ) && ( echo $i | grep -q '-' )
         then
           echo "Ordet \"$oud\" endret til \"$i\"." | tee -a $loggfil
           cat $norskword | sed s/$oud/$i/  > $norskword
           (( teller++ ))
       else
         if ( ! grep -qw $i $norskword )
         then
           echo "Ordet \"$i\" finnes ikke i ordlisten, legger det til listen." | tee -a $loggfil
           echo $i >> $norskword
           (( teller++ ))
         fi
       fi
    done

    # Vi sortere den endelige filen. Må dele kommentarfeltet øverst i filen fra resten før sortering.
    awk '/^[^#]/ { print }' $norskword > tmp.txt     # Flytte ordene til en tempfil hvor de kan sorteres.
    awk '/^#/ { print }' $norskword > tmpword.txt    # Flytter overskriften til en annen tempfil.
    mv tmpword.txt $norskword
    sort -u tmp.txt >> $norskword
    rm tmp.txt     
    # 'sort' sorterer ord som begynner med aa sist, som jo egentlig er rett.....

    # Avslutter med fancy bunntekst.
    echo $skigard | tee -a $loggfil
    echo "   Synkronisering ferdig, $teller ord lagt til i ordlisten. " | tee -a $loggfil
    echo $skigard | tee -a $loggfil

    #END

    Som sist, test grundig før du bruker den.
    Lykke til. :-)

    Erfaren
    Brukerens avatar
    medlem i 230 måneder
     

    Innleggav lars-e » man 02.04.2007 13:57

    Heisann!

    @TO
    Det ser ut til at det siste skriptet gjør noe rart..
    Når jeg har filen Missing med en god del ord i, og kjører den opp imot norsk.words, får jeg endel «uønskede» endringer. Det ser ut til at den fjerner orddelingen for hovedordet, samtidig som den gjør endel ikke ønskede endringer:
    Et eksempel fra norsk-2007-04-22.words
    Kode: Merk alt
    satellitt-målingaålinga *
    satellitt-målinganeålingane *
    satellitt-målingarålingar *
    satellitt-målingeneålingene 5 A
    satellitt-målingenålingen 1 A
    satellitt-målingensålingens 0 A
    satellitt-målingerålinger 11 A
    satellitt-målingåling * 1 A
    satellitt-mottager 10 K #ENDRET: var satellitt-mottager
    satellitt-mottagere 11 K #ENDRET: var satellitt-mottagere
    satellitt-mottageren 8 K #ENDRET: var satellitt-mottageren
    satellitt-mottagerens 0 K #ENDRET: var satellitt-mottagerens
    satellitt-mottageres 0 K #ENDRET: var satellitt-mottageres
    satellitt-mottagerne 1 K #ENDRET: var satellitt-mottagerne
    satellitt-mottagernes 0 K #ENDRET: var satellitt-mottagernes
    satellitt-mottagers #NYTT
    satellitt-mottakar *
    satellitt-mottakarane *
    satellitt-mottakarar *
    satellitt-mottakaren *
    satellitt-mottaker 0 A
    satellitt-mottakere 1 A
    satellitt-mottakeren 0 A
    satellitt-mottakerens 0 A
    satellitt-mottakeres 0 A
    satellitt-mottakerne 0 A
    satellitt-mottakernes 0 A
    satellitt-mottakers #NYTT


    Sammenlignet med den opprinnelige norsk.words
    Kode: Merk alt
    satellitt-mottager 10 K
    satellitt-mottagere 11 K
    satellitt-mottageren 8 K
    satellitt-mottagerens 0 K
    satellitt-mottageres 0 K
    satellitt-mottagerne 1 K
    satellitt-mottagernes 0 K
    satellitt-mottakar *
    satellitt-mottakarane *
    satellitt-mottakarar *
    satellitt-mottakaren *
    satellitt-mottaker 0 A
    satellitt-mottakere 1 A
    satellitt-mottakeren 0 A
    satellitt-mottakerens 0 A
    satellitt-mottakeres 0 A
    satellitt-mottakerne 0 A
    satellitt-mottakernes 0 A
    satellitt-måling * 1 A
    satellitt-målinga *
    satellitt-målingane *
    satellitt-målingar *
    satellitt-målingen 1 A
    satellitt-målingene 5 A
    satellitt-målingens 0 A
    satellitt-målinger 11 A


    Samme område fra nyeord.txt (etter kontroll mot source), viser dette:
    Kode: Merk alt
    Sara
    satellittmottager
    satellitt-mottagere
    satellitt-mottageren
    satellitt-mottagerens
    satellitt-mottageres
    satellitt-mottagerne
    satellitt-mottagernes
    satellitt-mottagers
    satellitt-mottakers
    saue-bønders


    Vet ikke hvorfor det ble endret på satellitt-målingene der, men et eller annet har skjedd, og det var også skjedd på flere andre steder? Samtidig ble jo også den alfabetiske sorteringen feil.

    Brukerens avatar
    medlem i 214 måneder
     

    Innleggav lars-e » man 02.04.2007 14:10

    @geirendre
    Det siste forslaget ditt, tar det hensyn til eventuelle oppføringer i norsk.words som skal byttes ut? Feks. om det i norsk.words finnes oppføringen:
    hjemmehjelp, og i nyeord.txt så finnes hjemme-hjelp. Optimalt sett bør jo da hjemmehjelp byttes ut mot hjemme-hjelp.

    @TO
    En annen ting jeg la merke til, ikke noen big deal, men koster litt ekstra manuelt arbeide. De ordene som er delt med flere orddelingsmarkører i norsk.words ble erstattet av ord med kun en orddelingsmarkør fra nyeord.txt. Det vil si, hvis jeg i norsk.words allerede hadde: høyeste-retts-justitiarius, mens det i nyeord.txt kun var høyesteretts-justitiarius, så ble den fra norsk.words erstattet med det mindre dekkende ordet fra nyeord.txt.

    Samtidig kom jeg over flere av de nevnte feilene midt i ordlisten, uten å være i nærhet av noen andre ord det var blitt endret på (norsk-dato.words)
    Kode: Merk alt
    sannhets-karakterens 0 B
    sannhets-kjærligeærlige 4 B
    sannhets-kjærlighetenærligheten 0 B
    sannhets-kjærlighetensærlighetens 0 B
    sannhets-kjærlighetærlighet 6 B
    sannhets-kjærligærlig 4 B
    Sannhets-kommisjon 14 A
    Sannhets-kommisjonen 15 A
    Sannhets-kommisjonens 10 A

    Brukerens avatar
    medlem i 214 måneder
     

    Innleggav TO » man 02.04.2007 14:40

    Har pellet ut typiske endringer:

    Nr 1:
    >satellitt-målingaålinga *
    Her er det noe med æøå-tipper jeg, det er nok regex-maskinen som ikke
    kjenner til disse nordiske bokstavene. Det kan nok løses når jeg klarer å
    reprodusere det - senere.

    Nr 2:
    >satellitt-mottager 10 K #ENDRET: var satellitt-mottager
    Her tar nyeord prioritet, men som du ser - det er ingen forskjell i brytning
    så det var vel unødvendig, men ingen skade er skjedd, så denne er
    grei. Men - du må ha 'satellitt-mottager' et sted i nyeord.txt, selv om du
    ikke viser den i utklippet - hvis ikke så er det en alvorlig feil et eller
    annet mystiks sted.

    Nr 3:
    >satellitt-mottagers #NYTT
    >satellitt-mottakers #NYTT

    Denne er vel også grei

    >Det ser ut til at det siste skriptet gjør noe rart..
    Enig
    >Når jeg har filen Missing med en god del ord i, og kjører den opp imot
    >norsk.words, får jeg endel «uønskede» endringer. Det ser ut til at den
    >fjerner orddelingen for hovedordet, samtidig som den gjør endel ikke
    >ønskede endringer:

    Du tenker vel på Nr 1, med å (samt æ og ø regner jeg med).

    satellitt-målinga * som blir korrumpert til:
    satellitt-målingaålinga *

    >Vet ikke hvorfor det ble endret på satellitt-målingene der,
    >men et eller annet har skjedd, og det var også skjedd på
    >flere andre steder?
    Hypotesen er ikke-korrekt håndtering av æøå.

    >Samtidig ble jo også den alfabetiske sorteringen feil.
    Skjønner ikke hvordan det kan skje, men kanskje av samme årsak (æøå).

    >En annen ting jeg la merke til, ikke noen big deal, men koster litt ekstra
    >manuelt arbeide. De ordene som er delt med flere orddelingsmarkører i
    >norsk.words ble erstattet av ord med kun en orddelingsmarkør fra
    >nyeord.txt. Det vil si, hvis jeg i norsk.words allerede hadde:

    Jeg prøvde litt halvhjertet å håndtere noe slikt i koden.

    >høyeste-retts-justitiarius, mens det i nyeord.txt kun var
    >høyesteretts-justitiarius, så ble den fra norsk.words erstattet med det
    >mindre dekkende ordet fra nyeord.txt.

    Uhm, jeg har antatt at 'nyeord.txt' alltid er en forbedring. Tror ikke at jeg skal begi meg ut på kvalitetsvurdering i skriptet.

    Du fant flere avvik:

    sannhets-kjærligeærlige 4 B
    sannhets-kjærlighetenærligheten 0 B


    Det er helt sikkert knyttet til æøå!


    Hva får du for 'locale' og 'echo signal-måling ...', jeg klarer ikke å reprodusere:
    $ locale
    LANG=en_AU.UTF-8
    LANGUAGE=en_AU:en
    LC_CTYPE="en_AU.UTF-8"
    LC_NUMERIC="en_AU.UTF-8"
    LC_TIME="en_AU.UTF-8"
    LC_COLLATE="en_AU.UTF-8"
    LC_MONETARY="en_AU.UTF-8"
    LC_MESSAGES="en_AU.UTF-8"
    LC_PAPER="en_AU.UTF-8"
    LC_NAME="en_AU.UTF-8"
    LC_ADDRESS="en_AU.UTF-8"
    LC_TELEPHONE="en_AU.UTF-8"
    LC_MEASUREMENT="en_AU.UTF-8"
    LC_IDENTIFICATION="en_AU.UTF-8"
    LC_ALL=
    $ echo signal-måling | awk 'sub(/^[ \t]*[^ \t]+/,"X") || 1'
    X

    NOTE: hvis du får Xåling på siste så vet vi hva det er.

    Fiks som ikke ordner sorteringsproblemet, bytt ut kode der norskword leses:
    Kode: Merk alt
            rest=$0                        # $0 =  'compword rest'
            sub(/^[ \t]*[^ \t]+/,"",rest)  # fjerner compword, rest gjenstår
             
            Ordindeks[word]++
            Norskword[word,"compword"]   = $1
            Norskword[word,"rest"    ]   = rest


    endres til følgende:
    Kode: Merk alt
            Ordindeks[word]++
            Norskword[word,"compword"]   = $1
            $1=""
            Norskword[word,"rest"    ]   = $0
    medlem i 213 måneder
     

    Neste

    Returner til Utvikling i Linux



    Hvem er i Forumene

    Registrerte brukere: Google [Bot]



    cron