前言:

前面我们已经能初步实现一个中文自然处理语言的模型了,但交互界面是命令行的,不太友好。

如果想做一个类似http://xiaosi.trs.cn/demo/rs/demo的界面,那就还需要继续往下处理。

Django

由于Jiagu等使用了python语言,所以Web站点的实现,优先考虑到python的web框架。

而这里选择了还比较流行的Django。

教程参考:

https://www.runoob.com/django/django-tutorial.html

https://www.cnblogs.com/feixuelove1009/p/5823135.html

1. Diango安装

pip install Diango

2. 创建一个Web站点

使用 django-admin命令来创建一个叫ai的项目

进入部署目录,Anaconda promt下cd

anaconda集成下安装默认的目录是: \anaconda\Lib\site-packages\django\bin\

django-admin startproject ai

linux下命令:

linux下默认安装目录是:/usr/local/python3/lib/python3.7/site-packages/django/bin/

python  django-admin.py  startproject ai

3. 编写Web页面

1)设置环境信息,修改settings.py

django知道我们的html文件在哪里,需要修改settings文件的相应内容。默认下不用修改

'DIRS': []修改为 'DIRS': [BASE_DIR+"/templates", ]

同时注释以下行,暂时关闭一下django的csrf跨站请求保护机制(涉及用户输入时会调用到,如不处理会报错):

MIDDLEWARE = [
   # 'django.middleware.csrf.CsrfViewMiddleware',

在ALLOWED_HOSTS = []中添加允许的IP ALLOWED_HOSTS = ['XX.XX.XX.XX']--当然,如果默认127.0.0.1运行,则不需要此步骤

2)表现层-创建template目录,并创建index.html

按Diango的分层思想,在界面显示的内容(表现层),放在模板Template中。

因此,我们先在项目下创建template的目录,并创建index.html文件。文件的内容后续补充。

3)UI-使用bootstrap美化界面

在项目中新建static目录,并放入bootstrap的目录。

同时在settings.py加入static目录的引用:

STATIC_URL='/static/'
STATICFILES_DIRS=(os.path.join(BASE_DIR, "static"),)

4) 控制器层-业务逻辑,修改view.py

这里用于向模板层提供数据,我们定义一个函数,html接收用户输入,view处理后返回给用户。

5)路由系统-urls.py

浏览器输入的url,通过这个urls.py文件转发到业务逻辑中

增加

import from ai import views

urlpatterns = [
path('admin/', admin.site.urls),
path('', views.login),
path('login/', views.login),
]

4. 启动Web服务

执行命令

python manage.py runserver 127.0.0.1:8000

python manage.py runserver IP:8000

5. 查看效果

浏览器打开url: http://127.0.0.1:8000/

主要代码:

views.py

# -*- coding: utf-8 -*-
from django.shortcuts import render
import jiagu # Create your views here.
from django.shortcuts import render,redirect words=""
keywords=""
knowledge=""
summarize=""
def login(request):
# request 包含用户提交的所有信息
words = ""
keywords=""
knowledge=""
summarize=""
text=""
pos=""
ner=""
newPos={}
newNer={} dict1 = {'B-PER':'人名','B-LOC':'地名','B-ORG':'机构名','I-PER':'人名','I-LOC':'地名','I-ORG':'机构名','O':'不是名词短语'}
dict2 = {'n':'普通名词','nt':'时间名词','nd':'方位名词','nl':'处所名词','nh':'人名','nhf':'姓','nhs':'名',
'ns':'地名','nn':'族名','ni':'机构名','nz':'其他专名','v':'动词','a':'形容词','m':'数词','d':'副词','w':'标点符号','ws':'非汉字字符串','i':'习用语','j':'缩略语',
'r':'代词','p':'介词','c':'连词','u':'助词','e':'叹词','vd':'趋向动词','vl':'联系动词','vu':'能愿动词','x':'非语素字','m':'数词','q':'量词','mq':'待定','o':'拟声词','k':'后接成分'} if request.method == 'POST':
inputText = request.POST.get('input',None)
output = request.POST.get('output',None)
text=inputText
words = jiagu.seg(text) # 分词,可以用model选择分词模式,不填则默认,mmseg则使用mmseg算法
if (len(text)<=6):
try:
keywords = jiagu.keywords(text, 1)
except ValueError:
print("关键词设置不当,请联系管理员!")
elif (len(text)<=30):
print(len(text))
keywords = jiagu.keywords(text, 3)
else:
try:
keywords = jiagu.keywords(text, 5)
except ValueError:
print("关键词设置不当,请联系管理员!") knowledge = jiagu.knowledge(text) # 知识抽取
summarize = jiagu.summarize(text, 1) # 摘要
pos = jiagu.pos(words) # 词性标注
ner = jiagu.ner(text) # 命名实体识别 j=len(pos)-1
tmp=0
tmp2=0
while tmp<=j:
k=pos[tmp]
newPos[tmp]=(words[tmp],k,dict2[k])
tmp=tmp+1 i=len(ner)-1
while tmp2<=i:
t=ner[tmp2]
newNer[tmp2]=(text[tmp2],t,dict1[t])
tmp2=tmp2+1
print(words)
print(keywords)
print(newPos)
print(knowledge)
return render(request, 'login.html',{"text":text,"words":words,"keywords":keywords,"knowledge":knowledge,"summarize":summarize,"pos":newPos,"ner":newNer})

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<style> label{ width: 80px;
text-align: right;
display: inline-block; }
</style>
<link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css" >
</head>
<body>
<div class="container">
<form action="/login/" method="post" class="form-horizontal">
<filedset>
<legend><lable> <span class="glyphicon glyphicon-home"></span>&nbsp;NLP自然语言处理 </lable></legend> <div class="row">
<!--栅格系统,每row行共12列,分个3div,每1,3个div占3列,第2个div则占5列,即3列+5列+4列=12列-->
<span class="glyphicon glyphicon-pencil"></span>&nbsp;请输入要处理的语言:
<input type="text" name="input" placeholder="请输入你要处理的文本:例如:广州市" class="form-control" style="margin: 20px 0px 0px; height: 104px; width: 807px;" required value={{text}} >
</div> <div class="row">
<br>
<div class="col-sm-7 col-sm-offset-7">
<input type="submit" value="一键处理" class="btn btn-xs btn-primary" >
<!-- <button type="reset" value="Reset" class="btn btn-xs btn-warning"></button>-->
</div>
</div> <legend><lable> <span class="glyphicon glyphicon-road"></span>&nbsp;分析结果 </lable></legend>
<br>
<div class="row">
<div class="col-sm-3"><span class="glyphicon glyphicon-scissors"></span>&nbsp;自动分词结果: </div>
<div class="col-sm-6">
{%for output in words%}
{{output}}
{% endfor %}
</div>
<div class="col-sm-3"></div>
</div> <br>
<div class="row">
<div class="col-sm-3" ><span class="glyphicon glyphicon-lock"></span>&nbsp;关键词获取结果: </div>
<div class="col-sm-6">
{%for output in keywords%}
{{output}}
{% endfor %}
</div>
<div class="col-sm-3"></div>
</div> <br>
<div class="row">
<div class="col-sm-3" ><span class="glyphicon glyphicon-font"></span>&nbsp;文本摘要: </div>
<div class="col-sm-6">
{%for output in summarize%}
{{output}}
{% endfor %}</div>
<div class="col-sm-3"></div>
</div> <br>
<div class="row">
<div class="col-sm-3" ><span class="glyphicon glyphicon-cog"></span>&nbsp;词性分析: </div>
<div class="col-sm-6"> {{pos}}
</div>
<div class="col-sm-3"></div>
</div> <br>
<div class="row">
<div class="col-sm-3" ><span class="glyphicon glyphicon-th"></span>&nbsp;实体识别: </div>
<div class="col-sm-6"> {{ner}}
</div>
<div class="col-sm-3"></div>
</div> <br>
<div class="row">
<div class="col-sm-3" ><span class="glyphicon glyphicon-tree-deciduous"></span>&nbsp;知识图谱关系: </div>
<div class="col-sm-6"> {{knowledge}}
</div>
<div class="col-sm-3"></div>
</div>
</filedset>
</form>
</div> </body>
</html>

附:用到的知识:

1. Django获取用户界面表单提交过来的数据

view.py中:

if request.method == 'POST':
    # 获取用户通过post 提交过来的数据
        inputText = request.POST.get('input',None)

html中:

<form action="/login/" method="post" class="form-horizontal">

       <input type="text" name="input" value={{text}} >       

2. Django返回用户界面数据并展示在html中

view.js中

return render(request, 'index.html',{"text":text,"words":words})

html中:

<div class="col-sm-6">
              {%for output in words%}
              {{output}}
              {% endfor %}
        </div>

自然语言处理NLP学习笔记三:使用Django做一个NLP的Web站点的更多相关文章

  1. QML学习笔记(五)— 做一个简单的待做事项列表

    做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...

  2. django创建一个简单的web站点

    一.新建project 使用Pycharm,File->New Project…,选择Django,给project命名 (project不能用test命名)   新建的project目录如下: ...

  3. ROS学习笔记三:编写第一个ROS节点程序

    在编写第一个ROS节点程序之前需要创建工作空间(workspace)和功能包(package).   1 创建工作空间(workspace) 创建一个catkin_ws: #注意:如果使用sudo一次 ...

  4. angular学习笔记(三十)-指令(9)-一个简单的指令示例

    学了前面这么多关于指令的知识,现在就用指令来写一个小组件:expander 这个组件的功能就是点击开展菜单,再点击收起菜单: ↑↓点击展开收起 下面来看它的代码: html: <!DOCTYPE ...

  5. 【WPF】学习笔记(一)——做一个简单的电子签名板

    参加实习(WPF)已经有两个多周的时间了,踩了一些坑,也算积累了一些小东西,准备慢慢拿出来分享一下.(●'◡'●) 这次呢就讲讲一个简单的电子签名板的实现. 先上张图(PS:字写得比较丑,不要太在意哈 ...

  6. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  7. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  8. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  9. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

随机推荐

  1. Hadoop-No.12之数据采集的时效性

    数据采集的时效性,指的是可进行数据采集的时间与Hadoop中工具可访问数量的时间之间的间隔.采集架构的时间分类会对存储媒介和采集方法造成很大的影响. 一般来说,在设计应用的采集构架之前建议使用以下分类 ...

  2. Java-五种线程池,四种拒绝策略,三种阻塞队列(转)

    Java-五种线程池,四种拒绝策略,三种阻塞队列 三种阻塞队列:    BlockingQueue<Runnable> workQueue = null;    workQueue = n ...

  3. 问题[scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to...

    原因是二次解析的域名被过滤掉了, 解决办法 解决办法一: yield scrapy.Request(url=detail_url, meta={'item': item}, callback=self ...

  4. 移动端布局Rem

    一.最好用没有之一 http://www.jianshu.com/p/b00cd3506782 虽然博主说这个方案已经过期了 但是新方案还没有理解 就接着沿用这个 可以根据自己常用的设计稿的宽度修改 ...

  5. 交换机配置——三层交换机实现VLAN间通信

    一.实验目的::用三层交换机让同一vlan的主机能通信,不同vlan的主机也能通信 二.拓扑图如下 三.具体步骤如下:. 先给每台主机和服务器配置ip地址和网关 例: (1)S1三层交换机配置: Sw ...

  6. [HNOI2004][bzoj1211] 树的计数(prufer序列)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3432  Solved: 1295[Submit][Stat ...

  7. sql 用表组织数据

    一.四种完整性约束 1.实体完整性约束:不允许出现相同记录的数据 2.域完整性约束:对字段进行限定,不得插入不符合限定的数据 3.引用完整性:表与表之间的关系 4.自定义完整性约束:开发人员自己设定对 ...

  8. 十八、MySQL 数据排名查询某条数据是总数据的第几条

    ) as rowno )) b ORDER BY a.zjf DESC 注意:mysql的下标是从0开始的 参考文章: https://blog.csdn.net/warylee/article/de ...

  9. [题解] [HNOI2014] 世界树

    题面 [HNOI2014]世界树 题解 从数据范围很容易看出是个虚树DP(可惜看出来了也还是不会做) 虚树大家应该都会, 不会的话自己去搜吧, 我懒得讲了, 我们在这里只需要考虑如何DP即可 首先我们 ...

  10. 线程系列4--Java线程范围内的共享数据(一)

    这张图片是我看传智播客的视频时的截屏,这个图片很直观的展示了线程范围内的数据共享.当同一个线程在执行三个不同业务模块时,这三个业务模块访问的数据是共享的.更直白的说,当一个执行线索在穿个每个业务模块时 ...