# -*- coding:utf-8 -* from __future__ import print_function import StringIO from argparse import ArgumentParser import tornado.ioloop import tornado.web import tensorflow as tf from tagger import Model def load_template(): page = ''' <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script> function loadXMLDoc() { var xmlhttp; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else { // IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("out").innerHTML=decodeURI(xmlhttp.responseText); } } var sentences=document.getElementById("in").value var req="sentences="+sentences req=encodeURI(req) xmlhttp.open("POST","/%s",true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.send(req); } </script> </head> <body> <div> <textarea id="in" style="height:400px;width:500px;font-size:18px"></textarea> <button onclick="loadXMLDoc()" style="height:25px;width:80px;font-size:18px">%s</button> <textarea id="out" style="height:400px;width:500px;font-size:18px"></textarea> </div> <br> <br> This is a %s demo provided by Chunqi Wang (chqiwang@126.com). </body> </html> ''' % (TASK.scope, TASK.scope, TASK.scope) return page class Tagger(object): def __init__(self, sess, model_dir, scope, batch_size): self.model = Model(scope, sess) self.batch_size = batch_size self.model.load_model(model_dir) def tag(self, sentences): sentences = self.preprocess(sentences) sf = StringIO.StringIO() sf.write(sentences) sf.seek(0) data = TASK.read_raw_file_all(sf) output = self.model.tag_all(data, self.batch_size) return TASK.create_output(*output) def preprocess(self, sentences): return sentences class MainHandler(tornado.web.RequestHandler): def get(self): self.write(load_template()) class TaskHandler(tornado.web.RequestHandler): def initialize(self, tagger): self.tagger = tagger def post(self): sentences = self.get_argument('sentences') segs = self.tagger.tag(sentences) self.write('\n'.join(segs)) def make_app(model_dir): config = tf.ConfigProto() config.gpu_options.allow_growth = True config.gpu_options.per_process_gpu_memory_fraction = 1.0 config.allow_soft_placement = True config.log_device_placement = True sess = tf.Session(config=config) tagger = Tagger(sess=sess, model_dir=model_dir, scope=TASK.scope, batch_size=200) return tornado.web.Application([ (r"/", MainHandler), (r"/%s" % TASK.scope, TaskHandler, {'tagger': tagger}) ]) if __name__ == "__main__": parser = ArgumentParser() parser.add_argument('--task', dest='task') parser.add_argument('--model_dir', dest='model_dir') parser.add_argument('--port', dest='port', type=int, default=8888) args = parser.parse_args() TASK = __import__(args.task) app = make_app(args.model_dir) app.listen(args.port) tornado.ioloop.IOLoop.current().start()