自然语言处理NLP学习笔记三:使用Django做一个NLP的Web站点

匿名 (未验证) 提交于 2019-12-02 23:52:01

前言:

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

如果想做一个类似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

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

linux下命令:

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

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

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


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

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

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

3)UI-使用bootstrap美化界面

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

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

STATIC_URL='/static/'

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

5)路由系统-urls.py

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

增加

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

执行命令

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})
View Code

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>
View Code

附:用到的知识:

view.py中:



html中:

view.js中

html中:





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!