The expression parser is then setup with the "infix", "preposition" and "article" types. Where the priorities are "infix" < "preposition" < "article". I made a new class called Chain that can be used to take the output of the hierarchy neural net and use that as the input into the expression neural net. The main change for that was to add code to specify which nodes are outputs from the hierarchy and which nodes are input into the expression neural net. That is pretty much all that I did.
The expression parser is trained with this
priorities = [
('preposition', 'article'),
('infix', 'preposition'),
('constant', 'infix'),
('0', 'constant')
]
The hierarchy neural net is trained with this
words = [
('constant', 'constant'),
('to', 'preposition'),
('from', 'preposition'),
('move', 'infix'),
('bought', 'infix'),
('a', 'article'),
('the', 'article'),
# top off the loop
('article', 'article'),
('preposition', 'preposition'),
('infix', 'infix')
]
The setup is done like so
one_hot_spec = ['constant', 'preposition', 'infix', 'article', '0']
hierarchy_model = HierarchyModel(words, 'constant', one_hot_spec)
parser_model = ParserModel(priorities, 'constant', one_hot_spec)
chain_model = ChainModel(hierarchy_model, parser_model)
chain_model.train(session)
Enter an sentence if you dare: move t1 to b2 dfhj ahadshfa sdhfgfah I bought a car
Input Expression: ['move', 't1', 'to', 'b2', 'dfhj', 'ahadshfa', 'sdhfgfah', 'I', 'bought', 'a', 'car']
Output Expression: {'action': 'move', 'thing': 't1', 'to': 'b2'}
Output Expression: {'buyer': 'I', 'action': 'buy', 'thing': {'thing': 'car', 'determiner': 'a'}}
The source code is expression5.py, hierarchy3.py and chain1.py . This is invoked by running expression5.py. The source code is here