閱讀708 返回首頁    go 阿裏雲 go 技術社區[雲棲]


學術分享搜索平台——設計方案

項目背景

有兩類和我們大學生息息相關的產品。一類是微博,人人,豆瓣這些偏SNS的社交平台,推薦同學朋友的信息,幫助我們找到可能認識的人,可能喜歡的書,可能愛看的電影等等。另一類是學術相關的搜索引擎,比如Google Scholar,Microsoft Academic Search Engine,通過搜索關鍵字,提供一些匹配度最高的學術論文,提供很多便利。

然而,學術搜索引擎是一個比較通用的工具,每個人搜索同一個詞,給出的都是相同的Ranking List,不會像亞馬遜一樣根據用戶的瀏覽和購書記錄進行個性化推薦。基於這點,我的畢設內容是做一個帶有用戶個性化推薦性質的知識分享平台,在搜索到可能想要的結果之外,推薦給用戶相關的學者,論文。同時,知識分享平台集成“眾包”的理念,讓用戶去添加和分享自己感興趣,想分享的知識,讓平台更加社交化。

學術分享搜索引擎作為“知識中心”的一部分,為自動綜述編寫提供豐富的論文資源。基於論文內容的分析和推薦,可以在這一個數據源下找到各領域,學者的論文,構成一個知識網絡。這個知識網絡為知識中心提供學術方麵的知識搜索和挖掘,結合“眾包”的理念,讓用戶分享知識,傳遞知識,同時平台為用戶推薦相關的論文列表和全文內容,把學術的搜索,推薦和“眾包”結合在一起,打造實用,便利的“知識中心”。


目標任務

目標是搭建一個知識分享平台,提供計算機科學方麵的垂直搜索,具體內容,一方麵是著名的專家學者的個人信息,也包括他的publications,個人主頁等;另一方麵是論文搜索結果,包括標題,全文等各個維度的檢索功能。平台還允許並鼓勵用戶自己上傳想要分享的論文,學者個人主頁,並將獲得這些數據,集成進平台底層數據中。在“眾包”的效果下,用戶還會發現與自己關注同相同領域,有著相似興趣的其他用戶,依照用戶自己的搜索記錄,收藏記錄和分享記錄,平台會為用戶進行推薦,有相關領域著名學者的推薦,論文的推薦,個人主頁的推薦和興趣相似的用戶群推薦。

下圖為整個平台需要實現的模塊架構圖:

從互聯網數據源裏獲取需要的學術資源,存儲到分布式數據庫及文件係統內,對資源提取文本內容並建立索引。這部分數據除了提供搜索外,也提供給相似度發現計算模塊來進行論文,用戶,學者的推薦,展示在搜索結果中。用戶登錄之後可以收藏感興趣的搜索結果,也可以分享上傳學者主頁來擴充數據庫。整個係統的主體邏輯如上,主要包含了搜索推薦,內容提取,數據爬取,索引建立以及一些基礎模塊。具體各個模塊的解決方案和實現方法將在第四部分詳細闡述。

問題分析

  1. 平台的初始數據(學者和論文)需要自己爬取,並且具備一定的數據量。論文的全文需要處理和分析,為搜索和推薦做好準備。
  2. 在抓取和分析用戶上傳的學者個人主頁時,要分析處理有效信息,得到論文列表,為個人主頁的推薦做基礎。
  3. 需要為大規模的數據建立高效的索引。索引具備增量,近實時等特點。設計索引文檔的結構,支持各維度的檢索需求。
  4. 平台以網站的方式呈現,支持用戶注冊登錄,為每位用戶展現一個收藏,分享記錄的頁麵。提供快速的搜索體驗,保證一定的搜索準確度。
  5. 相關學者,論文和個人主頁的推薦和挖掘需要做到盡可能好的效果。
  6. 利用數據可視化,直觀展示學術知識網絡。可以嚐試簡單地展示學者的研究領域,用戶興趣,論文之間引用關係等更深入的知識。


初步技術方案

數據爬取

需求分析

數據需求是計算機科學方麵的學者和論文元數據,所以我的爬取需求是定向的網絡爬取,而不是通用的爬取。在調研,使用和對比了Nutch,Heritrix,Scrapy這些爬蟲工具之後,決定采用Scrapy來做數據的爬取。


解決方案

Scrapy是一個Python寫的爬蟲框架,高效簡單,代碼量少,定製方便,而且是一個企業級的開源爬蟲。相對於Nutch,Heritrix要輕量級很多,基本沒有配置。它使用Python庫中Twisted這個優秀的異步網絡庫來處理網絡通訊,架構清晰,並且包含了各種中間件接口,可以靈活完成各種需求。

在爬數據的過程中,有兩點還需要考慮。第一點是頻繁的爬取會被目標站點發現,以至封掉爬蟲機器的IP,簡單的解決方案是在每兩次頁麵抓取過程中加上適當的時間停頓,模擬人的瀏覽方式。第二點是數據的存儲。Scrapy支持以json形式存儲和讀取爬取到的內容,我將把json對象存入MongoDB內,下麵會具體介紹。



數據存儲

需求分析

“學者”的數據大致包含以下一些字段:全名,工作地,個人主頁,研究領域(多字段),論文列表(多字段)。“論文”的元數據信息大致包含:題目,摘要,作者(多字段),期刊,下載鏈接。如果讓傳統的麵向行的關係型數據庫,如MySQL,來存取數據,多字段會需要多張表之間的join操作,表之間需要外鍵關聯,會影響查詢性能。此外,可以適當放寬數據查詢的一致性,隻要滿足CAP中的A和P。所以理想的存取方式是非結構化的存儲,並且具備可用性和分布式可擴展性,達到最終一致性。


解決方案

MongoDB是當下比較熱門的NoSQL之一。MongoDB是麵向文檔的NoSQL,也是易用性最高的。選擇MongoDB,在解決以下幾個問題中具備優勢:

1.     MongoDB的存儲模型是嵌套型的K/V對模型,稱為BSON。通過pymongo驅動能和Scrapy輕鬆連接,並直接將json形式的數據存入數據庫中。對於“學者”和“論文”,隻要各自一個collection(相當於MySQL中的一張表)就能完成存儲和查詢需求。

2.     MongoDB有主從,分片的部署方式。主從集群中,從節點會自動備份當前活躍節點的數據,任何集群中的節點都有可能成為主節點,所以集群容錯性強,且具備故障恢複的能力,這樣的集群稱為Replica Set。分片部署類似分布式部署,路由服務器會將多個分片節點與配置服務器相關聯,且分片節點可簡單增刪,讓集群具備高可擴展性,數據庫的容量也得到了擴充。分片服務器還能根據指定的片鍵對指定數據庫的collection讀寫做負載均衡。我將搭建一個健壯的MongoDB集群部署。

3.     MongoDB自帶的GridFS用於存儲較大的文件,“視覺中國”就利用該功能存儲海量的圖片。我將利用GridFS存儲pdf格式的論文。

4.     MongoDB相比MySQL,還有更簡潔的查詢語言(實現在自帶的js環境中),強大的基於MapReduce的查詢等等。

 

索引

需求分析

搜索是平台提供的最主要服務,需要對學者,論文兩塊的元數據,以及論文的全文數據建立高效的索引,提供各個維度的搜索需求。考慮到論文也是結構比較清晰的一類全文數據,對於論文內部的各個章節的數據也需要工具來定向提取和分析處理,然後建立到索引內提供搜索。索引內可以存儲部分數據,而大量的全文內容還是要存儲在數據庫內,所以索引和數據庫之間也存在連結和交互。


解決方案

Lucene是一個java語言的搜索引擎庫,為開發者提供了索引建立,搜索兩塊搜索引擎需要具備的基本功能。使用Lucene來自己定製索引塊內的文檔結構,為學者和論文定製索引,使用lucene的排序,高亮等功能,能搭建一套搜索原型了。

Solr兼容Lucene,將Lucene庫進行了包裝,封裝成了一個可用的配置型搜索服務。在servlet容器(Tomcat,或者更輕量級的Jetty)中啟動即可成為一個Http接口的搜索服務,能讓搜索模塊與網站隔離並且方便調用。Solr除了具備Lucene提供的一些搜索功能外,還提供批量的數據導入和自動建立索引,這裏不涉及這塊內容,因為索引的具體建立是由我利用Lucene自己建立的。我需要Solr的主要原因還是把它當作一個獨立的搜索服務層。

除此之外,Apache Tika是一個內容抽取工具,我將使用Tika來抽取pdf內的論文全文內容,並進行處理和分析,將全文內容建立索引並存入MongoDB內,這些全文內容還可以服務於進一步挖掘論文之間的關係,涉及到相關推薦模塊。

 

推薦/挖掘

需求分析

其實是基於研究方向,感興趣領域的推薦,推薦內容可以是用戶群,學者,論文。具體推薦這塊如何做,用什麼做還沒有想好。也可能是一些關係的挖掘。

參考這裏:文本相似度計算基本方法小結


網站搭建

需求分析

網站的需求分析是相對簡單的,能提供用戶注冊登陸,提供搜索框和搜索結果界麵,提供用戶上傳和分享pdf或者url鏈接的頁麵。在整個工程中,網站搭建這塊並不是重點,隻是一個呈現形式。當然如果有時間盡量把他做得更簡潔,更geek一點。


解決方案

在體驗了一下Django之後,雖然他層次很清楚,開發便捷,可是考慮到我上述有比較多的java模塊銜接,除了搜索可以作為服務外,別的小的模塊還是需要融入到整個平台的代碼裏,所以暫時還是決定采用Spring+Struts2的框架來搭建這個平台。前台的技術和庫基本上還是bootstrap,帶上一些CSS3的東西。


結束語

我把整個工程作為我自己定的畢設內容。初衷是想把我自己實踐過和想實踐的工具/產品/技術都融合起來,讓畢設成為一個沉澱技術積累和進一步學習新技術的過程。項目的代碼都托管在我的github賬戶上,而且是公開的。
我一直貫徹著"需求推動技術"的想法。當我想做這個平台,並且手上已經有了很多爬來的數據的時候,開始考慮我是不是要去學習一些推薦係統方麵的東西,我是不是需要去閱讀一些相關論文,學習一下文本之間怎麼挖掘,怎麼根據主題去聚類分類,要用到什麼樣的算法。所以“推薦”,或者“挖掘”這塊還沒有具體想好。隨著平台的搭建,一個產品原型出來了之後,自然會有更多的東西和可實踐,可深化,可挖掘的東西。


最後更新:2017-04-03 22:15:45

  上一篇:go VMware用vCloud混合雲服務對抗AWS
  下一篇:go 專訪許長敬:移動互聯網將進入電子商務時代