中文摘要
本文以學(xué)術(shù)研究為目的,針對新聞行業(yè)迫切需求和全文搜索引擎技術(shù)的優(yōu)越性,設(shè)計并實現(xiàn)了一個針對新聞領(lǐng)域的全文搜索引擎。該搜索引擎通過Scrapy網(wǎng)絡(luò)爬蟲工具獲取新聞頁面,將新聞內(nèi)容存儲在分布式存儲系統(tǒng)HBase中,并利用倒排索引及輪排索引等索引技術(shù)對新聞內(nèi)容進(jìn)行索引,實現(xiàn)了常用的新聞搜索功能,如短語查詢、布爾查詢、通配符查詢等。同時為了獲得更快的檢索速度,該系統(tǒng)使用了B+樹來構(gòu)建索引樹;為了提升用戶瀏覽體驗,引入了事件圖譜可視化技術(shù),幫助用戶直觀易懂地瀏覽相關(guān)新聞事件;為順應(yīng)搜索引擎?zhèn)€性化、智能化的發(fā)展趨勢和給用戶提供更符合其口味的新聞資訊, 實現(xiàn)了個性化新聞推薦功能。
關(guān)鍵詞:HBase,B+樹,事件圖譜,個性化新聞推薦
目錄
一、 緒論
(一) 研究背景
(二) 研究意義
(三) 主要研究內(nèi)容
(四) 研究創(chuàng)新點
二、 關(guān)鍵技術(shù)與理論基礎(chǔ)
(一) 全文搜索引擎的工作原理
(二) 網(wǎng)絡(luò)爬蟲技術(shù)
(三) 搜索引擎索引技術(shù)
(四) 分布式存儲技術(shù)
(五) 分布式計算技術(shù)
(六) 分布式消息系統(tǒng)
(七) 事件圖譜
(八) 推薦算法
三、 系統(tǒng)需求分析
(一) 功能性需求
(二) 特殊需求
四、 系統(tǒng)設(shè)計
(一) 系統(tǒng)功能模塊設(shè)計
(二) 新聞檢索功能設(shè)計
(三) 新聞推薦功能設(shè)計
五、 系統(tǒng)實現(xiàn)
(一) 開發(fā)環(huán)境及工具
(二) 搭建大數(shù)據(jù)平臺
(三) 數(shù)據(jù)采集模塊的實現(xiàn)
(四) 索引模塊的實現(xiàn)
(五) 檢索模塊的實現(xiàn)
(六) 新聞事件圖譜模塊的實現(xiàn)
(七) 新聞特征學(xué)習(xí)模塊的實現(xiàn)
(八) 用戶行為日志收集模塊的實現(xiàn)
(九) 新聞推薦模塊的實現(xiàn)
(十) Web服務(wù)的實現(xiàn)
六、 系統(tǒng)測試
(一) 功能測試
(二) 性能測試
七、 總結(jié)與展望
參考文獻(xiàn)
一、 緒論
(一) 研究背景
在當(dāng)今數(shù)字化時代,人們獲取新聞的方式已經(jīng)發(fā)生了巨大變化,越來越多的人選擇在網(wǎng)絡(luò)上獲取新聞信息。而對于新聞行業(yè)來說,如何快速、準(zhǔn)確地將信息傳達(dá)給讀者,滿足讀者的信息需求,實現(xiàn)信息的有效發(fā)布和傳播,已經(jīng)成為了一個十分重要的問題。傳統(tǒng)的新聞報道方式已經(jīng)無法滿足當(dāng)今追求即時性和互動性的需求。并且,一些傳統(tǒng)的新聞門戶網(wǎng)站如新浪、中國新聞網(wǎng)等,由于信息量過于龐大,會給網(wǎng)民們帶來尋找他們需要的信息的困難。此外,不同新聞網(wǎng)站對于某些事件的評價也各有不同,因此如果只看一個或兩個網(wǎng)站的話,容易產(chǎn)生以偏概全的問題,隨著網(wǎng)站數(shù)量不斷增加,這種問題也日益突出。
在此背景下,新聞搜索引擎應(yīng)運(yùn)而生。通過搜索引擎的特性,不同網(wǎng)站對于相同內(nèi)容的新聞報道可以被搜集整理后再呈現(xiàn)在網(wǎng)友的面前,為他們提供了便利的獲取資訊的條件。新聞搜索引擎還可以成為記者的攻堅利器,為記者的采訪提供大量的線索,為報道的成功提供堅實的基礎(chǔ),讓記者們更好地挖掘事件背后的真相。
因此,新聞搜索引擎的開發(fā)背景是建立在解決這些問題和需求的基礎(chǔ)之上的。除此之外,新聞搜索引擎的研究還涉及信息檢索、自然語言處理、機(jī)器學(xué)習(xí)等多個領(lǐng)域,其發(fā)展也可以促進(jìn)這些相關(guān)領(lǐng)域的發(fā)展。
(二) 研究意義
隨著互聯(lián)網(wǎng)的飛速發(fā)展,人們獲取信息的途徑也日益增多。而在這些途徑中,全文搜索引擎被認(rèn)為是最為廣泛和方便的信息獲取方式之一。而新聞行業(yè)對信息處理和獲取的需求日益迫切,而全文搜索引擎提供了高效、精準(zhǔn)的信息檢索服務(wù),是滿足新聞行業(yè)需求的重要方式之一。因此,通過開發(fā)一個新聞搜索引擎,可以將搜索引擎技術(shù)應(yīng)用到新聞行業(yè)中,推動新聞行業(yè)的信息化進(jìn)程。
同時,搜索引擎相關(guān)技術(shù)也是應(yīng)用廣泛、前沿性強(qiáng)的技術(shù)之一,包括各種優(yōu)化檢索效果和用戶體驗的算法和數(shù)據(jù)結(jié)構(gòu),以及人工智能等前沿技術(shù)。因此,開發(fā)一個新聞搜索引擎不僅能夠深入了解搜索引擎技術(shù),還可以提升自身的技術(shù)水平。
本文選題就是出于以上兩點,以學(xué)術(shù)研究為目的,選取新聞領(lǐng)域作為研究對象,旨在探究如何將搜索引擎技術(shù)應(yīng)用到新聞行業(yè)中并且優(yōu)化用戶體驗。
(三) 主要研究內(nèi)容
本文主要完成了基于Java的新聞全文搜索引擎的系統(tǒng)設(shè)計和開發(fā)工作,主要包括以下幾點內(nèi)容:
(1)基于Linux系統(tǒng)的分布式生產(chǎn)環(huán)境的搭建,包括Hadoop、Spark、HBase、Kafka、Zookeeper等大數(shù)據(jù)開源軟件的部署和配置。
(2)使用Scrapy實現(xiàn)新聞網(wǎng)頁的抓取,通過XPath精準(zhǔn)獲取新聞網(wǎng)頁的各個字段,構(gòu)建結(jié)構(gòu)化的新聞?wù)Z料庫,寫入分布式數(shù)據(jù)庫HBase。
(3)利用倒排索引及輪排索引等索引技術(shù)對新聞?wù)Z料庫里的新聞內(nèi)容文本進(jìn)行索引,實現(xiàn)了常用的新聞檢索功能,如短語查詢、布爾查詢、通配符查詢等。同時為了獲得更快的檢索速度,使用了 B+樹來構(gòu)建索引樹。
(4)引入了事件圖譜可視化技術(shù),為新聞?wù)Z料庫中的每一篇新聞文本都構(gòu)造了事件圖譜,將得到的新聞事件圖譜的JSON數(shù)據(jù)存儲到HBase中,由Web應(yīng)用根據(jù)用戶的選擇以圖譜化的形式渲染出來。
(5)對新聞?wù)Z料庫里的新聞內(nèi)容文本進(jìn)行清洗、預(yù)處理。使用Spark對新聞內(nèi)容文本進(jìn)行挖掘,使用LDA主題模型獲取新聞的主題分布向量作為新聞的特征表示。
(6)在前臺使用JavaScript腳本監(jiān)控用戶的瀏覽行為,將用戶的點擊行為日志收集到系統(tǒng)后臺后,使用Spark Streaming實時分析用戶點擊行為日志,對用戶興趣進(jìn)行建模,得到用戶對新聞的偏好特征。
(7)對于待推薦新聞集合中的每一條新聞,結(jié)合新聞特征和用戶偏好特征使用余弦距離來計算它們的推薦評分。然后按照推薦評分對可能引起用戶興趣的新聞進(jìn)行排序,并推薦給用戶。
(8)為用戶提供Web服務(wù):包括搜索主頁、登錄注冊頁面、新聞推薦頁面、新聞事件圖譜可視化頁面。
(四) 研究創(chuàng)新點
本系統(tǒng)的創(chuàng)新點在于引入了事件圖譜技術(shù),提升了用戶的瀏覽體驗。事件圖譜通常被應(yīng)用于情報分析、社交媒體分析和金融市場分析等領(lǐng)域。在搜索引擎中,事件圖譜通常被用于提高搜索結(jié)果和推薦結(jié)果的精確度。這可以幫助用戶更快地找到他們想要的信息,獲得更好的檢索結(jié)果。然而,在檢索結(jié)果的可視化方面,該技術(shù)的使用卻并不是很多。因此,本系統(tǒng)引入了事件圖譜可視化技術(shù),將新聞中的各關(guān)鍵點以及關(guān)鍵點之間的關(guān)聯(lián)都展現(xiàn)在圖譜中,以此提供圖譜化的瀏覽方式。引入了事件圖譜可視化技術(shù)的新聞搜索引擎具有以下優(yōu)點: (1)多維度展示:通過將與新聞事件相關(guān)聯(lián)的不同信息以圖譜的形式展示,用戶可以一目了然地了解事件關(guān)系的多個維度。 (2)直觀易懂:事件圖譜可視化可以幫助用戶更好地理解和快速瀏覽相關(guān)新聞事件。
二、 關(guān)鍵技術(shù)與理論基礎(chǔ)
(一) 全文搜索引擎的工作原理
由上圖可知,全文搜索引擎程序可以化分為數(shù)據(jù)采集模塊、索引模塊、檢索模塊以及用戶界面。全文搜索引擎程序的組成結(jié)構(gòu)具體如下:
組成結(jié)構(gòu) | 功能 |
---|---|
數(shù)據(jù)采集模塊 | 即網(wǎng)絡(luò)爬蟲程序,它的主要任務(wù)是從因特網(wǎng)上搜集各式各樣的信息資源,并存到原始語料庫里,為日后的用戶檢索做準(zhǔn)備。 |
索引模塊 | 把原始語料庫里的信息提取出來,進(jìn)行分析和建立索引,并進(jìn)行簡單的排列,把結(jié)果放在存儲系統(tǒng)里,生成倒排索引文件。 |
檢索模塊 | 當(dāng)用戶進(jìn)行檢索的時候,檢索模塊會通過判斷用戶輸入的請求,在倒排索引文件中進(jìn)行查找,將查找到的結(jié)果,根據(jù)匹配度、優(yōu)先度等指標(biāo)進(jìn)行最終排序,以提供給用戶最優(yōu)質(zhì)的結(jié)果。 |
用戶界面 | 是用戶與搜索引擎進(jìn)行人機(jī)交互的界面,不僅可用于輸入用戶的需求,也可用于返回搜索結(jié)果供用戶選擇。 |
(二) 網(wǎng)絡(luò)爬蟲技術(shù)
網(wǎng)絡(luò)爬蟲技術(shù)是一種信息自動采集程序,主要用于高效下載網(wǎng)頁信息并采集數(shù)據(jù),以提高搜索引擎的效率。在眾多開源爬蟲技術(shù)中,Apache軟件基金會提供的Nutch分布式爬蟲框架和基于Python語言的Scrapy爬蟲框架等最為流行。其中,Nutch包含爬蟲 crawler 和查詢 searcher 兩個組成部分,前者負(fù)責(zé)抓取網(wǎng)頁和建立索引,后者用這些索引產(chǎn)生查找結(jié)果。同時,Nutch還支持分布式抓取,運(yùn)行在Hadoop平臺上,并具有強(qiáng)大的插件機(jī)制。但是定制插件并不能修改爬蟲的遍歷算法、去重算法和爬取流程,因而 Nutch的靈活性不高。
Scrapy 是一個基于 Python 語言的應(yīng)用框架,專注于提供網(wǎng)站數(shù)據(jù)爬取和結(jié)構(gòu)化數(shù)據(jù)提取功能。它便于實現(xiàn)網(wǎng)頁內(nèi)容和圖片的抓取,用戶只需定制開發(fā)幾個相應(yīng)的方法即可達(dá)成目的。這個框架在爬蟲領(lǐng)域中用途非常廣泛,可以幫助用戶高效地采集所需數(shù)據(jù)。Scrapy是異步的,可同時在不同網(wǎng)頁上爬行,并靈活調(diào)整并發(fā)量;在持久化存儲方面,通過管道的方式存入數(shù)據(jù)庫,可保存為多種形式。Scrapy本身不支持分布式爬蟲,但Scrapy具有較強(qiáng)的擴(kuò)展性,可通過擴(kuò)展插件的方式實現(xiàn)分布式爬蟲。
綜上所述,Scrapy與Nutch兩方面的對比如下:
(三) 搜索引擎索引技術(shù)
搜索引擎索引技術(shù)負(fù)責(zé)收集、解析和存儲數(shù)據(jù),以便于快速準(zhǔn)確地檢索信息。全文搜索引擎在設(shè)計之初一般都會對互聯(lián)網(wǎng)中存在的所有文本文檔創(chuàng)建全文索引。全文索引一般分為兩種,正向索引與倒排索引。正向索引通過存儲每個文檔的單詞列表構(gòu)成索引結(jié)構(gòu),如下所示:
文檔 ID:(單詞 1,單詞 2,…)。
正向索引在搜索引擎進(jìn)行搜索時才會根據(jù)查詢關(guān)鍵詞在索引文檔中逐次查找。這種索引結(jié)構(gòu)雖然前期準(zhǔn)備工作十分簡單,但占用的搜索時間較長所以這種索引方式基本不被使用。倒排索引和正向索引相反,根據(jù)單詞來索引文檔編號,如下所示:
單詞:(文檔2,文檔6,文檔9,文檔8,…)。
這種普通倒排索引結(jié)構(gòu)只存儲了詞項和詞項對應(yīng)的文檔ID列表之間的索引信息,因此它只可以實現(xiàn)判斷詞項是否存在于特定文檔中的精確查詢和完成多個查詢詞之前的布爾查詢功能外,無法對詞項檢索出來的文檔列表進(jìn)行相關(guān)度排序,為了讓檢索出來的文檔列表實現(xiàn)相關(guān)度排序,本文在倒排索引設(shè)計時會附加反映詞項在文檔中的詞匯頻率和文檔集合中的出現(xiàn)頻率的信息,如下所示:
單詞,總詞頻,文檔集合中出現(xiàn)該單詞的文檔數(shù):(文檔2→該單詞在文檔2的詞頻,文檔6…)。
同時考慮到,用戶向搜索引擎提交查詢時,可能會對輸入詞項的拼寫形式?jīng)]有絕對把握,或者是想找包含查詢詞以及其相關(guān)變體形式的文檔的現(xiàn)實情況,本文對以上倒排索引中的詞典部分再進(jìn)行了一層索引——輪排索引以實現(xiàn)通配符查詢的功能。輪排索引是倒排索引的一種特殊形式,它在字符集中引入了一種新的符號,以標(biāo)識詞項的結(jié)束,并為每個旋轉(zhuǎn)結(jié)構(gòu)構(gòu)造了一個指針。這些指針指向詞項的不同旋轉(zhuǎn)版本,形成了一個集合。輪排索引的一部分的結(jié)構(gòu)圖如圖2所示。構(gòu)建輪排索引可以讓用戶輸入諸如X*Y、*X、X*、*X*等查詢語句進(jìn)行通配符查詢,比如如果要進(jìn)行通配符查詢m*n, 可以將查詢語句m*n進(jìn)行旋轉(zhuǎn)讓*號出現(xiàn)在字符串末尾,即得到n$m*。下一步,在輪排索引中查找該字符串。
輪排索引保存了每個詞項的所有旋轉(zhuǎn)結(jié)果,這樣會造成詞表非常大,為了實現(xiàn)我們能在一張大詞表中快速定位到我們想要查找的詞項,本文借鑒了MySQL中所使用的B+樹索引結(jié)構(gòu),用B+樹來存儲輪排索引,用于實現(xiàn)通配符查詢快速定位。
B+樹是一種平衡查找樹,與紅黑樹、二叉樹和B-樹相比,B+樹具有更低的高度,因此基于此構(gòu)建的索引結(jié)構(gòu)可以獲得更快的查找性能。在B+樹中,只有葉子節(jié)點存儲數(shù)據(jù),非葉節(jié)點則起到索引的作用。所有葉子節(jié)點按鍵值順序存放,并通過指針相連接形成一個鏈表,這樣有利于區(qū)間查找和遍歷。B+樹的數(shù)據(jù)結(jié)構(gòu)圖如圖所示。
(四) 分布式存儲技術(shù)
Hadoop 是基于 Apache 的開源分布式計算平臺,可以將大量的普通計算機(jī)整合在一起,形成一個計算機(jī)集群,用于解決大規(guī)模數(shù)據(jù)的計算和存儲問題。它的核心是分布式文件系統(tǒng) HDFS 和分布式計算框架 MapReduce。經(jīng)過多年的發(fā)展,Hadoop 已經(jīng)成為一個生態(tài)系統(tǒng),包括HDFS、HBase、Hive、Zookeeper、Mahout 等多個組成部分。
1. HDFS
HDFS是Hadoop體系中數(shù)據(jù)存儲管理的基礎(chǔ),主要負(fù)責(zé)大規(guī)模數(shù)據(jù)計算下的數(shù)據(jù)存儲和管理,運(yùn)行在大量普通計算機(jī)上。它的特點是高可靠性、高容錯性、高擴(kuò)展性和高吞吐量,可以穩(wěn)定可靠的存儲超大規(guī)模數(shù)據(jù),并且方便海量數(shù)據(jù)的處理。
HDFS采用主從結(jié)構(gòu)模型,包含一個NameNode和多個DataNode。NameNode是主節(jié)點,負(fù)責(zé)管理HDFS的命名空間和客戶端訪問操作;DataNode是從節(jié)點,負(fù)責(zé)存儲分配到的數(shù)據(jù)。HDFS將文件按一定的大小切塊(默認(rèn)設(shè)置是128MB),然后把每個塊以多個副本的形式保存在不同的DataNode上。通常每個塊會保存3個副本,多個副本可以保證在少量節(jié)點出現(xiàn)問題時數(shù)據(jù)不會丟失,同時也能提高數(shù)據(jù)讀取的速度。在HDFS中,文件的元數(shù)據(jù),包括文件路徑、大小、創(chuàng)建日期、所有者,以及分塊情況和每塊所在的數(shù)據(jù)節(jié)點編號等,會保存在NameNode上,名字節(jié)點全局只有一臺,同時還可以配置一個SecondaryNameNode來同步這些元數(shù)據(jù),充當(dāng)NameNode的備份。一旦NameNode出現(xiàn)故障,就可以很快地從SecondaryNameNode恢復(fù)所有的元數(shù)據(jù)。
2. HBase
HBase是Google Bigtable的開源實現(xiàn),而 Google 公司開發(fā)Bigtable是為了它的搜索引擎應(yīng)用。HBase是一個運(yùn)行在Hadoop集群上的高可靠性、高實時性、可擴(kuò)展的分布式數(shù)據(jù)庫,很容易進(jìn)行橫向擴(kuò)展。HBase的實現(xiàn)以HDFS為基礎(chǔ),每個表的每個列族都會對應(yīng)HDFS上的一個或多個文件。數(shù)據(jù)使用者可以通過HBase將數(shù)據(jù)存儲在HDFS中,或使用HBase隨機(jī)訪問HDFS中的數(shù)據(jù)。HBase允許存儲各種類型的、動態(tài)的、靈活的數(shù)據(jù),它利用行鍵、列族、列限定符和時間戳建立索引。HBase 數(shù)據(jù)庫的存儲結(jié)構(gòu)如圖所示:
HBase 數(shù)據(jù)庫主要有如下六部分構(gòu)成:
(1)表:HBase 用表來存儲數(shù)據(jù)。
(2)行鍵:在每個表中,數(shù)據(jù)按行存儲,行由行鍵作為唯一標(biāo)示,可以用來保證數(shù)據(jù)的唯一性。
(3)列族:HBase 基于列族劃分?jǐn)?shù)據(jù)的物理存儲,一個列族可以包含包意多個列限定符,一般同一類的列限定符會放在一個列族中。
(4)列限定符:列族里的數(shù)據(jù)用列限定符來定位。
(5)單元格:由行鍵、列族和列限定符共同確定,存儲在其中的數(shù)據(jù)即為單元值,單元值的數(shù)據(jù)類型通常被當(dāng)作字節(jié)數(shù)組byte[],也就是說HBase中的數(shù)據(jù)是以字節(jié)數(shù)組形式存儲的。
(6)時間戳:通過設(shè)置時間戳(默認(rèn)使用當(dāng)前時間戳),HBase表中一個單元格可以并列存儲多個版本的數(shù)據(jù)。
HBase與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的區(qū)別主要體現(xiàn)在以下幾個方面:
(1)數(shù)據(jù)索引:關(guān)系型數(shù)據(jù)庫一般能夠根據(jù)不同的列建立多種復(fù)雜索引,以提升信息查詢的精度。而HBase僅針對行鍵構(gòu)建索引,以便增加存取信息的效率。
(2)數(shù)據(jù)維護(hù):在關(guān)系型數(shù)據(jù)庫中,更新操作會導(dǎo)致舊值被覆蓋。而HBase執(zhí)行更新操作時,并不會刪除舊值,而是生成一個新值。
(3)可伸縮性:關(guān)系型數(shù)據(jù)庫難以實現(xiàn)橫向擴(kuò)展,縱向擴(kuò)展的空間也受到限制。與此形成對比,HBase旨在實現(xiàn)可靈活擴(kuò)展的橫向擴(kuò)展,并能輕松地增加或減少集群中的硬件數(shù)量,從而實現(xiàn)性能的伸縮性。
HBase極強(qiáng)的橫向擴(kuò)展性,使HBase能夠支持對網(wǎng)絡(luò)爬蟲提交的海量數(shù)據(jù)的存儲。同時HBase簡單的數(shù)據(jù)索引設(shè)計使其不需要考慮存儲和訪問海量數(shù)據(jù)時因為索引導(dǎo)致的性能瓶頸,所以HBase非常適合用來配合搜索引擎,根據(jù)搜索結(jié)果實時獲取數(shù)據(jù)。所以相對于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,用HBase來配合搜索引擎的構(gòu)建,更具有得天獨(dú)厚的優(yōu)勢。
(五) 分布式計算技術(shù)
在大數(shù)據(jù)處理中,Hadoop的MapReduce因延遲過高,無法適用于實時和快速計算的需求,因此只適用于離線批處理的應(yīng)用場景。為了彌補(bǔ)Hadoop在數(shù)據(jù)處理和計算方面的不足,出現(xiàn)了基于內(nèi)存計算的大數(shù)據(jù)并行計算框架Spark。Spark專注于處理和分析數(shù)據(jù),提供了內(nèi)存計算框架,支持SQL即席查詢、實時流式計算、機(jī)器學(xué)習(xí)和圖計算等。Spark形成了一套完整的生態(tài)系統(tǒng),并與Hadoop生態(tài)系統(tǒng)兼容,因此可以輕易地將現(xiàn)有的Hadoop應(yīng)用程序遷移到Spark系統(tǒng)中。
Spark生態(tài)系統(tǒng)包括Spark Core、Spark SQL、Spark Streaming、MLlib等組件。各個組件的具體功能如下:
(1)Spark Core:Spark Core是Spark的基礎(chǔ),它建立在抽象RDD之上,能夠適用于不同場景的大數(shù)據(jù)處理。RDD是彈性的分布式數(shù)據(jù)集,本質(zhì)上是一個只讀的分區(qū)記錄集合,每個RDD都可分為多個分區(qū),每個分區(qū)就是數(shù)據(jù)集的一個部分,不同分區(qū)可保存在集群中不同的節(jié)點上,因而可以在集群中的不同節(jié)點上進(jìn)行并行計算。
(2)Spark SQL:Spark SQL支持常見的SQL查詢操作和結(jié)構(gòu)化數(shù)據(jù)連接到Spark的底層引擎,滿足高級數(shù)據(jù)處理需求。
(3)Spark Streaming:Spark Streaming是建立在Spark上的實時計算框架,它擴(kuò)展了Spark處理大規(guī)模流式數(shù)據(jù)的能力。Spark Streaming支持多種數(shù)據(jù)輸入源,并以時間片為單位切分實時輸入數(shù)據(jù)流進(jìn)行處理。執(zhí)行流程如下圖所示:
(4)Spark MLlib:Spark MLlib是Spark的機(jī)器學(xué)習(xí)庫,提供了常用的機(jī)器學(xué)習(xí)算法,包括聚類、分類、回歸、協(xié)同過濾等,讓開發(fā)人員更方便快捷地進(jìn)行機(jī)器學(xué)習(xí)實踐。
(六) 分布式消息系統(tǒng)
Kafka是分布式消息系統(tǒng),使用Scala編寫,它以可水平擴(kuò)展和高吞吐率而被廣泛使用,允許用戶發(fā)布或者訂閱流數(shù)據(jù)。Kafka 旨在構(gòu)建可靠的、實時的數(shù)據(jù)流通道,以便在不同系統(tǒng)或應(yīng)用之間傳遞數(shù)據(jù),Kafka 是可以在單臺或多臺服務(wù)器上以集群方式運(yùn)行的。Kafka的系統(tǒng)總體架構(gòu)如圖所示:
一個基本的Kafka體系結(jié)構(gòu)包括:若干個Producer,它們是消息的生產(chǎn)者;若干個Broker,作為Kafka集群的節(jié)點服務(wù)器;若干個Comsumer,它們是消息的消費(fèi)者,負(fù)責(zé)消息的消費(fèi)。 除此之外,在Kafka架構(gòu)中,還有幾個重要概念。
(1)Topics:Kafka集群中存儲的消息按照不同的分類稱為不同的Topic。這本質(zhì)上是一個邏輯的概念。Topic主要針對的是Comsumer和Producer。在Producer中,只需要關(guān)注將消息push到哪一個Topic,在Comsumer中, 只需關(guān)注訂閱了哪些Topic。
(2)Partitions:每個Topic都可以被分割成多個Partition以提高并發(fā)性和消除大小的限制。就存儲而言,每個Partition實際上是一個日志文件,每當(dāng)消息發(fā)布到該P(yáng)artition時,都會以追加的方式寫入文件末尾。
(3)Offsets:為了方便讀取消息,每個消息在Partition中都有一個唯一的編號,稱為偏移量。偏移量用于標(biāo)識消息的位置和順序,如圖所示。
(4)Consumer Groups:多個Comsumer可以組成一個Comsumer Group,共享一個Topic的數(shù)據(jù)。每個Comsumer Group內(nèi)的Comsumer只能消費(fèi)一個Partition的數(shù)據(jù),以避免重復(fù)(隊列模式)。不同Comsumer Group之間可以獨(dú)立地消費(fèi)同一個主題的數(shù)據(jù)(發(fā)布-訂閱模式)。
(七) 事件圖譜
事件圖譜是一種基于知識圖譜的技術(shù),其主要功能是將新聞中的實體、事件以及它們之間的關(guān)系提取出來,形成結(jié)構(gòu)化化的事件圖譜。要構(gòu)建事件圖譜,最重要的兩個方面是實體識別和關(guān)系抽取。
實體識別是從文本中識別出各種實體類型(如人名、地名、組織機(jī)構(gòu)等),并將它們轉(zhuǎn)化為計算機(jī)可處理的形式。它是事件圖譜構(gòu)建的第一個主要步驟。為了實現(xiàn)有效的實體識別,NLP(自然語言處理)技術(shù)被廣泛應(yīng)用,其中包括分詞、詞性標(biāo)注、命名實體識別等
關(guān)系抽取是指從文本中識別和抽取出實體之間的關(guān)系,例如:是、在、發(fā)生于、屬于等。關(guān)系抽取是事件圖譜構(gòu)建的第二個主要步驟。事件圖譜中的關(guān)系抽取往往依靠基于規(guī)則的方法。其中,基于詞性標(biāo)注的規(guī)則和基于句法分析的規(guī)則等規(guī)則模型是#較為常用的。
(八) 推薦算法
搜索引擎的推薦系統(tǒng)是評價搜索引擎綜合性能的一個重要因素,目前國內(nèi)外學(xué)術(shù)界和科技界常見的推薦算法有:
(1)基于內(nèi)容的推薦算法:以物品的內(nèi)容描述信息以及用戶對內(nèi)容的偏好為基礎(chǔ),通過對物品和用戶自身特征的分析和建模來實現(xiàn)的,它根據(jù)建模后的用戶偏好和物品特征進(jìn)行計算,使用余弦相似度、歐氏距離等方法求兩者的相似度來預(yù)測用戶對物品的偏好,以得出推薦結(jié)果。
(2)協(xié)同過濾的推薦算法:協(xié)同過濾算法有基于用戶(UserCF)和基于物品(ItemCF)兩種,基于用戶與商品之間的交互,前者是推薦與用戶有相似行為的其他用戶喜歡的商品;后者是推薦與用戶當(dāng)前喜歡的商品類似的其他商品。協(xié)同過濾算法能夠為用戶推薦出多樣性、新穎的商品,能很多得挖掘用戶的潛在需求,但協(xié)同過濾算法依賴于海量的用戶商品交互記錄,會存在冷啟動問題(難以為新用戶推薦商品、難以向用戶推薦新商品)和數(shù)據(jù)稀疏問題(用戶和商品的數(shù)量大,但用戶對商品的行為數(shù)據(jù)很少,導(dǎo)致構(gòu)建出來的用戶-物品矩陣很稀疏,難以計算相似度和推薦結(jié)果)。
(3)基于知識的推薦算法:根據(jù)專家的知識或領(lǐng)域規(guī)則,推薦符合用戶需求的商品,假設(shè)找不到滿足用戶需求的商品,用戶必須改動需求,為此系統(tǒng)必須向用戶維護(hù)一個會話窗口用于用戶修改需求,對系統(tǒng)交互性要求高。
對于強(qiáng)內(nèi)容屬性的新聞領(lǐng)域來說,基于內(nèi)容的推薦算法更能在新聞檢索系統(tǒng)中發(fā)揮優(yōu)勢,且由于本系統(tǒng)并非上線系統(tǒng),用戶數(shù)量較少,因此難以利用基于大量用戶數(shù)據(jù)的協(xié)同過濾算法進(jìn)行推薦。相比之下,基于內(nèi)容的推薦算法可避免新聞的冷啟動問題。因此,在本系統(tǒng)中,我們選擇了基于內(nèi)容的推薦算法來實現(xiàn)新聞推薦。
三、系統(tǒng)需求分析
(一) 功能性需求
系統(tǒng)總體用例圖如下圖所示:
該系統(tǒng)主要包含四大功能:用戶登錄注冊功能、新聞檢索功能、個性化推薦新聞功能、新聞瀏覽功能。
(1)用戶登錄注冊功能
本系統(tǒng)要求實現(xiàn)用戶登錄注冊功能,這有利于收集用戶搜索行為數(shù)據(jù),從而更好地為用戶推薦其感興趣的新聞。
(2)新聞檢索功能
本系統(tǒng)會顯示新聞檢索頁面,用戶可以在該頁面中輸入關(guān)鍵詞、通配符和布爾運(yùn)算符進(jìn)行檢索,并得到經(jīng)相關(guān)度排序后的新聞列表集合。
(3)新聞瀏覽功能
在新聞檢索或個性化推薦頁面中,用戶不僅可以查看具體新聞?wù)膬?nèi)容,也可以查看與該新聞相關(guān)的事件圖譜,以便更好地了解新聞關(guān)聯(lián)的事件、人物等知識。
(4)個性化推薦新聞功能
用戶可以選擇進(jìn)入個性化推薦頁面,從而得到根據(jù)其瀏覽記錄生成的新聞推薦。
(二) 特殊需求
(1)海量數(shù)據(jù)存儲:隨著互聯(lián)網(wǎng)數(shù)據(jù)的爆炸式增長,面對海量數(shù)據(jù)的存儲和處理已經(jīng)成為業(yè)界的一個大問題。搜索引擎需要解決海量數(shù)據(jù)的存儲和管理問題,以便快速、高效地響應(yīng)用戶的搜索請求。
(2)可擴(kuò)展性:在互聯(lián)網(wǎng)時代下,用戶數(shù)量、請求量以及數(shù)據(jù)量都在不斷增長,搜索引擎必須具備快速擴(kuò)展的能力,以便能夠支持大量用戶的同時保證搜索速度和質(zhì)量。
(3)準(zhǔn)確挖掘用戶興趣:準(zhǔn)確挖掘用戶興趣能夠提高搜索結(jié)果的精準(zhǔn)度和個性化程度,從而增強(qiáng)用戶黏性和滿意度。通過對搜索引擎用戶行為的研究,發(fā)現(xiàn)雖然用戶的主體興趣不容易發(fā)生變化,但用戶對于某一類型的新聞興趣會隨時間的推移而逐漸衰減。如何處理時間因素對用戶興趣的影響是提高推薦系統(tǒng)精確度的關(guān)鍵。
四、系統(tǒng)設(shè)計
(一) 系統(tǒng)功能模塊設(shè)計
本系統(tǒng)的功能模塊圖如上圖所示,可基于上述需求分析把該系統(tǒng)各部分按照功能進(jìn)行模塊劃分,主要包括數(shù)據(jù)采集模塊、索引模塊、檢索模塊、新聞事件圖譜模塊、新聞特征學(xué)習(xí)模塊、用戶行為日志收集模塊、新聞推薦模塊。
(二) 新聞檢索功能設(shè)計
1. 索引模塊設(shè)計
該模塊負(fù)責(zé)將采集到的新聞數(shù)據(jù)進(jìn)行構(gòu)建倒排索引,以便后續(xù)的檢索。索引模塊流程圖如上圖所示。各個處理步驟如下:
(1)分詞:將文檔集合中的每個文檔分成一個個獨(dú)立的單元,稱為詞項等,成為構(gòu)建倒排索引的最小單位。對于中文可以使用開源中文分詞工具進(jìn)行分詞。
(2)去除停用詞:在文檔中出現(xiàn)頻率較高但又沒有特殊含義和價值的詞,稱為停用詞。通過過濾停用詞,可以降低索引的存儲空間、提高檢索效率。常用的中文停用詞庫為Stopwords-zh。
(3)統(tǒng)計詞頻:統(tǒng)計每個詞項在文檔集合中和每個文檔中出現(xiàn)的次數(shù)。
(4)構(gòu)建倒排索引:基于詞項生成倒排索引,即詞項到原始文檔的映射。文檔列表包括文檔ID,以及每個詞項在此文檔中的出現(xiàn)次數(shù)等信息。通過這個倒排索引,可以實現(xiàn)復(fù)雜的布爾查詢、處理短語進(jìn)行精確查詢等操作。
(5)構(gòu)建輪排索引:將倒排索引文件中的詞典部分提取出來,對于詞典中的每個詞項,構(gòu)建旋轉(zhuǎn)結(jié)構(gòu),生成輪排索引。
(6)構(gòu)建B+索引樹:讀取輪排索引中的詞項,將其添加到B+索引樹中,首先建立根節(jié)點,然后將單詞按照字典序逐個插入到B+樹中。
2. 檢索模塊設(shè)計
檢索模塊時序圖如上圖所示。該檢索模塊處理用戶檢索的流程如下:
(1)用戶查詢:用戶在搜索界面輸入要查詢的Query語句。
(2)Query語句切分:檢索模塊對用戶輸入的Query語句進(jìn)行切分處理,并將Query語句分為三類:短語、帶通配符的短語和布爾運(yùn)算符。根據(jù)切分后的Query語句類別,判斷查詢的邏輯方式,確定是精準(zhǔn)查詢還是范圍查詢。
(3)執(zhí)行檢索 :根據(jù)查詢邏輯方式,檢索模塊從后臺調(diào)用對應(yīng)的查詢API,對索引模塊構(gòu)建的B+索引樹進(jìn)行查詢。
(4)檢索召回相關(guān)網(wǎng)頁:通過查詢API調(diào)用,檢索模塊從索引庫中檢索召回初步相關(guān)網(wǎng)頁,即與用戶查詢的關(guān)鍵詞項相關(guān)的新聞網(wǎng)頁等。
(5)BM25排序:將召回的初步相關(guān)網(wǎng)頁與用戶查詢的關(guān)鍵詞項一起帶入BM25算法計算,計算每個關(guān)鍵詞的詞項與該新聞的得分,將計算出的得分按照高低順序排列,返回給用戶并在搜索界面中顯示相關(guān)網(wǎng)頁結(jié)果列表。
(三) 新聞推薦功能設(shè)計
新聞推薦功能時序圖如上圖所示。本系統(tǒng)采用的基于內(nèi)容的推薦算法,需要表示新聞的特征,還需要對用戶的偏好特征(即用戶對新聞的興趣)進(jìn)行建模。
對于新聞推薦功能的設(shè)計,本系統(tǒng)運(yùn)用了CountVectorizer 和 LDA 模型相結(jié)合的方式來構(gòu)建新聞模型。此外,本系統(tǒng)通過使用 Kafka 和 Spark Streaming,實時獲取用戶點擊新聞的行為日志,并計算用戶對主題的偏好,以建立用戶模型。同時,對于用戶對新聞興趣會隨時間的推移而逐漸衰減的現(xiàn)象,運(yùn)用了牛頓冷卻定律建立了一個時間權(quán)值衰減函數(shù),以應(yīng)對這一現(xiàn)象并對用戶模型進(jìn)行調(diào)節(jié)。在得到了用戶模型和新聞模型的前提下,通過余弦距離的比較來做出推薦。
下面先介紹本系統(tǒng)使用到的兩種向量空間模型CountVectorizer和LDA主題分布模型,再介紹由牛頓冷卻定律建立的時間衰減函數(shù)以及余弦距離。
1. CountVectorizer
CountVectorizer是一種文本特征提取工具,它將文本中單詞的出現(xiàn)次數(shù)計算出來作為特征,并忽略文本的順序和語法,將文本轉(zhuǎn)換為數(shù)值矩陣,其生成的數(shù)值矩陣可以傳遞給其他算法進(jìn)行處理。CountVectorizer可以用于文本分類、聚類、信息檢索、情感分析等自然語言處理任務(wù)。
2. LDA
LDA(Latent Dirichlet Allocation)是一種主題模型。它可以對文檔集進(jìn)行分析,對于每篇文檔中的主題,按照一定的概率分布進(jìn)行歸納。實質(zhì)上,LDA 模型是一個三層貝葉斯概率模型,包括文本、主題和詞三層結(jié)構(gòu)。每個文檔可以被視為主題集合的概率分布,每個主題則可以被視為單詞集合的概率分布。總而言之,LDA模型的三層結(jié)構(gòu)為我們提供了一種分層的思路,可以用來解決文本聚類,主題提取等問題。這一模型的應(yīng)用非常廣泛,例如在新聞分類、推薦系統(tǒng)和情感分析等領(lǐng)域都有相應(yīng)的應(yīng)用。
當(dāng)我們有一個文檔集合,需要去判定其中每一篇文檔的主題集合的概率分布時,LDA模型的工作流程偽代碼如下:
// docs為一個包含N個文檔,每個文檔都是一個長度為M的單詞列表
// alpha為超參數(shù)
// beta為超參數(shù)
// K為topic的個數(shù)
// iteration是迭代次數(shù)
// 隨機(jī)初始化每篇文檔中每個單詞的topic
for each doc in docs:
for each word in doc:
assign a random topic to word
//迭代優(yōu)化每篇文檔中每個單詞的topic
for i in range(iteration):
for each doc in docs:
for each word in doc:
// 計算每個主題下這個單詞出現(xiàn)的概率
topic_word_prob = (count(word in topic) + beta) / (count(topic) + beta * vocab_size)
// 計算該doc內(nèi)出現(xiàn)各個topic的概率
doc_topic_prob = (count(topic in doc) + alpha) / (count(doc) + alpha * num_topics)
// 根據(jù)上面兩個概率值更新單詞的topic
p = topic_word_prob * doc_topic_prob
new_topic = sample(p) //從概率分布中采樣
// 將單詞的主題分配為新的topic
assign new_topic to word
3. 牛頓冷卻定律在挖掘用戶興趣上的應(yīng)用
牛頓冷卻定律來自于物理學(xué)領(lǐng)域,其原始含義是:物體冷卻速度,與其當(dāng)前溫度與周圍環(huán)境溫度之差成正比。公式如下:
公式中變量含義為:T:當(dāng)前溫度;T0原始溫度;α:衰減因子;t:當(dāng)前時間;t0:初始時間。牛頓冷卻定律給我們提供了一種指數(shù)衰減的思路,這種思路同樣是可以應(yīng)用到用戶興趣的建模上。假設(shè)當(dāng)前用戶對點擊過的所有新聞主題分布向量為{v1,v2,…vn},每條新聞的點擊時間為t1,t2,…tn,當(dāng)前時間為t,我們對當(dāng)前用戶偏好建模計算公式如下:
其中λ為衰減因子,通常我們用半衰期的概念計算λ。對于新聞,半衰期較短,假設(shè)12小時,即0.5天后,熱度衰減一半,我們把相關(guān)的數(shù)字代入上式計算,得到λ=1.386。
4. 余弦距離
余弦距離 (Cosine Distance),又稱余弦相似度,是一種計算兩個向量之間相似度的方法。它是基于向量空間模型的概念而來的。在計算兩個向量之間的余弦距離時,我們首先將這兩個向量看作是在多維空間中的兩個向量,然后計算它們之間的夾角的余弦值來衡量它們之間的相似程度。在n 維空間中的余弦距離計算公式為:
余弦距離的取值范圍是[-1, 1],其中-1表示兩個向量完全相反,0表示兩個向量沒有相似性,1表示兩個向量完全相同。
五、 系統(tǒng)實現(xiàn)
(一) 開發(fā)環(huán)境及工具
本系統(tǒng)所采用的開發(fā)環(huán)境和工具為:
本系統(tǒng)根據(jù)不同語言的性質(zhì)選用不同的語言開發(fā)模塊,然后通過網(wǎng)絡(luò)通信(如Socket通信)、模塊調(diào)用等方式,把模塊協(xié)同起來提供服務(wù)。這樣做有以下好處:
(1)擴(kuò)展性:如果只使用一種編程語言去實現(xiàn)所有功能,可能會受到語言的局限性而無法實現(xiàn)一些細(xì)節(jié)或性能上的優(yōu)化。使用多種編程語言,可以讓項目更加可擴(kuò)展,更容易添加新的功能或更改現(xiàn)有的功能。
(2)技術(shù)適配性:不同的編程語言適用于不同的技術(shù)場景,使用多種編程語言去實現(xiàn)不同的功能,可以更好地發(fā)揮每種編程語言的優(yōu)勢,提高項目的效率。例如Java具有優(yōu)秀的性能和內(nèi)存管理能力,可以在處理大量數(shù)據(jù)時保持高效率,本系統(tǒng)用于開發(fā)索引模塊和檢索模塊;Scala適合大數(shù)據(jù)處理和復(fù)雜計算,與大數(shù)據(jù)處理與分析框架如Spark和Kafka緊密結(jié)合,本系統(tǒng)用于實現(xiàn)新聞特征學(xué)習(xí)模塊和用戶行為日志收集模塊;Python擁有簡潔的語法特性和豐富的第三方庫,對于數(shù)據(jù)采集、數(shù)據(jù)分析、科學(xué)計算以及構(gòu)建輕量級的Web應(yīng)用方面有著較好的支持,本系統(tǒng)用于開發(fā)數(shù)據(jù)采集模塊、新聞事件圖譜模塊以及構(gòu)建Web服務(wù)。
(二) 搭建大數(shù)據(jù)平臺
大數(shù)據(jù)平臺的集群架構(gòu)如上圖所示。首先需要完成Hadoop集群的搭建,然后再在集群上配置安裝ZooKeeper、HBase、Spark和Kafka,完成整個實驗環(huán)境搭建。
本文利用服務(wù)器虛擬機(jī)搭建了本實驗集群,在該服務(wù)器上創(chuàng)建了 3個節(jié)點,其中1個主節(jié)點Master,2個從節(jié)點 Slave,將各個節(jié)點連入同一局域網(wǎng),保證節(jié)點可以相互ping通。各個節(jié)點軟硬件情況如下表所示:
具體的 Hadgeoop大數(shù)據(jù)平臺搭建過程如下:
(1)在各個節(jié)點上都安裝好 CentOS 6.4 系統(tǒng)。
(2)首先需要修改虛擬機(jī)的網(wǎng)絡(luò)配置并為主機(jī)名與 IP 地址之間建立映射??梢酝ㄟ^運(yùn)行 “vim /etc/hosts” 命令來打開系統(tǒng)的 hosts 文件,然后在文件的末尾添加各個節(jié)點的 IP 地址和對應(yīng)的主機(jī)名,每行一個。
(3)為了避免在 Hadoop 啟動過程中頻繁輸入密碼驗證,我們需要配置 SSH 免密碼登錄。具體做法為在主節(jié)點 Master 上使用 “ssh-keygen -t rsa” 命令生成公鑰,然后使用 scp 命令將公鑰發(fā)送給所有從節(jié)點 Slave,最終在從節(jié)點上為該公鑰授權(quán)即可。
(4)在所有節(jié)點上安裝 JDK-1.8,并為 JAVA_HOME 環(huán)境變量進(jìn)行配置。
(5)為了將各節(jié)點組成一個 Hadoop 集群,需要在每個節(jié)點上安裝并配置 Hadoop。首先在主節(jié)點 Master 上下載并解壓 Hadoop 文件夾,然后配置 Path 變量。接著需要修改 Hadoop 的配置文件,包括 slaves、core-site.xml 和 hdfs-site.xml。其中,slaves 文件需要寫入所有從節(jié)點的主機(jī)名,每行一個。在 core-site.xml 文件中,需要在 fs.defaultFS 標(biāo)簽中設(shè)置默認(rèn)文件系統(tǒng)名稱,并在 hadoop.tmp.dir 標(biāo)簽中設(shè)置 HDFS 的臨時文件目錄。在 hdfs-site.xml 文件中,需要在 dfs.namenode.secondary. http-address 標(biāo)簽中設(shè)置備份名稱節(jié)點的 http 協(xié)議訪問地址與端口,并在 dfs.replication 標(biāo)簽中設(shè)置 Slave 數(shù)量(本集群為 2)。最后,需要將修改好配置文件的 Hadoop 文件夾發(fā)送到所有從節(jié)點上。
(6)在各個節(jié)點上安裝 Zookeeper。首先需要下載并解壓 Zookeeper 文件夾,然后配置 PATH 變量。接下來,將 conf 目錄下的 zoo_sample.cfg 文件名改為 zoo.cfg,并根據(jù) Hadoop 集群的配置,在其中添加所有主從節(jié)點的信息。最后,為了使 Zookeeper 在 Hadoop 集群中運(yùn)行,需要在各個節(jié)點上創(chuàng)建 myid 文件,并在其中寫入該節(jié)點的 id。這樣Zookeeper就被安裝到了Hadoop集群中。
(7)在各個節(jié)點上安裝HBase 。先在主節(jié)點Master上下載并解壓HBase文件夾;然后配置PATH變量;接下來,修改HBase 的配置文件:在hbase-site.xml中,修改hbase.cluster.distributed字段為true,指定HBase是以分布式形式運(yùn)行,修改hbase.rootdir字段,指定HBase的數(shù)據(jù)文件在HDFS文件系統(tǒng)中的位置,修改hbase.zookeeper.quorum字段,指定zookeeper集群各個主機(jī)的位置;在regionservers文件中,寫入節(jié)點名,一行一個。主節(jié)點把修改好配置文件的HBase文件夾發(fā)送到其他兩個從節(jié)點,這樣就完成了HBase的集群搭建。
(8)在各個節(jié)點上安裝Spark 。先在主節(jié)點Master上下載并解壓Spark文件夾;然后配置PATH變量;接下來,修改HBase 的配置文件:添加從節(jié)點的主機(jī)名或IP地址到slaves中;在spark-env.sh中(設(shè)置Worker節(jié)點),設(shè)置SPARK_DIST_CLASSPATH為"${HADOOP_HOME}/bin/hadoop classpath",這樣Spark就可以把數(shù)據(jù)存儲到Hadoop的HDFS中,設(shè)置HADOOP_CONF_DIR為Hadoop的配置文件夾所在的文件路徑,設(shè)置SPARK_MASTER_IP 為Spark 集群 Master 節(jié)點的 IP 地址;主節(jié)點把修改好配置文件的Spark文件夾發(fā)送到其他兩個從節(jié)點,這樣就完成了Spark的集群搭建。
(9)在各個節(jié)點上按照Kafka。先在主節(jié)點Master上下載并解壓Kafka文件夾;然后配置PATH變量;接下來,修改Kafka的配置文件:在server.properties中,設(shè)置broker.id為一整數(shù),設(shè)置Kafka的端口號port,設(shè)置log.dir為日志文件存放的文件路徑,設(shè)置zookeeper.connect為Zookeeper各節(jié)點的主機(jī)名和端口號。主節(jié)點把修改好配置文件的Kafka文件夾發(fā)送到其他兩個從節(jié)點,并在各個從節(jié)點下修改broker.id為全局唯一的其他整數(shù),這樣就完成了Kafka的集群搭建。
(三) 數(shù)據(jù)采集模塊的實現(xiàn)
該模塊負(fù)責(zé)從互聯(lián)網(wǎng)各個站點抓取新聞數(shù)據(jù)。實現(xiàn)該模塊時需考慮抓取速度、數(shù)據(jù)格式等問題。本系統(tǒng)使用Scrapy實現(xiàn)新聞網(wǎng)頁的抓取,利用XPath解析、提取網(wǎng)頁中用戶感興趣的內(nèi)容,將半結(jié)構(gòu)化的網(wǎng)頁數(shù)據(jù)轉(zhuǎn)化為結(jié)構(gòu)化的網(wǎng)頁數(shù)據(jù),并將結(jié)構(gòu)化網(wǎng)頁數(shù)據(jù)存儲至HBase中,作為新聞原始語料庫,供后續(xù)新聞特征學(xué)習(xí)、生成新聞事件圖譜和新聞檢索使用。
Scrapy作為網(wǎng)頁數(shù)據(jù)采集的工具,由調(diào)度器(Scheduler)、下載器(Downloader)、爬蟲(Spiders)、管道(Item Pipeline)和Scrapy引擎(Scrapy Engine)五個部分組成,其連接關(guān)系以及數(shù)據(jù)的流通方向如圖所示:
Scrapy運(yùn)行流程如下:
(1)Scrapy引擎從Spiders獲取鏈接url,并把鏈接url封裝成Requests傳給調(diào)度器 。
(2)調(diào)度器將Requests調(diào)度后經(jīng)引擎交給下載器,下載器把資源下載下來,封裝成Responses再次經(jīng)過引擎交給Spiders。
(3)Spiders處理Responses返回數(shù)據(jù)items給Item Pipeline,或者把新的Requests發(fā)送給調(diào)度器等待調(diào)度,開啟新一輪的爬取,直到調(diào)度器中沒有Requests。
在Scrapy自有框架的基礎(chǔ)下,本文根據(jù)實際需要對新浪新聞、中國新聞網(wǎng)的新聞數(shù)據(jù)進(jìn)行爬取,新聞爬蟲代碼流程圖如圖所示:
該爬蟲的運(yùn)行過程如圖所示:
通過新聞爬蟲獲取到的新聞字段信息如表5所示. 爬取到的新聞信息將會存儲到HBase數(shù)據(jù)庫中,作為新聞原始語料庫。
(四) 索引模塊的實現(xiàn)
倒排索引的構(gòu)建過程如圖所示,實現(xiàn)流程如下:
(1)獲取文本:獲取存儲在HBase中的新聞原始語料庫中的content字段的文本用來建立倒排索引。
(2)分詞:選用中文分詞工具來對選取的各個文本信息進(jìn)行分詞,生成item(term,docID),并記錄各個文本信息的長度。其中Item類的定義如下:
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;
import java.lang.String;
public class Item implements Comparable<Item> {
public String term;
public Integer freq;
public String strdocId;
//以下略
}
(3)排序:對提取的所有 items進(jìn)行排序。
(4)統(tǒng)計詞頻:統(tǒng)計在每個文檔中出現(xiàn)的每個item(term,docID)的詞頻tf,形成item(term,docID,freq)。
(5)統(tǒng)計df并去重:計算出現(xiàn)每個詞語的文檔個數(shù)df,將具有同個term的item(term,docID,freq)進(jìn)行合并處理,形成itemIndex(term,docs,total_freq,ori_item_list)。其中ItemIndex類的定義如下:
import java.util.LinkedList;
public class ItemIndex {
public String term;
public Integer docs;
public Integer freq_total;
public LinkedList<Item> ori_item_list;
//以下略
}
(6)基于itemIndex(term,docs,total_freq,ori_item_list)建立倒排索引結(jié)構(gòu)(包含Dictionary結(jié)構(gòu)和PostingList結(jié)構(gòu)),生成索引文件。倒排索引結(jié)構(gòu)如圖所示。
構(gòu)建好輪排索引之后還需將倒排索引文件中的詞典部分提取出來,對于詞典中的每個詞項,構(gòu)建旋轉(zhuǎn)結(jié)構(gòu),生成輪排索引。然后將輪排索引中每個詞項的旋轉(zhuǎn)結(jié)構(gòu)添加到B+索引樹中。實現(xiàn)流程如下:
(1)讀取倒排索引文件,反序列化形成倒排索引結(jié)構(gòu),把倒排索引結(jié)構(gòu)里Dictionary結(jié)構(gòu)里的每一項term形成輪排索引。以hello舉例,hello可以被轉(zhuǎn)換成hello$, ello$h, llo$he, lo$hel, o$hell。$代表中hello的結(jié)束,現(xiàn)在查詢hello等于查詢hello$,查詢hel*等于查詢hel*$,查詢*hel等于查詢hel$*,查詢hel*o等于查詢o$hel*。引入輪排的索引方法,可以支持通配符的模糊查詢方式
(2)在形成輪排索引的基礎(chǔ)上構(gòu)建B+索引樹,首先建立根節(jié)點,然后將單詞按照字典序逐個插入到B+樹中,B+索引樹構(gòu)建好后常駐在內(nèi)存中,以加快檢索速度。核心代碼如下:
public static BPlusTree createRotateIndex(LinkedList dictionary){
long startTime = System.currentTimeMillis(); //獲取開始時間
//每個節(jié)點可放4個關(guān)鍵字,5個子節(jié)點指針
int order = 4;
BPlusTree bPlusTree = new BPlusTree(order);
Iterator<ItemIndex> iterator = dictionary.iterator();
while (iterator.hasNext()) {
ItemIndex item = iterator.next();
String cur_term = item.term + "$";
for (int i = 0; i < cur_term.length() - 1; i++) {
bPlusTree.insertOrUpdate(cur_term, item);
cur_term = cur_term.substring(1) + cur_term.charAt(0);
}
}
構(gòu)建好的B+索引樹的一部分如下圖所示:
(五) 檢索模塊的實現(xiàn)
檢索過程流程圖如圖所示:檢索模塊的實現(xiàn)流程如下:
(1)獲取用戶的查詢內(nèi)容并進(jìn)行切分,切分后用戶的查詢內(nèi)容可劃分為三個組成部分(也可以只有其中一個組成部分或兩個):短語、帶通配符的短語、布爾運(yùn)算符,據(jù)此判斷出要用哪種查詢方式,短語使用精確查詢,帶通配符的短語使用范圍查詢,如查詢內(nèi)容還含有布爾運(yùn)算符,則需要根據(jù)相應(yīng)的布爾運(yùn)算符把精確查詢和范圍查詢(或精確查詢和精確查詢、范圍查詢和范圍查詢)兩者得到的結(jié)果進(jìn)行布爾查詢,篩選出初步的相關(guān)新聞docID列表。該新聞檢索子系統(tǒng)支持如下形式的查詢語句:
單個查詢:
X
XY或X或X或X*
多個查詢相結(jié)合:
XY或X或X或X或X AND XY或X或X或X或X
XY或X或X或X或X OR XY或X或X或X或X
XY或X或X或X或X ANDNOT XY或X或X或X或X …
XY或X或X或X或X AND XY或X或X或X或X OR…
…
(2)把初步的相關(guān)新聞docID列表和用戶查詢的關(guān)鍵詞項一起帶入BM25算法,計算出關(guān)鍵詞的詞項與該新聞的相關(guān)度得分,按照相關(guān)度得分高低的順序排列返回最終的相關(guān)新聞docID列表。BM25是目前信息索引領(lǐng)域最主流的計算用戶查詢與召回文檔相似度得分的算法。BM25算法公式如下所示:
公式中變量含義為:qtf:查詢關(guān)鍵詞的詞頻;tf:文檔中的詞頻;ld:文檔長度;avg_1:平均文檔長度;N:文檔數(shù)量;df:文檔頻率;b、k1、k3:可調(diào)參數(shù)。
(3)根據(jù)最終的相關(guān)新聞docID列表,從對應(yīng)的HBase數(shù)據(jù)庫存儲中得到詳細(xì)的新聞內(nèi)容信息返回給前端。
本系統(tǒng)采取HBase數(shù)據(jù)庫存儲和索引文件相結(jié)合的方式檢索數(shù)據(jù),HBase數(shù)據(jù)庫中存儲新聞網(wǎng)頁內(nèi)容的詳細(xì)信息,索引文件存儲了新聞網(wǎng)頁的索引信息。HBase數(shù)據(jù)庫存儲的作用是減輕索引存儲的容量負(fù)擔(dān),且當(dāng)索引文件崩潰或損壞時,還可以用HBase數(shù)據(jù)庫存儲的信息作為源,重新生成索引文件,從而提高系統(tǒng)的安全性。
(六) 新聞事件圖譜模塊的實現(xiàn)
新聞事件圖譜模塊的活動圖如上圖所示。它主要的功能是對新聞?wù)Z料庫中的每一篇新聞文本進(jìn)行文本處理、實體和事件識別和構(gòu)建事件網(wǎng)絡(luò)。
1. 文本處理
文本處理的步驟如下:
(1)輸入新聞文本。
(2)去除干擾信息:對輸入的新聞文本移除括號內(nèi)的內(nèi)容。
(3)分詞、詞性標(biāo)注:對新聞文本進(jìn)行分句,遍歷每個分句,對分句進(jìn)行分詞和詞性標(biāo)注,得到分詞結(jié)果words和詞性標(biāo)注結(jié)果postags。
以上步驟涉及到的處理結(jié)果words和postags的示例如下表所示:
2. 實體和事件識別
實體和事件識別的步驟如下:
(1)命名實體識別:遍歷words和postags列表,當(dāng)詞性為命名實體(人名、地名、機(jī)構(gòu)名)時,將該詞和詞性標(biāo)注按照“詞/詞性”格式拼接成一個字符串收集起來。
(2)對每一個具有命名實體的分句提取出SVO(主謂賓)三元組等信息:對words和postags列表進(jìn)行句法分析,返回句法分析結(jié)果tuples和句法分析樹的結(jié)構(gòu)child_dict_list。接著,遍歷tuples,對于SBV關(guān)系(表示主語與謂語的關(guān)系),抽取出主語、謂語,并根據(jù)謂語在child_dict_list中找到賓語,形成SVO三元組,最后將SVO三元組依次放入svo列表中。
以上步驟涉及到的處理結(jié)果tuples、child_dict_list和svo的示例如下:
3. 事件網(wǎng)絡(luò)構(gòu)建
事件網(wǎng)絡(luò)構(gòu)建的步驟如下:
(1)提取高頻詞:計算每個詞的出現(xiàn)頻率,并排除了長度小于等于 1 的詞匯。接著選取出現(xiàn)頻率最高的前 10 個詞匯,將這些詞匯的類別定義為“高頻詞”,并將這些詞匯的名稱和類別存儲在 events 列表中。
(2)挖掘關(guān)鍵詞:基于TextRank算法挖掘關(guān)鍵詞,將這些關(guān)鍵詞按權(quán)重從大到小排序,并返回前10個關(guān)鍵詞,然后將這些詞匯的類別定義為“關(guān)鍵詞”,并將這些詞匯的名稱和類別存儲在 events 列表中。
(3)提取SVO三元組:把全文經(jīng)過實體和事件識別得到的并且含有關(guān)鍵詞的SVO三元組收集起來,存儲在 events 列表中。
(4)提取全文命名實體:把全文經(jīng)過實體和事件識別得到的所有命名實體收集起來,存儲在 events 列表中。
(5)構(gòu)建事件共現(xiàn)網(wǎng)絡(luò):首先獲取命名實體共現(xiàn)對以及關(guān)鍵詞與命名實體的共現(xiàn)對。獲取命名實體共現(xiàn)對:對分句進(jìn)行遍歷,將分句中的命名實體兩兩組合作為共現(xiàn)對,遍歷分句結(jié)束后,將所有的共現(xiàn)對存儲在events 列表中;獲取關(guān)鍵詞與命名實體的共現(xiàn)對:對分句進(jìn)行遍歷,將分句中的關(guān)鍵詞和命名實體兩兩組合作為共現(xiàn)對,遍歷分句結(jié)束后,將所有的共現(xiàn)對存儲在events 列表中。最后將events列表轉(zhuǎn)化為共現(xiàn)網(wǎng)絡(luò)的節(jié)點和邊,最終將所有的節(jié)點和邊打包成JSON格式的數(shù)據(jù)。事件共現(xiàn)網(wǎng)絡(luò)JSON數(shù)據(jù)如下圖所示。
(6)存儲到HBase:把得到的新聞事件共現(xiàn)網(wǎng)絡(luò)JSON數(shù)據(jù)存儲到HBase中,由Web應(yīng)用根據(jù)用戶的選擇以圖譜化的形式渲染出來。
(七) 新聞特征學(xué)習(xí)模塊的實現(xiàn)
新聞特征學(xué)習(xí)模塊的流程如上圖所示。新聞特征學(xué)習(xí)模塊主要完成對新聞的特征表示,本系統(tǒng)使用向量空間模型表示新聞特征,即每條新聞數(shù)據(jù)以向量的形式表示。首先使用Spark Mlib庫對存儲在HBase數(shù)據(jù)庫的新聞原始語料庫進(jìn)行訓(xùn)練,先采用CountVectorizer模型得到新聞的詞袋向量,再將詞袋向量作為LDA模型的輸入,使用LDA模型訓(xùn)練新聞的主題分布向量。具體實現(xiàn)過程如下。
(1)首先,使用SparkConf提供的newAPIHadoopRDD接口從HBase數(shù)據(jù)庫中導(dǎo)入content字段的新聞?wù)奈谋?br> (2)對選取的新聞?wù)奈谋具M(jìn)行分詞并去除停用詞,過濾掉經(jīng)分詞和去除停用詞后詞項列表為空的新聞,防止后續(xù)訓(xùn)練過程中出現(xiàn)空指針異常。經(jīng)過數(shù)據(jù)預(yù)處理后的數(shù)據(jù)為RDD格式,需要基于StructType類型建立schema,與需要轉(zhuǎn)換的RDD相匹配建立DataFrame,才可以進(jìn)行進(jìn)一步處理。使用CountVectorizer模型將文本分詞后的詞項集合轉(zhuǎn)換為詞袋向量。
(3)數(shù)據(jù)預(yù)處理完畢后,可以進(jìn)行模型訓(xùn)練。將得到的詞袋向量轉(zhuǎn)遞給LDA模型。設(shè)置LDA模型的超參數(shù)主題Topics數(shù)量K=20,最大迭代次數(shù)MaxIter=20進(jìn)行訓(xùn)練。訓(xùn)練完畢后,每條新聞得到一個topicDistribution類型作為輸出,表示新聞的主題分布向量,也是新聞特征學(xué)習(xí)的最終輸出結(jié)果。
(4)調(diào)用自定義的hbaseSave方法,將訓(xùn)練結(jié)果保存到HBase數(shù)據(jù)庫。每條新聞內(nèi)容對應(yīng)的詞項集合、經(jīng)CountVectorizer模型訓(xùn)練得到的詞袋向量以及經(jīng)LDA模型訓(xùn)練得到的主題分布向量如下圖所示
(八) 用戶行為日志收集模塊的實現(xiàn)
用戶行為日志收集模塊的流程圖如上圖所示。用戶行為日志收集模塊主要利用Javascript、Kafka、Spark Streaming等技術(shù)實時處理用戶日志。具體實現(xiàn)過程如下。
(1)在用戶使用我們提供的Web應(yīng)用的基礎(chǔ)上,使用Javascript埋點技術(shù)收集用戶的點擊行為,收集的數(shù)據(jù)包括用戶id或名字,用戶點擊的新聞docId,點擊時間等。然后將用戶行為數(shù)據(jù)封裝為JSON格式,使用AJAX技術(shù)將JSON數(shù)據(jù)發(fā)送到后臺。收集用戶點擊行為的方法為自定義的postClick函數(shù)。收集的用戶行為日志格式如下表所示。
(2)postClick函數(shù)將用戶行為日志發(fā)送到后臺的"/get_action"接口,該接口再將數(shù)據(jù)轉(zhuǎn)發(fā)到Kafka上匯總,最后由Kafka交給Spark Streaming處理。
(3)Spark Streaming程序的流程:使用StreamingContext類配置Spark Streaming的數(shù)據(jù)接收間隔為5秒,即5秒接收的數(shù)據(jù)組成一個RDD。每5秒產(chǎn)生一個RDD組成DStream類型的數(shù)據(jù),DStream類型的數(shù)據(jù)實際是一個RDD序列。獲取Kafka中的數(shù)據(jù)后,使用Spark Streaming提供的foreachRDD功能遍歷所有的RDD窗口,并調(diào)用foreachPartition方法枚舉每一個分片進(jìn)行處理,處理的核心邏輯為迭代遍歷日志數(shù)據(jù),使用JSON解析器將String類型的日志數(shù)據(jù)為Map[String,String]對象,使用UUID創(chuàng)建隨機(jī)的RowKey,并將日志數(shù)據(jù)存儲到HBase的action_log表中。
(九) 新聞推薦模塊的實現(xiàn)
新聞推薦模塊的流程圖如上圖所示。具體實現(xiàn)如下:通過新聞發(fā)布時間過濾出待推薦新聞集合,對于待推薦新聞集合里的每一篇新聞,獲取其特征向量new_vec,并計算用戶偏好矩陣user_vec(計算用戶偏好矩陣的流程圖如下圖所示),然后計算new_vec和user_vec的余弦相似度simscore,之后按照simscore的大小進(jìn)行排序,按照排序結(jié)果返回前10篇新聞作為推薦結(jié)果。
(十) Web服務(wù)的實現(xiàn)
本系統(tǒng)采用Flask框架實現(xiàn)Web服務(wù)。Flask 是一種采用 Python 編寫的輕量級 Web 應(yīng)用框架,與其他同類框架相比,它相對更加靈活、輕便和安全性更高,且易于入門。Flask的設(shè)計理念上是基于 MVC(Model-View-Controller) 架構(gòu)的,可以與MVC模式很好地結(jié)合進(jìn)行開發(fā)。MVC架構(gòu)圖如下所示。
在 VSCode中創(chuàng)建Web服務(wù)的項目結(jié)構(gòu)如下圖所示。項目結(jié)構(gòu)包含:存放html模板的文件夾(templates)、存放靜態(tài)文件資源的文件夾(static)、項目配置文件(config.ini)、項目程序文件(main.py)、連接MySQL的程序文件(mysql.py)、連接Kafka的程序文件(conn_kafka.py)、計算用戶特征的程序文件(user_vec.py)。
1. 新聞檢索接口設(shè)計
Web服務(wù)提供搜索引擎主頁,可將接收到的用戶查詢內(nèi)容與提供核心搜索服務(wù)的數(shù)據(jù)檢索服務(wù)進(jìn)行交互,獲取相關(guān)新聞的docID列表,并從對應(yīng)的HBase數(shù)據(jù)庫存儲中得到詳細(xì)的新聞內(nèi)容信息返回給用戶。為此,Web服務(wù)需要提供新聞檢索接口以供與用戶進(jìn)行檢索交互。新聞檢索接口說明表如下表所示。
2. 新聞推薦接口設(shè)計
系統(tǒng)獲得新聞特征向量和用戶特征向量后,可開發(fā)新聞推薦接口供Web服務(wù)使用。該接口根據(jù)用戶ID或名字調(diào)用用戶特征計算方法計算出當(dāng)前用戶的特征向量,再調(diào)用新聞過濾方法獲得當(dāng)前待推薦新聞集合,然后枚舉推薦新聞集合,計算當(dāng)前用戶對每一條新聞的推薦評分值。最終將待推薦新聞按照推薦評分值從大到小排序后返回。新聞推薦接口說明表如下表所示。
3. 新聞事件圖譜可視化接口設(shè)計
用戶可選擇瀏覽新聞檢索服務(wù)或新聞推薦服務(wù)返回的新聞列表中的任何一條新聞的事件圖譜。為此,Web服務(wù)提供了一個可視化訪問新聞事件圖譜的接口。該接口會根據(jù)新聞的docID從對應(yīng)的HBase數(shù)據(jù)庫中讀取新聞事件圖譜JSON數(shù)據(jù),供前端渲染成圖譜化的形式返回給用戶。新聞事件圖譜可視化接口說明表如表11所示。
4. 用戶界面設(shè)計
界面設(shè)計主要在templates文件夾下,為了實現(xiàn)更好的用戶體驗,需要設(shè)計web界面。這個搜索引擎目前需要五個頁面,一個是搜索主頁頁面,用戶可輸入查詢內(nèi)容檢索新聞,并且可查看按查詢內(nèi)容檢索和經(jīng)BM25算法計算相關(guān)度排序的新聞列表;兩個是登錄注冊頁面,用戶可進(jìn)行登錄注冊;一個是新聞推薦頁面,用戶可獲取個性化的新聞推薦服務(wù);一個是新聞事件圖譜可視化頁面,用戶可瀏覽相應(yīng)的新聞事件圖譜。
六、 系統(tǒng)測試
系統(tǒng)測試是軟件測試的重要階段,它主要是測試整個系統(tǒng)是否滿足用戶需求,并且系統(tǒng)的性能是否正常運(yùn)行。該系統(tǒng)進(jìn)行了系統(tǒng)測試,主要分為功能測試和性能測試兩個部分。其中,功能測試涵蓋用戶登錄注冊、新聞檢索、新聞瀏覽和新聞推薦四個方面的測試。而性能測試則包括倒排索引構(gòu)建時間和檢索響應(yīng)時間兩個方面的測試。綜合上述測試,可以對該系統(tǒng)的功能和性能進(jìn)行全面的評估和優(yōu)化。
(一)功能測試
1. 用戶登錄注冊測試
該測試主要檢驗用戶登錄注冊功能是否正常運(yùn)作。測試要點包括用戶注冊、登錄、退出登錄等功能是否正常。
2. 新聞檢索測試
該測試主要檢驗用戶能否通過檢索功能準(zhǔn)確查找到所需的新聞。測試要點包括是否能夠?qū)π侣勥M(jìn)行精確查詢、布爾查詢和通配符查詢。
3. 新聞瀏覽測試
該測試主要檢驗新聞瀏覽功能是否正常運(yùn)行,并且顯示信息是否符合要求。測試要點包括新聞列表頁面的信息展示是否完整、新聞詳情頁面是否能正常跳轉(zhuǎn)、新聞的事件圖譜是否能正常顯示、檢索結(jié)果頁面跳轉(zhuǎn)是否正常等。
4. 新聞推薦測試
該測試主要檢驗系統(tǒng)能否成功根據(jù)用戶的新聞瀏覽記錄推薦相關(guān)新聞。測試要點包括推薦結(jié)果是否能正常顯示、推薦結(jié)果是否與用戶的瀏覽興趣相關(guān)等。
(二) 性能測試
1. 倒排索引構(gòu)建時間測試
該測試主要檢驗系統(tǒng)在倒排索引構(gòu)建時所需的時間,以確定系統(tǒng)的性能和用戶體驗。
上表顯示了為28353條新聞(字?jǐn)?shù)為9582976)構(gòu)建倒排索引時各步驟的運(yùn)行耗時,各步驟的運(yùn)行耗時均在合理的范圍內(nèi),此結(jié)果達(dá)到了預(yù)期。
2. 檢索響應(yīng)時間測試
該測試主要檢驗系統(tǒng)的檢索響應(yīng)時間,以確定系統(tǒng)的性能和用戶體驗。為了確保準(zhǔn)確獲取系統(tǒng)的檢索響應(yīng)時間,采用了以下測試步驟:在精確查詢、布爾查詢和通配符查詢方面,手動輸入關(guān)鍵詞進(jìn)行單次檢索,記錄了每種查詢方式的5組系統(tǒng)響應(yīng)時間,最后取每種查詢方式的5組響應(yīng)時間的平均值。
從上表可以看到,系統(tǒng)的檢索響應(yīng)時間在可接受范圍內(nèi)。此結(jié)果達(dá)到了預(yù)期,可以滿足用戶對新聞檢索的普通需求。
七、總結(jié)與展望
本文針對搜索引擎的廣闊應(yīng)用前景以及搜索引擎系統(tǒng)的基本原理設(shè)計一種應(yīng)用于新聞領(lǐng)域的全文搜索引擎,在對項目工程進(jìn)行分析之后,確定了一系列有針對性的技術(shù)解決方案:
(1)使用個性化定制的網(wǎng)絡(luò)爬蟲工具Scrapy爬取新聞頁面,對爬取到的新聞頁面進(jìn)行精準(zhǔn)解析,從而獲取用戶感興趣的新聞信息。
(2)結(jié)合時下應(yīng)用比較廣泛的分布式存儲技術(shù)存儲原始的新聞?wù)Z料庫,供后續(xù)的生成索引文件、配合新聞檢索使用,滿足了海量新聞內(nèi)容的存儲需求,同時保證了存儲可靠性。
(3)實現(xiàn)了新聞的常用搜索功能。用戶可輸入短語、帶通配符的短語以及布爾運(yùn)算符查詢感興趣的新聞內(nèi)容。
(4)根據(jù)用戶偏好向量和新聞主題分布向量,設(shè)計和實現(xiàn)了新聞推薦算法,并提供了接口供前臺Web服務(wù)調(diào)用。
(5)引入了事件圖譜可視化技術(shù),將新聞中的各個關(guān)鍵點以及關(guān)鍵點之間的關(guān)聯(lián)都展現(xiàn)在圖譜中,提升了用戶瀏覽新聞時的用戶體驗。
本文研究僅研究了搜索引擎的基本理論和典型框架,實際上搜索引擎系統(tǒng)的真正內(nèi)涵非常豐富,它所涉及的技術(shù)正在向多元化、縱深化發(fā)展。現(xiàn)在的搜索引擎不僅能搜文字內(nèi)容,還能搜索圖片、音樂等,并且更加注重智能化和個性化。我將繼續(xù)努力學(xué)習(xí),不斷提高自己在這個領(lǐng)域的知識和技能。另外,雖然本系統(tǒng)已經(jīng)擁有了部分功能,但仍存在一些不完善的地方以及需要進(jìn)一步開發(fā)的進(jìn)階功能,可以在如下方面進(jìn)行改進(jìn):
(1)可以考慮引入拼寫檢查功能,這是市面上成熟的搜索引擎所擁有的。
(2)利用先進(jìn)的自然語言處理技術(shù)挖掘用戶檢索行為日志,對用戶檢索語句進(jìn)行分析和改寫,從而召回更多、更優(yōu)質(zhì)的搜索結(jié)果。文章來源:http://www.zghlxwxcb.cn/news/detail-633165.html
參考文獻(xiàn)
[1] (美)曼寧,(美)拉哈萬,(德)舒策. 信息檢索導(dǎo)論[M]. 北京: 人民郵電出版社, 2010.
[2] Spark快速大數(shù)據(jù)分析[M]. 卡勞;;肯維尼斯科;;溫德爾;;扎哈里亞.人民郵電出版社.2015
[3] 推薦系統(tǒng)實踐[M]. 項亮, 編著.人民郵電出版社.2012
[4]時亞南,張?zhí)t,陳燕紅,郭斌.大規(guī)模非結(jié)構(gòu)化數(shù)據(jù)的索引技術(shù)研究[J].計算機(jī)技術(shù)與發(fā)展,2014,24(12):109-113.
[5]耿慶田,狄婧,常亮,趙宏偉.基于B+樹的數(shù)據(jù)索引存儲[J].吉林大學(xué)學(xué)報(理學(xué)版),2013,51(06):1133-1136.
[6]韓志強(qiáng). 基于Hadoop的分布式藏文新聞網(wǎng)站垂直搜索引擎設(shè)計與實現(xiàn)[D].中央民族大學(xué),2016.
[7]崔博. 基于Spark Streaming的實時新聞推薦平臺的設(shè)計與實現(xiàn)[D]. 山東大學(xué), 2018.
[8]李釗. 基于大數(shù)據(jù)的熱點醫(yī)療新聞系統(tǒng)的研究與實現(xiàn)[D]. 西北大學(xué), 2018.
[9]張翼. 基于分布式的新聞爬取和推薦系統(tǒng)的設(shè)計與實現(xiàn)_張翼[D]. 山東大學(xué), 2018.
[10]李鑫克. 基于爬蟲技術(shù)的小型垂直搜索引擎的設(shè)計與實現(xiàn)_李鑫克[D]. 首都經(jīng)濟(jì)貿(mào)易大學(xué),2020.
[11]吳小飛. 分布式環(huán)境下動態(tài)實時新聞推薦技術(shù)研究[D].北京工業(yè)大學(xué),2018.
[12]陳銘權(quán). 基于主題模型的用戶興趣建模及在新聞推薦中的應(yīng)用[D].華南理工大學(xué),2015.
[13]丁正祁,彭余輝,孫剛.基于改進(jìn)LDA主題模型的個性化新聞推薦算法[J].赤峰學(xué)院學(xué)報(自然科學(xué)版),2021,37(06):28-32.DOI:10.13398/j.cnki.issn1673-260x.2021.06.006.
[14]查云杰. 基于網(wǎng)絡(luò)新聞的知識圖譜構(gòu)建與研究[D].武漢郵電科學(xué)研究院,2020.DOI:10.27386/d.cnki.gwyky.2020.000064.
[15]黃恒琪,于娟,廖曉等.知識圖譜研究綜述[J].計算機(jī)系統(tǒng)應(yīng)用,2019,28(06):1-12.DOI:10.15888/j.cnki.csa.006915.文章來源地址http://www.zghlxwxcb.cn/news/detail-633165.html
到了這里,關(guān)于基于Java的新聞全文搜索引擎的設(shè)計與實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!