Package nltk_lite :: Package contrib :: Package mit :: Package six863 :: Package semantics :: Module interact
[hide private]
[frames] | no frames]

Source Code for Module nltk_lite.contrib.mit.six863.semantics.interact

 1  from featurechart import * 
 2  from logic import Counter 
 3  import sys 
 4   
5 -def interact(grammar_filename, trace=2):
6 cp = load_earley(grammar_filename, trace=trace-2) 7 model = [] 8 counter = Counter() 9 while True: 10 sys.stdout.write('> ') 11 line = sys.stdin.readline().strip() 12 if not line: break 13 14 # Read a line and parse it. 15 trees = cp.parse(line) 16 if len(trees) == 0: 17 print "I don't understand." 18 continue 19 elif len(trees) > 1: 20 print "That was ambiguous, but I'll guess at what you meant." 21 22 # Extract semantic information from the parse tree. 23 tree = trees[0] 24 pos = tree[0][0].node['pos'] 25 sem = tree[0].node['sem'] 26 27 # We need variables to have unique names even if they didn't get 28 # alpha-converted already. Replace all the variables that are unbound 29 # via skolemization -- but not the ones that are completely free, 30 # like "mary" -- with uniquely-named ones. 31 free = sem.free() 32 skolem = sem.skolemize() 33 almostfree = skolem.free() 34 vars = set(almostfree).difference(free) 35 for var in vars: 36 skolem = skolem.replace_unique(var, counter) 37 38 if trace > 0: 39 print tree 40 print 'Semantic value:', skolem 41 clauses = skolem.clauses() 42 if trace > 1: 43 print "Got these clauses:" 44 for clause in clauses: 45 print '\t', clause 46 47 if pos == 'S': 48 # Handle statements 49 model += clauses 50 elif pos == 'Q': 51 # Handle questions 52 bindings = {} 53 success = True 54 for clause in clauses: 55 success = False 56 for known in model: 57 newbindings = dict(bindings) 58 try: 59 unify(object_to_features(clause), 60 object_to_features(known), newbindings) 61 bindings = newbindings 62 success = True 63 break 64 except UnificationFailure: 65 continue 66 if not success: 67 break 68 if success: 69 # answer 70 answer = bindings.get('wh', 'Yes.') 71 print answer['variable']['name'] 72 else: 73 # This is an open world without negation, so negative answers 74 # aren't possible. 75 print "I don't know."
76
77 -def demo():
78 interact('lab3-slash.cfg', trace=2)
79 80 if __name__ == '__main__': 81 demo() 82