張少迪 鄭炅 艾山·吾買爾 趙全軍
摘要:隨著機器學(xué)習(xí)的不斷興起,python編程語言也逐漸的被更多人所知和使用,而Django作為由python編寫的Web應(yīng)用框架,也開始被更多的工程和項目所使用。但是隨著互聯(lián)網(wǎng)進程的不斷推進,人們對于速度的要求也在逐漸加大,多線程的成為了各大企業(yè)和機構(gòu)不可或缺的需要,而傳統(tǒng)的Django在多線程上的拙劣表現(xiàn)也讓人大失所望,因此,本系統(tǒng)采用了Django+uWSGI+Nginx的框架,很好的解決了多線程和高并發(fā)的問題,而且還擁有了負載均衡的功能,使得中文關(guān)鍵詞提取系統(tǒng)的速度提升到了一個新的高度。
關(guān)鍵詞:python;Django;多線程;uWSGI;Nginx
中圖分類號:TP391 ? 文獻標識碼:A
文章編號:1009-3044(2019)13-0220-03
Abstract: With the rising of machine learning, python programming language is gradually known and used by more people, and Django, as a web application framework written by python, is also beginning to be used by more projects and projects. However, with the continuous advancement of the Internet process, people's demand for speed is also increasing. Multithreading has become an indispensable requirement for major enterprises and institutions. The poor performance of traditional Django on multithreading is also disappointing. Therefore, the system adopts the framework of Django+uWSGI+Nginx, which solves the problems of multithreading and high concurrency very well. With the function of load balancing, the speed of Chinese keyword extraction system has been raised to a new level.
Key Words: python; Django; multithreading; uWSGI; Nginx
1 引言
隨著互聯(lián)網(wǎng)進程的加快,人們產(chǎn)生的信息也在面臨指數(shù)級的增漲,如何從日益龐大的數(shù)據(jù)中過濾出關(guān)鍵的信息成為學(xué)者們逐漸關(guān)注的課題,信息抽取任務(wù)也因此應(yīng)運而生。信息抽取包括文本摘要提取、文本關(guān)鍵短語提取、文本關(guān)鍵詞提取[1]等任務(wù),關(guān)鍵詞提取作為最基礎(chǔ)也是需求量最大的一環(huán),也成為學(xué)者們研究的最多也最為透徹的一環(huán)。
本文設(shè)計的中文關(guān)鍵詞提取系統(tǒng)是一個基于Django[2]的關(guān)鍵詞提取接口,當用戶調(diào)用該接口之時,會對用戶輸入的文本進行關(guān)鍵詞提取,并將結(jié)果返回給用戶。該系統(tǒng)采用了Django+uWSGI+Nginx的開源開發(fā)框架來進行web[3]設(shè)計的,需要分別對Django[4]、uWSGI以及Nginx[5]來進行配置,從而使得這三者能夠連接在一起,共同進行接口的調(diào)用。該關(guān)鍵詞提取系統(tǒng)的工作流程如圖1所示。
2 關(guān)鍵詞提取系統(tǒng)服務(wù)器環(huán)境配置
本文中關(guān)鍵詞提取系統(tǒng)使用的編程語言為pytthon語言為python3.5.2,操作系統(tǒng)為centos7.2。以下為關(guān)鍵詞提取系統(tǒng)服務(wù)器的配置過程,包括Anaconda的安裝,核心算法依賴包的安裝,Django的安裝與配置,uWSGI的安裝與配置以及Nginx的安裝與配置:
2.1 Anaconda的安裝
Anaconda指的是一個開源的Python發(fā)行版本,其中包含了conda、Python、numpy、pandas等180多個科學(xué)包及其依賴項,而且也可以用于在同一個機器上安裝不同版本的軟件包及依賴,能夠在不同的環(huán)境之間切換。
1) 下載Anaconda3-4.2.0-Linux-x86_64.sh版本。
2) 在安裝包目錄輸入以下指令
#bash Anaconda3-4.2.0-Linux-x86_64.sh
//同意許可證
#yes
//同意將Anaconda添加進環(huán)境變量
#yes
3) 安裝完成后,輸入python,顯示python版本和Anaconda版本即為安裝成功。
2.2 依賴包的安裝
1)安裝依賴包jieba 0.39
2)下載jieba 0.39的安裝包
3)在安裝包的目錄下打開命令行輸入以下指令
#pip install jieba-0.39.tar.gz
4)安裝networkx 1.11
5)下載networkx1.11的安裝包
6)在安裝包的目錄下打開命令行輸入以下指令
#pip install networkx-1.11.tar.gz
2.3 Django的安裝
1)下載Django-1.11.17.tar.gz
2)在安裝包的目錄下打開命令行輸入以下指令
#pip install Django-1.11.17.tar.gz
2.4 uWSGI的安裝
1)下載uwsgi-2.0.17.1.tar.gz
2)在安裝包的目錄下打開命令行輸入以下指令
#pip install uwsgi-2.0.17.1.tar.gz
2.5 Nginx的安裝
1)下載Nginx的安裝包,nginx-1.12.2.tar.gz
2)在安裝包目錄下打開命令行輸入以下指令
//解壓安裝包
#tar -zxvf nainx-1.12.2.tar.gz
//進入nginx文件目錄
#cd nginx-1.12.2
#./configure
#make
#make install
3)運行Nginx
//進入Nginx的目錄
#cd /usr/local/nginx/sbin
//啟動Nginx
#sudo ./nginx
4)打開瀏覽器,輸入本機地址,127.0.0.1,如果看到頁面上顯示“Welcome to nginx”即為安裝成功。
3 項目部署
配置整個中文關(guān)鍵詞提取系統(tǒng)需要配置三方面內(nèi)容,包括配置Django,配置uWSGI以及配置Nginx。
3.1 配置Django
配置Django需要先創(chuàng)建Django工程,修改相關(guān)的視圖函數(shù)以及url,同時修改settings.py的設(shè)置。具體操作如下:
1)創(chuàng)建一個Django工程zh_KeyExtraction
#django-admin.py startproject zhKeyExtraction
創(chuàng)建成功后會在目錄下生成文件夾zh_KeyExtraction以及文件manage.py,文件夾zh_KeyExtraction下有__init__.py,settings.py,urls.py,wsgi.py。
2)新建一個名為keyextraction_app的app
#django-admin.py startapp keyextraction_app
創(chuàng)建成功后會生成keyextraction_app的文件夾,其中包含admin.py,apps.py,__init__.py,models.py,tests.py以及views.py。
4) 將核心代碼放入keyextraction_app文件夾中,并配置views.py,創(chuàng)建get請求和post請求,以及json格式數(shù)據(jù)的解析和封裝,核心代碼如下:
#k_w = Key_Word_Extraction()
#def processkey(request):
# ? ?if request.method == 'GET':
# ? ? ? ?text = request.GET.get('text')
# ? ? ? ?retdata=k_w.keywordextraction(text)
# ? return HttpResponse(Tojson(retdata), charset='utf8')
# ? ?else:
# ? ? ? ?dt = request.body.decode()
# ? ? ? ?jsdt = json.loads(dt)
#return HttpResponse(Tojson(jsdt['text']), charset='utf8')
#def Tojson(data):
# ? ?dt={}
# ? ?dt['code']=200
# ? ?dt['data']=data
# ? ?return json.dumps(dt,ensure_ascii=False)
4)配置zh_KeyExtraction文件夾下的urls.py文件,具體如下:
#urlpatterns = [
# ? url(r'^admin/', admin.site.urls),
# ? url(r'^keyextraction$', views.processkey,name='keyextraction$')]
5)配置settings.py文件,具體如下:
//將ALLOWED_HOSTS改為*可以保證該服務(wù)在不同ip的服務(wù)器上也可以順利運行。
#ALLOWED_HOSTS = ['*']
//注釋掉MIDDLEWARE可以有效防止post請求時,檢測到?jīng)]有csrf字符串而產(chǎn)生報錯。
# #'django.middleware.csrf.CsrfViewMiddleware'
至此,Django就全部配置完成了。
3.2 配置uWSGI
配置uWSGI需要在django項目的根目錄下創(chuàng)建配置文件,uwsgi.ini,配置文件的內(nèi)容如下:
[uwsgi]
// 對外提供 http 服務(wù)的端口
#http = :10920 #這里改為自己的
//用于和 nginx 進行數(shù)據(jù)交互的端口
#socket = 127.0.0.1:10930
//django 程序的主目錄
#chdir=/home/zsd/zh_KeyExtraction
//django中wsgi.py文件的目錄
#wsgi-file=/home/zsd/zh_KeyExtraction/KeyExtraction/wsgi.py
//最大的進程數(shù)
#processes = 4
//每個進程中的線程數(shù)
#threads = 2
3.3配置Nginx
配置Nginx需要進如Nginx的文件夾下,配置相應(yīng)的配置文件,并重啟Nginx。
1)進入Nginx的目錄
#cd /usr/local/nginx/conf/
2)創(chuàng)建文件夾conf.d用于存放配置文件
#mkdir conf.d
3)進入conf.d文件夾下并創(chuàng)建配置文件zh_kw.conf
#cd conf.d
#sudo vim zh_kw.conf
4)編輯配置文件,配置內(nèi)容如下
#upstream zh_kw{
//假設(shè)有兩臺服務(wù)器,而且都部署有相同的服務(wù),兩臺服務(wù)器ip分別為10.11.12.3和10.11.12.4,設(shè)置nginx可以將請求平均分配到這兩個端口號上,即可將效率大幅提升。
#server 10.11.12.3:10910
#server 10.11.12.4:10910 }
#server {
# ? listen ? ?10940;
# ? server_name localhost;
# ? location / {
# ? ? ? proxy_set_header Host $http_host;
# ? ? ? proxy_pass http://zh_kw;
# include /usr/local/nginx/conf/uwsgi_params;}}
# server {
# ? ? listen ? ? ? 10910;
# ? ? server_name ?localhost;
# ? ? location / {
# ? ? ? ? uwsgi_pass 127.0.0.1:12130;
# ? ? ? ? uwsgi_send_timeout 600;
# ? ? ? ? uwsgi_connect_timeout 600;
# ? ? ? ? uwsgi_read_timeout 600;
# ? ? ? ? client_max_body_size 500m;
# ? ? ? ? client_body_buffer_size 1024k;
# include /usr/local/nginx/conf/uwsgi_params;}
# error_page ? 500 502 503 504 ?/50x.html;
# ? ? location = /50x.html {
# ? ? ? ? root ? etc/nginx/default-site/;}}
5)重新啟動Nginx
//進入nginx啟動程序的目錄
#cd /usr/local/nginx/sbin
//啟動nginx
#sudo ./nginx
4 遠程測試
經(jīng)過以上的配置,中文關(guān)鍵詞提取系統(tǒng)已經(jīng)完成,啟動服務(wù)后即可進行測試,啟動方式如下:
//進入django項目的根目錄下
#cd /home/zsd/zh_KeyExtraction
//啟動django項目
#uwsgi --ini uwsgi.ini
啟動完成后,打開瀏覽器,在地址欄輸入以下數(shù)據(jù):
#127.0.0.1:10910/extraction?text=”我感謝中國共產(chǎn)黨的領(lǐng)導(dǎo)?!?/p>
得到以下結(jié)果:
{“code”:200,”data”:{“中國”,”共產(chǎn)黨”,”領(lǐng)導(dǎo)”,”感謝”}}
可以發(fā)現(xiàn)該服務(wù)已經(jīng)正常啟動了,用戶可以通過上述方式的get請求對該接口進行訪問,或者通過post請求對該接口進行訪問,提取所需的中文關(guān)鍵詞。
此外,我們選擇從騰訊大豫網(wǎng)上面爬取了10000篇中文新聞作為測試語料,對該接口的速度進行并發(fā)性測試,測試數(shù)據(jù)如下表所示:
由上表可知,Django+uWSGI+Nginx在一定的范圍內(nèi),多線程的效果提升非常顯著,當達到硬件的瓶頸后,速度不再提升,但是仍然十分穩(wěn)定,所有的請求都能夠成功返回。
5 總結(jié)
綜上所述,基于Django的中文關(guān)鍵詞提取系統(tǒng),在加入了uWSGI和Nginx之后,在多線程方面的表現(xiàn)非常出色,有效的解決了Django在多線程方面的缺陷,使得關(guān)鍵詞提取的速度更加的快捷,極大的提升了使用者的工作效率。
參考文獻:
[1] 趙京勝,朱巧明,周國棟,等.自動關(guān)鍵詞抽取研究綜述[J].軟件學(xué)報,2017,28(09):2431-2449.
[2] 郭鹍,蔣曉龍,趙甲文.基于Django框架的電子海圖服務(wù)器設(shè)計[J].電腦知識與技術(shù),2018,14(19):61-63.
[3] 楊改紅,趙冬,鄧豪,等.基于WEB的遠程體育教學(xué)平臺的開發(fā)與設(shè)計[J].電子設(shè)計工程,2018,26(22):10-13+18.
[4] 楊剛.基于Django的在線考試系統(tǒng)的設(shè)計與實現(xiàn)[J].電腦知識與技術(shù),2016,12(14):40-42.
[5] 戴偉,馬明棟,王得玉.基于Nginx的負載均衡技術(shù)研究與優(yōu)化[J/OL].計算機技術(shù)與發(fā)展,2019(03):1-7[2019-03-02].http://kns.cnki.net/kcms/detail/61.1450.TP.20181219.1511.038.html.
【通聯(lián)編輯:梁書】