2017-05-11 17:54:02 +00:00
|
|
|
import copy
|
|
|
|
|
|
|
|
import parsing
|
|
|
|
import knowledge_evaluation
|
2017-05-11 18:24:29 +00:00
|
|
|
from modifiable_property import ModifiableProperty
|
2017-05-11 17:54:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
def diff_knowledge(before, after):
|
|
|
|
import jsondiff
|
|
|
|
return jsondiff.diff(before, after)
|
|
|
|
|
|
|
|
|
|
|
|
class KnowledgeBase(object):
|
|
|
|
def __init__(self, knowledge, examples=[], trained=[]):
|
|
|
|
self.knowledge = copy.copy(knowledge)
|
|
|
|
self.examples = copy.copy(examples)
|
|
|
|
self.trained = copy.copy(trained)
|
|
|
|
|
|
|
|
def train(self, examples):
|
|
|
|
knowledge_before = copy.deepcopy(self.knowledge)
|
|
|
|
|
|
|
|
# Parse everything
|
|
|
|
parsed_examples = []
|
|
|
|
for example in examples:
|
2017-05-15 14:51:39 +00:00
|
|
|
print("\x1b[7;32m> {} \x1b[0m".format(example))
|
2017-05-11 17:54:02 +00:00
|
|
|
tokens, decomposition, inferred_tree = parsing.integrate_language(self, example)
|
|
|
|
print(tokens)
|
2017-05-11 18:24:29 +00:00
|
|
|
result = knowledge_evaluation.integrate_information(self.knowledge, {
|
2017-05-11 17:54:02 +00:00
|
|
|
"elements": tokens,
|
|
|
|
"decomposition": decomposition,
|
|
|
|
"parsed": inferred_tree,
|
|
|
|
})
|
2017-05-15 14:51:39 +00:00
|
|
|
|
|
|
|
print("\x1b[7;33m< {} \x1b[0m".format(self.get_value(result)))
|
2017-05-11 18:24:29 +00:00
|
|
|
self.act_upon(result)
|
2017-05-15 14:51:39 +00:00
|
|
|
print("\x1b[7;34m< {} \x1b[0m".format(self.get_value(result)))
|
2017-05-13 18:28:11 +00:00
|
|
|
self.examples.append((decomposition, inferred_tree))
|
2017-05-11 17:54:02 +00:00
|
|
|
|
2017-05-13 18:28:11 +00:00
|
|
|
# Reduce values
|
|
|
|
self.trained = parsing.reprocess_language_knowledge(self, self.examples)
|
2017-05-11 17:54:02 +00:00
|
|
|
|
|
|
|
knowledge_after = copy.deepcopy(self.knowledge)
|
|
|
|
knowledge_diff_getter = lambda: diff_knowledge(knowledge_before,
|
|
|
|
knowledge_after)
|
|
|
|
|
|
|
|
return knowledge_diff_getter
|
|
|
|
|
|
|
|
|
|
|
|
def process(self, row):
|
|
|
|
knowledge_before = copy.deepcopy(self.knowledge)
|
2017-05-16 20:46:22 +00:00
|
|
|
print("\x1b[7;32m> {} \x1b[0m".format(row))
|
2017-05-11 18:56:01 +00:00
|
|
|
tokens, decomposition, inferred_tree = parsing.get_fit(self, row)
|
2017-05-11 17:54:02 +00:00
|
|
|
result = knowledge_evaluation.integrate_information(self.knowledge,
|
|
|
|
{
|
2017-05-11 18:56:01 +00:00
|
|
|
"elements": tokens,
|
2017-05-11 17:54:02 +00:00
|
|
|
"decomposition": decomposition,
|
|
|
|
"parsed": inferred_tree,
|
|
|
|
})
|
2017-05-11 18:24:29 +00:00
|
|
|
self.act_upon(result)
|
|
|
|
|
2017-05-11 17:54:02 +00:00
|
|
|
knowledge_after = copy.deepcopy(self.knowledge)
|
|
|
|
knowledge_diff_getter = lambda: diff_knowledge(knowledge_before,
|
|
|
|
knowledge_after)
|
|
|
|
|
2017-05-11 19:13:27 +00:00
|
|
|
return result, inferred_tree, knowledge_diff_getter
|
2017-05-11 18:24:29 +00:00
|
|
|
|
2017-05-15 14:51:39 +00:00
|
|
|
def get_value(self, result):
|
|
|
|
if isinstance(result, ModifiableProperty):
|
|
|
|
return result.getter()
|
|
|
|
else:
|
|
|
|
return result
|
|
|
|
|
2017-05-11 18:24:29 +00:00
|
|
|
def act_upon(self, result):
|
|
|
|
if isinstance(result, ModifiableProperty):
|
|
|
|
result.setter()
|
|
|
|
else:
|
|
|
|
print(result)
|