【NLP】Python之词性标注界面化实现

       小白之前文章中有介绍过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

其他部分小白标注如上面代码,如有未标注清楚之处,欢迎留言~

运行上面代码后,打开上面网址,出现页面后,输入一段文字如下图:

点击显示标注:结果如下图:

发布了91 篇原创文章 · 获赞 125 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Jarry_cm/article/details/103065854