lang-model/naive-nlu/tree_nlu/tests/basic.py

159 lines
4.3 KiB
Python
Raw Normal View History

2017-05-23 19:57:51 +00:00
import logging
import json
from ..knowledge_base import KnowledgeBase
from ..modifiable_property import is_modifiable_property
examples = [
{
"text": "icecream is cold",
"parsed": ("exists-property-with-value", 'icecream', 'cold'),
},
{
"text": "is icecream cold?",
"parsed": ("question", ("exists-property-with-value", 'icecream', 'cold'))
},
{
"text": "lava is dangerous",
"parsed": ("exists-property-with-value", 'lava', 'dangerous')
},
{
"text": "is lava dangerous?",
"parsed": ("question", ("exists-property-with-value", 'lava', 'dangerous')),
},
{
"text": "earth is a planet",
"parsed": ("pertenence-to-group", 'earth', 'planet'),
},
{
"text": "io is a moon",
"parsed": ("pertenence-to-group", 'io', 'moon'),
},
{
"text": "is earth a moon?",
"parsed": ("question", ("pertenence-to-group", 'earth', 'moon')),
},
{
"text": "Green is a color",
"parsed": ("pertenence-to-group", 'green', 'color'),
},
{
"text": "a plane can fly",
"parsed": ("has-capacity", 'plane', 'fly')
},
{
"text": "a wale can swim",
"parsed": ("has-capacity", 'wale', 'swim')
},
# {
# "text": "if earth is a planet, it is big",
# "parsed": ("implies",
# ("pertenence-to-group", 'earth', 'planet'),
# ("exists-property-with-value", 'earth', 'big')),
# },
]
base_knowledge = {
'icecream': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'object', 'comestible', 'sweet'},
2017-05-23 19:57:51 +00:00
},
'lava': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'object'},
2017-05-23 19:57:51 +00:00
},
'earth': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'object', 'planet'},
2017-05-23 19:57:51 +00:00
},
'io': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'object'},
2017-05-23 19:57:51 +00:00
},
'green': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'color', 'concept'},
2017-05-23 19:57:51 +00:00
},
'plane': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'object', 'vehicle', 'fast'},
2017-05-23 19:57:51 +00:00
},
'car': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'object', 'vehicle', 'slow-ish'},
2017-05-23 19:57:51 +00:00
},
'wale': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'object', 'living-being'},
2017-05-23 19:57:51 +00:00
},
'cold': {
2017-05-23 21:29:34 +00:00
"groups": {'property', 'temperature'},
2017-05-23 19:57:51 +00:00
"as_property": "temperature",
},
'dangerous': {
2017-05-23 21:29:34 +00:00
"groups": {'property'},
2017-05-23 19:57:51 +00:00
"as_property": "safety",
},
'planet': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'group'},
2017-05-23 19:57:51 +00:00
},
'moon': {
2017-05-23 21:29:34 +00:00
"groups": {'noun', 'group'},
2017-05-23 19:57:51 +00:00
},
'color': {
2017-05-23 21:29:34 +00:00
"groups": {'property', 'group'},
2017-05-23 19:57:51 +00:00
},
'fly': {
2017-05-23 21:29:34 +00:00
"groups": {'verb'},
2017-05-23 19:57:51 +00:00
},
'bus': {
"groups": {'noun'},
},
'run': {
"groups": {'verb'},
},
2017-05-23 19:57:51 +00:00
'swim': {
2017-05-23 21:29:34 +00:00
"groups": {'verb'},
2017-05-23 19:57:51 +00:00
},
}
def test_assumption(expectedResponse, knowledge, query):
2017-09-21 23:00:09 +00:00
logging.debug("Query: {}".format(query['text']))
logging.debug("Expected: {}".format(expectedResponse))
2017-05-23 19:57:51 +00:00
result, abstract_tree, diff = knowledge.process(query['text'])
end_result = result.getter() if is_modifiable_property(result) else result
2017-09-21 23:00:09 +00:00
logging.debug("\x1b[0;3{}mResult: {}\x1b[0m".format("1" if end_result != expectedResponse else "2", end_result))
2017-05-23 20:16:27 +00:00
if end_result != expectedResponse:
raise AssertionError('{} is not {}'.format(end_result, expectedResponse))
2017-05-23 19:57:51 +00:00
def main():
knowledge = KnowledgeBase(
knowledge=base_knowledge,
)
differences = knowledge.train(examples)
2017-09-21 23:00:09 +00:00
logging.debug("----")
logging.debug(differences())
logging.debug("----")
2017-05-23 19:57:51 +00:00
test_assumption(True, knowledge, {'text': 'earth is a planet'})
test_assumption(True, knowledge, {'text': 'is lava dangerous?'})
for test in [{'text': 'a bus can run'}, {'text': 'io is a moon'}]:
row = test['text']
result, inferred_tree, differences = knowledge.process(row)
2017-09-21 23:00:09 +00:00
logging.debug("result:", result)
logging.debug(differences())
logging.debug("---")
logging.debug('-----')
logging.debug(json.dumps(sorted(knowledge.knowledge.keys()), indent=4))
logging.debug('-----')
2017-05-23 19:57:51 +00:00
queryTrue = {
"text": "is io a moon?",
"parsed": ("question", ("pertenence-to-group", "io", "moon"))
}
queryFalse = {
"text": "is io a planet?",
"parsed": ("question", ("pertenence-to-group", "io", "planet"))
}
test_assumption(False, knowledge, queryFalse)
test_assumption(True, knowledge, queryTrue)
2017-09-18 02:01:59 +00:00
return knowledge