小白之前文章中有介绍过jieba词性标注,这篇博文,总结一下小白实现的一个界面化词性标注的案例,可以在平时积累一些文章,快速的获取词性标注的结果文档。
在具体举例之前,需要先安利一个重要的工具--Tornado。Tornado既是一个web server,也是web framework。而它作为web server 采用的是asynchronous IO的网络模型,这是一种很高效的模型。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。
如果没有安装过这个包的小伙伴,可以pip一下安装该包。
安装:pip install tornado
安装之后,进入实战~
1.首先,需要创建一个HTML脚本,实现界面化
由于小白是HTML的0基础选手,所以写的比较简单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>'标注TEST'</title>
</head>
<body>
<center>
<br><br><br>
<form class="form-horizontal" role="form" method="post" action="/result" style="width:600px"><!--带有两个输入字段和一个提交按钮的 HTML 表单 class="form-horizontal"横向布局-->
<!-- 框 -->
<div class="form-group">
<label for="event" class="col-sm-2 control-label">输入文字</label>
<div class="col-sm-10"><!--屏幕对应不同的值 中等屏幕设备上该div占用8列的宽度-->
<textarea type="text" class="form-control" id="detail" style="width:300px; height:100px" name="detail"></textarea>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<br>
<button type="submit" class="btn btn-success">显示标注</button>
</div>
</div>
<form>
<br>
<!-- 标注的结果展示-->
<div style="width:600px">
<p> 内容:{{data[0]}} </p>
<table class="table table-striped">
{% for char, tag in zip(data[0], data[1]) %}
<tr>
<td>{{char}} </td>
<td>{{tag}} </td>
</tr>
{%end%}
</table>
</div>
</center>
</body>
</html>
界面如下:
2.Python脚本
import os.path
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
import os
import jieba.posseg as pseg
import jieba
# 获取当前所在目录的txt文本的最大数值
def get_max_num(path):
files = os.listdir(path)
if files:
numbers = list(map(lambda x: int(x.replace('.txt', '')), files))
return max(numbers)
else:
return 0
#定义端口为9001
define("port", default=9001, help="run on the given port", type=int)
# GET请求
class QueryHandler(tornado.web.RequestHandler): # RequestHandler:封装对请求处理的所有信息和处理方法
# get函数 get/post/..:封装对应的请求方式
def get(self):
self.render('test2.html', data = ['', []])
# POST请求
class PostHandler(tornado.web.RequestHandler):
# post函数
def post(self):
# 获取前端参数,
detail = self.get_argument('detail')
print(type(detail))
words = pseg.cut(detail) # 词性标注
detail = []
tags = []
for w in words:
# print (w.word,w.flag)
detail.append(w.word)
tags.append(w.flag)
# print (result)
print(detail)
print('----------------')
print(tags)
# 前端显示序列标注信息
# tags = ['O'] * len(detail)
result = [detail,tags]
self.render('test2.html', data=result)
# 保存为txt文件
dir_path = 'd:/Users/time_tagging_platform_result'
with open('%s/%s.txt' % (dir_path, get_max_num(dir_path)+1), 'w', encoding='utf-8') as f:
for char, tag in zip(detail, tags):
f.write(char+' '+tag+'') # write():封装响应信息,写响应信息的一个方法
# 主函数
def main():
# 开启tornado服务
tornado.options.parse_command_line()
# 定义app
app = tornado.web.Application(
handlers=[(r'/query', QueryHandler),
(r'/result', PostHandler)],# 网页路径控制
template_path=os.path.dirname(__file__) # 模板路径
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port) # 设置端口
tornado.ioloop.IOLoop.instance().start() # 启动web程序,开始监听端口的连接 start()启动IOLoop实力对象的IO循环,开启监听
# tornado.ioloop:核心io循环模块,封装linux的epoll和BSD的kqueue, tornado高性能处理的核心。
main()
虽然代码中小白做了很多注释,不过还是对几个重要的函数做一些解释:
get_max_num:这个函数主要是为了,每次在保存文档时,先检测,每次标注保存文档的文件夹下游哪些文档,以避免文档被覆盖。
定义端口号的作用是,在查询网址时使用,比如小白的网址就是:http://localhost:9001/query
其他部分小白标注如上面代码,如有未标注清楚之处,欢迎留言~
运行上面代码后,打开上面网址,出现页面后,输入一段文字如下图:
点击显示标注:结果如下图: