Skip to content

Commit a1277c1

Browse files
Fix constructions that never won a parse
A usage census over 10,000 parsed news sentences found nonterminals that never appeared in a winning tree. Four of them were meant to fire on ordinary prose and lost to a wrong analysis or could not match: - "sem:ao" does not exist in BÍN ('sem' is st or fs), so SemStendur ("sem stendur"), LoSem ("sem jöfnustu"), "svo sem" and one "sem sagt" could never match. Use "sem:st". - HjSögnLhNtFrumlag's first alternative ("Nú fer hælisleitendum fækkandi") lacked the dative subject, so the sentence was parsed with an impersonal verb instead. - HjSögnVantaSkorta ("Okkur þótti vanta mýkt") lost on score to a reading of 'vanta' as a noun; give it a bonus. - "undir eins" was read as 'undir' + the comparison "eins og". Make it a fixed phrase in Phrases.conf. On the 1000-sentence baseline 5 trees change: 3 score ties and 2 improvements (e.g. "vel viðráðanleg sem stendur" no longer becomes a relative clause), none lost. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent b321356 commit a1277c1

3 files changed

Lines changed: 41 additions & 8 deletions

File tree

src/reynir/Greynir.grammar

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3375,7 +3375,7 @@ HjSögnLhNt →
33753375
# [Nú] fer hælisleitendum fækkandi
33763376
# [Nú] hefur hælisleitendum farið fækkandi
33773377
HjSögnLhNtFrumlag →
3378-
'fara:so'_gm_p3_et
3378+
'fara:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? # fer/fór/færi þeim [ekki] (fækkandi)
33793379
| 'hafa:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? 'geta:so'_sagnb? 'fara:so'_sagnb # hefur/hafði/hefði þeim [ekki] [getað] farið (fækkandi)
33803380
| 'geta:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? 'hafa:so'_nh? 'fara:so'_sagnb # getur/gat/gæti þeim [hafa] farið (fækkandi)
33813381
| 'munu:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? 'fara:so'_nh # mun/myndi þeim [ekki] fara (fækkandi)
@@ -3426,6 +3426,9 @@ HjSögnVantaSkorta →
34263426
'vanta:so'_nh # Okkur þykir/þótti vanta mýkt í rödd Pálínu
34273427
| 'skorta:so'_nh # Páli þykir/þótti skorta samkvæmni í málflutningi Jóns
34283428

3429+
# Kjósum þessa greiningu fremur en að lesa 'vanta' sem nafnorð
3430+
$score(+8) HjSögnVantaSkorta
3431+
34293432
HjSögnFá/tala/pers →
34303433
'fá:so'_1_þf_gm/tala/pers # Páll fékk bílinn endurgreiddan
34313434
| 'hafa:so'_gm/tala/pers 'fá:so'_gm_sagnb # Páll hefur fengið bílinn endurgreiddan
@@ -5750,7 +5753,7 @@ LoMun/fall/tala/kyn →
57505753
$score(+10) LoMun/fall/tala/kyn
57515754

57525755
LoSem/fall/tala/kyn →
5753-
"sem:ao" lo_esb/fall/tala/kyn # (hvernig skuli stuðla að) sem jöfnustu hlutfalli
5756+
"sem:st" lo_esb/fall/tala/kyn # (hvernig skuli stuðla að) sem jöfnustu hlutfalli
57545757

57555758
$score(+4) LoSem/fall/tala/kyn
57565759

@@ -6491,9 +6494,9 @@ EinnAl →
64916494
| 'einn:fn'_kvk_et_þf 'ferð:kvk'_þf_et_gr "enn:ao" # eina ferðina enn
64926495
| "heima:ao" "fyrir:ao"
64936496
| "hingað:ao" "til:ao"
6494-
| "sem:ao" 'segja:so'_lhþt_sb_hk_nf_et # sem sagt
6495-
| "svo:ao" "sem:ao"
6496-
| "sem:ao" "fyrst:ao"
6497+
| "sem:st" 'segja:so'_lhþt_sb_hk_nf_et # sem sagt
6498+
| "svo:ao" "sem:st"
6499+
| "sem:st" "fyrst:ao"
64976500
| 'vinsamlegur:lo'_esb_nf_et_hk # (Þátttakendur eru) vinsamlegast (beðnir að fylla út eyðublað)
64986501
| 'náðarsamlegur:lo'_esb_nf_et_hk # (Þátttakendur eru) náðarsamlegast (beðnir að fylla út eyðublað)
64996502
| "mest:ao" Allra # (Ferðamönnum hefur fjölgað) mest allra
@@ -6545,12 +6548,12 @@ $score(+8) FyrirLöngu
65456548

65466549
# Sem stendur er hann ekki viðlátinn
65476550
SemStendur →
6548-
"sem:ao" 'standa:so'_0_gm_fh_et_p3
6551+
"sem:st" 'standa:so'_0_gm_fh_et_p3
65496552

65506553
$score(-6) SemStendur
65516554

65526555
UndirEins →
6553-
"undir:ao" "eins:ao" # 'Ég fór undir eins og kannaði málið'
6556+
'undir_eins:ao' # 'Ég fór undir eins og kannaði málið' (fasti frasinn 'undir eins' í Phrases.conf)
65546557

65556558
$score(+4) UndirEins
65566559

@@ -6626,7 +6629,7 @@ AtviksliðurEinkunn →
66266629
eo # Einkunnarorð = atviksorð sem geta ekki jafnframt verið forsetningar
66276630
| Aldur # Hin 29 ára gamla fyrirsæta
66286631
| Allt "að:ao" # 'fjárfesta fyrir allt að 100 milljónir króna'
6629-
| "svo:ao" "sem:ao" # 'enda kemur kynlíf þeirra svo sem engum við'
6632+
| "svo:ao" "sem:st" # 'enda kemur kynlíf þeirra svo sem engum við'
66306633
| "innan_við:fs"
66316634
| "líkast:ao" "til:ao"
66326635
| UmEðaYfir

src/reynir/config/Phrases.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,7 @@ meaning = ao frasi -
13821382

13831383
"á stangli", "aþ nheþ", "á stangl"
13841384
"á ný", "aa aa", "á ný"
1385+
"undir eins", "aa aa", "undir eins"
13851386
"hvað mest", "aa aae", "hvað mjög"
13861387
"út og suður", "aa c aa", "út og suður"
13871388
"heils hugar", "lkeesf nkee", "heill hugur"

test/test_parse.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2780,6 +2780,34 @@ def test_sagdur_hafa(r) -> None:
27802780
assert "lhþt" in s.tree.flat, sentence
27812781

27822782

2783+
def test_never_winning_constructions(r) -> None:
2784+
"""Constructions that a grammar usage census showed never won a parse,
2785+
because of a dead terminal ('sem:ao' does not exist in BÍN), a missing
2786+
subject in a production, or losing on score"""
2787+
# sem stendur / sem jöfnustu: 'sem' is a conjunction in BÍN, not an adverb
2788+
s = r.parse_single("Sem stendur er hann ekki viðlátinn.")
2789+
assert s and s.tree and "ADVP st VP so_0" in s.tree.flat, s.tree.flat if s.tree else None
2790+
s = r.parse_single("Stuðla skal að sem jöfnustu hlutfalli.")
2791+
assert s and s.tree and "st lo_" in s.tree.flat, s.tree.flat if s.tree else None
2792+
# undir eins: a fixed phrase, not 'undir' + a comparison
2793+
s = r.parse_single("Ég fór undir eins og kannaði málið.")
2794+
assert s and s.tree and "CP-ADV-CMP" not in s.tree.flat, s.tree.flat if s.tree else None
2795+
assert any(t.text.lower() == "undir eins" for t in s.tree.leaves)
2796+
# Nú fer hælisleitendum fækkandi: dative subject after the auxiliary
2797+
s = r.parse_single("Nú fer hælisleitendum fækkandi.")
2798+
assert s and s.tree and "NP-SUBJ no_ft_þgf_kk /NP-SUBJ" in s.tree.flat, (
2799+
s.tree.flat if s.tree else None
2800+
)
2801+
assert "subj_op" not in s.tree.flat
2802+
# Okkur þótti vanta mýkt: 'vanta' is the infinitive, 'mýkt' its object
2803+
s = r.parse_single("Okkur þótti vanta mýkt í rödd hennar.")
2804+
assert s and s.tree and "vanta" in s.tree.verbs, s.tree.flat if s.tree else None
2805+
assert "NP-OBJ no_et_þf_kvk" in s.tree.flat
2806+
# Apposition in the wrong case parses via the error fallback
2807+
s = r.parse_single("Ég ræddi við forsætisráðherra (Sigmundur Davíð) um málið.")
2808+
assert s and s.tree and "person_nf_kk person_nf_kk" in s.tree.flat
2809+
2810+
27832811
if __name__ == "__main__":
27842812
# When invoked as a main module, do a verbose test
27852813
from reynir import Greynir
@@ -2849,4 +2877,5 @@ def test_sagdur_hafa(r) -> None:
28492877
test_quoted_question_attribution(g)
28502878
test_thess_i_stad(g)
28512879
test_sagdur_hafa(g)
2880+
test_never_winning_constructions(g)
28522881
g.__class__.cleanup()

0 commit comments

Comments
 (0)