Bug 2162 - possible to represent MWE-ambiguity within pmatch?
Summary: possible to represent MWE-ambiguity within pmatch?
Status: RESOLVED FIXED
Alias: None
Product: Pre- and postprocessing
Classification: Unclassified
Component: lookup2cg (show other bugs)
Version: unspecified
Hardware: Macintosh Linux
: P4 - Within a month enhancement
Assignee: Sjur Nørstebø Moshagen
URL:
Keywords:
Depends on:
Blocks: 2160
  Show dependency treegraph
 
Reported: 2016-03-02 13:52 CET by Kevin Brubeck Unhammer
Modified: 2017-09-08 14:40 CEST (History)
5 users (show)

See Also:


Attachments
tavleskribleriar om with-flag (263.71 KB, image/png)
2017-09-08 10:54 CEST, Kevin Brubeck Unhammer
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Kevin Brubeck Unhammer 2016-03-02 13:52:29 CET
For Bug 2160, we want certain kinds of MWE ambiguity to be at least partly (the linguistic part) represented on the FST level. We will likely also need new language-general mechanisms regarding how to do formatting and tokenising.

What we want:

- Treat "good morning" as ambiguous between a single interjection "<good morning>", and an adj "<good>" followed by noun "<morning>" as in "this is a good morning".

- Similarly treat "3." as ambiguous between single ordinal, and numeral followed by punctuation; "<3.>" vs "<3>" "<.>".

- *Not* have to treat "we are" as ambiguous between single and multiple cohorts – it's always exactly two; and similarly not look at "we 3." ambiguous between "<we 3.>" and "<we>" "<3.>", but ambiguous between "<we>" "<3.>" and "<we>" "<3>" "<.>".


-----


I've looked at using pmatch for this by simply repeating the lexicon, e.g. 

  Define morphology @bin"analyser-disamb-gt-desc.hfst" ;
  Define blank           Whitespace | Punct ;
  Define morphoword       morphology                   LC([blank | #]) RC([blank | # ]);
  Define morphowords      morphology % :%# morphology LC([blank | #]) RC([blank | # ]);
  Define token [ morphoword | morphowords ] EndTag(token);
regex token ;


Consider "dalle go" – this might be unambiguous, but treat it as ambiguous for this example. The above pmscript will give

$ echo dalle go | hfst-tokenise --cg -kawu: ana.bin
"<dalle go>"
        "go" Pcle Qst <W:0>
                "dalle" Adv Sem/Time <W:0>
        "go" CS <W:0>
                "dalle" Adv Sem/Time <W:0>
        "dalle go" CS <W:0>
:\n

but of course that fails when there's a word before:

echo 'go dan dihte' | hfst-tokenise --cg  -kawu: ana.bin
"<go dalle go>"
        "dalle go" CS <W:0>
                "go" CS <W:0>

since now it looks at the MWE ambiguity between "go" and "dalle go" – and pmatch always wants the longest possible match.

-----

This issue seems solvable by intersecting the forms of the morphology with the repeated morphology, although I couldn't get this to work *within* the pmscript (one would think [morpho2words & [morphology].u] would work, but no such luck). It seems to work with plain HFST commands though:


Makefile:

space.hfst:
	echo '% :%#' | hfst-regexp2fst -o $@

repeated.hfst: analyser-disamb-gt-desc.hfst space.hfst
	hfst-concatenate -1 $< -2 space.hfst -o analyser-space.hfst
	hfst-concatenate -F -1 analyser-space.hfst -2 $< -o analyser-space-analyser.hfst
	hfst-invert analyser-space-analyser.hfst -o generator-space-generator.hfst
	hfst-project -p upper $< -o forms.hfst
	hfst-compose-intersect -1 generator-space-generator.hfst -2 forms.hfst -o generator-repeated.hfst
	hfst-invert generator-repeated.hfst -o $@
	echo    dan dihte | hfst-lookup $@
	echo go dan dihte | hfst-lookup $@


pmscript:

  Define morphology @bin"analyser-disamb-gt-desc.hfst" ;
  Define repeated @bin"repeated.hfst" ;
  Define blank           Whitespace | Punct ;
  Define morphoword       morphology       LC([blank | #]) RC([blank | # ]);
  Define morphowords      repeated         LC([blank | #]) RC([blank | # ]);
  Define token [ morphoword | morphowords ] EndTag(token);
regex token ;


This looks closer to what we want:

$ echo dalle go | hfst-tokenize --cg  -kawu: rep.pmhfst
"<dalle go>"
        "go" Pcle Qst <W:0>
                "dalle" Adv Sem/Time <W:0>
        "go" CS <W:0>
                "dalle" Adv Sem/Time <W:0>
        "dalle go" CS <W:0>
:\n

$ echo go dalle go | hfst-tokenize --cg  -kawu: rep.pmhfst
"<go>"
        "go" Pcle Qst <W:0>
        "go" CS <W:0>
: 
"<dalle go>"
        "go" Pcle Qst <W:0>
                "dalle" Adv Sem/Time <W:0>
        "go" CS <W:0>
                "dalle" Adv Sem/Time <W:0>
        "dalle go" CS <W:0>
:\n

The repeated.hfst took quite a lot of time+ram+disk space, but perhaps that can be optimised – the final file seems to be just 28M.


-----


Are the problems with this method not shown above?

If we add an error-tagged entry in the noun compounding lexicon that inserts a space before the compound border, will it work fine for catching compound-space errors (while still showing the ambiguity with non-errors that are simply two nouns)?
Comment 1 Sjur Nørstebø Moshagen 2016-03-02 14:10:46 CET
(In reply to Kevin Brubeck Unhammer from comment #0)
> For Bug 2160, we want certain kinds of MWE ambiguity to be at least partly
> (the linguistic part) represented on the FST level.

Yes.

> What we want:
> 
> - Treat "good morning" as ambiguous between a single interjection "<good
> morning>", and an adj "<good>" followed by noun "<morning>" as in "this is a
> good morning".
> 
> - Similarly treat "3." as ambiguous between single ordinal, and numeral
> followed by punctuation; "<3.>" vs "<3>" "<.>".
> 
> - *Not* have to treat "we are" as ambiguous between single and multiple
> cohorts – it's always exactly two; and similarly not look at "we 3."
> ambiguous between "<we 3.>" and "<we>" "<3.>", but ambiguous between "<we>"
> "<3.>" and "<we>" "<3>" "<.>".

Agree.

> This issue seems solvable by intersecting the forms of the morphology with
> the repeated morphology, although I couldn't get this to work *within* the
> pmscript (one would think [morpho2words & [morphology].u] would work, but no
> such luck). It seems to work with plain HFST commands though:
> 
> 
> Makefile:
> 
> space.hfst:
> 	echo '% :%#' | hfst-regexp2fst -o $@
> 
> repeated.hfst: analyser-disamb-gt-desc.hfst space.hfst
> 	hfst-concatenate -1 $< -2 space.hfst -o analyser-space.hfst
> 	hfst-concatenate -F -1 analyser-space.hfst -2 $< -o
> analyser-space-analyser.hfst
> 	hfst-invert analyser-space-analyser.hfst -o generator-space-generator.hfst
> 	hfst-project -p upper $< -o forms.hfst
> 	hfst-compose-intersect -1 generator-space-generator.hfst -2 forms.hfst -o
> generator-repeated.hfst
> 	hfst-invert generator-repeated.hfst -o $@
> 	echo    dan dihte | hfst-lookup $@
> 	echo go dan dihte | hfst-lookup $@

[...]

> Are the problems with this method not shown above?
> 
> If we add an error-tagged entry in the noun compounding lexicon that inserts
> a space before the compound border, will it work fine for catching
> compound-space errors (while still showing the ambiguity with non-errors
> that are simply two nouns)?

I have an uncommitted change on my computer with exactly this, the core of which is:

+Err/SpaceCmp+Cmp#:%  Noun ;

That should in theory catch all instances of split compounds, while leaving other sequences of word + space + word as separate items/segments.

I haven't committed this because the consequences can be quite dramatic for some applications, and it needs further testing. On the other hand, if I don't commit it, noone will test it.

Unless there are major objections, I will commit this change later today so that Kevin, Lene and others can test it.
Comment 2 Lene Antonsen 2016-03-02 15:21:22 CET
> Unless there are major objections, I will commit this change later today so
> that Kevin, Lene and others can test it.

Jeg forstår dette ikke helt, så jeg kan ikke komme med major objections.

Kunne du komme med et eksempel, Sjur (ikke go dalle go)
Comment 3 Sjur Nørstebø Moshagen 2016-03-02 15:42:34 CET
(In reply to Lene Antonsen from comment #2)
> Jeg forstår dette ikke helt, så jeg kan ikke komme med major objections.
> 
> Kunne du komme med et eksempel, Sjur (ikke go dalle go)

Eg skal prøva:

Hovudtemaet for denne og andre relaterte lusmeldingar (klitika) gjeld utfordringar med segmentering / tokenisering der segmentgrensene ikkje svarar til ortografiske ord (dvs bokstavar skilde med anten blankteikn eller eintydige ordskiljeteikn som t.d. komma). Av desse er det tre typar:

1) Samskriving der ein kunne eller burde hatt særskriving ("3." er eitt slikt døme, klitika eit anna)

2) Særskriving der ein burde hatt samskriving (feil delte samansette ord)

3) Fleirordsuttrykk som ein vil analysera som éi eining, men som potensielt kan analyserast som to separate ord ("good morning" som MWE eller som ein analyserbar NP)

Kodeendringa mi gjeld 2).

Tanken er at vi (med ein +Err-tagg) analyserer to substantiv etter kvarandre som om dei var eitt samansett substantiv som eit alternativ til å gje dei kvar sin analyse:

$ echo "gielisvuohta viessu" | hfst-lookup -q analyser-mt-gt-desc.hfstol | cg-conv -f
"<gielisvuohta viessu>"
	"viessu" N Sem/Build Sg Nom <W:1000>
		"gielis" AA Sem/Hum Attr Der/vuohta N Cmp/SgNom Err/Orth Err/SpaceCmp Cmp <W:1000>
	"viessu" N Sem/Build Sg Nom <W:1000>
		"gielis" AA Sem/Hum Der/vuohta N Cmp/SgNom Err/Orth Err/SpaceCmp Cmp <W:1000>

Problemet er at dette heilt sikkert vil overgenerera, så det er viktig at vi tek vare på den alternative analysen:

$ echo "gielisvuohta viessu" | tr ' ' '\n' | hfst-lookup -q analyser-mt-gt-desc.hfstol | cg-conv -f
"<gielisvuohta>"
	"gielisvuohta" N Sem/Feat Sg Nom <W:0>
	"gielis" AA Sem/Hum Attr Der/vuohta N Sg Nom <W:0>
	"gielis" AA Sem/Hum Der/vuohta N Sg Nom <W:0>
	"vuohta" Err/Lex N Sg Nom <W:1000>
		"gielis" A Sem/Hum Cmp/Attr Cmp <W:1000>
	"vuohta" Err/Lex N Sg Nom <W:1000>
		"gielis" A Sem/Hum Cmp/SgNom Cmp <W:1000>
"<viessu>"
	"viessu" N Sem/Build Sg Nom <W:0>
	"viessat" V IV Imprt Du1 <W:0>
	"viessut" V IV Imprt Du1 <W:0>
	"viessut" V IV Imprt Du2 <W:0>
	"viessut" V IV Ind Prs Sg3 <W:0>
	"viessut" V IV PrsPrc <W:0>
	"viessut" VV IV Der/NomAg N Sg Acc <W:0>
	"viessut" VV IV Der/NomAg N Sg Gen <W:0>
	"viessut" VV IV Der/NomAg N Sg Nom <W:0>

Korleis dette skal skje og bli representert er ein del av diskusjonen, eg er usikker. Men Kevin har kanskje eit forslag?

Uansett, eg håper at det no er litt klårare kva eg hadde i tankane.
Comment 4 Lene Antonsen 2016-03-02 15:53:05 CET
Det er viktig hvordan analysen vil se ut, at vi ikke får det første substantivet bare som underlesning. Hvilke restriksjoner hadde du tenkt? Skal dette skje når det er to alternativer i lexc for de den spesifikke strengen: to enkle ord eller MWE,
eller hadde du tenkt dette som en generell greie?
Comment 5 Sjur Nørstebø Moshagen 2016-03-02 16:01:57 CET
(In reply to Lene Antonsen from comment #4)
> Det er viktig hvordan analysen vil se ut, at vi ikke får det første
> substantivet bare som underlesning.

Eg veit, og eg vil gjerne ha tilbakemelding frå Kevin korleis vi kan få til dette. Sjølv er eg veldig usikker, men vi treng ein måte å representera tvetydig segmentering i CG-format på, slik at ein kan bruka CG-reglar til å avgjera om det skal vera to eller eitt segment / token.

> Hvilke restriksjoner hadde du tenkt?
> Skal dette skje når det er to alternativer i lexc for de den spesifikke
> strengen: to enkle ord eller MWE,
> eller hadde du tenkt dette som en generell greie?

I dette tilfellet hadde eg tenkt det som ei generell greie som datagrunnlag for å identifisera særskriving. Men det er mogleg det blir for kraftig - men det veit vi ikkje før vi har testa.

I tilfelle der vi har eit MWE i leksikon og vil gje ein alternativ analyse som to uavhengige ord, pratar vi om type 3) i lista mi.
Comment 6 Kevin Brubeck Unhammer 2016-03-02 20:40:58 CET
(In reply to Sjur Nørstebø Moshagen from comment #1)
> I have an uncommitted change on my computer with exactly this, the core of
> which is:
> 
> +Err/SpaceCmp+Cmp#:%  Noun ;
> 
> That should in theory catch all instances of split compounds, while leaving
> other sequences of word + space + word as separate items/segments.
> 
> I haven't committed this because the consequences can be quite dramatic for
> some applications, and it needs further testing. On the other hand, if I
> don't commit it, noone will test it.
> 
> Unless there are major objections, I will commit this change later today so
> that Kevin, Lene and others can test it.

Det er kanskje litt farleg å ta den med i standardanalysatorane allereie? (Utan andre endringar vil det jo fjerna to-kohort-lesinga.)
Comment 7 Linda Wiechetek 2016-03-07 10:32:26 CET
> > What we want:
> > 
>
> > - Similarly treat "3." as ambiguous between single ordinal, and numeral
> > followed by punctuation; "<3.>" vs "<3>" "<.>".
> > 
> 
> Agree.
> 


I CG bruker vi punctuation <.> som delimiter for vinduet vi scanne innafor en regel. Hvis vi alltid har ambiguitet der kommer det til å være store forandringer der.
Comment 8 Kevin Brubeck Unhammer 2016-03-07 11:28:29 CET
(In reply to Linda Wiechetek from comment #7)
> > > What we want:
> > > 
> >
> > > - Similarly treat "3." as ambiguous between single ordinal, and numeral
> > > followed by punctuation; "<3.>" vs "<3>" "<.>".
> > > 
> > 
> > Agree.
> > 
> 
> 
> I CG bruker vi punctuation <.> som delimiter for vinduet vi scanne innafor
> en regel. Hvis vi alltid har ambiguitet der kommer det til å være store
> forandringer der.

Det er derfor eg seier det må vera mwe-disambiguering først :)

Altså:

hfst-tokenise | mwe-disambiguering | formatfiksing | disambiguering

Eit døme på alle steg i pipelinen:

INPUT: 
Ta 3. Også

Etter hfst-tokenise:
"<Ta>"
        "ta" Verb Inf "<Ta>"
        "ta" Verb Imp "<Ta>"
"<3.>"
        "3" Num "<3>"
                "." PUNCT "<.>"
        "3." Adj Ord "<3.>"
"<Også>"
        "også" Adv "<Også>"


Etter mwe-disambiguering:
"<Ta>"
        "ta" Verb Inf "<Ta>"
        "ta" Verb Imp "<Ta>"
"<3.>"
        "3" Num "<3>"
                "." PUNCT "<.>"
"<Også>"
        "også" Adv "<Også>"



Etter formatfiksing:
"<Ta>"
        "ta" Verb Inf
        "ta" Verb Imp
"<3.>"
        "3" Num
"<.>"
        "." PUNCT
"<Også>"
        "også" Adv

Etter (vanleg) disambiguering:
"<Ta>"
        "ta" Verb Imp
"<3.>"
        "3" Num
"<.>"
        "." PUNCT
"<Også>"
        "også" Adv


Så formålet er at den vanlege disambigueringa i størst mogleg grad skal få same input som før når det gjeld desse fleirordsuttrykka, men stega før disambiguering vil altså ha ein ulik representasjon.
Comment 9 Kevin Brubeck Unhammer 2016-03-10 15:39:38 CET
Eg har sjekka inn ei endring i sme/tools/preprocess som gjer dette, men for beste effekt bør det testast med hfst frå

git clone -b tokenise-as-gtdivvun-lookup git@github.com:unhammer/hfst.git


Sidan «vaikko mii» ikkje står i leksikon enno får me lata som «dalle go» betyr det same, for skuld eksempelet. 
Då får eg t.d.

"<dalle go>"
        "go" Pcle Qst <W:0> "<go>"
                "dalle" Adv Sem/Time <W:0> "<dalle >"
        "go" CS <W:0> "<go>"
                "dalle" Adv Sem/Time <W:0> "<dalle >"
        "dalle go" CS <W:0>


Eg la inn i sme/tools/preprocess/Makefile.am at alle sekvensar av «ord mellomrom ord» som finst i leksikon som eitt ord er moglege multiord, som gjer at t.d. <dalle> <go> blir tvetydig med <dalle go>. 

Det går dessverre ikkje like enkelt å ta med alle sekvensar av to ord utan mellomrom som er tvetydige med eitt ord – ein analysator for alle desse blir på 425M (vs 171M for den med mellomrom) og eg har for lite minne til å laga den endelege pmatch-analysatoren.


På den andre sida så er det kanskje like greitt – me vil vel ikkje seia at alle todelingar av eit token er moglege? (Det blir iallfall irriterande om <etruskar> òg gir analysen <et> <ruskar>.) Det at <leaba> er tvetydig med <lea> <ba> går det an å spesifisera eksplisitt i leksikonoppslaget der "ba" blir lagt på. 

Det går sjølvsagt òg an å stramma inn på dei med mellomrom – der er vel spørsmålet om folk synst det er greiast å la alle sekvensar av typen <dalle> <go> vera moglege og så ta dei med CG (mot litt RAM-bruk ved FST-kompilering), eller om folk har lyst til å seia, på slutten av oppslaget for «dalle», at her går det an å gå til «go» som eit nytt ord (gitt at det faktisk er tvetydig med «dalle go» som eitt ord).



Litt meir output for å visa status nett no:

$ echo 'ukjendord привет dalle, dalle go, go dalle go gáfegáhkkus' | hfst-tokenize -wacku: tokeniser-disamb-gt-desc.pmhfst 
"<ukjendord>"
        "ukjendord" ?
: привет 
"<dalle>"
        "dalle" Adv Sem/Time <W:0>
"<,>"
        "," CLB <W:0>
: 
"<dalle go>"
        "go" Pcle Qst <W:0> "<go>"
                "dalle" Adv Sem/Time <W:0> "<dalle >"
        "go" CS <W:0> "<go>"
                "dalle" Adv Sem/Time <W:0> "<dalle >"
        "dalle go" CS <W:0>
"<,>"
        "," CLB <W:0>
: 
"<go>"
        "go" Pcle Qst <W:0>
        "go" CS <W:0>
: 
"<dalle go>"
        "go" Pcle Qst <W:0> "<go>"
                "dalle" Adv Sem/Time <W:0> "<dalle >"
        "go" CS <W:0> "<go>"
                "dalle" Adv Sem/Time <W:0> "<dalle >"
        "dalle go" CS <W:0>
: 
"<gáfegáhkkus>"
        "gáhkut" V IV Der/NomAg N Sg Loc <W:10>
                "gáffe" N Sem/Plant Cmp/SgGen Cmp <W:10>
        "gáhkut" V IV Der/NomAg N Sg Loc <W:10>
                "gáfe" N Sem/Plant Err/Orth Cmp/SgNom Cmp <W:10>
        "gáhkut" V IV Der/NomAg N Sg Loc <W:10>
                "gáfe" N Sem/Plant Cmp/SgNom Cmp <W:10>
        "gáhkut" V IV Der/NomAg N Sg Loc <W:10>
                "gáfe" N Sem/Plant Cmp/SgGen Cmp <W:10>
:\n


(Linjer med «:» er ting som er «utanfor alfabetet» – CG ignorerer det linjer som ikkje startar med «"» eller tab/mellomrom, men det er nyttig å kunna ha alt av input med i maskinomsetjing og grammatikkontroll.)
Comment 10 Sjur Nørstebø Moshagen 2016-03-11 17:52:20 CET
I svn rev 130872 har eg sjekka inn ei endring som vi vart samde om på møtet på måndag:

analyser-disamb-gt-desc.hfst (og berre hfst-varianten av han, ikkje xerox) kan no analysera særskrivne samansette ord som eitt ord, med ein +Err-tagg.

No er det opp til Kevin å testa og sjå om det fungerer nokolunde. Er svaret ja, så vil vi ha breiare testing (Linda, Lene, Thomas).

Eg har høge forventningar til denne analysatoren og høve til å fanga opp særskrivingar - eg håper det ikkje blir alt for mykje overgenerering og problem med å skilja ut falske alarmar :-)
Comment 11 Sjur Nørstebø Moshagen 2016-03-11 19:36:21 CET
(In reply to Sjur Nørstebø Moshagen from comment #10)
> I svn rev 130872 har eg sjekka inn ei endring som vi vart samde om på møtet
> på måndag:

Gløymde å leggja ved eit døme som viser korleis det funkar med disamb-analysatoren:

$ echo skuvla busse | hfst-lookup -q src/analyser-disamb-gt-desc.hfstol 
skuvla busse	skuvla+N+Sem/Edu_Org+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Acc	10,000000
skuvla busse	skuvla+N+Sem/Edu_Org+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Gen+Allegro	10,000000
skuvla busse	skuvla+N+Sem/Edu_Org+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Gen	10,000000
skuvla busse	skuvla+N+Sem/Edu_Org+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Nom	10,000000
skuvla busse	skuvla+N+Sem/Edu_Org+Err/Orth+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Acc	10,000000
skuvla busse	skuvla+N+Sem/Edu_Org+Err/Orth+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Gen+Allegro	10,000000
skuvla busse	skuvla+N+Sem/Edu_Org+Err/Orth+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Gen	10,000000
skuvla busse	skuvla+N+Sem/Edu_Org+Err/Orth+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-clth_Veh+Sg+Nom	10,000000

Dersom dette blir brukt i lag med pmatch-srkptet til Kevin, blir resultatet meir cg-likt, men dømet over burde gje ein omtrentleg idé om korleis det blir.
Comment 12 Kevin Brubeck Unhammer 2016-03-15 14:46:07 CET
(In reply to Sjur Nørstebø Moshagen from comment #11)
> (In reply to Sjur Nørstebø Moshagen from comment #10)
> > I svn rev 130872 har eg sjekka inn ei endring som vi vart samde om på møtet
> > på måndag:
> 
> Gløymde å leggja ved eit døme som viser korleis det funkar med
> disamb-analysatoren:
> 
> $ echo skuvla busse | hfst-lookup -q src/analyser-disamb-gt-desc.hfstol 
> skuvla busse
> skuvla+N+Sem/Edu_Org+Cmp/SgNom+Err/SpaceCmp+Cmp#busse+N+G3+Sem/Ctain-
> clth_Veh+Sg+Acc	10,000000
> skuvla busse
> […]


Eg får ikkje til same resultat når eg kompilerer sjølv, men det er sikkert noko feil i mitt oppsett. Men når eg prøvde å legga inn .hfst-fila du hadde i http://filebin.net/mvvnmqgal0 i mappa mi, så fekk eg:


$ echo skuvla busse | hfst-tokenise -wacku: tokeniser-disamb-gt-desc.pmhfst
"<skuvla busse>"
        "busse" N G3 Sem/Ctain-clth_Veh Sg Nom <W:10>
                "skuvla" N Sem/Edu_Org Err/Orth Cmp/SgNom Err/SpaceCmp Cmp <W:10>
        "busse" N G3 Sem/Ctain-clth_Veh Sg Acc <W:10>
                "skuvla" N Sem/Edu_Org Err/Orth Cmp/SgNom Err/SpaceCmp Cmp <W:10>
        "busse" N G3 Sem/Ctain-clth_Veh Sg Gen Allegro <W:10>
                "skuvla" N Sem/Edu_Org Err/Orth Cmp/SgNom Err/SpaceCmp Cmp <W:10>
        "busse" N G3 Sem/Ctain-clth_Veh Sg Gen <W:10>
                "skuvla" N Sem/Edu_Org Err/Orth Cmp/SgNom Err/SpaceCmp Cmp <W:10>
        "busse" N G3 Sem/Ctain-clth_Veh Sg Nom <W:10>
                "skuvla" N Sem/Edu_Org Cmp/SgNom Err/SpaceCmp Cmp <W:10>
        "busse" N G3 Sem/Ctain-clth_Veh Sg Acc <W:10>
                "skuvla" N Sem/Edu_Org Cmp/SgNom Err/SpaceCmp Cmp <W:10>
        "busse" N G3 Sem/Ctain-clth_Veh Sg Gen Allegro <W:10>
                "skuvla" N Sem/Edu_Org Cmp/SgNom Err/SpaceCmp Cmp <W:10>
        "busse" N G3 Sem/Ctain-clth_Veh Sg Gen <W:10>
                "skuvla" N Sem/Edu_Org Cmp/SgNom Err/SpaceCmp Cmp <W:10>
:\n

Så det underanalyserer – me vil jo ha to-ordsanalysen inn her òg.


Grunnen til at "<skuvla>" "<busse>" ikkje kjem med er at eg har prøvd (og feila) å filtrera to-ordsanalysane til dei som er tvetydige med eittordsanalysar (dette for å unngå at alle vilkårlege sekvensar, som «ja skuvla», blei analysert i hop). Altså, me treng ein analysator som gir analyse til «ja», «skuvla», «busse», «skuvla busse», men ikkje «ja skuvla». Det eg gjorde var å først laga ein som tok alle to-ordssekvensar, og så ta intersect med *formar* frå analysatoren for å få dei tvetydige.

Dette fungerte fint for «dalle go»; viss 
A={"dalle go","go","dalle","ja"} 
så er
A ∩ A" "A ={"dalle go"}

Då skulle ein tru at det fungerte med
A={"skuvla busse","skuvla","busse","ja"} 
→
A ∩ A" "A ={"skuvla busse"}
men greia med «skuvla busse» er at formen som ligg i FST-en ikkje er «skuvla busse», men «@P.Px.add@Skuvla@U.NeedsVowRed.ON@@P.CmpFrst.FALSE@@P.CmpPref.FALSE@@D.CmpLast.TRUE@@D.CmpNone.TRUE@@U.CmpNone.FALSE@@P.CmpOnly.TRUE@@U.NeedsVowRed.ON@@C.NeedsVowRed@ @P.Px.add@busse@D.CmpOnly.FALSE@@D.CmpPref.TRUE@@D.NeedNoun.ON@».

og når me prøver
A={
"@P.Px.add@skuvla@U.NeedsVowRed.ON@@P.CmpFrst.FALSE@@P.CmpPref.FALSE@@D.CmpLast.TRUE@@D.CmpNone.TRUE@@U.CmpNone.FALSE@@P.CmpOnly.TRUE@@U.NeedsVowRed.ON@@C.NeedsVowRed@ @P.Px.add@busse@D.CmpOnly.FALSE@@D.CmpPref.TRUE@@D.NeedNoun.ON@", 
"@P.Px.add@skuvla@D.CmpOnly.FALSE@@D.CmpPref.TRUE@@D.NeedNoun.ON@",
"@P.Px.add@busse@D.CmpOnly.FALSE@@D.CmpPref.TRUE@@D.NeedNoun.ON@",
"ja"
}
så får me A ∩ A" "A ={}
sidan «skuvla» og «busse» har ulike flagg frå «skuvla busse».


Eg prøvde å eliminera flagg på eit mindre leksikon med flaggdiakritika, og då fekk eg dei rette analysane, men når eg prøver å eliminera flagg på den fulle FST-en (om det er via foma eller hfst-substitute+grep) går alltid tom for RAM før eg får kompilert ferdig.

Kanskje er det mogleg å eliminera berre visse flagg (men det krev jo at folk held ting ved like), eller kanskje eg berre må ha meir enn 8GB RAM, eller kanskje me må prøva noko heilt anna.
Comment 13 Kevin Brubeck Unhammer 2016-03-15 15:59:31 CET
(In reply to Kevin Brubeck Unhammer from comment #12)
> Eg prøvde å eliminera flagg på eit mindre leksikon med flaggdiakritika, og
> då fekk eg dei rette analysane, men når eg prøver å eliminera flagg på den
> fulle FST-en (om det er via foma eller hfst-substitute+grep) går alltid tom
> for RAM før eg får kompilert ferdig.
> 
> Kanskje er det mogleg å eliminera berre visse flagg (men det krev jo at folk
> held ting ved like), eller kanskje eg berre må ha meir enn 8GB RAM, eller
> kanskje me må prøva noko heilt anna.

… og sjølv med 32GB RAM ser det ut til å feila. 

-----

Kanskje må me gi opp å automatisk finna alle mellomrom-tvetydige ord, og i staden eksplisitt markera i lexc for dei fleirordsuttrykka me vil at skal vera fleirtydige (iallfall for stiar med flaggdiakritika).

Altså, gitt at «dan dihte+Adv» var tvetydig med pron+verb eller noko, så fordi «dan dihte+Adv» står med flagg måtte me i tillegg hatt ein sti frå «dan+Pron» via mellomrom til verbleksikonet. Meir styrete, men sjølvsagt òg færre unødvendig tvetydige oppslag.

-----

Det tredje alternativet eg ser er å ikkje ha nokon endringar i leksikon eller repeterte analysatorar, men laga ei ganske ulik utgåve av hfst-tokenise som er slik at viss det analyserer noko og ser at det har mellomrom i seg, så prøver det å analysera det på nytt som fleire ord òg.
Comment 14 Kevin Brubeck Unhammer 2016-04-18 13:13:43 CEST
Sjur hadde ein genial idé som burde løysa dette: Me lar eit visst symbol i FST-en signalisera at her må det ein «backtrack» til for å få med alle analysar. Så ved særskrivingsanalyse, når me har lese «ananas» og rett før me skal inn i « biter»-leksikonet, så legg me inn @Backtrack@ (eller noko), og då vil me ikkje berre få særskrivingsanalysen «ananas biter», men òg alle moglege analysar av «ananas» følgt av «biter» som to ord. 

hfst-tokenise må då sjå i alle analysar etter @Backtrack@, som signaliserer at her må du ikkje berre ta lengste analyse, men òg analysera oppdelt, på akkurat det punktet som @Backtrack@ finst. 

Då må altså den overgangen i lexc kor me går over i særskrivingsfeil ha ein sånn Backtrack-tagg. 

-----

Denne løysinga kunne me òg brukt for «leaba», ved å ha @Backtrack@ mellom «lea» og «ba» i leaba Du3 (altså éin-kohortslesinga), men det blir litt uelegant. Det ideelle er nok å ha begge moglegheitene, som då blir spegelvendte av kvarandre:


LEXICON V
leat+V+Du3:leaba C;
leat+V+Sg3:lea C;

LEXICON C
#;
@MWESplit@+Pcle+ba:ba;

LEXICON N
ananas+N+Err/SpaceCmp+Backtrack:ananas% LEXICON N;
bit+N+Pl:biter;


Så for input «leaba» gir FST-en sjølv to analysar, éin med MWESplit og éin utan. Den analysen som hadde MWESplit blir delt opp der taggen var.

For input «ananas biter» gir FST-en sjølv éin analyse, men med Backtrack-taggen. Sidan hfst-tokenise såg ein Backtrack-tagg, vil programmet analysera strengen på nytt, delt opp der Backtrack-taggen var.

(Ved fleire Backtrack-taggar prøver me alle kombinasjonar.)
Comment 15 Kevin Brubeck Unhammer 2016-04-21 19:41:34 CEST
Linda nemnte noko viktig: Me må kanskje reanalysera *utan* mellomrom òg; det er nemleg svært verdifull informasjon for særskrivingsdisambiguering at «skuvlabusses» har ein leksikalisert analyse, medan t.d. «bárdnibusses» ikkje har det (som gjer at «bárdni busses» meir sannsynleg er korrekt enn «skuvla busses»).
Comment 16 Sjur Nørstebø Moshagen 2016-04-21 19:49:42 CEST
(In reply to Kevin Brubeck Unhammer from comment #15)
> Linda nemnte noko viktig: Me må kanskje reanalysera *utan* mellomrom òg; det
> er nemleg svært verdifull informasjon for særskrivingsdisambiguering at
> «skuvlabusses» har ein leksikalisert analyse, medan t.d. «bárdnibusses»
> ikkje har det (som gjer at «bárdni busses» meir sannsynleg er korrekt enn
> «skuvla busses»).

Men vil ikkje slike feil bli oppdaga som valensfeil? T.d. som manglande objekt etter verb t.d. Spørsmålet er kor mykje tvetydigheit vi får dersom vi byrjar å reanalysera på denne måten. Og: vil det ikkje vera betre at vi gjer ei slik reanalysering i CG?
Comment 17 Kevin Brubeck Unhammer 2016-04-21 21:30:40 CEST
(In reply to Sjur Nørstebø Moshagen from comment #16)
> (In reply to Kevin Brubeck Unhammer from comment #15)
> > Linda nemnte noko viktig: Me må kanskje reanalysera *utan* mellomrom òg; det
> > er nemleg svært verdifull informasjon for særskrivingsdisambiguering at
> > «skuvlabusses» har ein leksikalisert analyse, medan t.d. «bárdnibusses»
> > ikkje har det (som gjer at «bárdni busses» meir sannsynleg er korrekt enn
> > «skuvla busses»).
> 
> Men vil ikkje slike feil bli oppdaga som valensfeil? T.d. som manglande
> objekt etter verb t.d. Spørsmålet er kor mykje tvetydigheit vi får dersom vi
> byrjar å reanalysera på denne måten. Og: vil det ikkje vera betre at vi gjer
> ei slik reanalysering i CG?

Hm, ja me vil jo ikkje ha ein ekstra analyse, men informasjonen om at ein ekstra analyse ville vore mogleg om det ikkje var eit mellomrom der. Altså, «skuvla busse» er tvetydig mellom +N+Err/SpaceCmp og to ord +N +N, men sjølvsagt ikkje med den feilfrie eittordsanalysen. 

Likevel ville det vore svært verdifullt for grammatikkontrollen å vita at «skuvlabusse» er leksikalisert. I CG-en hadde det kanskje vore greiast om det var ein tagg som sa at SpacecmpHasLex. Er det mogleg vha. FST-operasjonar å legga ein sånn tagg på berre dei dynamiske samansetjingane som òg finst som leksikaliserte? (Dette minner skummelt om den minneslukande snittoperasjonen frå tidlegare …)
Comment 18 Linda Wiechetek 2016-04-26 12:02:12 CEST
Kevin har rett, det som er av verdi er nettopp det å vite om det er leksikalisert.
Problemet er jo at CGen ikkje kan referere til 2 ord, sette dem sammen og sjekke om de er leksikaliserte. Og en syntaktisk analyse aleine gir dårlige resultat (vi har prøvd og lagt til en hel rekke med unntakk) fordi det fins en hel del syntaktiske kontekster med to substantiver ved siden av hverandre der første er nominativ som er korrekte.

Forresten kan man vurdere å utelukke sånne som har substantiv på "i" i første ledd da det blir til "e" i det sammensatte ordet, dvs. "bárdnebusse" og ikkje "bárdnibusse", men kanskje en feilanalyse er nødvendig først, altså vi må se om det i realitet fins mange feil med -i substantiv i nominativ.



(In reply to Kevin Brubeck Unhammer from comment #17)
> (In reply to Sjur Nørstebø Moshagen from comment #16)
> > (In reply to Kevin Brubeck Unhammer from comment #15)
> > > Linda nemnte noko viktig: Me må kanskje reanalysera *utan* mellomrom òg; det
> > > er nemleg svært verdifull informasjon for særskrivingsdisambiguering at
> > > «skuvlabusses» har ein leksikalisert analyse, medan t.d. «bárdnibusses»
> > > ikkje har det (som gjer at «bárdni busses» meir sannsynleg er korrekt enn
> > > «skuvla busses»).
> > 
> > Men vil ikkje slike feil bli oppdaga som valensfeil? T.d. som manglande
> > objekt etter verb t.d. Spørsmålet er kor mykje tvetydigheit vi får dersom vi
> > byrjar å reanalysera på denne måten. Og: vil det ikkje vera betre at vi gjer
> > ei slik reanalysering i CG?
> 
> Hm, ja me vil jo ikkje ha ein ekstra analyse, men informasjonen om at ein
> ekstra analyse ville vore mogleg om det ikkje var eit mellomrom der. Altså,
> «skuvla busse» er tvetydig mellom +N+Err/SpaceCmp og to ord +N +N, men
> sjølvsagt ikkje med den feilfrie eittordsanalysen. 
> 
> Likevel ville det vore svært verdifullt for grammatikkontrollen å vita at
> «skuvlabusse» er leksikalisert. I CG-en hadde det kanskje vore greiast om
> det var ein tagg som sa at SpacecmpHasLex. Er det mogleg vha.
> FST-operasjonar å legga ein sånn tagg på berre dei dynamiske samansetjingane
> som òg finst som leksikaliserte? (Dette minner skummelt om den minneslukande
> snittoperasjonen frå tidlegare …)
Comment 19 Linda Wiechetek 2016-04-26 12:15:42 CEST
Duommá sa forresten at det er mange leksikaliserte sammensetninger i substantivfila siden han jobba med det for spellcheckeren. Det er jo en resurs som vi burde utnytte.

(In reply to Linda Wiechetek from comment #18)
> Kevin har rett, det som er av verdi er nettopp det å vite om det er
> leksikalisert.
> Problemet er jo at CGen ikkje kan referere til 2 ord, sette dem sammen og
> sjekke om de er leksikaliserte. Og en syntaktisk analyse aleine gir dårlige
> resultat (vi har prøvd og lagt til en hel rekke med unntakk) fordi det fins
> en hel del syntaktiske kontekster med to substantiver ved siden av hverandre
> der første er nominativ som er korrekte.
> 
> Forresten kan man vurdere å utelukke sånne som har substantiv på "i" i
> første ledd da det blir til "e" i det sammensatte ordet, dvs. "bárdnebusse"
> og ikkje "bárdnibusse", men kanskje en feilanalyse er nødvendig først, altså
> vi må se om det i realitet fins mange feil med -i substantiv i nominativ.
> 
> 
> 
> (In reply to Kevin Brubeck Unhammer from comment #17)
> > (In reply to Sjur Nørstebø Moshagen from comment #16)
> > > (In reply to Kevin Brubeck Unhammer from comment #15)
> > > > Linda nemnte noko viktig: Me må kanskje reanalysera *utan* mellomrom òg; det
> > > > er nemleg svært verdifull informasjon for særskrivingsdisambiguering at
> > > > «skuvlabusses» har ein leksikalisert analyse, medan t.d. «bárdnibusses»
> > > > ikkje har det (som gjer at «bárdni busses» meir sannsynleg er korrekt enn
> > > > «skuvla busses»).
> > > 
> > > Men vil ikkje slike feil bli oppdaga som valensfeil? T.d. som manglande
> > > objekt etter verb t.d. Spørsmålet er kor mykje tvetydigheit vi får dersom vi
> > > byrjar å reanalysera på denne måten. Og: vil det ikkje vera betre at vi gjer
> > > ei slik reanalysering i CG?
> > 
> > Hm, ja me vil jo ikkje ha ein ekstra analyse, men informasjonen om at ein
> > ekstra analyse ville vore mogleg om det ikkje var eit mellomrom der. Altså,
> > «skuvla busse» er tvetydig mellom +N+Err/SpaceCmp og to ord +N +N, men
> > sjølvsagt ikkje med den feilfrie eittordsanalysen. 
> > 
> > Likevel ville det vore svært verdifullt for grammatikkontrollen å vita at
> > «skuvlabusse» er leksikalisert. I CG-en hadde det kanskje vore greiast om
> > det var ein tagg som sa at SpacecmpHasLex. Er det mogleg vha.
> > FST-operasjonar å legga ein sånn tagg på berre dei dynamiske samansetjingane
> > som òg finst som leksikaliserte? (Dette minner skummelt om den minneslukande
> > snittoperasjonen frå tidlegare …)
Comment 20 Sjur Nørstebø Moshagen 2016-05-18 14:31:07 CEST
(In reply to Kevin Brubeck Unhammer from comment #17)
> (In reply to Sjur Nørstebø Moshagen from comment #16)
> > (In reply to Kevin Brubeck Unhammer from comment #15)
> > > Linda nemnte noko viktig: Me må kanskje reanalysera *utan* mellomrom òg; det
> > > er nemleg svært verdifull informasjon for særskrivingsdisambiguering at
> > > «skuvlabusses» har ein leksikalisert analyse, medan t.d. «bárdnibusses»
> > > ikkje har det (som gjer at «bárdni busses» meir sannsynleg er korrekt enn
> > > «skuvla busses»).
> > 
> > Men vil ikkje slike feil bli oppdaga som valensfeil? T.d. som manglande
> > objekt etter verb t.d. Spørsmålet er kor mykje tvetydigheit vi får dersom vi
> > byrjar å reanalysera på denne måten. Og: vil det ikkje vera betre at vi gjer
> > ei slik reanalysering i CG?
> 
> Hm, ja me vil jo ikkje ha ein ekstra analyse, men informasjonen om at ein
> ekstra analyse ville vore mogleg om det ikkje var eit mellomrom der. Altså,
> «skuvla busse» er tvetydig mellom +N+Err/SpaceCmp og to ord +N +N, men
> sjølvsagt ikkje med den feilfrie eittordsanalysen. 
> 
> Likevel ville det vore svært verdifullt for grammatikkontrollen å vita at
> «skuvlabusse» er leksikalisert. I CG-en hadde det kanskje vore greiast om
> det var ein tagg som sa at SpacecmpHasLex. Er det mogleg vha.
> FST-operasjonar å legga ein sånn tagg på berre dei dynamiske samansetjingane
> som òg finst som leksikaliserte? (Dette minner skummelt om den minneslukande
> snittoperasjonen frå tidlegare …)

Det finst ein enkel måte å gjera dette på:

å la # i alle samansette, leksikaliserte ord (som har # som ordgrense før dei blir fjerna i den endelege analysatoren) valfritt gå til " " (mellomrom). Då vil særskriving av leksikaliserte ord bli analyserte som leksikaliserte ord :) Og dette burde ikkje gje ein mykje større fst.

Det som kompliserer det heile er at vi vil samtidig leggja til ein feiltagg når og berre når vi lar #:" ", slik at vi kan identifisera dei i cg-en. Men eg har tankar om korleis vi kan ordna det òg, men her kan fst-storleiken nok bli ein del større. Vi må eksperimentera...
Comment 21 Sjur Nørstebø Moshagen 2016-05-24 12:41:34 CEST
(In reply to Sjur Nørstebø Moshagen from comment #20)
> > Likevel ville det vore svært verdifullt for grammatikkontrollen å vita at
> > «skuvlabusse» er leksikalisert. I CG-en hadde det kanskje vore greiast om
> > det var ein tagg som sa at SpacecmpHasLex. Er det mogleg vha.
> > FST-operasjonar å legga ein sånn tagg på berre dei dynamiske samansetjingane
> > som òg finst som leksikaliserte? (Dette minner skummelt om den minneslukande
> > snittoperasjonen frå tidlegare …)
> 
> Det finst ein enkel måte å gjera dette på:
> 
> å la # i alle samansette, leksikaliserte ord (som har # som ordgrense før
> dei blir fjerna i den endelege analysatoren) valfritt gå til " "
> (mellomrom). Då vil særskriving av leksikaliserte ord bli analyserte som
> leksikaliserte ord :) Og dette burde ikkje gje ein mykje større fst.
> 
> Det som kompliserer det heile er at vi vil samtidig leggja til ein feiltagg
> når og berre når vi lar #:" ", slik at vi kan identifisera dei i cg-en. Men
> eg har tankar om korleis vi kan ordna det òg, men her kan fst-storleiken nok
> bli ein del større. Vi må eksperimentera...

Denne delen er no i boks, og fst-en har vorte _mindre_ (ikkje pga denne endringa, men pga at eg retta ein logisk brest som hadde vorte oversett).

Det som står att no er:
* å få korrekte analyser for ikkje-samansetjingsanalysene (er på veg, truleg i boks snart)
* å retta ein regresjon i hfst som gjer at ordformer med etterfylgjande punktteikn ikkje blir analyserte
Comment 22 Kevin Brubeck Unhammer 2016-05-24 14:30:13 CEST
(In reply to Sjur Nørstebø Moshagen from comment #21)
> (In reply to Sjur Nørstebø Moshagen from comment #20)
> > > Likevel ville det vore svært verdifullt for grammatikkontrollen å vita at
> > > «skuvlabusse» er leksikalisert. I CG-en hadde det kanskje vore greiast om
> > > det var ein tagg som sa at SpacecmpHasLex. Er det mogleg vha.
> > > FST-operasjonar å legga ein sånn tagg på berre dei dynamiske samansetjingane
> > > som òg finst som leksikaliserte? (Dette minner skummelt om den minneslukande
> > > snittoperasjonen frå tidlegare …)
> > 
> > Det finst ein enkel måte å gjera dette på:
> > 
> > å la # i alle samansette, leksikaliserte ord (som har # som ordgrense før
> > dei blir fjerna i den endelege analysatoren) valfritt gå til " "
> > (mellomrom). Då vil særskriving av leksikaliserte ord bli analyserte som
> > leksikaliserte ord :) Og dette burde ikkje gje ein mykje større fst.
> > 
> > Det som kompliserer det heile er at vi vil samtidig leggja til ein feiltagg
> > når og berre når vi lar #:" ", slik at vi kan identifisera dei i cg-en. Men
> > eg har tankar om korleis vi kan ordna det òg, men her kan fst-storleiken nok
> > bli ein del større. Vi må eksperimentera...
> 
> Denne delen er no i boks, og fst-en har vorte _mindre_ (ikkje pga denne
> endringa, men pga at eg retta ein logisk brest som hadde vorte oversett).
> 
> Det som står att no er:
> * å få korrekte analyser for ikkje-samansetjingsanalysene (er på veg, truleg
> i boks snart)

Eg er veldig usikker på om den metoden eigentleg er nok – det innebærer mykje manuell pirk i leksikon for noko som burde vera mogleg å automatisera. Altså, problemet er som tidlegare at me vil ha fleirordsanalysar av *alle og berre* dei analysane som er tvetydige med særskrivingsfeil. 

For å ta eit ekstremt døme: Pronomenet "dan" er tvetydig med feilstavinga "dan" av ei form av adjektivet "dánska", som gjer at "dančuođi" får ein Cmp-analyse, som igjen gjer at "dan čuođi" (korpus "…gal dan čuođi proseantta") får ein SpaceCmp-analyse. Men då må me òg ha ein alternativ sti frå pronomenet "dan" inn i både N, Num og V for å få same sett med ikkje-SpaceCmp-analysar som standard preprocess/lookup/lookup2cg ville gitt. I prinsippet kan jo ord frå kva som helst av ordklasser vera tvetydige med substantiv, men som eksperimenta over viste er det umogleg å på FST-nivå finna alle og berre desse (utan å gå tom for ram). 

Så alternativa, etter det eg kan sjå, er: 

1) backtracking i hfst-tokenise, som skildra i http://giellatekno.uit.no/bugzilla/show_bug.cgi?id=2162#c14 (analyser først lengste moglege streng; viss me såg eit backtracking-symbol, så prøver me alle måter å analysera delene)

2) me godtek at alt i prinsippet kan gå til alt via mellomrom, og prøver å fjerna mest mogleg tull med manuelle unntak i FST og CG-reglar i mwe-dis

I det lange løp trur eg nok 1) er betre; eg trur iallfall me bør prøva det så me får samanlikna.

> * å retta ein regresjon i hfst som gjer at ordformer med etterfylgjande
> punktteikn ikkje blir analyserte

Denne er no retta – nye hfst-pmatch2fst har som standard at token må ha separatorar mellom seg, så eg la inn «set need-separators off» i pmscriptet.
Comment 23 Sjur Nørstebø Moshagen 2016-05-25 10:08:57 CEST
(In reply to Kevin Brubeck Unhammer from comment #22)
> (In reply to Sjur Nørstebø Moshagen from comment #21)
> > Det som står att no er:
> > * å få korrekte analyser for ikkje-samansetjingsanalysene (er på veg, truleg
> > i boks snart)
> 
> Eg er veldig usikker på om den metoden eigentleg er nok – det innebærer
> mykje manuell pirk i leksikon for noko som burde vera mogleg å automatisera.
> Altså, problemet er som tidlegare at me vil ha fleirordsanalysar av *alle og
> berre* dei analysane som er tvetydige med særskrivingsfeil. 
[...]
> Så alternativa, etter det eg kan sjå, er: 
> 
> 1) backtracking i hfst-tokenise, som skildra i
> http://giellatekno.uit.no/bugzilla/show_bug.cgi?id=2162#c14 (analyser først
> lengste moglege streng; viss me såg eit backtracking-symbol, så prøver me
> alle måter å analysera delene)

Eg er samd, og etter at vi no har testa alternativet, og eg har tenkt meir på saka, ser eg det som det einaste fungerande alternativet. Eg har skrive e-post til Sam og Krister for å høyra kva dei meiner.

> 2) me godtek at alt i prinsippet kan gå til alt via mellomrom, og prøver å
> fjerna mest mogleg tull med manuelle unntak i FST og CG-reglar i mwe-dis

Eg har kome fram til at dette ikkje er ein farbar veg, av fleire grunnar:
* for mykje hack / er ikkje generell nok
* vi risikerer alt for stor minnebruk, og for træge system

> I det lange løp trur eg nok 1) er betre; eg trur iallfall me bør prøva det
> så me får samanlikna.

Samd. Rettare trur eg no, etter at vi har prøvd alternativet, at dette er den einaste fungerande løysinga.

Sjølv om vi ikkje har fått svar frå Krister og Sam enno, så trur eg du berre kan byrja å arbeida med ei slik løysing med ein gong. Då har vi i det minste noko å testa og visa til.
Comment 24 Kevin Brubeck Unhammer 2016-05-30 15:38:09 CEST
http://sprunge.us/AHCV?diff med
«git clone -b tokenise-backtrack https://github.com/unhammer/hfst»
er no ganske nærme noko brukbart (men har nok enno noko krasj ein stad)

For å ta ein ikkje-feil først, så gir det no http://sprunge.us/DGLg?sh der det før gav
http://sprunge.us/FFiA?sh – utan at heile den strengen er spesifisert
som ikkje-feil i lexc.

Så det som manglar er lengste-match (areála+ektui go vs
areála+ektui+go), men eg veit ikkje om det er vits i å bruka tid på
enno – det er jo noko som den «elegante» løysinga burde gi oss, men
som me ikkje veit enno om me treng pga. me uansett først må innskrenka
ganske kraftig det me analyserer som særskriving i lexc.

Eit anna problem med å begynna på lengste-match er at dei vil
inkludera særskrivingsanalysar, og det vil me jo ikkje ha. Altså, viss
«A B C» hadde backtracking-punkt mellom alle ord, og me først skal
prøva «A B+C» vs «A+B C» (før me eventuelt prøver «A+B+C»), så er det
god sjanse for at «A+B C» inkluderer ein særskrivingsanalyse av «B C»
– skal me då ha hardkoda visse ting i tokenize som fjernar SpaceCmp
frå backtracking? Det blir veldig hackete.

-----

Viss me derimot klarer å innskrenka særskrivinga ein del først, så kan
det henda at me klarer oss utan lengste-match, iallfall fram til me
har ein sånn pmatch-spesifisert versjon av backtracking som Sam &
Krister snakka om. Linda & Duommá og meg snakka om t.d. berre
særskriving av leksikaliserte til å begynna med; og eventuelt
dynamiske uderiverte N+ – og så går det an å sjå på kva slags feil det
ikkje fangar opp, om det er verdt den ekstreme tvetydigheita å utvida
meir.
Comment 25 Sjur Nørstebø Moshagen 2016-10-13 20:22:38 CEST
(In reply to Kevin Brubeck Unhammer from comment #24)
> Viss me derimot klarer å innskrenka særskrivinga ein del først, så kan
> det henda at me klarer oss utan lengste-match, iallfall fram til me
> har ein sånn pmatch-spesifisert versjon av backtracking som Sam &
> Krister snakka om. Linda & Duommá og meg snakka om t.d. berre
> særskriving av leksikaliserte til å begynna med; og eventuelt
> dynamiske uderiverte N+ – og så går det an å sjå på kva slags feil det
> ikkje fangar opp, om det er verdt den ekstreme tvetydigheita å utvida
> meir.

Det har vore stille lenge her:-)

Vi har gått over til berre å ha særskrivingsanalyse av leksikaliserte samansetjingar, og det ser ut til å vera akkurat det vi vil ha. Løysinga er generell, og samtidig avgrensa nok til at vi unngår uhorveleg mange analyser og stor tvetydigheit.

Etter det eg kan sjå er vi no snart klare til å lukka denne lusmeldinga.
Comment 26 Kevin Brubeck Unhammer 2016-10-19 19:26:40 CEST
Ja; det er rett nok enno nokre ting som er litt rare, men det er kanskje sånt me berre fiksar med lingvistikken i lexc/CG. 

T.d..

$ echo servodat dilálašvuođain | hfst-tokenise -g tokeniser-gramcheck-gt-desc.pmhfst
"<servodat dilálašvuođain>"
        "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc Err/SpaceCmp <W:0>
        "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Sg Com Err/SpaceCmp <W:0>
        "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc Err/SpaceCmp <W:0>
        "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com Err/SpaceCmp <W:0>
        "servodatdilálašvuohta" N Sem/State Pl Loc Err/Orth Err/SpaceCmp <W:0>
        "servodatdilálašvuohta" N Sem/State Pl Loc Err/SpaceCmp <W:0>
        "servodatdilálašvuohta" N Sem/State Sg Com Err/Orth Err/SpaceCmp <W:0>
        "servodatdilálašvuohta" N Sem/State Sg Com Err/SpaceCmp <W:0>
        "vuohta" Err/Lex N Pl Loc Err/Orth Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
        "vuohta" Err/Lex N Pl Loc Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
        "vuohta" Err/Lex N Sg Com Err/Orth Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
        "vuohta" Err/Lex N Sg Com Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
        "vuohta" Err/Lex N Pl Loc Err/Orth Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
        "vuohta" Err/Lex N Pl Loc Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
        "vuohta" Err/Lex N Sg Com Err/Orth Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
        "vuohta" Err/Lex N Sg Com Err/SpaceCmp <W:10>
                "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
        "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
                "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
                        "dat" Pcle <W:0> "<dat>"
                                "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Sg Com Err/Orth <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilálašvuohta" N Sem/State Sg Com Err/Orth <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Sg Com Err/Orth <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Sg Com <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilálašvuohta" N Sem/State Sg Com <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Sg Com <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Pl Loc Err/Orth <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilálašvuohta" N Sem/State Pl Loc Err/Orth <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Pl Loc Err/Orth <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Pl Loc <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilálašvuohta" N Sem/State Pl Loc <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilálašvuohta" N Sem/State Pl Loc <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Sg Com <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Sg Com <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Sg Com <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc <W:0> "< dilálašvuođain>"
                "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0> "<servo>"
        "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc <W:0> "< dilálašvuođain>"
                "dat" Pcle <W:0> "<dat>"
                        "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0> "<servo>"
:\n
Comment 27 Kevin Brubeck Unhammer 2016-10-19 19:32:12 CEST
dvs. http://sprunge.us/QgWA?sh – bugzilla brekker lange linjer :/
Comment 28 Linda Wiechetek 2016-12-07 11:40:15 CET
(In reply to Kevin Brubeck Unhammer from comment #26)
> Ja; det er rett nok enno nokre ting som er litt rare, men det er kanskje
> sånt me berre fiksar med lingvistikken i lexc/CG. 
> 
> T.d..
> 
> $ echo servodat dilálašvuođain | hfst-tokenise -g
> tokeniser-gramcheck-gt-desc.pmhfst
> "<servodat dilálašvuođain>"
>         "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth
> Pl Loc Err/SpaceCmp <W:0>
>         "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth
> Sg Com Err/SpaceCmp <W:0>
>         "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc
> Err/SpaceCmp <W:0>
>         "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com
> Err/SpaceCmp <W:0>
>         "servodatdilálašvuohta" N Sem/State Pl Loc Err/Orth Err/SpaceCmp
> <W:0>
>         "servodatdilálašvuohta" N Sem/State Pl Loc Err/SpaceCmp <W:0>
>         "servodatdilálašvuohta" N Sem/State Sg Com Err/Orth Err/SpaceCmp
> <W:0>
>         "servodatdilálašvuohta" N Sem/State Sg Com Err/SpaceCmp <W:0>
>         "vuohta" Err/Lex N Pl Loc Err/Orth Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>         "vuohta" Err/Lex N Pl Loc Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>         "vuohta" Err/Lex N Sg Com Err/Orth Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>         "vuohta" Err/Lex N Sg Com Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>         "vuohta" Err/Lex N Pl Loc Err/Orth Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>         "vuohta" Err/Lex N Pl Loc Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>         "vuohta" Err/Lex N Sg Com Err/Orth Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>         "vuohta" Err/Lex N Sg Com Err/SpaceCmp <W:10>
>                 "servodatdilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>         "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/SgGen Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Sg Com Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Sg Com <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc Err/Orth <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs Sg3
> <W:0> "<servo>"
>         "vuohta" Err/Lex N Pl Loc <W:10> "< dilálašvuođain>"
>                 "dilli" NN Sem/State Der/lasj A Cmp/Attr Cmp <W:10>
>                         "dat" Pcle <W:0> "<dat>"
>                                 "searvat" VV IVV Der/PassS V IV Ind Prs
> ConNeg <W:0> "<servo>"
>         "dilálašvuohta" N Sem/State Sg Com Err/Orth <W:0> "< dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilálašvuohta" N Sem/State Sg Com Err/Orth <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilálašvuohta" N Sem/State Sg Com Err/Orth <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
>         "dilálašvuohta" N Sem/State Sg Com <W:0> "< dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilálašvuohta" N Sem/State Sg Com <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilálašvuohta" N Sem/State Sg Com <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
>         "dilálašvuohta" N Sem/State Pl Loc Err/Orth <W:0> "< dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilálašvuohta" N Sem/State Pl Loc Err/Orth <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilálašvuohta" N Sem/State Pl Loc Err/Orth <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
>         "dilálašvuohta" N Sem/State Pl Loc <W:0> "< dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilálašvuohta" N Sem/State Pl Loc <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilálašvuohta" N Sem/State Pl Loc <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com <W:0> "<
> dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com <W:0> "<
> dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Sg Com <W:0> "<
> dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc <W:0> "<
> dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc <W:0> "<
> dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Pl Loc <W:0> "<
> dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Sg Com
> <W:0> "< dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Sg Com
> <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Sg Com
> <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc
> <W:0> "< dilálašvuođain>"
>                 "servodat" N Sem/Org Sg Nom <W:0> "<servodat>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc
> <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs Sg3 <W:0>
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc
> <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>
> "<servo>"
> :\n

Kosjn har du tenkt å fikse sånt i CG?
Comment 29 Kevin Brubeck Unhammer 2016-12-07 12:29:29 CET
(In reply to Linda Wiechetek from comment #28)
> (In reply to Kevin Brubeck Unhammer from comment #26)
> > Ja; det er rett nok enno nokre ting som er litt rare, men det er kanskje
> > sånt me berre fiksar med lingvistikken i lexc/CG. 
> > 
> > T.d..
> > 
> > $ echo servodat dilálašvuođain | hfst-tokenise -g
> > tokeniser-gramcheck-gt-desc.pmhfst
> > "<servodat dilálašvuođain>"
> >         "servodatdilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth
> > Pl Loc Err/SpaceCmp <W:0>
[…]
> Kosjn har du tenkt å fikse sånt i CG?

På same måte som andre CG-reglar … er det noko spesifikt som ikkje går an å få til her?
Comment 30 Sjur Nørstebø Moshagen 2017-03-08 00:10:16 CET
(In reply to Kevin Brubeck Unhammer from comment #26)
> Ja; det er rett nok enno nokre ting som er litt rare, men det er kanskje
> sånt me berre fiksar med lingvistikken i lexc/CG. 
> 
> T.d..
> 
> $ echo servodat dilálašvuođain | hfst-tokenise -g
> tokeniser-gramcheck-gt-desc.pmhfst
[...]
> "<servo>"
>         "dilli" NN Sem/State Der/lasj AA Attr Der/vuota N Err/Orth Pl Loc
> <W:0> "< dilálašvuođain>"
>                 "dat" Pcle <W:0> "<dat>"
>                         "searvat" VV IVV Der/PassS V IV Ind Prs ConNeg <W:0>

Jepp, kvifor 'dat' lagar samansetjing t.d. - det forstår eg ikkje, og det er samtidig noko som heilt klårt må løysast i lexc.

Eg reknar med dette denne lusmeldinga som løyst.
Comment 31 Kevin Brubeck Unhammer 2017-09-08 10:54:09 CEST
Created attachment 207 [details]
tavleskribleriar om with-flag

Me bør etter kvart sjå på om me kan bruka FST-lokale flagg, ein ny funksjon som Sam har lagt til i Pmatch:
https://github.com/hfst/hfst/commit/b5b7995be645d845477c403ab4de6981f26badb4

Kort fortalt skal det altså gå an å ha stiar inn i same FST (t.d. heile leksikon) frå to ulike stadar i tokeniser-FST-en, der dei to stiane har ulike start-verdiar for eit visst flagg. Så i ein viss tokeniseringskontekst slår me opp ord med flagget på, i ein annan, med flagget av. 

Kombinert med RC/right context (ein sjekk som skjer ved køyring og ikkje ved kompilering), burde det i teorien vera mogleg å bruka dette maskineriet til å berre analysera særskrivingsfeil viss dei i tillegg finst utan mellomrom i leksikonet (og dermed fjerna min backtracking-kode, som er litt for oppgåvespesifikk).
Comment 32 Kevin Brubeck Unhammer 2017-09-08 14:40:47 CEST
(In reply to Kevin Brubeck Unhammer from comment #31)
> Created attachment 207 [details] [details]
> tavleskribleriar om with-flag
> 
> Me bør etter kvart sjå på om me kan bruka FST-lokale flagg, ein ny funksjon
> som Sam har lagt til i Pmatch:
> https://github.com/hfst/hfst/commit/b5b7995be645d845477c403ab4de6981f26badb4
> 
> Kort fortalt skal det altså gå an å ha stiar inn i same FST (t.d. heile
> leksikon) frå to ulike stadar i tokeniser-FST-en, der dei to stiane har
> ulike start-verdiar for eit visst flagg. Så i ein viss tokeniseringskontekst
> slår me opp ord med flagget på, i ein annan, med flagget av. 
> 
> Kombinert med RC/right context (ein sjekk som skjer ved køyring og ikkje ved
> kompilering), burde det i teorien vera mogleg å bruka dette maskineriet til
> å berre analysera særskrivingsfeil viss dei i tillegg finst utan mellomrom i
> leksikonet (og dermed fjerna min backtracking-kode, som er litt for
> oppgåvespesifikk).

-r156774 har ein enkel proof-of-concept på dette