天然語言處理NLP學習筆記三:使用Django作一個NLP的Web站點

 

前言:css

前面咱們已經能初步實現一箇中文天然處理語言的模型了,但交互界面是命令行的,不太友好。html

若是想作一個相似http://xiaosi.trs.cn/demo/rs/demo的界面,那就還須要繼續往下處理。python

 

 

Djangolinux

因爲Jiagu等使用了python語言,因此Web站點的實現,優先考慮到python的web框架。web

而這裏選擇了還比較流行的Django。算法

 

教程參考:django

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

http://www.javashuo.com/article/p-kcvusssu-c.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})
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

 

 

 

附:用到的知識:

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>

相關文章
相關標籤/搜索