def test_minimal_flag_set(self): # for brevity s = sorted mfs = morphotactics.minimal_flag_set ch = customize.choices.ChoicesFile() ch.load_choices(lextypes + con_dis_junctive) preceeds = morphotactics.create_preceeds_dict(ch) # no constraints self.assertEqual(mfs({}, preceeds), []) # single constraint (a or b forces c) self.assertEqual(mfs(('verb-slot3', ), preceeds), [('verb-slot3', )]) # two constraints, sequential self.assertEqual(s(mfs(('verb-slot3', 'verb-slot4'), preceeds)), [('verb-slot3', ), ('verb-slot4', )]) # two constraints, non-sequential, same value self.assertEqual(s(mfs(('verb-slot4', 'verb-slot5'), preceeds)), [( 'verb-slot4', 'verb-slot5', )]) # four constraints, two non-seq, same val, other two non seq, same val self.assertEqual( s( mfs(('verb-slot1', 'verb-slot2', 'verb-slot4', 'verb-slot5'), preceeds)), [( 'verb-slot1', 'verb-slot2', ), ( 'verb-slot4', 'verb-slot5', )]) ch = customize.choices.ChoicesFile() ch.load_choices(lextypes + extended_con_dis_junctive1) preceeds = morphotactics.create_preceeds_dict(ch) # disjunctive and sequential constrainted, all same value self.assertEqual( s(mfs(('verb-slot4', 'verb-slot5', 'verb-slot6'), preceeds)), [( 'verb-slot4', 'verb-slot5', ), ( 'verb-slot5', 'verb-slot6', )]) ch.load_choices(lextypes + extended_con_dis_junctive2) preceeds = morphotactics.create_preceeds_dict(ch) # disjunctive and sequential constrainted, all same value self.assertEqual( s( mfs(('verb-slot4', 'verb-slot5', 'verb-slot6', 'verb-slot7'), preceeds)), [( 'verb-slot4', 'verb-slot5', ), ( 'verb-slot6', 'verb-slot7', )])
def test_create_lexical_rules(self): clrs = morphotactics.create_lexical_rules # no rules ch = customize.choices.ChoicesFile() ch.load_choices(lextypes) preceeds = morphotactics.create_preceeds_dict(ch) self.assertEqual(clrs(ch, preceeds), {}) # no-orth noun ch = customize.choices.ChoicesFile() ch.load_choices(lextypes + simple_no_orth) preceeds = morphotactics.create_preceeds_dict(ch) lrs = clrs(ch, preceeds) self.assertEqual(len(lrs), 2) self.assertEqual(lrs['noun-slot1'].name, 'num') self.assertEqual(lrs['noun-slot1'].slot_key, 'noun-slot1') self.assertEqual(lrs['noun-slot1'].order, 'after') self.assertEqual(len(lrs['noun-slot1'].morphs), 1) self.assertEqual(lrs['noun-slot1'].morphs[0].name, 'singular') self.assertEqual(lrs['noun-slot1'].morphs[0].features, {'number': { 'value': 'sg', 'head': None }}) self.assertEqual(lrs['noun1'].name, 'testnoun-noun') self.assertEqual(lrs['noun1'].slot_key, 'noun1') # multiple basetypes # sequential verb slots ch = customize.choices.ChoicesFile() ch.load_choices(lextypes + sequential_verb_slots) preceeds = morphotactics.create_preceeds_dict(ch) lrs = clrs(ch, preceeds) self.assertEqual(len(lrs), 5) self.assertEqual(lrs['verb-slot1'].name, 'person') self.assertEqual(lrs['verb-slot1'].slot_key, 'verb-slot1') self.assertEqual(lrs['verb-slot1'].order, 'after') self.assertEqual(len(lrs['verb-slot1'].morphs), 1) self.assertEqual(lrs['verb-slot1'].morphs[0].name, '3sg') self.assertEqual(len(lrs['verb-slot1'].morphs), 1) self.assertEqual(len(lrs['verb-slot2'].morphs), 2) self.assertEqual(len(lrs['verb-slot3'].morphs), 1)
def test_sequential(self): # for brevity seq = morphotactics.sequential ch = customize.choices.ChoicesFile() ch.load_choices(lextypes + con_dis_junctive) preceeds = morphotactics.create_preceeds_dict(ch) self.assertEqual(seq('verb-slot1', 'verb-slot2', preceeds), False) self.assertEqual(seq('verb-slot2', 'verb-slot1', preceeds), False) self.assertEqual(seq('verb-slot1', 'verb-slot3', preceeds), True) self.assertEqual(seq('verb-slot3', 'verb-slot1', preceeds), True) self.assertEqual(seq('verb-slot2', 'verb-slot3', preceeds), True) self.assertEqual(seq('verb-slot3', 'verb-slot2', preceeds), True) self.assertEqual(seq('verb-slot3', 'verb-slot4', preceeds), True) self.assertEqual(seq('verb-slot4', 'verb-slot3', preceeds), True) self.assertEqual(seq('verb-slot1', 'verb-slot4', preceeds), True) self.assertEqual(seq('verb-slot4', 'verb-slot1', preceeds), True) self.assertEqual(seq('verb-slot4', 'verb-slot5', preceeds), False) self.assertEqual(seq('verb-slot5', 'verb-slot4', preceeds), False) self.assertEqual(seq('verb-slot1', 'verb-slot1', preceeds), False) self.assertEqual(seq('verb-slot42', 'verb-slot99', preceeds), False)
def test_ordered_constraints(self): # for brevity oc = morphotactics.ordered_constraints ch = customize.choices.ChoicesFile() ch.load_choices(lextypes + extended_con_dis_junctive2) preceeds = morphotactics.create_preceeds_dict(ch) # one slot self.assertEqual(oc(['verb-slot1'], preceeds), ['verb-slot1']) # nonsequential, ordered by name self.assertEqual(oc(['verb-slot1', 'verb-slot2'], preceeds), ['verb-slot1', 'verb-slot2']) # nonsequential, not ordered by name self.assertEqual(oc(['verb-slot2', 'verb-slot1'], preceeds), ['verb-slot1', 'verb-slot2']) # sequential self.assertEqual(oc(['verb-slot4', 'verb-slot1'], preceeds), ['verb-slot1', 'verb-slot4']) # sequential and nonsequential self.assertEqual( oc(['verb-slot7', 'verb-slot5', 'verb-slot4', 'verb-slot6'], preceeds), ['verb-slot4', 'verb-slot5', 'verb-slot6', 'verb-slot7'])
def test_create_preceeds_dict(self): # no slots choices = customize.choices.ChoicesFile() choices.load_choices(lextypes) self.assertEqual(morphotactics.create_preceeds_dict(choices), {}) # single slot choices = customize.choices.ChoicesFile() choices.load_choices(lextypes + simple_no_orth) self.assertEqual(morphotactics.create_preceeds_dict(choices), {'noun-slot1': set(['noun1'])}) # two morphemes (no different) choices = customize.choices.ChoicesFile() choices.load_choices(lextypes + two_morphemes) self.assertEqual(morphotactics.create_preceeds_dict(choices), {'noun-slot1': set(['noun1'])}) # competing slots choices = customize.choices.ChoicesFile() choices.load_choices(lextypes + competing_slots) self.assertEqual(morphotactics.create_preceeds_dict(choices), { 'noun-slot1': set(['noun1']), 'noun-slot2': set(['noun1']) }) # sequential slots choices = customize.choices.ChoicesFile() choices.load_choices(lextypes + sequential_slots) self.assertEqual( morphotactics.create_preceeds_dict(choices), { 'noun-slot1': set(['noun1']), 'noun-slot2': set(['noun-slot1', 'noun1']) }) # multiple basetypes, multiple inputs choices = customize.choices.ChoicesFile() choices.load_choices(lextypes + sequential_verb_slots) self.assertEqual( morphotactics.create_preceeds_dict(choices), { 'verb-slot1': set(['verb1', 'verb2']), 'verb-slot2': set(['verb-slot1', 'verb1', 'verb2']), 'verb-slot3': set( ['verb-slot1', 'verb-slot2', 'verb1', 'verb2']) })
def prep_lrs(choice_lines): ch = customize.choices.ChoicesFile() ch.load_choices(choice_lines) preceeds = morphotactics.create_preceeds_dict(ch) lrs = morphotactics.create_lexical_rules(ch, preceeds) return lrs, preceeds, ch