張先榮 鄭貴俊
(中國科學(xué)技術(shù)大學(xué)軟件學(xué)院 安徽 合肥 230051)
地圖位置POI數(shù)據(jù)在電子地圖中扮演著重要角色。常見的電子地圖中存在兩種數(shù)據(jù),一種是底圖數(shù)據(jù),另一種是地圖位置數(shù)據(jù)——POI數(shù)據(jù)。底圖數(shù)據(jù)一般在電子地圖中描述大的輪廓,如哪一片是小區(qū),哪一片是公園。底圖數(shù)據(jù)一般在國家地理測繪局購買,這些數(shù)據(jù)不需要人為測量,由衛(wèi)星照片合成。
一個電子地圖的好壞一般是由POI數(shù)據(jù)決定。POI數(shù)據(jù)嚴(yán)格意義上屬于向量數(shù)據(jù),該數(shù)據(jù)與底圖數(shù)據(jù)最大的不同是不需要描述建筑物或者實體的輪廓,在地圖上呈現(xiàn)的是一個點的標(biāo)注,這些點都是坐標(biāo)點。如銀行、餐廳和咖啡館等,這些都可以用POI坐標(biāo)表示,一般比較容易更新或者編輯。如果用面向?qū)ο蟮乃季S考慮POI數(shù)據(jù),其屬性應(yīng)該包括:數(shù)據(jù)編號(Id),數(shù)據(jù)名稱(Name),經(jīng)度(Longitude),緯度(Latitude),國別(Country),省(Province),市(City),縣區(qū)(County)和地址(Address)等。
因此,本文提出并設(shè)計一種POI數(shù)據(jù)采集與判重系統(tǒng),利用程序?qū)崿F(xiàn)自動數(shù)據(jù)采集,能夠滿足地圖廠商實時更新的需要,尤其為企業(yè)節(jié)約了大量的成本,具有重要的工程設(shè)計價值意義。
本文系統(tǒng)的核心是數(shù)據(jù)采集與判重,數(shù)據(jù)采集技術(shù)主要是主題網(wǎng)絡(luò)爬蟲[1-2]。相對于全網(wǎng)爬蟲,該技術(shù)更準(zhǔn)確高效,目前主要有以下幾類:
(1)基于內(nèi)容的啟發(fā)式方式。Best first search算法[3]:將需要采集的網(wǎng)頁的URL加入到一個優(yōu)先級隊列中,隊列的優(yōu)先級是根據(jù)主題和網(wǎng)頁內(nèi)容的相關(guān)性計算的。Cho等[4]把等待采集的URL隊列又細分成兩個隊列,一個隊列叫作hot_queue,另一個叫作URL_queue。僅當(dāng)hot_queue相關(guān)網(wǎng)頁的數(shù)據(jù)采集結(jié)束之后,才開始采集URL_queue隊列。算法缺點是當(dāng)主題詞比較多時,效率特別低。Fish search算法[5]:將待采集的網(wǎng)頁看成一群魚。如果有相關(guān)主題信息,魚就有“食物”,魚有了“食物”就會“繁殖”。沒有相關(guān)主題信息,魚則會出現(xiàn)死亡。算法的缺點是相關(guān)度計算設(shè)置成離散,計算不夠準(zhǔn)確,相關(guān)度相同的網(wǎng)頁容易被忽略掉。Shark search算法[5]繼承了Fish search 方法,相關(guān)度度量方法不是利用離散值,而是利用0~1之間的相關(guān)度。在計算相關(guān)性時,還充分利用了錨文字。這樣能更好地提高爬行方向的正確性。
(2)基于超鏈圖方式。Page Rank算法[7]利用一個網(wǎng)頁的重要性傳遞到了它所引用的網(wǎng)頁,因此它被稱為權(quán)威網(wǎng)頁。
(1)
式中:B(i)表示那些指向網(wǎng)頁i的網(wǎng)頁;N(j)表示網(wǎng)頁j指向的其他網(wǎng)頁的數(shù)目;R(i)表示i這個網(wǎng)頁的權(quán)威度;R(j)表示網(wǎng)頁存在指向網(wǎng)頁i的鏈接,網(wǎng)頁在上一次迭代時的Page Rank值;d(0 (1)基于字符串。設(shè)兩個文本分別是X(x1,x2,…,xn)和Y(x1,x2,…,xn),則計算文本距離的公式如下: 余弦相似度: (2) 曼哈頓距離: (3) 歐氏距離: (4) 由于僅是從字面的層次上進行比較,運行速率快,但沒有考慮文本中詞與詞之間的順序關(guān)系、語義關(guān)系,所以不能有效地識別近義詞。 (2)基于向量空間。將兩個文本編碼后看成向量空間[9]中的兩個向量,通過余弦距離計算相似度。TF-IDF[10]中的TF指的是“詞頻”,IDF指的是“逆文本頻率”,公式如下: TF-IDF(Wi)=tfj(Wi)×log(N/df(Wi)) (5) 式中:tfj(Wi)表示W(wǎng)i這個詞在文檔j中出現(xiàn)的頻率;N表示的是文檔的總數(shù);df(Wi)表示有多少個文檔中出現(xiàn)過Wi這個詞。通過將所有的文檔都進行分析,然后可以得出每一個詞的TF-IDF值,利用這個值可以對所有文檔中每個詞進行編碼。Word2vec[11]模型分為兩種:一種是CBOW,另一種是Skip-grim。CBOW利用詞Wi前后的各m個詞預(yù)測Wi,而Skip-grim則剛好相反,它利用Wi預(yù)測前后m個詞。這兩種模型的訓(xùn)練比較相似,這里主要討論CBOW。輸入層是2m個詞向量,投影層是2m個向量的和。輸出層是語料庫中所有的詞為葉子節(jié)點,詞的出現(xiàn)次數(shù)為權(quán)值的哈夫曼樹,通過隨機梯度下降算法對投影層進行預(yù)測,使得條件概率公式p(Wi|context(Wi))最大化,其中context(Wi)指的是Wi的上下文2m個詞。訓(xùn)練結(jié)束就得到了每個詞的編碼。 圖1 孿生LSTM 孿生CNN[13]模型采用孿生卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),分別對兩個句子進行建模,然后利用一個句子相似度測量層計算文本相似度,最后通過一個全連接層輸出相似度得分。其結(jié)構(gòu)如圖2所示。 圖2 孿生CNN 本文系統(tǒng)的采集模塊,以一定的種子URL開始,通過主題分析以及深度優(yōu)先搜索、廣度優(yōu)先搜索等策略,確定待采集的URL。常見的分布式數(shù)據(jù)采集器框架主要分為控制節(jié)點、數(shù)據(jù)采集節(jié)點、存儲節(jié)點。控制節(jié)點包括URL管理器、數(shù)據(jù)存儲器、控制調(diào)度器。數(shù)據(jù)采集節(jié)點包括HTML下載器、HTML解析器、數(shù)據(jù)采集調(diào)度器。存儲節(jié)點主要是MongoDB,負責(zé)數(shù)據(jù)增改刪查。數(shù)據(jù)采集、格式化、存儲結(jié)束,一定時間后需要對數(shù)據(jù)更新和判重。系統(tǒng)整體架構(gòu)如圖3所示。 圖3 整體架構(gòu)設(shè)計 網(wǎng)絡(luò)數(shù)據(jù)采集功能通過主題網(wǎng)絡(luò)爬蟲實現(xiàn)。與傳統(tǒng)網(wǎng)絡(luò)數(shù)據(jù)采集不同,采集模塊用分布式以及多進程提高采集效率,多臺主機可協(xié)同采集數(shù)據(jù)。數(shù)據(jù)采集節(jié)點架構(gòu)圖如圖4所示。 圖4 數(shù)據(jù)采集節(jié)點架構(gòu)圖 1)控制節(jié)點: (1)控制節(jié)點的URL管理器。主要包括兩個集合,一個集合是已采集URL的集合,另一個是未采集的URL的集合。如果重復(fù)采集URL,根據(jù)Best first search算法會出現(xiàn)死循環(huán)。 URL去重復(fù)主要有如下解決方案:① 內(nèi)存去重;② 關(guān)系數(shù)據(jù)庫去重、緩存數(shù)據(jù)庫去重。大型成熟的網(wǎng)絡(luò)數(shù)據(jù)采集系統(tǒng)采用緩存數(shù)據(jù)庫去重的方式,這樣可以盡可能避免內(nèi)存的限制。URL管理器是本文系統(tǒng)重要的模塊,直接影響著最后數(shù)據(jù)的召回率。定義一個優(yōu)先級隊列,運用Page Rank算法計算優(yōu)先級,按照優(yōu)先級大小順序進行采集。對于上千萬條URL,URL又非常長,需要做MD5處理,以防止內(nèi)存溢出。MD5的信息摘要是128位,可以減少好幾倍的內(nèi)存消耗。不過Python的MD5值是256位,所以取前128位即可。 (2)控制節(jié)點的數(shù)據(jù)存儲器。主要功能是將解析出來的數(shù)據(jù),批量放入文本文件或者HTML文件。文件名以日期命名,文件格式主要是以Key-Value形式保存。 (3)控制節(jié)點的調(diào)度控制器。調(diào)度控制器主要是產(chǎn)生并啟動URL管理線程、數(shù)據(jù)提取進程、數(shù)據(jù)存儲進程,同時維護4個隊列保持進程間通信。URL_q隊列是URL管理進程將URL傳遞給數(shù)據(jù)采集節(jié)點的通道。Result_q隊列是數(shù)據(jù)采集結(jié)點將數(shù)據(jù)返回給數(shù)據(jù)提取進程的通道。Conn_q是數(shù)據(jù)提取進程將新的URL數(shù)據(jù)提交給URL管理進程的通道。Store_q是數(shù)據(jù)提取進程將取得的數(shù)據(jù)交給數(shù)據(jù)存儲進程的通道。URL管理進程從Conn_q隊列獲得新的URL提交給URL管理器,經(jīng)過去重之后,讀取URL放入URL_q隊列中傳遞給數(shù)據(jù)采集節(jié)點。數(shù)據(jù)提取進程從Result_q隊列讀取返回數(shù)據(jù),并將隊列中的URL添加到Conn_q隊列交給URL管理進程。數(shù)據(jù)存儲進程從Store_q中讀取數(shù)據(jù)并調(diào)用數(shù)據(jù)存儲器進行存儲。 2)爬蟲數(shù)據(jù)采集節(jié)點:數(shù)據(jù)采集節(jié)點主要包括HTML下載器、HTML解析器、數(shù)據(jù)采集調(diào)度器。執(zhí)行流程如下:首先數(shù)據(jù)采集調(diào)度器從控制節(jié)點中的URL_q讀取URL;然后數(shù)據(jù)采集器先調(diào)用HTML下載器獲得網(wǎng)頁的源代碼,再從源代碼中解析出新的URL;最后數(shù)據(jù)采集調(diào)度器將新的URL和摘要傳入Result_q隊列并交給控制節(jié)點。 (1)數(shù)據(jù)采集節(jié)點的HTML下載器。主要利用HTTP協(xié)議向服務(wù)器發(fā)送請求,從服務(wù)器返回的數(shù)據(jù)中得到有用的數(shù)據(jù)。客戶端向服務(wù)器發(fā)出請求,請求建立TCP連接。服務(wù)器對數(shù)據(jù)采集器作出響應(yīng),并把對應(yīng)的HTML文本發(fā)送給數(shù)據(jù)采集器,然后釋放TCP連接,數(shù)據(jù)采集器將HTML文本保存。 (2)數(shù)據(jù)采集節(jié)點的HTML解析器。HTML解析器是通過Xpath或者BeautifulSoup解析出有用的數(shù)據(jù)。 (3)數(shù)據(jù)采集節(jié)點的采集調(diào)度器。數(shù)據(jù)采集節(jié)點的調(diào)度器需要先連接上控制節(jié)點,然后從URL_q中獲取URL,下載并解析網(wǎng)頁。再把獲得的文件交給Result_q隊列并返回給控制節(jié)點。這里需要用到分布式進程——服務(wù)進程的創(chuàng)建以及客戶進程的創(chuàng)建。 3)采集模塊的存儲節(jié)點:實現(xiàn)數(shù)據(jù)持久化存儲。 斷點續(xù)傳也是網(wǎng)絡(luò)爬蟲設(shè)計難點。一個數(shù)據(jù)采集程序一旦啟動就必須等它運行完,如果中途中斷就前功盡棄,這樣的數(shù)據(jù)采集程序系統(tǒng)是非常不健壯的。由于不可控因素?zé)o法預(yù)料,中間會因各種原因中斷,如某些數(shù)據(jù)量大的網(wǎng)站需要采集很長時間,中途可能會遇到斷電、網(wǎng)頁請求超時、程序崩潰、網(wǎng)頁請求頻繁被禁止等問題。健壯的網(wǎng)絡(luò)數(shù)據(jù)采集系統(tǒng)應(yīng)該是隨時都可以啟動,而且每次啟動都是從剩下的開始而不是從頭開始重復(fù)采集。解決該問題的一種策略是記錄日志,對于采集失敗的URL放入日志記錄,采集一輪結(jié)束后,程序遍歷日志記錄,再次采集日志記錄中采集失敗的URL。如果采用該日志策略,可能會出現(xiàn)某幾個URL總是采集不成功,程序可能會陷入死循環(huán)。另一種策略是URL輸入兩個隊列,一個隊列存儲采集過的URL,另一個隊列存儲未采集的URL,此時就實現(xiàn)了斷點續(xù)傳。斷點續(xù)傳流程設(shè)計可使網(wǎng)絡(luò)爬蟲程序可以隨時停下,隨時啟動,并且每次啟動都不會做重復(fù)工作。 對于主題爬蟲,為了加速主題網(wǎng)站的采集速率,本文系統(tǒng)采集模塊改進了常見的網(wǎng)絡(luò)爬蟲請求方法以提高采集效率。不同數(shù)據(jù)品牌采用多進程,品牌內(nèi)采用多線程。受TCP擁塞控制啟發(fā),設(shè)計出線程回退算法自動化調(diào)整線程數(shù)量。該算法描述如下: (1)增長階段:該階段按照指數(shù)規(guī)律分配線程的數(shù)量。在線程數(shù)量指數(shù)增長節(jié)點,每次分配線程數(shù)量結(jié)束,在一定的時間窗內(nèi)檢測爬蟲是否穩(wěn)定。剔除檢測到的異常的線程,并將下一個時間窗口設(shè)置為當(dāng)前線程數(shù)量的一半。 (6) 式中:Nt+1表示下一個時間窗口的線程數(shù);Nt表示當(dāng)前時間窗口的線程數(shù);state表示當(dāng)前是否異常,值為0表示異常,值為1表示正常。 (2)衰減階段:在該階段表示以線性規(guī)律增加或者減少線程數(shù)。經(jīng)過一定的時間窗口,檢測網(wǎng)絡(luò)爬蟲是否異常,正常則線性增加線程數(shù),異常則線性減少線程數(shù)。 (7) (1)RNN。循環(huán)神經(jīng)網(wǎng)絡(luò)可以將任意長度的序列映射成定長的向量,捕獲線性序列的特征非常有效[13],則RNN是將n個din維向量X1:n=X1,X2,…,Xn(Xi∈Rdin)序列作為輸入返回單個dout維向量yn∈Rdout的函數(shù)。 yn=RNN(x1:n)xi∈Rdinyi∈Rdout (8) 式(8)隱式定義了:每一個輸出向量yi,可以將返回輸出向量序列的函數(shù)記為RNN*: y1:n=RNN*(x1:n)yi=RNN(x1:i)xi∈Rdinyi∈Rdout (9) 構(gòu)建一個循環(huán)神經(jīng)網(wǎng)絡(luò)類似于構(gòu)建一個前饋網(wǎng)絡(luò)。必須指定輸入向量xi和輸出向量yi的維度: RNN*(x1:n;s0)=y1:nyi=o(si)si=R(si-1,xi)xi∈Rdinyi∈Rdoutsi∈Rf(dout) (10) 式中:o(·)是激活函數(shù);si是隱層單元輸出;R(·)是處理隱層單元的線性函數(shù)。加入?yún)?shù)θ強調(diào)時間步的相同,不同的R、O實例會得到不同網(wǎng)絡(luò)結(jié)構(gòu),如圖5所示。 圖5 RNN圖形化表示 (2)長短記憶網(wǎng)絡(luò)(LSTM)。長短記憶網(wǎng)絡(luò)用于解決梯度消失問題[15],并且引入了門結(jié)構(gòu)。將狀態(tài)向量Si分解成記憶單元和運行單元,記憶單元設(shè)計為跨時間記憶并保存相關(guān)梯度信息,同時由平滑數(shù)學(xué)函數(shù)控制。形式化定義如下: (11) 式中:sj是時刻j的狀態(tài);RLSTM(·)是LSTM算法模型函數(shù);⊙是hadamard乘積操作;W為LSTM模型待更新的權(quán)重矩陣。因此,時刻j的狀態(tài)由上一時刻sj-1和第j時刻的x得出。時刻j的狀態(tài)由兩個向量組成,分別是cj和hj。其中,cj是記憶組件,hj是隱藏狀態(tài)組件。有三種門結(jié)構(gòu)i、f、o,分別控制輸入、遺忘和輸出。門的值由當(dāng)前輸入xj和前一狀態(tài)hj-1的線性組合通過Sigmoid激活函數(shù)σ(·)得到。一個更新候選項z由xj和hj-1的線性組合經(jīng)過一個非線性激活函數(shù)tanh得到。 各個值取值范圍如下: sj∈R2·dhxi∈Rdxcj,hj,i,f,o,z∈RdhWxo∈Rdx×dhWho∈Rdh×dh (12) (3)Word2Vec。Word2Vec有2種模型:連續(xù)詞袋模型(continuous bag-of-words model,CBOW)和Skip-Gram。本文使用的是CBOW模型。 (4)POI相似度模型。以Simase-LSTM設(shè)計短文本相似度模型,如圖6所示。該模型由輸入層、詞嵌入層、Simase-LSTM層、全連接層以及輸出層組成。將兩條POI數(shù)據(jù)的Name字段首先進行分詞,建立詞庫字典,以字典中的位置進行初始編號,輸入詞嵌入層用Word2Vec進行計算,得到一組向量。部分詞向量效果如表1所示。 圖6 短文本相似度模型 表1 部分詞向量效果 統(tǒng)一長度后輸入Simase-LSTM。學(xué)習(xí)結(jié)果進行拼接。采用簡單的單層LSTM+全連接層對數(shù)據(jù)進行訓(xùn)練,兩個LSTM的輸出拼接后作為全連接層的輸入,經(jīng)過Dropout和Batch Normalization正則化,最終輸出結(jié)果進行訓(xùn)練。 數(shù)據(jù)采集之后,需要對數(shù)據(jù)進行格式化處理,一般POI數(shù)據(jù)的格式是JSON形式,這種由多個Key-Value形式組成的一條數(shù)據(jù)便于數(shù)據(jù)的處理和研究。大多數(shù)網(wǎng)頁的原始數(shù)據(jù)都是這種形式。 直接把數(shù)據(jù)處理程序包含在數(shù)據(jù)采集模塊的實現(xiàn)方式雖然易于實現(xiàn),但是仔細分析后會發(fā)現(xiàn)眾多問題。該編程方式增加了程序模塊間的耦合度,違反了軟件工程的高內(nèi)聚低耦合的標(biāo)準(zhǔn),會導(dǎo)致原始數(shù)據(jù)丟失,比如在數(shù)據(jù)上線之后數(shù)據(jù)出現(xiàn)差錯,是原始網(wǎng)站的錯誤還是編程導(dǎo)致的錯誤無法定位。另外,程序開發(fā)完成后,需要對所有數(shù)據(jù)修改一個屬性,如將“經(jīng)度”與“緯度”合成一個屬性“經(jīng)緯度”,那么就需要一個一個地修改所有的網(wǎng)絡(luò)爬蟲代碼,顯然這種方式是不明智的。 可以用一種改進的編程方式,即使用設(shè)計模式中的工廠模式就可以解決上述所有問題,將“工廠”單獨抽象出來一個格式化模塊,該格式化模塊包含一個數(shù)據(jù)配置信息映射表和一個映射程序。每一個主題的數(shù)據(jù),將是否缺屬性、缺哪個屬性、屬性的映射、原始數(shù)據(jù)的存儲地址都事先寫入映射表中,通過該方式將千變?nèi)f化的數(shù)據(jù)統(tǒng)一成一種格式,既有利于降低耦合,又有利于批量操作數(shù)據(jù),使得系統(tǒng)更加健壯。 圖7是根據(jù)目標(biāo)分析出的數(shù)據(jù)格式化模塊的程序流程圖。 圖7 POI數(shù)據(jù)格式化流程圖 已入庫并且已經(jīng)格式化的數(shù)據(jù),經(jīng)過3個月需要進行一次重新的數(shù)據(jù)采集與判重上線。 得到兩批POI向量數(shù)據(jù)后,首先循環(huán)遍歷第一批數(shù)據(jù),對于第一批每個數(shù)據(jù),如ODi,循環(huán)遍歷計算第二批數(shù)據(jù)NDj與第一批數(shù)據(jù)ODi的距離,找出與ODi距離小于1 000米的數(shù)據(jù)集合LODi,該集合中每條數(shù)據(jù)的Shop_name、Address與ODi的Shop_name,Address使用POI相似度模型比較并打分,分?jǐn)?shù)最高的一條第二批數(shù)據(jù)NDl即為關(guān)聯(lián)數(shù)據(jù)。 假設(shè)第一批數(shù)據(jù)數(shù)量為M,第二批數(shù)據(jù)數(shù)量為N,其中M和N大小不確定,那么執(zhí)行判重算法后,關(guān)聯(lián)數(shù)據(jù)列表List的長度一定小于M并且小于N。設(shè)關(guān)聯(lián)數(shù)據(jù)條數(shù)為L,則這L條數(shù)據(jù)既存在于第一批數(shù)據(jù),又存在于第二批數(shù)據(jù),并且是第一批數(shù)據(jù)和第二批數(shù)據(jù)的交集,設(shè)為D。則第一批數(shù)據(jù)中不在D內(nèi)的數(shù)據(jù)應(yīng)下線,第二批不在D內(nèi)的數(shù)據(jù)應(yīng)上線。 算法1POI數(shù)據(jù)判重算法 1.List=[]; 2.For ODi←第一批采集數(shù)據(jù); 3.For NDj←第二批采集數(shù)據(jù); 4.If Distance(ODi, NDj)<1 000: 5.NameScore=Compare(name(ODi,NDj)); 6.AddressScore=Compare(addre(ODi,NDj)); 7.TotleScore=0.8 * NameScore + AddressScore * 0.2 8.找出與ODi比較后totleScore最高的ODj。 9.ODi,ODj一起存入List 10.Return List 為了驗證本文方法的可行性,分別對單線程網(wǎng)絡(luò)爬蟲、多線程網(wǎng)絡(luò)爬蟲、多進程網(wǎng)絡(luò)爬蟲,以及本文提出的自適應(yīng)分布式網(wǎng)絡(luò)爬蟲進行對比實驗,表2為實驗環(huán)境的參數(shù)。 表2 實驗環(huán)境 實驗將數(shù)據(jù)品牌“勞力士表”“中國建設(shè)銀行”“特斯拉汽車”“星巴克咖啡廳”“愛馬仕”“小米”“華為”“學(xué)?!钡?種品牌網(wǎng)站進行編號,如表3所示。 表3 網(wǎng)站品牌 數(shù)據(jù)采集實驗:將本文提出的負載均衡自適應(yīng)算法應(yīng)用到多線程以及本文設(shè)計的分布式爬蟲系統(tǒng)上,得到如圖8所示的實驗結(jié)果。 圖8 POI數(shù)據(jù)采集性能對比圖 在剛開始采集階段,多線程的采績效率明顯高于其他方案,在采集60分鐘之后,由于源網(wǎng)站反趴策略的限制,效率開始下降。自適應(yīng)分布式采集策略趨于穩(wěn)定。 (1)數(shù)據(jù)集的構(gòu)造。將從表3中采集到的8類品牌數(shù)據(jù)隨機取出3 000條,標(biāo)注是否相似,1代表相似,0代表不相似。樣本示例如表4所示。 表4 實驗環(huán)境 (2)模型訓(xùn)練。把2批6 000條數(shù)據(jù)按照7∶2∶1分為訓(xùn)練集、驗證集、測試集。使用梯度下降法更新神經(jīng)網(wǎng)絡(luò)權(quán)值。batch_size是每塊訓(xùn)練樣本數(shù),本文系統(tǒng)中為15,每次對15個參數(shù)進行訓(xùn)練。Epochs參數(shù)是迭代次數(shù),本文系統(tǒng)中為100。 如圖9所示,模型的訓(xùn)練損失每輪都在下降,準(zhǔn)確率每輪都在上升,達到80輪之后,呈現(xiàn)穩(wěn)定狀態(tài)。準(zhǔn)確率達到98%,損失函數(shù)降至1.3%。 圖9 模型訓(xùn)練結(jié)果 (3)模型驗證。如圖10所示,達到80輪之后,模型在驗證集上準(zhǔn)確率達到95.2%,損失函數(shù)值降至17%。 圖10 模型驗證結(jié)果 (4)模型測試。除了使用本文介紹的Word2Vec結(jié)合LSTM方法,實驗還對比了Word2Vec結(jié)合CNN方法、僅用Word2Vec方法。以下簡稱本文算法、WV-CNN、WV-Cosine。其中WV-Cosine指的是將短文本用Word2Vec編碼后直接用COS函數(shù)計算短文本相似度。各方法在測試集上的性能如表5和圖11所示。 表5 多種算法在測試集上的準(zhǔn)確率比較 圖11 模型ROC曲線 本文模型在準(zhǔn)確率和ROC曲線[16]上的表現(xiàn)優(yōu)于其他算法。WV-Cosine算法效果最差,因為Word2Vec雖然解決了詞語間語義關(guān)系的問題,但是其類似于詞袋模型,簡單地把詞語向量堆積組成文本向量,往往會造成誤判。雖然WV-CNN有較高準(zhǔn)確率,但不適用于序列化文本的處理。對于文本處理LSTM更有優(yōu)勢。由于計算的相似度是介于[0,1]之間的浮點數(shù),因此需要規(guī)定閾值,這里定義相似度小于0.8,算法判斷為不相似,相似度大于0.8,算法判斷為相似。這樣就可以計算真正率與假正率。 從圖11中ROC曲線看出,本文提出的短文本相似模型具有最佳性能。 (1)判重算法的基本流程。三個月前采集一批數(shù)據(jù),現(xiàn)在采集一批數(shù)據(jù),為了保證電子地圖實時更新,需要將第一批沒有的數(shù)據(jù)識別出之后上線。兩批數(shù)據(jù)的交集不用上線?;诙涛谋鞠嗨贫鹊腜OI判重算法的目的就是找到兩批數(shù)據(jù)的交集。流程如圖12所示。 圖12 POI數(shù)據(jù)判重算法 (2)判重算法性能比較。將短文本相似度算法分別換成WV-CNN、WV-Cosine,與本文的算法性能對比如圖13所示。 圖13 POI數(shù)據(jù)判重算法性能對比 由圖13可得,本文提出的算法更具有穩(wěn)定性,在各類品牌上的準(zhǔn)確率均保持在95%以上。 系統(tǒng)采用自適應(yīng)分布式爬蟲技術(shù)從銀行、小米手機店、汽車4S店等官方網(wǎng)站采集電子地圖的POI數(shù)據(jù),經(jīng)格式化模塊補全屬性后進行上線。經(jīng)過一定時間重新采集數(shù)據(jù)、判重上線。后端使用MongoDB存儲數(shù)據(jù)。主要功能包括數(shù)據(jù)抓取、數(shù)據(jù)格式化、數(shù)據(jù)判重、數(shù)據(jù)入庫。騰訊地圖、高德地圖等地圖廠商可使用本文思想自動化更新數(shù)據(jù)。以下是系統(tǒng)實現(xiàn)后得到的數(shù)據(jù)例子: (1)原始數(shù)據(jù)例子。從魅族手機官方網(wǎng)站抓取的一條營業(yè)廳的數(shù)據(jù)。 {″province″: ″四川省″, ″name″: ″四川宜賓授權(quán)服務(wù)體驗中心″, ″city″: ″宜賓市″, ″address″: ″四川省宜賓市翠屏區(qū)東街經(jīng)緯商場9樓8號″} (2)格式化數(shù)據(jù)的例子。由于原始數(shù)據(jù)可能會缺少字段,如原始數(shù)據(jù)例子中沒有經(jīng)緯度信息,在格式化模塊需要用百度地圖工具API將″四川省宜賓市翠屏區(qū)東街經(jīng)緯商場9樓8號″這條地址信息轉(zhuǎn)換成經(jīng)緯度信息,并加上唯一ID號。 {″province″: ″四川省″, ″thirdId″: ″3 326 575.453 603 036″, ″name″: ″四川宜賓授權(quán)服務(wù)體驗中心″, ″city″: ″宜賓市″, ″longitude″: ″11 648 275.596 548 6″, ″address″: ″四川省宜賓市翠屏區(qū)東街經(jīng)緯商場9樓8號″, ″latitude″: ″3 326 575.453 603 036″} 這樣就可以將這條數(shù)據(jù)上線到騰訊地圖App中。 (3)數(shù)據(jù)的判重例子。數(shù)據(jù)上線到騰訊地圖App中,3個月以后,騰訊地圖App的數(shù)據(jù)上線人員再次運行爬蟲程序,抓取同樣的數(shù)據(jù),發(fā)現(xiàn)原始數(shù)據(jù)“name”字段有變化,如: 三月前:″name″: ″四川宜賓授權(quán)服務(wù)體驗中心″。 現(xiàn)在:″name″: ″魅族官方授權(quán)服務(wù)體驗中心(四川宜賓店)″。 可能經(jīng)緯度也有變化,上線人員可以認為這個營業(yè)廳可能搬至別處。因此,可以運行本系統(tǒng)的判重算法,通過經(jīng)緯度計算,得到此時POI數(shù)據(jù)與三月前同一POI數(shù)據(jù)距離″distance″: 65.939 936 304 486 3,即65米。舊name(即″oldname″: ″四川宜賓授權(quán)服務(wù)體驗中心″)與新name(即″name″: ″魅族官方授權(quán)服務(wù)體驗中心(四川宜賓店)″)相似度分?jǐn)?shù)為″score″: ″0.731 213″。因此可以判斷該條數(shù)據(jù)與三個月前那條數(shù)據(jù)是同一條數(shù)據(jù),僅讓新采集的未找到關(guān)聯(lián)的數(shù)據(jù)上線即可。 {″province″:四川省″, ″distance″: 65.939 936 304 486 3, ″sametype″: ″diff″, ″thirdId″: ″3 326 575.453 603 036″, ″oldname″: ″四川宜賓授權(quán)服務(wù)體驗中心″, ″city″: ″宜賓市″, ″longitude″: ″11 648 275.596 548 6″, ″score″: ″0.731 213″, ″name″: ″魅族官方授權(quán)服務(wù)體驗中心(四川宜賓店)″, ″address″: ″四川省宜賓市翠屏區(qū)東街經(jīng)緯商場9樓8號″, ″latitude″: ″3 326 575.453 603 036″, ″guid″: ″fd3fcb4e-a2a4-11e7-a06b-6c92bf270e68″} 本文提出并設(shè)計的系統(tǒng)很好地解決了地圖App的數(shù)據(jù)來源問題,全程自動化處理,具有很好的用戶體驗。但在以下方面也有值得改進的地方: (1)運行效率。雖然本文系統(tǒng)在目前來看,運行速度還算可以,但是數(shù)據(jù)量如果加大,效率還有待提高。由于本文系統(tǒng)是面向過程設(shè)計的整體架構(gòu),因此,一個功能模塊不穩(wěn)定,就會讓后期數(shù)據(jù)處理無法執(zhí)行。 (2)算法的準(zhǔn)確率。NLP的文本相似度算法的準(zhǔn)確率一直在0.93左右,所以算法準(zhǔn)確率的提高有待進一步研究。1.2 短文本相似度
2 設(shè)計研究思路
2.1 分布式采集架構(gòu)
2.2 數(shù)據(jù)質(zhì)量管理
2.3 負載均衡
2.4 相關(guān)算法
2.5 POI數(shù)據(jù)格式化流程
2.6 POI數(shù)據(jù)判重算法
3 實驗與分析
3.1 分布式系統(tǒng)數(shù)據(jù)采集性能
3.2 POI數(shù)據(jù)的短文本相似度算法
3.3 基于短文本相似度的POI判重算法
3.4 系統(tǒng)實驗實例
4 結(jié) 語