From e6e81464780c2e3fa367b0efd53fdd2f895c4da2 Mon Sep 17 00:00:00 2001 From: kenkeiras Date: Tue, 23 May 2017 23:24:44 +0200 Subject: [PATCH] Allow learning from unparsed data in tests. --- naive-nlu/tree_nlu/knowledge_evaluation.py | 17 ++- naive-nlu/tree_nlu/tests/gac_100.py | 126 +++++++++++++-------- 2 files changed, 93 insertions(+), 50 deletions(-) diff --git a/naive-nlu/tree_nlu/knowledge_evaluation.py b/naive-nlu/tree_nlu/knowledge_evaluation.py index ed48f85..bcce527 100644 --- a/naive-nlu/tree_nlu/knowledge_evaluation.py +++ b/naive-nlu/tree_nlu/knowledge_evaluation.py @@ -41,10 +41,21 @@ def get_subquery_type(knowledge_base, atom): def property_for_value(knowledge_base, value): - if 'as_property' in knowledge_base[value]: - return knowledge_base[value]['as_property'] + if value in knowledge_base: + # Annotate the property as property + groups = knowledge_base[value].get('groups', set(['property'])) + groups.add('property') + knowledge_base[value]['groups'] = groups - return knowledge_base[value].get('groups', set(['noun'])) + # And find the property "name" + if 'as_property' in knowledge_base[value]: + return knowledge_base[value]['as_property'] + + return knowledge_base[value].get('groups', set(['property'])) + else: + # Consider that any property is... a property + knowledge_base[value] = {'groups': {'property'}} + return {'property'} def modifiable_property_from_property(prop, path, value): diff --git a/naive-nlu/tree_nlu/tests/gac_100.py b/naive-nlu/tree_nlu/tests/gac_100.py index 77d7139..ef68dfb 100644 --- a/naive-nlu/tree_nlu/tests/gac_100.py +++ b/naive-nlu/tree_nlu/tests/gac_100.py @@ -1,30 +1,38 @@ from ..knowledge_base import KnowledgeBase examples = [ - { - "text": "is icecream cold?", - "affirmation": "icecream is cold", - "parsed": ("question", ("exists-property-with-value", 'icecream', 'cold')), - "answer": True, - }, - # { - # "text": "is earth a planet?", - # "affirmation": "is earth a planet?", - # "parsed": (), - # "answer": None, - # }, - # { - # "text": "Is green a color?", - # "affirmation": "Is green a color?", - # "parsed": (), - # "answer": None, - # }, - # { - # "text": "do airplanes fly?", - # "affirmation": "do airplanes fly?", - # "parsed": (), - # "answer": None, - # }, + ('full_example', + { + "text": "is icecream cold?", + "affirmation": "icecream is cold", + "parsed": ("question", + ("exists-property-with-value", 'icecream', 'cold')), + "answer": True, + }), + ('full_example', + { + "text": "is earth a planet?", + "affirmation": "earth is a planet", + "parsed": ("question", + ("pertenence-to-group", 'earth', 'planet')), + "answer": True, + }), + ('full_example', + { + "text": "Is green a color?", + "affirmation": "green is a color", + "parsed": ("question", + ("pertenence-to-group", 'green', 'color')), + "answer": True, + }), + ('full_example', + { + "text": "do airplanes fly?", + "affirmation": "airplanes fly", + "parsed": ("question", + ("has-capacity", 'plane', 'fly')), + "answer": True, + }), # { # "text": "Is it hot during the summer?", # "affirmation": "Is it hot during the summer?", @@ -61,12 +69,12 @@ examples = [ # "parsed": (), # "answer": None, # }, - # { - # "text": "Is milk white?", - # "affirmation": "Is milk white?", - # "parsed": (), - # "answer": None, - # }, + ('text_example', + { + "question": "Is milk white?", + "affirmation": "milk is white", + "answer": True, + }), # { # "text": "do people have emotions?", # "affirmation": "do people have emotions?", @@ -607,10 +615,24 @@ base_knowledge = { 'icecream': { "groups": set(['noun', 'object', 'comestible', 'sweet']), }, - "cold": { + 'cold': { "groups": set(['property', 'temperature']), - "as_property": "temperature", - } + }, + 'earth': { + "groups": set(['noun', 'object', 'planet']), + }, + 'planet': { + "groups": set(['noun', 'group']), + }, + 'color': { + "groups": set(['property', 'group']), + }, + 'green': { + "groups": set(['noun', 'color', 'concept']), + }, + 'fly': { + "groups": set(['verb']), + }, } def main(): @@ -618,20 +640,30 @@ def main(): knowledge=base_knowledge, ) - affirmations = [ - { - 'text': x['affirmation'], - 'parsed': x['parsed'][1], - } - for x in examples - ] - questions = examples + for example_type, data in examples: + if example_type == 'full_example': + affirmation = { + 'text': data['affirmation'], + 'parsed': data['parsed'][1], + } + question = data + differences = knowledge.train([affirmation]) + differences = knowledge.train([question]) - differences = knowledge.train(affirmations) - differences = knowledge.train(questions) + result, _, _ = knowledge.process(data['text']) - for example in examples: - result, _, _ = knowledge.process(example['text']) + if result != data['answer']: + raise AssertionError('{} is not {}'.format(result, data['answer'])) - if result != example['answer']: - raise AssertionError('{} is not {}'.format(result, example['answer'])) + elif example_type == 'text_example': + affirmation = data['affirmation'] + question = data['question'] + + _, _, _ = knowledge.process(affirmation) + result, _, _ = knowledge.process(question) + + if result != data['answer']: + raise AssertionError('{} is not {}'.format(result, data['answer'])) + + else: + raise NotImplementedError('Example type: {}'.format(example_type))