自動(dòng)寫作項(xiàng)目相關(guān)技術(shù)

項(xiàng)目整體設(shè)計(jì)為前后端完全分離的模式,
前端采用react以及amazeui構(gòu)建用戶交互界面,
后端采用python flask提供restful接口與前端UI交互起源于 Facebook 的內(nèi)部項(xiàng)目,用來架設(shè) Instagram 的網(wǎng)站,并于 2013 年 5 月開源。它擁有較高的性能,代碼邏輯非常簡單,越來越多的人已開始關(guān)注和使用它。下面詳細(xì)介紹前端UI實(shí)現(xiàn)中涉及的一些技術(shù)

ECMAScript 6

ECMAScript 6(以下簡稱 ES6)是 JavaScript 語言的下一代標(biāo)準(zhǔn),已經(jīng)在 2015 年 6 月正式發(fā)布了。Mozilla 公司將在這個(gè)標(biāo)準(zhǔn)的基礎(chǔ)上,推出 JavaScript 2.0。
ES6 的目標(biāo),是使得 JavaScript 語言可以用來編寫大型的復(fù)雜的應(yīng)用程序,成為企業(yè)級(jí)開發(fā)語言。
簡單說,ECMAScript 是 JavaScript 語言的國際標(biāo)準(zhǔn),JavaScript 是 ECMAScript 的實(shí)現(xiàn)。
截止至今各大瀏覽器的最新版本,隨著時(shí)間的推移,對(duì)ES6支持度已經(jīng)越來越高了,ES6 的大部分特性都實(shí)現(xiàn)了。

babel

babel是一個(gè)能讓我們今天就來用下一代 JavaScript 語法寫代碼的廣泛使用的自動(dòng)轉(zhuǎn)碼器
Babel是一個(gè)轉(zhuǎn)換編譯器,它能將ES6轉(zhuǎn)換成可以在瀏覽器中運(yùn)行的代碼。Babel由來自澳大利亞的開發(fā)者Sebastian McKenzie創(chuàng)建。他的目標(biāo)是使Babel可以處理ES6的所有新語法,并為它內(nèi)置了React JSX擴(kuò)展及Flow類型注解支持。
Babel是所有ES6轉(zhuǎn)換編譯器中與ES6規(guī)范兼容度最高的,甚至超過了谷歌創(chuàng)建已久的Traceur編譯器。Babel允許開發(fā)者使用ES6的所有新特性,而且不會(huì)影響與老版本瀏覽器的兼容性。此外,它還支持許多不同的構(gòu)建&測(cè)試系統(tǒng),使開發(fā)者很容易將它集成到自己的工具鏈中。
Babel從根本上講是一個(gè)平臺(tái),這是它與compile-to-JS語言CoffeeScript和TypeScript最大的不同。Babel的插件系統(tǒng)允許開發(fā)者自定義代碼轉(zhuǎn)換器并插入到編譯過程。這些轉(zhuǎn)換器會(huì)接收一棵抽象語法樹,并在代碼轉(zhuǎn)換成可執(zhí)行的JavaScript之前對(duì)其進(jìn)行操作。
Babel還能提升JavaScript的執(zhí)行速度。由于JavaScript文件加載和執(zhí)行速度慢會(huì)嚴(yán)重影響用戶體驗(yàn),所以JIT沒有時(shí)間在運(yùn)行時(shí)執(zhí)行所有技術(shù)上可行的優(yōu)化。相比之下,Babel是在編譯時(shí)運(yùn)行,沒有這么嚴(yán)格的時(shí)間限制。借助強(qiáng)大的作用域跟蹤和類型推斷功能及插件系統(tǒng),開發(fā)者可以構(gòu)建轉(zhuǎn)換器來執(zhí)行此類優(yōu)化

nodejs

Node.js采用C++語言編寫而成,是一個(gè)Javascript的運(yùn)行環(huán)境。Node.js采用了Google Chrome瀏覽器的V8引擎,性能很好,同時(shí)還提供了很多系統(tǒng)級(jí)的API,如文件操作、網(wǎng)絡(luò)編程等。瀏覽器端的Javascript代碼在運(yùn)行時(shí)會(huì)受到各種安全性的限制,對(duì)客戶系統(tǒng)的操作有限。相比之下,Node.js則是一個(gè)全面的后臺(tái)運(yùn)行時(shí),為Javascript提供了其他語言能夠?qū)崿F(xiàn)的許多功能。
Node.js的設(shè)計(jì)思想中以事件驅(qū)動(dòng)為核心,它提供的絕大多數(shù)API都是基于事件的、異步的風(fēng)格。以Net模塊為例,其中的net.Socket對(duì)象就有以下事件:connect、data、end、timeout、drain、error、close等,使用Node.js的開發(fā)人員需要根據(jù)自己的業(yè)務(wù)邏輯注冊(cè)相應(yīng)的回調(diào)函數(shù)。這些回調(diào)函數(shù)都是異步執(zhí)行的,這意味著雖然在代碼結(jié)構(gòu)中,這些函數(shù)看似是依次注冊(cè)的,但是它們并不依賴于自身出現(xiàn)的順序,而是等待相應(yīng)的事件觸發(fā)。事件驅(qū)動(dòng)、異步編程的設(shè)計(jì)重要的優(yōu)勢(shì)在于,充分利用了系統(tǒng)資源,執(zhí)行代碼無須阻塞等待某種操作完成,有限的資源可以用于其他的任務(wù)。

node.js 運(yùn)行圖

NPM

NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場(chǎng)景有以下幾種:
允許用戶從NPM服務(wù)器下載別人編寫的第三方包到本地使用。
允許用戶從NPM服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。
允許用戶將自己編寫的包或命令行程序上傳到NPM服務(wù)器供別人使用。
版本號(hào)
使用NPM下載和發(fā)布代碼時(shí)都會(huì)接觸到版本號(hào)。NPM使用語義版本號(hào)來管理代碼,這里簡單介紹一下。
語義版本號(hào)分為X.Y.Z三位,分別代表主版本號(hào)、次版本號(hào)和補(bǔ)丁版本號(hào)。當(dāng)代碼變更時(shí),版本號(hào)按以下原則更新。
如果只是修復(fù)bug,需要更新Z位。
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大變動(dòng),向下不兼容,需要更新X位。
版本號(hào)有了這個(gè)保證后,在申明第三方包依賴時(shí),除了可依賴于一個(gè)固定版本號(hào)外,還可依賴于某個(gè)范圍的版本號(hào)。例如"argv": "0.0.x"表示依賴于0.0.x系列的最新版argv。

Paste_Image.png

React

React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫。
React 特點(diǎn)
1.聲明式設(shè)計(jì) ?React采用聲明范式,可以輕松描述應(yīng)用。
2.高效 ?React通過對(duì)DOM的模擬,最大限度地減少與DOM的交互。
3.靈活 ?React可以與已知的庫或框架很好地配合。
4.JSX ? JSX 是 JavaScript 語法的擴(kuò)展。React 開發(fā)不一定使用 JSX ,但我們建議使用它。
5.組件 ? 通過 React 構(gòu)建組件,使得代碼更加容易得到復(fù)用,能夠很好的應(yīng)用在大項(xiàng)目的開發(fā)中。
6.單向響應(yīng)的數(shù)據(jù)流 ? React 實(shí)現(xiàn)了單向響應(yīng)的數(shù)據(jù)流,從而減少了重復(fù)代碼,這也是它為什么比傳統(tǒng)數(shù)據(jù)綁定更簡單。

Paste_Image.png

react-router

在 web 應(yīng)用開發(fā)中,路由系統(tǒng)是不可或缺的一部分。在瀏覽器當(dāng)前的 URL 發(fā)生變化時(shí),路由系統(tǒng)會(huì)做出一些響應(yīng),用來保證用戶界面與 URL 的同步。隨著單頁應(yīng)用時(shí)代的到來,為之服務(wù)的前端路由系統(tǒng)也相繼出現(xiàn)了。有一些獨(dú)立的第三方路由系統(tǒng),比如 director ,代碼庫也比較輕量。react-router 就是這樣一個(gè)構(gòu)建單頁應(yīng)用的路由系統(tǒng)
react-router 有如下的特征
Router 與 Route 一樣都是 react 組件 ,它的 history 對(duì)象是整個(gè)路由系統(tǒng)的核心,它暴漏了很多屬性和方法在路由系統(tǒng)中使用;
Route 的 path 屬性表示路由組件所對(duì)應(yīng)的路徑,可以是絕對(duì)或相對(duì)路徑,相對(duì)路徑可繼承;
Redirect 是一個(gè)重定向組件,有 from 和 to 兩個(gè)屬性;
Route 的 onEnter 鉤子將用于在渲染對(duì)象的組件前做攔截操作,比如驗(yàn)證權(quán)限;
在 Route 中,可以使用 component 指定單個(gè)組件,或者通過 components 指定多個(gè)組件集合;
param 通過 /:param 的方式傳遞,這種寫法與 express 以及 ruby on rails 保持一致,符合 RestFul 規(guī)范;
路由的基本原理
無論是傳統(tǒng)的后端 MVC 主導(dǎo)的應(yīng)用,還是在當(dāng)下最流行的單頁面應(yīng)用中,路由的職責(zé)都很重要,但原理并不復(fù)雜,即保證視圖和 URL 的同步,而視圖可以看成是資源的一種表現(xiàn)。當(dāng)用戶在頁面中進(jìn)行操作時(shí),應(yīng)用會(huì)在若干個(gè)交互狀態(tài)中切換,路由則可以記錄下某些重要的狀態(tài),比如在一個(gè)博客系統(tǒng)中用戶是否登錄、在訪問哪一篇文章、位于文章歸檔列表的第幾頁。而這些變化同樣會(huì)被記錄在瀏覽器的歷史中,用戶可以通過瀏覽器的前進(jìn)、后退按鈕切換狀態(tài),同樣可以將 URL 分享給好友。簡而言之,用戶可以通過手動(dòng)輸入或者與頁面進(jìn)行交互來改變 URL,然后通過同步或者異步的方式向服務(wù)端發(fā)送請(qǐng)求獲取資源(當(dāng)然,資源也可能存在于本地),成功后重新繪制 UI,原理如下圖所示:


Paste_Image.png
Paste_Image.png

amazeui-react

amazeui是中國首個(gè)開源的html5跨屏前端框架Amaze UI React基于 React.js 開發(fā)的 Web 組件庫它基于 React 封裝組件,不再疲于組織雜亂的 HTML 標(biāo)簽;組件可以按需組合、功能擴(kuò)展方便。

gulp

gulp是前端開發(fā)過程中一種基于流的代碼構(gòu)建工具,是自動(dòng)化項(xiàng)目的構(gòu)建利器;她不僅能對(duì)網(wǎng)站資源進(jìn)行優(yōu)化,而且在開發(fā)過程中很多重復(fù)的任務(wù)能夠使用正確的工具自動(dòng)完成;使用她,不僅可以很愉快的編寫代碼,而且大大提高我們的工作效率。

gulp是基于Nodejs的自動(dòng)任務(wù)運(yùn)行器, 她能自動(dòng)化地完成 javascript、coffee、sass、less、html/image、css 等文件的測(cè)試、檢查、合并、壓縮、格式化、瀏覽器自動(dòng)刷新、部署文件生成,并監(jiān)聽文件在改動(dòng)后重復(fù)指定的這些步驟。在實(shí)現(xiàn)上,她借鑒了Unix操作系統(tǒng)的管道(pipe)思想,前一級(jí)的輸出,直接變成后一級(jí)的輸入,使得在操作上非常簡單。
流,簡單來說就是建立在面向?qū)ο蠡A(chǔ)上的一種抽象的處理數(shù)據(jù)的工具。在流中,定義了一些處理數(shù)據(jù)的基本操作,如讀取數(shù)據(jù),寫入數(shù)據(jù)等,程序員是對(duì)流進(jìn)行所有操作的,而不用關(guān)心流的另一頭數(shù)據(jù)的真正流向。流不但可以處理文件,還可以處理動(dòng)態(tài)內(nèi)存、網(wǎng)絡(luò)數(shù)據(jù)等多種數(shù)據(jù)形式。

而gulp正是通過流和代碼優(yōu)于配置的策略來盡量簡化任務(wù)編寫的工作。這看起來有點(diǎn)“像jQuery”的方法,把動(dòng)作串起來創(chuàng)建構(gòu)建任務(wù)。早在Unix的初期,流就已經(jīng)存在了。流在Node.js生態(tài)系統(tǒng)中也扮演了重要的角色,類似于*nix將幾乎所有設(shè)備抽象為文件一樣,Node將幾乎所有IO操作都抽象成了stream的操作。因此用gulp編寫任務(wù)也可看作是用Node.js編寫任務(wù)。當(dāng)使用流時(shí),gulp去除了中間文件,只將最后的輸出寫入磁盤,整個(gè)過程因此變得更快。
易于使用
通過代碼優(yōu)于配置的策略,gulp 讓簡單的任務(wù)簡單,復(fù)雜的任務(wù)可管理。
構(gòu)建快速
利用 Node.js 流的威力,你可以快速構(gòu)建項(xiàng)目并減少頻繁的 IO 操作。
易于學(xué)習(xí)
通過最少的 API,掌握 gulp 毫不費(fèi)力,構(gòu)建工作盡在掌握:如同一系列流管道。
首先確保你已經(jīng)正確安裝了nodejs環(huán)境。然后以全局方式安裝gulp:
npm install -g gulp
全局安裝gulp后,還需要在每個(gè)要使用gulp的項(xiàng)目中都單獨(dú)安裝一次。把目錄切換到你的項(xiàng)目文件夾中,然后在命令行中執(zhí)行:
npm install gulp
如果想在安裝的時(shí)候把gulp寫進(jìn)項(xiàng)目package.json文件的依賴中,則可以加上–save-dev:
npm install --save-dev gulp
這樣就完成了gulp的安裝,接下來就可以在項(xiàng)目中應(yīng)用gulp了。
插件高質(zhì)
gulp 嚴(yán)格的插件指南確保插件如你期望的那樣簡潔高質(zhì)得工作。


Paste_Image.png

flask+gunicorn

Flask 是一個(gè)使用 Python 編寫的輕量級(jí) Web 應(yīng)用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2。
Flask 也被稱為 “microframework” ,因?yàn)樗褂煤唵蔚暮诵模?extension 增加其他功能。Flask沒有默認(rèn)使用的數(shù)據(jù)庫、窗體驗(yàn)證工具。然而,F(xiàn)lask保留了擴(kuò)增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗(yàn)證工具、文件上傳、各種開放式身份驗(yàn)證技術(shù)。
Gunicorn (獨(dú)角獸)是一個(gè)高效的Python WSGI Server,通常用它來運(yùn)行 wsgi application(由我們自己編寫遵循WSGI application的編寫規(guī)范) 或者 wsgi framework(如Django,Paster),地位相當(dāng)于Java中的Tomcat。

中文分詞

詞是最小的能夠獨(dú)立活動(dòng)的有意義的語言成分,英文單詞之間是以空格作為自然分界符的,而漢語是以字為基本的書寫單位,詞語之間沒有明顯的區(qū)分標(biāo)記,因此,中文詞語分析是中文信息處理的基礎(chǔ)與關(guān)鍵。
分詞算法可分為三大類:
1.基于詞典:基于字典、詞庫匹配的分詞方法;(字符串匹配、機(jī)械分詞法)
2.基于統(tǒng)計(jì):基于詞頻度統(tǒng)計(jì)的分詞方法;
3.基于規(guī)則:基于知識(shí)理解的分詞方法。
第一類方法應(yīng)用詞典匹配、漢語詞法或其它漢語語言知識(shí)進(jìn)行分詞,如:最大匹配法、最小分詞方法等。這類方法簡單、分詞效率較高,但漢語語言現(xiàn)象復(fù)雜豐富,詞典的完備性、規(guī)則的一致性等問題使其難以適應(yīng)開放的大規(guī)模文本的分詞處理。第二類基于統(tǒng)計(jì)的分詞方法則基于字和詞的統(tǒng)計(jì)信息,如把相鄰字間的信息、詞頻及相應(yīng)的共現(xiàn)信息等應(yīng)用于分詞,由于這些信息是通過調(diào)查真實(shí)語料而取得的,因而基于統(tǒng)計(jì)的分詞方法具有較好的實(shí)用性。

jieba

jieba是一款效果很好,運(yùn)行穩(wěn)定的Python 中文分詞組件
支持三種分詞模式:
精確模式,試圖將句子最精確地切開,適合文本分析;
全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
搜索引擎模式,在精確模式的基礎(chǔ)上,對(duì)長詞再次切分,提高召回率,適合用于搜索引擎分詞。
支持繁體分詞
支持自定義詞典
基于前綴詞典實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖 (DAG)
采用了動(dòng)態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合
對(duì)于未登錄詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法
word2vec
word2vec是一個(gè)將單詞轉(zhuǎn)換成向量形式的工具。可以把對(duì)文本內(nèi)容的處理簡化為向量空間中的向量運(yùn)算,計(jì)算出向量空間上的相似度,來表示文本語義上的相似度。
1.詞向量是什么
自然語言理解的問題要轉(zhuǎn)化為機(jī)器學(xué)習(xí)的問題,第一步肯定是要找一種方法把這些符號(hào)數(shù)學(xué)化。
NLP 中最直觀,也是到目前為止最常用的詞表示方法是 One-hot Representation,這種方法把每個(gè)詞表示為一個(gè)很長的向量。這個(gè)向量的維度是詞表大小,其中絕大多數(shù)元素為 0,只有一個(gè)維度的值為 1,這個(gè)維度就代表了當(dāng)前的詞。
2詞向量的用法最常見的有兩種:

  1. 直接用于神經(jīng)網(wǎng)絡(luò)模型的輸入層。如 C&W 的 SENNA 系統(tǒng)中,將訓(xùn)練好的詞向量作為輸入,用前饋網(wǎng)絡(luò)和卷積網(wǎng)絡(luò)完成了詞性標(biāo)注、語義角色標(biāo)注等一系列任務(wù)。再如 Socher 將詞向量作為輸入,用遞歸神經(jīng)網(wǎng)絡(luò)完成了句法分析、情感分析等多項(xiàng)任務(wù)。
  2. 作為輔助特征擴(kuò)充現(xiàn)有模型。如 Turian 將詞向量作為額外的特征加入到接近 state of the art 的方法中,進(jìn)一步提高了命名實(shí)體識(shí)別和短語識(shí)別的效果。
word2vec模型結(jié)構(gòu)圖

tensorflow

TensorFlow? 是一個(gè)采用數(shù)據(jù)流圖(data flow graphs),用于數(shù)值計(jì)算的開源軟件庫。節(jié)點(diǎn)(Nodes)在圖中表示數(shù)學(xué)操作,圖中的線(edges)則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。它靈活的架構(gòu)讓你可以在多種平臺(tái)上展開計(jì)算,例如臺(tái)式計(jì)算機(jī)中的一個(gè)或多個(gè)CPU(或GPU),服務(wù)器,移動(dòng)設(shè)備等等。TensorFlow 最初由Google大腦小組(隸屬于Google機(jī)器智能研究機(jī)構(gòu))的研究員和工程師們開發(fā)出來,用于機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)方面的研究,但這個(gè)系統(tǒng)的通用性使其也可廣泛用于其他計(jì)算領(lǐng)域。
什么是數(shù)據(jù)流圖(Data Flow Graph)?
數(shù)據(jù)流圖用“結(jié)點(diǎn)”(nodes)和“線”(edges)的有向圖來描述數(shù)學(xué)計(jì)算。“節(jié)點(diǎn)” 一般用來表示施加的數(shù)學(xué)操作,但也可以表示數(shù)據(jù)輸入(feed in)的起點(diǎn)/輸出(push out)的終點(diǎn),或者是讀取/寫入持久變量(persistent variable)的終點(diǎn)?!熬€”表示“節(jié)點(diǎn)”之間的輸入/輸出關(guān)系。這些數(shù)據(jù)“線”可以輸運(yùn)“size可動(dòng)態(tài)調(diào)整”的多維數(shù)據(jù)數(shù)組,即“張量”(tensor)。張量從圖中流過的直觀圖像是這個(gè)工具取名為“Tensorflow”的原因。一旦輸入端的所有張量準(zhǔn)備好,節(jié)點(diǎn)將被分配到各種計(jì)算設(shè)備完成異步并行地執(zhí)行運(yùn)算。
TensorFlow的特征
高度的靈活性
真正的可移植性(Portability)
將科研和產(chǎn)品聯(lián)系在一起
自動(dòng)求微分
多語言支持
性能最優(yōu)化

tensorlayer

TensorLayer 是為研究人員和工程師設(shè)計(jì)的一款基于Google TensorFlow開發(fā)的深度學(xué)習(xí)與強(qiáng)化學(xué)習(xí)庫。 它提供高級(jí)別的(Higher-Level)深度學(xué)習(xí)API,這樣不僅可以加快研究人員的實(shí)驗(yàn)速度,也能夠減少工程師在實(shí)際開發(fā)當(dāng)中的重復(fù)工作。 TensorLayer非常易于修改和擴(kuò)展,這使它可以同時(shí)用于機(jī)器學(xué)習(xí)的研究與應(yīng)用。 此外,TensorLayer 提供了大量示例和教程來幫助初學(xué)者理解深度學(xué)習(xí),并提供大量的官方例子程序方便開發(fā)者快速找到適合自己項(xiàng)目的例子。

RNN

循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Networks,RNNs)已經(jīng)在眾多自然語言處理(Natural Language Processing, NLP)中取得了巨大成功以及廣泛應(yīng)用。RNNs已經(jīng)被在實(shí)踐中證明對(duì)NLP是非常成功的。如詞向量表達(dá)、語句合法性檢查、詞性標(biāo)注等。在RNNs中,目前使用最廣泛最成功的模型便是LSTMs(Long Short-Term Memory,長短時(shí)記憶模型)模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容