I dag bruker den norske stavekontrollen bindestrek (-) som markør for sammensatte ord. Denne markøren er viktig for å få "komprimeringen" til ispell, aspell og myspell til å fungere tilfredstillende. Et kritisk problem med bruk av bindestrek som slik markør er at det gjør det umulig å representere norske ord som skal ha bindestrek i stavekontrollen. Et eksempel er CD-spiller.
En ide for å fikse dette er å endre markørtegnet, til f.eks. likhetstegn (=) som å bruke samme tegn som på no.speling.org, og jeg har forsøkt to ganger nå å få dette til. En kompliserende faktor for meg er at byggsystemet til den norske stavekontrollen er veldig komplekst, og jeg forstår ikke fullt ut hvordan det fungerer.
Mitt siste forsøk ser ut til å fungere bedre enn sist, så jeg poster derfor patchen her i håp om at noen andre kan ta en titt og finne eventuelle problemer med den, før vi tar den i bruk. Jeg tror det er viktig å sikre at stavekontrollresultatene blir like med og uten denne patchen, før vi går videre og legger inn ord med bindestrek.
I tillegg til denne patchen av byggesystemet, så må alle bindestrek i ordene i norsk.words endres til likhetstegn.
Her er patchen relativ til dagens CVS-utgave av koden.
Index: Makefile =================================================================== RCS file: /cvsroot/spell-norwegian/src/spell-norwegian/Makefile,v retrieving revision 1.111 diff -u -3 -p -u -r1.111 Makefile --- Makefile 2 Nov 2006 23:08:00 -0000 1.111 +++ Makefile 11 Nov 2006 10:47:36 -0000 @@ -111,10 +111,10 @@ SHELLDEBUG = +vx
# CATNOHEADER=$(SED) -e '/^#/ D' -e 's/[ ]*#.*//' ${LANGUAGE}.words CATNOHEADER=grep -v '^#' ${LANGUAGE}.words -ALPHASUBST=tr '-' 'î' -ALPHASUBSTSED=s/-/î/g -STREKSUBST=tr 'î' '-' -STREKSUBSTSED=s/î/-/g +ALPHASUBST=tr '=' 'î' +ALPHASUBSTSED=s/=/î/g +STREKSUBST=tr 'î' '=' +STREKSUBSTSED=s/î/=/g STREKREM=tr -d 'îÎ' STREKREMSED=s/[îÎ]//g
@@ -133,7 +133,7 @@ SUFF=${SUFFNORM}${SUFFCOMP} # The awk scripts below tells which words from in each category that # should be in the dictionary. The line
-# /^[-${LCH}]{4}[${SUFF}]/ {if ($$2>4) {print $$1,$$2}} +# /^[=${LCH}]{4}[${SUFF}]/ {if ($$2>4) {print $$1,$$2}}
# says that words with length 4 containing only lowercase letters with # frequency greater then 5 should be included. Edit the scripts as @@ -142,7 +142,7 @@ SUFF=${SUFFNORM}${SUFFCOMP} # to be a legal word if the word is short. `re' is legal!
# The CHOOSEFLAG script sets the limit for flag inclusion. Example: -# adgangs-tegn is a common word, but the form adgangstegnenes scores 0 +# adgangs=tegn is a common word, but the form adgangstegnenes scores 0 # on frequency. It will be excluded by the script below if you don't # change it.
@@ -209,10 +209,10 @@ COMPOUNDLIMIT=0 # Somewhere in the long pipe making the input file for buildhash, the # data looks like # -# gutte-drøm/ 17 -# gutte-drøm/A 18 -# gutte-drøm/E 14 -# gutte-drøm/G 7 +# gutte=drøm/ 17 +# gutte=drøm/A 18 +# gutte=drøm/E 14 +# gutte=drøm/G 7 # # thus the frequenzy indicator for each flag is availiable. Awk is # used to pick the flags we want, and the variable holding the program @@ -221,7 +221,7 @@ COMPOUNDLIMIT=0 # # Later in the pipe the data looks like # -# gutte-drøm/17A18E14G7 19 +# gutte=drøm/17A18E14G7 19 # # The second field (19) is the frequenzy indicator for all words # coming from the root gutt. So here we can throw away a root with @@ -269,29 +269,29 @@ CHOOSEROOTC=${DEFAULTROOTFILTER} # Samme
# define CHOOSEFLAGB # '//[ ${PRE}]/ {print $$1,$$2} \ -# /^[-${LCH}]{1,2}/[${SUFF}]/ {if ($$2>6) {print $$1,$$2}} \ -# /^[-${LCH}]{3}/[${SUFF}]/ {if ($$2>5) {print $$1,$$2}} \ -# /^[-${LCH}]{4}/[${SUFF}]/ {if ($$2>3) {print $$1,$$2}} \ -# /^[-${LCH}]{5,7}/[${SUFF}]/ {if ($$2>1) {print $$1,$$2}} \ -# /^[-${LCH}]{8,}/[${SUFF}]/ {if ($$2>=0) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{1,2}/[${SUFF}]/ {if ($$2>4) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{3}/[${SUFF}]/ {if ($$2>3) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{4}/[${SUFF}]/ {if ($$2>2) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{5,7}/[${SUFF}]/ {if ($$2>1) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{8,}/[${SUFF}]/ {if ($$2>=0) {print $$1,$$2}}' +# /^[=${LCH}]{1,2}/[${SUFF}]/ {if ($$2>6) {print $$1,$$2}} \ +# /^[=${LCH}]{3}/[${SUFF}]/ {if ($$2>5) {print $$1,$$2}} \ +# /^[=${LCH}]{4}/[${SUFF}]/ {if ($$2>3) {print $$1,$$2}} \ +# /^[=${LCH}]{5,7}/[${SUFF}]/ {if ($$2>1) {print $$1,$$2}} \ +# /^[=${LCH}]{8,}/[${SUFF}]/ {if ($$2>=0) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{1,2}/[${SUFF}]/ {if ($$2>4) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{3}/[${SUFF}]/ {if ($$2>3) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{4}/[${SUFF}]/ {if ($$2>2) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{5,7}/[${SUFF}]/ {if ($$2>1) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{8,}/[${SUFF}]/ {if ($$2>=0) {print $$1,$$2}}' # endef
# define CHOOSEROOTB -# '/^[-${LCH}]{1,2}// {if ($$2>8) {print $$1,$$2}} \ -# /^[-${LCH}]{3}// {if ($$2>6) {print $$1,$$2}} \ -# /^[-${LCH}]{4}// {if ($$2>5) {print $$1,$$2}} \ -# /^[-${LCH}]{5,7}// {if ($$2>2) {print $$1,$$2}} \ -# /^[-${LCH}]{8,}// {if ($$2>1) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{1,2}// {if ($$2>8) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{3}// {if ($$2>6) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{4}// {if ($$2>3) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{5,7}// {if ($$2>2) {print $$1,$$2}} \ -# /^[${UCH}][-${CH}]{8,}// {if ($$2>1) {print $$1,$$2}}' +# '/^[=${LCH}]{1,2}// {if ($$2>8) {print $$1,$$2}} \ +# /^[=${LCH}]{3}// {if ($$2>6) {print $$1,$$2}} \ +# /^[=${LCH}]{4}// {if ($$2>5) {print $$1,$$2}} \ +# /^[=${LCH}]{5,7}// {if ($$2>2) {print $$1,$$2}} \ +# /^[=${LCH}]{8,}// {if ($$2>1) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{1,2}// {if ($$2>8) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{3}// {if ($$2>6) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{4}// {if ($$2>3) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{5,7}// {if ($$2>2) {print $$1,$$2}} \ +# /^[${UCH}][=${CH}]{8,}// {if ($$2>1) {print $$1,$$2}}' # endef
@@ -413,21 +413,21 @@ munched.%: ${LANGUAGE}.words nb.aff.munc -e 's/(er/.*I.*)V/\1/' \ -e 's/(e/.*B.*)W/\1/' \ -e 's/([^ei]um/.*B.*)I/\1/' \ - | $(SED) -e N -e 's/^(([-${CH}])*([^e][^r]|[e][^r]|[r][^e]))/([A-Zt-z]*)\n\1e/([A-Zt-z]*)R([A-Zt-z]*)$$/\1/\4*\1e/\5\6/g' \ + | $(SED) -e N -e 's/^(([=${CH}])*([^e][^r]|[e][^r]|[r][^e]))/([A-Zt-z]*)\n\1e/([A-Zt-z]*)R([A-Zt-z]*)$$/\1/\4*\1e/\5\6/g' \ -e '$$ p' -e '$$ d' -e P -e D \ | tr '*' '\n' \ - | $(SED) -e N -e 's/^(([-${CH}])*)(/[AB]*)E(.*)\n\1er/AI/\1\3\4*\1er/AI/' \ + | $(SED) -e N -e 's/^(([=${CH}])*)(/[AB]*)E(.*)\n\1er/AI/\1\3\4*\1er/AI/' \ -e '$$ p' -e '$$ d' -e P -e D \ | tr '*' '\n' \ | $(SED) -e '$(STREKSUBSTSED)' \ -e 's//([${SUFF}]*)([${PRE}]*)//\2\1/' \ - -e 's/(([-${CH}])*)/([${PRE}]*)([${SUFF}]+)$$/\1/\3*\1/\3\4/' \ - -e 's/^([-${CH}]*)$$/\1/ /' \ + -e 's/(([=${CH}])*)/([${PRE}]*)([${SUFF}]+)$$/\1/\3*\1/\3\4/' \ + -e 's/^([=${CH}]*)$$/\1/ /' \ | tr '*' '\n' \ | $(SED) -e ':START' \ - -e 's/^([-${CH}]+)/([${PRE}]*)([${SUFF}]+)([${SUFF}])/\1/\2\3*\1/\2\4/' \ + -e 's/^([=${CH}]+)/([${PRE}]*)([${SUFF}]+)([${SUFF}])/\1/\2\3*\1/\2\4/' \ -e 't START' \ - -e 's/^([-${CH}]+)/([${PRE}]+)(*|$$)/\1/*\1/\2\3/'\ + -e 's/^([=${CH}]+)/([${PRE}]+)(*|$$)/\1/*\1/\2\3/'\ | tr '*' '\n' > munch2.tmp # This pipe produce a file containing the a line number of munch2.tmp and # the frequency indicator for that line. Note that the summation rule @@ -435,7 +435,7 @@ munched.%: ${LANGUAGE}.words nb.aff.munc cat munch2.tmp \ | tr -d ' ' \ | ispell -e -d ./nb.munch.hash \ - | $(SED) -e 's/^[-${CH}]+ //' -e '$(STREKSUBSTSED)' \ + | $(SED) -e 's/^[=${CH}]+ //' -e '$(STREKSUBSTSED)' \ | $(AWK) --source '{i=0; while (i<NF) {i=i+1;print $$i,NR}}' \ | sort \ | join - ${LANGUAGE}.words \ @@ -465,8 +465,8 @@ munched.%: ${LANGUAGE}.words nb.aff.munc | uniq \ | tr -d ' ' \ | $(SED) -e '$$ p' -e '$$ D' -e ':START' -e '$$ ! N' \ - -e 's/^(([-${CH}])+)/([0-9]*)\n\1/([${SUFF}${PRE}0-9]*)$$/\1/\3\4/' \ - -e 's/^(([-${CH}])+/)([0-9]*)([${PRE}]*)([${SUFF}0-9]*)\n\1\4([${SUFF}0-9]+)$$/\1\3\4\5\6/' \ + -e 's/^(([=${CH}])+)/([0-9]*)\n\1/([${SUFF}${PRE}0-9]*)$$/\1/\3\4/' \ + -e 's/^(([=${CH}])+/)([0-9]*)([${PRE}]*)([${SUFF}0-9]*)\n\1\4([${SUFF}0-9]+)$$/\1\3\4\5\6/' \ -e 't START' -e P -e D \ | $(SED) -e 's//([${SUFF}0-9${PRE}]*)//\1* \1/' \ | tr '*' '\n' \ @@ -495,7 +495,7 @@ nb.mch: forkort.txt $(patsubst %,munched
# First make a list of words with some compound flag, and a hash-file. cat forkort.txt $(patsubst %,munched.%,${CATHEGORIES}) \ - | tr -d '-0-9 ' \ + | tr -d '=0-9 ' \ | grep "/.*[z\_`]" \ > comp1.tmp $(BUILDHASH) comp1.tmp nb.aff comp.hash @@ -508,13 +508,13 @@ nb.mch: forkort.txt $(patsubst %,munched
cat -n forkort.txt $(patsubst %,munched.%,${CATHEGORIES}) \ | grep -v "/.*[z\_`]" \ - | $(AWK) --source '/-/ {if ($$3<${COMPOUNDLIMIT}) {print $$1,$$2,$$3}}' \ + | $(AWK) --source '/=/ {if ($$3<${COMPOUNDLIMIT}) {print $$1,$$2,$$3}}' \ > comp2.tmp # Test which words are accepted by ispell. Output is a list of line # numbers indicating the lines that can be removed from the munched # file. cat comp2.tmp \ - | tr -d '-0-9 ' \ + | tr -d '=0-9 ' \ | ispell -e -d ./comp.hash \ | $(SED) -e 's/$$/ xyxyxyxy/' \ | ispell -l -d ./comp.hash \ @@ -531,7 +531,7 @@ nb.mch: forkort.txt $(patsubst %,munched cat -n forkort.txt $(patsubst %,munched.%,${CATHEGORIES}) \ | sort -n -m -s +0 -1 comp3.tmp - \ | $(SED) -e '/^[0-9]+$$/,/.*/ D' -e '/(xxxx|yyyy)// D' \ - | tr -d '- 0-9' \ + | tr -d '= 0-9' \ | LC_COLLATE=C sort > $@ rm -f comp.hash comp[123].tmp*
@@ -551,9 +551,9 @@ nn.mch: ${LANGUAGE}.words nn.aff.munch ${CATNOHEADER} \ | grep '*' \ | $(SED) -e 's/ .*//' \ - | tr -d '-' \ + | tr -d '=' \ | munchlist -v -l nn.aff.munch \ - | $(SED) -e N -e 's/^(([-${CH}])*)er/(.*F.*)\n\1rar/M$$/\1er/\3D/' \ + | $(SED) -e N -e 's/^(([=${CH}])*)er/(.*F.*)\n\1rar/M$$/\1er/\3D/' \ -e '$$ p' -e '$$ d' -e P -e D \ | LC_COLLATE=C sort > $@
@@ -566,7 +566,7 @@ words.nb: ${LANGUAGE}.words | grep '[BANDS]$$' \ | tr -d '*' \ | $(AWK) --re-interval --source ${WORDSFILTER} \ - | tr -d '"-' \ + | tr -d '"=' \ | grep -v '(xxxx|yyyy|zyzyzy)' \ | sort -f \ > $@ @@ -577,7 +577,7 @@ words.nn: ${LANGUAGE}.words ${CATNOHEADER} \ | grep '*' \ | $(SED) -e 's/ .*//' \ - | tr -d '"-' \ + | tr -d '"=' \ | grep -v '(xxxx|yyyy|zyzyzy)' \ | sort -f \ > $@ @@ -588,7 +588,7 @@ words.${LANGUAGE}.%: ${LANGUAGE}.words | grep '[BANDS]$$' \ | grep ' $(patsubst words.${LANGUAGE}.%,%,$@) ' \ | $(SED) -e 's/ .*//' \ - | tr -d - \ + | tr -d = \ | grep -v '(xxxx|yyyy|zyzyzy)' \ | sort -f \ > $@
On Sat, Nov 11, 2006 at 11:48:21AM +0100, Petter Reinholdtsen wrote:
I dag bruker den norske stavekontrollen bindestrek (-) som markør for sammensatte ord. Denne markøren er viktig for å få "komprimeringen" til ispell, aspell og myspell til å fungere tilfredstillende. Et kritisk problem med bruk av bindestrek som slik markør er at det gjør det umulig å representere norske ord som skal ha bindestrek i stavekontrollen. Et eksempel er CD-spiller.
En ide for å fikse dette er å endre markørtegnet, til f.eks. likhetstegn (=) som å bruke samme tegn som på no.speling.org, og jeg har forsøkt to ganger nå å få dette til. En kompliserende faktor for meg er at byggsystemet til den norske stavekontrollen er veldig komplekst, og jeg forstår ikke fullt ut hvordan det fungerer.
Hva med å endre dette tegnet it Soft Hyphen? SHY?
Hilsen Keld
[Keld Jørn Simonsen]
Hva med å endre dette tegnet it Soft Hyphen? SHY?
Jeg ser fordelen med å bruke samme tegn som i datafilen for no.speling.org-systemet, da vi slipper konvertering. Hva er fordelen med å bruke SHY?
Vennlig hilsen,
On Sat, Nov 11, 2006 at 01:12:32PM +0100, Petter Reinholdtsen wrote:
[Keld Jørn Simonsen]
Hva med å endre dette tegnet it Soft Hyphen? SHY?
Jeg ser fordelen med å bruke samme tegn som i datafilen for no.speling.org-systemet, da vi slipper konvertering. Hva er fordelen med å bruke SHY?
SHY er det tegnet, som er definert til å markere orddeling. Det er bedre enn =, da det kan vises umiddelbart. Det er bedre enn - da man så kan representere ord med bindestrek.
Hilsen keld
[Keld Jørn Simonsen]
SHY er det tegnet, som er definert til å markere orddeling. Det er bedre enn =, da det kan vises umiddelbart. Det er bedre enn - da man så kan representere ord med bindestrek.
Hvordan lager en dette tegnet med norsk og amerikansk tastaturoppsett? Jeg fortrekker tegn de fleste bidragsytere ser og kan skrive uten problemer, da det senker terskelen for å bidra.
Uansett er dette rent akademisk, med mindre noen får patchen min til å fungere som den skal. :)
Vennlig hilsen,
On Sat, Nov 11, 2006 at 02:27:58PM +0100, Petter Reinholdtsen wrote:
[Keld Jørn Simonsen]
SHY er det tegnet, som er definert til å markere orddeling. Det er bedre enn =, da det kan vises umiddelbart. Det er bedre enn - da man så kan representere ord med bindestrek.
Hvordan lager en dette tegnet med norsk og amerikansk tastaturoppsett? Jeg fortrekker tegn de fleste bidragsytere ser og kan skrive uten problemer, da det senker terskelen for å bidra.
På norsk tastatur skal det ligge på alt- På amerikansk? Hvis noen lager norske oversettelser på amerikansk tastatur, så har de selv bedt om problemer:-)
Hilsen keld
Hei!
Eg er ny på lista (og i heile miljet for den del), så ver overberande med meg:-) Eg har meldt meg på mest fordi eg arbeider med liknande prosjekt for samisk, utan at dei er direkte kopla til det arbeidet som blir diskutert på denne lista. I tillegg har eg ein del års røynsle med språkteknologi og korrekturprogram frå før.
Den 11. nov. 2006 kl. 14.59 skrev Keld Jørn Simonsen:
On Sat, Nov 11, 2006 at 01:12:32PM +0100, Petter Reinholdtsen wrote:
[Keld Jørn Simonsen]
Hva med å endre dette tegnet it Soft Hyphen? SHY?
Jeg ser fordelen med å bruke samme tegn som i datafilen for no.speling.org-systemet, da vi slipper konvertering. Hva er fordelen med å bruke SHY?
SHY er det tegnet, som er definert til å markere orddeling. Det er bedre enn =, da det kan vises umiddelbart. Det er bedre enn - da man så kan representere ord med bindestrek.
Prinsipielt er det ein grunnleggjande skilnad på eit orddelingspunkt og ei ordgrense:
orddelingspunkt: - eit tilfeldig punkt i ein tekststreng der ein kan dela eit ord om det må brytast over to liner; punktet kan vera motivert ut i frå lingvistiske eigenskapar ved ordet (ordgrense, stavingsstruktur), men kan og vera motivert ut i frå reint ortografiske reglar som ikkje har noko med språklege eigenskapar ved ordet å gjera. Informasjon om orddelingspunkt kan ikkje brukast om att til andre formål.
ordgrense: grense mellom to ord i eit samansett ord. Dette er ei grense definert ut i frå ordgrammatikken til språket, og informasjon om slike grenser kan brukast til fleire formål: orddeling, reglar for nylaging av samansette ord (og dermed for komprimeringsalgoritmer i språkteknologi som t.d. stavekontrollar), analyse av tekstar, statistikk om ordlagingsmønster m.m.
Altså: det finst mange og gode grunnar til at ein ikkje skal blanda ordgrense og (moglege) orddelingspunkt. De bør halda fast ved forslaget til Petter Reinholdtsen, og bruka = for å markera grensa mellom ord. Ved å bruka SHY reduserer ein informasjonen i datafilene kraftig, og dermed verdien av materialet som heilheit.
Beste helsing Sjur
[Sjur Nørstebø Moshagen]
Altså: det finst mange og gode grunnar til at ein ikkje skal blanda ordgrense og (moglege) orddelingspunkt. De bør halda fast ved forslaget til Petter Reinholdtsen, og bruka = for å markera grensa mellom ord. Ved å bruka SHY reduserer ein informasjonen i datafilene kraftig, og dermed verdien av materialet som heilheit.
Godt poeng du har om skillet mellom ordgrenser og orddelingspunkter. Dog blir konklusjonen ikke nødvendigvis riktig for datafilen vi snakker om her, da de ikke inneholder orddelingspunkter, kun ordgrenser, og vi egentlig kan bruke hvilket som helst tegn som ikke finnes i ordene som ordgrenseskille. Verdien av datasettet påvirkes ikke av hvilket tegn vi bruker, så lenge vi fortsetter å bruke dette tegnet kun til å markere ordgrenser. Og det bør vi fortsette med.
Uansett er ditt poeng nok til å gjøre SHY mindre aktuell som skilletegn, da det ikke lenger kan sies å treffe like godt til formålet.
Datafilen vi snakker om finner du via URL:https://alioth.debian.org/projects/spell-norwegian/.
Vennlig hilsen,