項目整體設計為前后端完全分離的模式,
前端采用react以及amazeui構建用戶交互界面,
后端采用python flask提供restful接口與前端UI交互起源于 Facebook 的內部項目竞川,用來架設 Instagram 的網(wǎng)站堡妒,并于 2013 年 5 月開源。它擁有較高的性能排抬,代碼邏輯非常簡單栈拖,越來越多的人已開始關注和使用它连舍。下面詳細介紹前端UI實現(xiàn)中涉及的一些技術
ECMAScript 6
ECMAScript 6(以下簡稱 ES6)是 JavaScript 語言的下一代標準,已經(jīng)在 2015 年 6 月正式發(fā)布了涩哟。Mozilla 公司將在這個標準的基礎上索赏,推出 JavaScript 2.0。
ES6 的目標贴彼,是使得 JavaScript 語言可以用來編寫大型的復雜的應用程序潜腻,成為企業(yè)級開發(fā)語言。
簡單說器仗,ECMAScript 是 JavaScript 語言的國際標準融涣,JavaScript 是 ECMAScript 的實現(xiàn)童番。
截止至今各大瀏覽器的最新版本,隨著時間的推移威鹿,對ES6支持度已經(jīng)越來越高了剃斧,ES6 的大部分特性都實現(xiàn)了。
babel
babel是一個能讓我們今天就來用下一代 JavaScript 語法寫代碼的廣泛使用的自動轉碼器
Babel是一個轉換編譯器忽你,它能將ES6轉換成可以在瀏覽器中運行的代碼幼东。Babel由來自澳大利亞的開發(fā)者Sebastian McKenzie創(chuàng)建。他的目標是使Babel可以處理ES6的所有新語法科雳,并為它內置了React JSX擴展及Flow類型注解支持根蟹。
Babel是所有ES6轉換編譯器中與ES6規(guī)范兼容度最高的,甚至超過了谷歌創(chuàng)建已久的Traceur編譯器糟秘。Babel允許開發(fā)者使用ES6的所有新特性娜亿,而且不會影響與老版本瀏覽器的兼容性。此外蚌堵,它還支持許多不同的構建&測試系統(tǒng),使開發(fā)者很容易將它集成到自己的工具鏈中沛婴。
Babel從根本上講是一個平臺吼畏,這是它與compile-to-JS語言CoffeeScript和TypeScript最大的不同。Babel的插件系統(tǒng)允許開發(fā)者自定義代碼轉換器并插入到編譯過程嘁灯。這些轉換器會接收一棵抽象語法樹泻蚊,并在代碼轉換成可執(zhí)行的JavaScript之前對其進行操作。
Babel還能提升JavaScript的執(zhí)行速度丑婿。由于JavaScript文件加載和執(zhí)行速度慢會嚴重影響用戶體驗性雄,所以JIT沒有時間在運行時執(zhí)行所有技術上可行的優(yōu)化。相比之下羹奉,Babel是在編譯時運行秒旋,沒有這么嚴格的時間限制。借助強大的作用域跟蹤和類型推斷功能及插件系統(tǒng)诀拭,開發(fā)者可以構建轉換器來執(zhí)行此類優(yōu)化
nodejs
Node.js采用C++語言編寫而成迁筛,是一個Javascript的運行環(huán)境。Node.js采用了Google Chrome瀏覽器的V8引擎耕挨,性能很好细卧,同時還提供了很多系統(tǒng)級的API,如文件操作筒占、網(wǎng)絡編程等贪庙。瀏覽器端的Javascript代碼在運行時會受到各種安全性的限制,對客戶系統(tǒng)的操作有限翰苫。相比之下止邮,Node.js則是一個全面的后臺運行時,為Javascript提供了其他語言能夠實現(xiàn)的許多功能。
Node.js的設計思想中以事件驅動為核心农尖,它提供的絕大多數(shù)API都是基于事件的析恋、異步的風格。以Net模塊為例盛卡,其中的net.Socket對象就有以下事件:connect助隧、data、end滑沧、timeout并村、drain、error滓技、close等哩牍,使用Node.js的開發(fā)人員需要根據(jù)自己的業(yè)務邏輯注冊相應的回調函數(shù)。這些回調函數(shù)都是異步執(zhí)行的令漂,這意味著雖然在代碼結構中膝昆,這些函數(shù)看似是依次注冊的,但是它們并不依賴于自身出現(xiàn)的順序叠必,而是等待相應的事件觸發(fā)荚孵。事件驅動、異步編程的設計重要的優(yōu)勢在于纬朝,充分利用了系統(tǒng)資源收叶,執(zhí)行代碼無須阻塞等待某種操作完成,有限的資源可以用于其他的任務共苛。
NPM
NPM是隨同NodeJS一起安裝的包管理工具判没,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種:
允許用戶從NPM服務器下載別人編寫的第三方包到本地使用隅茎。
允許用戶從NPM服務器下載并安裝別人編寫的命令行程序到本地使用澄峰。
允許用戶將自己編寫的包或命令行程序上傳到NPM服務器供別人使用。
版本號
使用NPM下載和發(fā)布代碼時都會接觸到版本號辟犀。NPM使用語義版本號來管理代碼摊阀,這里簡單介紹一下。
語義版本號分為X.Y.Z三位踪蹬,分別代表主版本號胞此、次版本號和補丁版本號。當代碼變更時跃捣,版本號按以下原則更新漱牵。
如果只是修復bug,需要更新Z位疚漆。
如果是新增了功能酣胀,但是向下兼容刁赦,需要更新Y位。
如果有大變動闻镶,向下不兼容甚脉,需要更新X位。
版本號有了這個保證后铆农,在申明第三方包依賴時牺氨,除了可依賴于一個固定版本號外,還可依賴于某個范圍的版本號墩剖。例如"argv": "0.0.x"表示依賴于0.0.x系列的最新版argv猴凹。
React
React 是一個用于構建用戶界面的 JAVASCRIPT 庫。
React 特點
1.聲明式設計 ?React采用聲明范式岭皂,可以輕松描述應用郊霎。
2.高效 ?React通過對DOM的模擬,最大限度地減少與DOM的交互爷绘。
3.靈活 ?React可以與已知的庫或框架很好地配合书劝。
4.JSX ? JSX 是 JavaScript 語法的擴展。React 開發(fā)不一定使用 JSX 土至,但我們建議使用它购对。
5.組件 ? 通過 React 構建組件,使得代碼更加容易得到復用毙籽,能夠很好的應用在大項目的開發(fā)中。
6.單向響應的數(shù)據(jù)流 ? React 實現(xiàn)了單向響應的數(shù)據(jù)流毡庆,從而減少了重復代碼坑赡,這也是它為什么比傳統(tǒng)數(shù)據(jù)綁定更簡單。
react-router
在 web 應用開發(fā)中么抗,路由系統(tǒng)是不可或缺的一部分毅否。在瀏覽器當前的 URL 發(fā)生變化時,路由系統(tǒng)會做出一些響應蝇刀,用來保證用戶界面與 URL 的同步螟加。隨著單頁應用時代的到來,為之服務的前端路由系統(tǒng)也相繼出現(xiàn)了吞琐。有一些獨立的第三方路由系統(tǒng)捆探,比如 director ,代碼庫也比較輕量站粟。react-router 就是這樣一個構建單頁應用的路由系統(tǒng)
react-router 有如下的特征
Router 與 Route 一樣都是 react 組件 黍图,它的 history 對象是整個路由系統(tǒng)的核心,它暴漏了很多屬性和方法在路由系統(tǒng)中使用奴烙;
Route 的 path 屬性表示路由組件所對應的路徑助被,可以是絕對或相對路徑剖张,相對路徑可繼承;
Redirect 是一個重定向組件揩环,有 from 和 to 兩個屬性搔弄;
Route 的 onEnter 鉤子將用于在渲染對象的組件前做攔截操作,比如驗證權限丰滑;
在 Route 中顾犹,可以使用 component 指定單個組件,或者通過 components 指定多個組件集合吨枉;
param 通過 /:param 的方式傳遞蹦渣,這種寫法與 express 以及 ruby on rails 保持一致,符合 RestFul 規(guī)范貌亭;
路由的基本原理
無論是傳統(tǒng)的后端 MVC 主導的應用柬唯,還是在當下最流行的單頁面應用中,路由的職責都很重要圃庭,但原理并不復雜锄奢,即保證視圖和 URL 的同步,而視圖可以看成是資源的一種表現(xiàn)剧腻。當用戶在頁面中進行操作時拘央,應用會在若干個交互狀態(tài)中切換,路由則可以記錄下某些重要的狀態(tài)书在,比如在一個博客系統(tǒng)中用戶是否登錄灰伟、在訪問哪一篇文章、位于文章歸檔列表的第幾頁儒旬。而這些變化同樣會被記錄在瀏覽器的歷史中栏账,用戶可以通過瀏覽器的前進、后退按鈕切換狀態(tài)栈源,同樣可以將 URL 分享給好友挡爵。簡而言之,用戶可以通過手動輸入或者與頁面進行交互來改變 URL甚垦,然后通過同步或者異步的方式向服務端發(fā)送請求獲取資源(當然茶鹃,資源也可能存在于本地),成功后重新繪制 UI艰亮,原理如下圖所示:
amazeui-react
amazeui是中國首個開源的html5跨屏前端框架Amaze UI React基于 React.js 開發(fā)的 Web 組件庫它基于 React 封裝組件闭翩,不再疲于組織雜亂的 HTML 標簽;組件可以按需組合迄埃、功能擴展方便男杈。
gulp
gulp是前端開發(fā)過程中一種基于流的代碼構建工具,是自動化項目的構建利器调俘;她不僅能對網(wǎng)站資源進行優(yōu)化伶棒,而且在開發(fā)過程中很多重復的任務能夠使用正確的工具自動完成旺垒;使用她,不僅可以很愉快的編寫代碼肤无,而且大大提高我們的工作效率先蒋。
gulp是基于Nodejs的自動任務運行器, 她能自動化地完成 javascript宛渐、coffee竞漾、sass、less窥翩、html/image业岁、css 等文件的測試、檢查寇蚊、合并笔时、壓縮、格式化仗岸、瀏覽器自動刷新允耿、部署文件生成,并監(jiān)聽文件在改動后重復指定的這些步驟扒怖。在實現(xiàn)上较锡,她借鑒了Unix操作系統(tǒng)的管道(pipe)思想,前一級的輸出盗痒,直接變成后一級的輸入蚂蕴,使得在操作上非常簡單。
流,簡單來說就是建立在面向對象基礎上的一種抽象的處理數(shù)據(jù)的工具俯邓。在流中骡楼,定義了一些處理數(shù)據(jù)的基本操作,如讀取數(shù)據(jù)看成,寫入數(shù)據(jù)等君编,程序員是對流進行所有操作的跨嘉,而不用關心流的另一頭數(shù)據(jù)的真正流向川慌。流不但可以處理文件,還可以處理動態(tài)內存祠乃、網(wǎng)絡數(shù)據(jù)等多種數(shù)據(jù)形式梦重。
而gulp正是通過流和代碼優(yōu)于配置的策略來盡量簡化任務編寫的工作。這看起來有點“像jQuery”的方法亮瓷,把動作串起來創(chuàng)建構建任務琴拧。早在Unix的初期,流就已經(jīng)存在了嘱支。流在Node.js生態(tài)系統(tǒng)中也扮演了重要的角色蚓胸,類似于*nix將幾乎所有設備抽象為文件一樣挣饥,Node將幾乎所有IO操作都抽象成了stream的操作。因此用gulp編寫任務也可看作是用Node.js編寫任務沛膳。當使用流時扔枫,gulp去除了中間文件,只將最后的輸出寫入磁盤锹安,整個過程因此變得更快短荐。
易于使用
通過代碼優(yōu)于配置的策略,gulp 讓簡單的任務簡單叹哭,復雜的任務可管理忍宋。
構建快速
利用 Node.js 流的威力,你可以快速構建項目并減少頻繁的 IO 操作风罩。
易于學習
通過最少的 API糠排,掌握 gulp 毫不費力,構建工作盡在掌握:如同一系列流管道泊交。
首先確保你已經(jīng)正確安裝了nodejs環(huán)境乳讥。然后以全局方式安裝gulp:
npm install -g gulp
全局安裝gulp后,還需要在每個要使用gulp的項目中都單獨安裝一次廓俭。把目錄切換到你的項目文件夾中云石,然后在命令行中執(zhí)行:
npm install gulp
如果想在安裝的時候把gulp寫進項目package.json文件的依賴中,則可以加上–save-dev:
npm install --save-dev gulp
這樣就完成了gulp的安裝研乒,接下來就可以在項目中應用gulp了汹忠。
插件高質
gulp 嚴格的插件指南確保插件如你期望的那樣簡潔高質得工作。
flask+gunicorn
Flask 是一個使用 Python 編寫的輕量級 Web 應用框架雹熬。其 WSGI 工具箱采用 Werkzeug 宽菜,模板引擎則使用 Jinja2。
Flask 也被稱為 “microframework” 竿报,因為它使用簡單的核心铅乡,用 extension 增加其他功能。Flask沒有默認使用的數(shù)據(jù)庫烈菌、窗體驗證工具阵幸。然而,F(xiàn)lask保留了擴增的彈性芽世,可以用Flask-extension加入這些功能:ORM挚赊、窗體驗證工具、文件上傳济瓢、各種開放式身份驗證技術荠割。
Gunicorn (獨角獸)是一個高效的Python WSGI Server,通常用它來運行 wsgi application(由我們自己編寫遵循WSGI application的編寫規(guī)范) 或者 wsgi framework(如Django,Paster),地位相當于Java中的Tomcat。
中文分詞
詞是最小的能夠獨立活動的有意義的語言成分旺矾,英文單詞之間是以空格作為自然分界符的蔑鹦,而漢語是以字為基本的書寫單位夺克,詞語之間沒有明顯的區(qū)分標記,因此嚎朽,中文詞語分析是中文信息處理的基礎與關鍵懊直。
分詞算法可分為三大類:
1.基于詞典:基于字典、詞庫匹配的分詞方法火鼻;(字符串匹配室囊、機械分詞法)
2.基于統(tǒng)計:基于詞頻度統(tǒng)計的分詞方法;
3.基于規(guī)則:基于知識理解的分詞方法魁索。
第一類方法應用詞典匹配融撞、漢語詞法或其它漢語語言知識進行分詞,如:最大匹配法粗蔚、最小分詞方法等尝偎。這類方法簡單、分詞效率較高,但漢語語言現(xiàn)象復雜豐富鹏控,詞典的完備性致扯、規(guī)則的一致性等問題使其難以適應開放的大規(guī)模文本的分詞處理。第二類基于統(tǒng)計的分詞方法則基于字和詞的統(tǒng)計信息当辐,如把相鄰字間的信息抖僵、詞頻及相應的共現(xiàn)信息等應用于分詞,由于這些信息是通過調查真實語料而取得的缘揪,因而基于統(tǒng)計的分詞方法具有較好的實用性耍群。
jieba
jieba是一款效果很好,運行穩(wěn)定的Python 中文分詞組件
支持三種分詞模式:
精確模式找筝,試圖將句子最精確地切開蹈垢,適合文本分析;
全模式袖裕,把句子中所有的可以成詞的詞語都掃描出來, 速度非巢芴В快,但是不能解決歧義急鳄;
搜索引擎模式谤民,在精確模式的基礎上,對長詞再次切分攒岛,提高召回率赖临,適合用于搜索引擎分詞胞锰。
支持繁體分詞
支持自定義詞典
基于前綴詞典實現(xiàn)高效的詞圖掃描灾锯,生成句子中漢字所有可能成詞情況所構成的有向無環(huán)圖 (DAG)
采用了動態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合
對于未登錄詞,采用了基于漢字成詞能力的 HMM 模型嗅榕,使用了 Viterbi 算法
word2vec
word2vec是一個將單詞轉換成向量形式的工具顺饮〕炒希可以把對文本內容的處理簡化為向量空間中的向量運算,計算出向量空間上的相似度兼雄,來表示文本語義上的相似度吟逝。
1.詞向量是什么
自然語言理解的問題要轉化為機器學習的問題,第一步肯定是要找一種方法把這些符號數(shù)學化赦肋。
NLP 中最直觀块攒,也是到目前為止最常用的詞表示方法是 One-hot Representation,這種方法把每個詞表示為一個很長的向量佃乘。這個向量的維度是詞表大小囱井,其中絕大多數(shù)元素為 0,只有一個維度的值為 1趣避,這個維度就代表了當前的詞庞呕。
2詞向量的用法最常見的有兩種:
- 直接用于神經(jīng)網(wǎng)絡模型的輸入層。如 C&W 的 SENNA 系統(tǒng)中程帕,將訓練好的詞向量作為輸入住练,用前饋網(wǎng)絡和卷積網(wǎng)絡完成了詞性標注、語義角色標注等一系列任務愁拭。再如 Socher 將詞向量作為輸入讲逛,用遞歸神經(jīng)網(wǎng)絡完成了句法分析、情感分析等多項任務岭埠。
- 作為輔助特征擴充現(xiàn)有模型妆绞。如 Turian 將詞向量作為額外的特征加入到接近 state of the art 的方法中,進一步提高了命名實體識別和短語識別的效果枫攀。
tensorflow
TensorFlow? 是一個采用數(shù)據(jù)流圖(data flow graphs)括饶,用于數(shù)值計算的開源軟件庫。節(jié)點(Nodes)在圖中表示數(shù)學操作来涨,圖中的線(edges)則表示在節(jié)點間相互聯(lián)系的多維數(shù)據(jù)數(shù)組图焰,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU)抢肛,服務器蚀同,移動設備等等。TensorFlow 最初由Google大腦小組(隸屬于Google機器智能研究機構)的研究員和工程師們開發(fā)出來藤滥,用于機器學習和深度神經(jīng)網(wǎng)絡方面的研究,但這個系統(tǒng)的通用性使其也可廣泛用于其他計算領域社裆。
什么是數(shù)據(jù)流圖(Data Flow Graph)?
數(shù)據(jù)流圖用“結點”(nodes)和“線”(edges)的有向圖來描述數(shù)學計算拙绊。“節(jié)點” 一般用來表示施加的數(shù)學操作,但也可以表示數(shù)據(jù)輸入(feed in)的起點/輸出(push out)的終點标沪,或者是讀取/寫入持久變量(persistent variable)的終點榄攀。“線”表示“節(jié)點”之間的輸入/輸出關系金句。這些數(shù)據(jù)“線”可以輸運“size可動態(tài)調整”的多維數(shù)據(jù)數(shù)組檩赢,即“張量”(tensor)。張量從圖中流過的直觀圖像是這個工具取名為“Tensorflow”的原因违寞。一旦輸入端的所有張量準備好贞瞒,節(jié)點將被分配到各種計算設備完成異步并行地執(zhí)行運算。
TensorFlow的特征
高度的靈活性
真正的可移植性(Portability)
將科研和產(chǎn)品聯(lián)系在一起
自動求微分
多語言支持
性能最優(yōu)化
tensorlayer
TensorLayer 是為研究人員和工程師設計的一款基于Google TensorFlow開發(fā)的深度學習與強化學習庫趁曼。 它提供高級別的(Higher-Level)深度學習API憔狞,這樣不僅可以加快研究人員的實驗速度,也能夠減少工程師在實際開發(fā)當中的重復工作彰阴。 TensorLayer非常易于修改和擴展瘾敢,這使它可以同時用于機器學習的研究與應用。 此外尿这,TensorLayer 提供了大量示例和教程來幫助初學者理解深度學習簇抵,并提供大量的官方例子程序方便開發(fā)者快速找到適合自己項目的例子。
RNN
循環(huán)神經(jīng)網(wǎng)絡(Recurrent Neural Networks射众,RNNs)已經(jīng)在眾多自然語言處理(Natural Language Processing, NLP)中取得了巨大成功以及廣泛應用碟摆。RNNs已經(jīng)被在實踐中證明對NLP是非常成功的。如詞向量表達叨橱、語句合法性檢查典蜕、詞性標注等。在RNNs中罗洗,目前使用最廣泛最成功的模型便是LSTMs(Long Short-Term Memory愉舔,長短時記憶模型)模型