def parse(self, sentences): ''' Accepts as arguments a sentence or a list of sentences. Returns the syntactic structure of the sentences in form of MLN databases containing the respective atoms. :param sentences: a sentence or list of sentences in natural language :return: a list of databases returned by parse_db ''' #======================================================================= # Create a temporary file in which nlparse will write its result #======================================================================= filepath = None with NamedTemporaryFile(suffix='.db', delete=False) as f: filepath = f.name cmd = [ 'python', os.path.join(self.module_path, 'src', 'nlparse.py'), '--out-file', filepath ] cmd.extend([json.dumps(s) for s in sentences]) logger.debug('Calling Stanford Parser: '.format(cmd)) envs = os.environ envs.update({"PYTHONPATH": locations.code_base}) subprocess.call( cmd, env=envs, ) with open(filepath, 'r') as f: c = f.read() return parse_db(self.mln, c)
def update_result_from_dbeditor(self): dbtext = self.db_container.editor.get("1.0", END).encode('utf8').strip() dbobj = parse_db(self.prac.mln, dbtext, ignore_unknown_preds=self.config.get( 'ignore_unknown_preds', True)) self.prac_inference.inference_steps[-1].output_dbs = dbobj
def loaddb(self, mln, config, db=None): if db is None: if config == 'query': config = self.queryconf elif config == 'learn': config = self.learnconf else: raise Exception('Need a database name or config.') from pracmln.mln.database import parse_db path = self.path if hasattr(self, 'path') else None out(db) out(self.dbs[db]) return parse_db(mln, self.dbs[ifNone(db, config['db'])], ignore_unknown_preds=config['ignore_unknown_preds'], projectpath=path)
def loaddb(self, mln, config, db=None): if db is None: if config not in ['query', 'learn']: raise Exception('Need a database name or config.') if config == 'query': config = self.queryconf elif config == 'learn': config = self.learnconf from pracmln.mln.database import parse_db path = self.path if hasattr(self, 'path') else None return parse_db(mln, self.dbs[ifnone(db, config['db'])], ignore_unknown_preds=config['ignore_unknown_preds'], projectpath=path)
def __get_db(self, request, config, mln): if not request.query.evidence and config.db == "": raise Exception("No evidence provided!") if request.query.evidence and config.db != "": raise Exception( "Duplicate evidence; provide either a db in the config or an evidence db in the query" ) if request.query.evidence: to_return = parse_db( mln, reduce(lambda x, y: x + "\n" + y, request.query.evidence)) else: to_return = Database.load(mln, config.db) if len(to_return) != 1: raise Exception("Only one db is supported!") return to_return[0]
def learn(self, savegeometry=True, options=None, *_): if options is None: options = {} mln_content = self.mln_container.editor.get("1.0", END).strip() db_content = self.db_container.editor.get("1.0", END).strip() # create conf from current gui settings self.update_config() # write gui settings self.write_gconfig(savegeometry=savegeometry) # hide gui self.master.withdraw() try: print((headline('PRAC LEARNING TOOL'))) print() if options.get('mlnarg') is not None: mlnobj = MLN(mlnfile=os.path.abspath(options.get('mlnarg')), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) else: mlnobj = parse_mln(mln_content, searchpaths=[self.project_dir], projectpath=os.path.join(self.project_dir, self.project.name), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) if options.get('dbarg') is not None: dbobj = Database.load(mlnobj, dbfiles=[options.get('dbarg')], ignore_unknown_preds=self.config.get('ignore_unknown_preds', True)) else: if self.config.get('pattern'): local, dblist = self.get_training_db_paths(self.config.get('pattern').strip()) dbobj = [] # build database list from project dbs if local: for dbname in dblist: dbobj.extend(parse_db(mlnobj, self.project.dbs[dbname].strip(), ignore_unknown_preds=self.config.get('ignore_unknown_preds', True), projectpath=os.path.join(self.dir, self.project.name))) out(dbobj) # build database list from filesystem dbs else: for dbpath in dblist: dbobj.extend(Database.load(mlnobj, dbpath, ignore_unknown_preds= self.config.get('ignore_unknown_preds', True))) # build single db from currently selected db else: dbobj = parse_db(mlnobj, db_content, projectpath=os.path.join(self.dir, self.project.name), dirs=[self.dir]) learning = MLNLearn(config=self.config, mln=mlnobj, db=dbobj) result = learning.run() # write to file if run from commandline, otherwise save result # to project results if options.get('outputfile') is not None: output = io.StringIO() result.write(output) with open(os.path.abspath(options.get('outputfile')), 'w') as f: f.write(output.getvalue()) logger.info('saved result to {}'.format(os.path.abspath(options.get('outputfile')))) elif self.save.get(): output = io.StringIO() result.write(output) self.project.add_mln(self.output_filename.get(), output.getvalue()) self.mln_container.update_file_choices() self.project.save(dirpath=self.project_dir) logger.info('saved result to file mln/{} in project {}'.format(self.output_filename.get(), self.project.name)) else: logger.debug("No output file given - results have not been saved.") except: traceback.print_exc() # restore gui sys.stdout.flush() self.master.deiconify()
def infer(self, savegeometry=True, options={}, *args): mln_content = self.mln_container.editor.get("1.0", END).strip() db_content = self.db_container.editor.get("1.0", END).strip() # create conf from current gui settings self.update_config() # write gui settings self.write_gconfig(savegeometry=savegeometry) # hide gui self.master.withdraw() try: print((headline('PRACMLN QUERY TOOL'))) print() if options.get('mlnarg') is not None: mlnobj = MLN(mlnfile=os.path.abspath(options.get('mlnarg')), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) else: mlnobj = parse_mln( mln_content, searchpaths=[self.dir], projectpath=os.path.join(self.dir, self.project.name), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) if options.get('emlnarg') is not None: emln_content = mlnpath(options.get('emlnarg')).content else: emln_content = self.emln_container.editor.get("1.0", END).strip() if options.get('dbarg') is not None: dbobj = Database.load(mlnobj, dbfiles=[options.get('dbarg')], ignore_unknown_preds=self.config.get( 'ignore_unknown_preds', True)) else: out(self.config.get('ignore_unknown_preds', True)) dbobj = parse_db(mlnobj, db_content, ignore_unknown_preds=self.config.get( 'ignore_unknown_preds', True)) if options.get('queryarg') is not None: self.config["queries"] = options.get('queryarg') infer = MLNQuery(config=self.config, mln=mlnobj, db=dbobj, emln=emln_content) result = infer.run() # write to file if run from commandline, otherwise save result to project results if options.get('outputfile') is not None: output = io.StringIO() result.write(output) with open(os.path.abspath(options.get('outputfile')), 'w') as f: f.write(output.getvalue()) logger.info('saved result to {}'.format( os.path.abspath(options.get('outputfile')))) elif self.save.get(): output = io.StringIO() result.write(output) fname = self.output_filename.get() self.project.add_result(fname, output.getvalue()) self.project.save(dirpath=self.dir) logger.info( 'saved result to file results/{} in project {}'.format( fname, self.project.name)) else: logger.debug( 'No output file given - results have not been saved.') except: traceback.print_exc() # restore main window sys.stdout.flush() self.master.deiconify()
def learn(self, savegeometry=True, options={}, *args): mln_content = self.mln_container.editor.get("1.0", END).encode('utf8').strip() db_content = self.db_container.editor.get("1.0", END).encode('utf8').strip() # create conf from current gui settings self.update_config() # write gui settings self.write_gconfig(savegeometry=savegeometry) # hide gui self.master.withdraw() try: print headline('PRAC LEARNING TOOL') print if options.get('mlnarg') is not None: mlnobj = MLN(mlnfile=os.path.abspath(options.get('mlnarg')), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) else: mlnobj = parse_mln(mln_content, searchpaths=[self.project_dir], projectpath=os.path.join(self.project_dir, self.project.name), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) if options.get('dbarg') is not None: dbobj = Database.load(mlnobj, dbfiles=[options.get('dbarg')], ignore_unknown_preds=self.config.get('ignore_unknown_preds', True)) else: if self.config.get('pattern'): local, dblist = self.get_training_db_paths(self.config.get('pattern').strip()) dbobj = [] # build database list from project dbs if local: for dbname in dblist: dbobj.extend(parse_db(mlnobj, self.project.dbs[dbname].strip(), ignore_unknown_preds=self.config.get('ignore_unknown_preds', True), projectpath=os.path.join(self.dir, self.project.name))) out(dbobj) # build database list from filesystem dbs else: for dbpath in dblist: dbobj.extend(Database.load(mlnobj, dbpath, ignore_unknown_preds= self.config.get('ignore_unknown_preds', True))) # build single db from currently selected db else: dbobj = parse_db(mlnobj, db_content, projectpath=os.path.join(self.dir, self.project.name), dirs=[self.dir]) learning = MLNLearn(config=self.config, mln=mlnobj, db=dbobj) result = learning.run() # write to file if run from commandline, otherwise save result # to project results if options.get('outputfile') is not None: output = StringIO.StringIO() result.write(output) with open(os.path.abspath(options.get('outputfile')), 'w') as f: f.write(output.getvalue()) logger.info('saved result to {}'.format(os.path.abspath(options.get('outputfile')))) elif self.save.get(): output = StringIO.StringIO() result.write(output) self.project.add_mln(self.output_filename.get(), output.getvalue()) self.mln_container.update_file_choices() self.project.save(dirpath=self.project_dir) logger.info('saved result to file mln/{} in project {}'.format(self.output_filename.get(), self.project.name)) else: logger.debug("No output file given - results have not been saved.") except: traceback.print_exc() # restore gui sys.stdout.flush() self.master.deiconify()
def infer(self, savegeometry=True, options={}, *args): mln_content = self.mln_container.editor.get("1.0", END).encode('utf8').strip() db_content = self.db_container.editor.get("1.0", END).encode('utf8').strip() # create conf from current gui settings self.update_config() # write gui settings self.write_gconfig(savegeometry=savegeometry) # hide gui self.master.withdraw() try: print headline('PRACMLN QUERY TOOL') print if options.get('mlnarg') is not None: mlnobj = MLN(mlnfile=os.path.abspath(options.get('mlnarg')), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) else: mlnobj = parse_mln(mln_content, searchpaths=[self.dir], projectpath=os.path.join(self.dir, self.project.name), logic=self.config.get('logic', 'FirstOrderLogic'), grammar=self.config.get('grammar', 'PRACGrammar')) if options.get('emlnarg') is not None: emln_content = mlnpath(options.get('emlnarg')).content else: emln_content = self.emln_container.editor.get("1.0", END).encode('utf8').strip() if options.get('dbarg') is not None: dbobj = Database.load(mlnobj, dbfiles=[options.get('dbarg')], ignore_unknown_preds=self.config.get('ignore_unknown_preds', True)) else: out(self.config.get('ignore_unknown_preds', True)) dbobj = parse_db(mlnobj, db_content, ignore_unknown_preds=self.config.get('ignore_unknown_preds', True)) if options.get('queryarg') is not None: self.config["queries"] = options.get('queryarg') infer = MLNQuery(config=self.config, mln=mlnobj, db=dbobj, emln=emln_content) result = infer.run() # write to file if run from commandline, otherwise save result to project results if options.get('outputfile') is not None: output = StringIO.StringIO() result.write(output) with open(os.path.abspath(options.get('outputfile')), 'w') as f: f.write(output.getvalue()) logger.info('saved result to {}'.format(os.path.abspath(options.get('outputfile')))) elif self.save.get(): output = StringIO.StringIO() result.write(output) fname = self.output_filename.get() self.project.add_result(fname, output.getvalue()) self.project.save(dirpath=self.dir) logger.info('saved result to file results/{} in project {}'.format(fname, self.project.name)) else: logger.debug('No output file given - results have not been saved.') except: traceback.print_exc() # restore main window sys.stdout.flush() self.master.deiconify()