前言:

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

如果想做一个类似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. pheonix从入门到进阶

    别人写的帖子感觉很好,记录一下: https://blog.csdn.net/u013411339/article/details/90657429

  2. uniapp上传图片转base64码

    uni.chooseImage({ count: 9, success: res => { this.imageList = this.imageList.concat(res.tempFile ...

  3. 【Winform-自定义控件】自定义Tab Control 带关闭符号(X)的标签页

    a form & a tabControl 思路: DrawMode设一定要设为OwnerDrawFixed 事件:Form_Load.tabControl1_DrawItem.tabCont ...

  4. jsp上传超大文件解决方案

    1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...

  5. Python 运算符优先级

    这个表给出Python的运算符优先级(从低到高). 从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合). 这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上 ...

  6. 读狼书,重温flask

    最近做个简单的MIS系统, 趁机读<flask web 开发实战 入门.进阶与原理解析> 李辉.  由于是flask官方团队的人写的.方方面面都很细致. 很多写法.配置,和之前0.X时代也 ...

  7. 两篇将rf和boosting方法用在搜索排序上的paper

    在网上看到关于排序学习的早期文章,这两篇文章大致都使用了Random Forest和Boosting方法. 一.paper 1.Web-Search Ranking with Initialized ...

  8. scrapy pipeline

    pipeline的四个方法 @classmethod def from_crawler(cls, crawler): """ 初始化的时候,用以创建pipeline对象 ...

  9. truncate at 255 characters with xlsx files(OLEDB方式读取Excel丢失数据、字符串截断的原因和解决方法)

    The TypeGuessRows setting is supported by ACE. Note the version numbers in the key may change depend ...

  10. Maximum upload size exceede上传文件大小超出解决

    在这里记录三种方法, 努力提高自己的姿势水平 application.yml配置 spring: servlet: multipart: enabled: true max-file-size: 10 ...