天天看點

c++builder 運作網站的api_[Github 項目推薦] 一個更好閱讀和查找論文的網站

c++builder 運作網站的api_[Github 項目推薦] 一個更好閱讀和查找論文的網站

機器學習發展到現在,已經積累了非常多的文章,特别是深度學習火起來後,每年新增加的論文非常多,如果需要研究某個領域,不僅需要閱讀這個領域經典的論文,也必須時刻關注最新的學術進展,比如最近兩年特别火的 GAN,不僅需要先了解它的第一篇開山之作--"Generative Adversarial Nets",也需要關注最新發表的該領域的論文。

而查找論文,除了直接谷歌搜尋外,通常都會到 arxiv 網站上查找,下圖顯示的是在計算機視覺和模式識别這個類别下的最新論文:

c++builder 運作網站的api_[Github 項目推薦] 一個更好閱讀和查找論文的網站

不過,從上圖也可以知道,這裡僅僅展示了論文名字和作者、發表時間等資訊,如果是熟悉的作者,比如一些大牛,當然就值得我們一看,但如果作者不熟悉,就隻能通過論文名字判斷是否值得點選論文名字,檢視論文簡介,再通過論文簡介判斷是否值得下載下傳 pdf 來精讀或者泛讀。

如果可以,我們當然希望在這個頁面就可以展示論文簡介,這樣可以減少一個步驟。

是以今天推薦一個基于 arXiv 提供的 API 實作的更加易于閱讀機器學習方面論文的網站,網站如下所示:

網址:http://www.arxiv-sanity.com/

c++builder 運作網站的api_[Github 項目推薦] 一個更好閱讀和查找論文的網站

上圖左上角,可以這個網站目前收集了過去幾年大約總共 62820 篇論文,都是機器學習方面的論文,然後下方有幾個頁籤,分别是:

most recent

展示最新的論文。對于每篇論文,都會展示名字、作者、發表時間,論文的圖示,論文的簡介,然後可以下載下傳 pdf,并且還可以搜尋相似論文和有讨論區。

不過對于讨論區,似乎因為使用人數不多,或者是發表評論的人不多,直接展示的論文基本都沒有評論留言,需要直接點選

discussions

這個頁籤才會展示有評論的論文,但基本都是隻有一條評論,不多于兩條評論。

top recent

根據登入使用者收藏到其 library 的論文展示,可以選擇展示最近幾天的範圍,包括最近一天、三天、一周、一個月、一年以及所有。

c++builder 運作網站的api_[Github 項目推薦] 一個更好閱讀和查找論文的網站
top hype

這主要是展示在 Twitter 上提及過的論文,可以檢視提及的使用者,以及發的 twitter 内容,不過我看基本都是屬于直接轉發 arxiv 的官方twitter 發表的推文,類似于我們直接轉發微網誌。

c++builder 運作網站的api_[Github 項目推薦] 一個更好閱讀和查找論文的網站

後面的幾個頁籤,除了

discussions

,其餘幾個都是需要進行登入的,

friends

就是展示你朋友的論文,

recommanded

就是基于你收藏在你的

library

的論文來展示,這裡開發者還給出采用的方法,是基于 SVM 算法。

Github 項目

這個網站的實作代碼是開源在 Github 上的:

https://github.com/karpathy/arxiv-sanity-preserver

c++builder 運作網站的api_[Github 項目推薦] 一個更好閱讀和查找論文的網站

其中通過 Arxiv API 查找論文的代碼檔案是

fetch_papers.py

,可以在這個代碼中改變希望查找的論文類别,不僅僅是機器學習。對于 Arxiv API ,可以檢視說明文檔,文檔位址:

https://arxiv.org/help/api/user-manual#detailed_examples

代碼結構

根據作者介紹,代碼主要分為兩部分:

查詢代碼

通過 Arxiv API 來下載下傳指定類别的最新論文,并提取每篇論文的内容來提取文字,建立

tfidf

向量,這部分代碼需要考慮的就是後端爬取和計算方面的功能:

  • 建立一個 arxiv 論文的資料庫
  • 計算内容向量
  • 生成略縮圖
  • 給使用者計算 SVMs
  • 等等

使用者界面

這部分是一個網頁端的伺服器(基于 Flask/Tornado/sqlite),實作通過資料庫查詢論文,根據相似性來過濾使用者,等功能。

依賴庫

需要的依賴庫包括:

  • numpy
  • feedparser--解析 xml 檔案
  • scikit learn--處理 tfidef 向量,并實作 SVM 算法
  • flask--展示結果
  • flask_limiter
  • tornado
  • dateutil
  • scipy
  • sqlite3

上述依賴庫可以通過下列指令來安裝:

$ virtualenv env                # optional: use virtualenv
$ source env/bin/activate       # optional: use virtualenv
$ pip install -r requirements.txt
           

除此外,還需要

ImageMagick

pdftotext

,在

Ubuntu

可以通過指令安裝:

sudo apt-get install imagemagick poppler-utils
           

但這個指令會還需要繼續安裝其他依賴庫

運作流程

整個項目的運作流程需要依次運作好幾個腳本檔案,這裡最好仔細檢視每個腳本代碼,它們包含不少設定,這些設定可能是你希望修改的。按如下順序來依次執行下列代碼:

  1. fetch_papers.py

    :通過 arxiv API 進行查詢并建立一個包含每篇論文所有資訊的檔案

    db.p

    。這份代碼可以修改你想查詢的内容,比如不是查詢機器學習,而是其他計算機内容,如資料庫等類别。這裡需要注意,**一次性查詢太多論文會受到 arxiv 的限制,**是以最好分批運作這份代碼,并通過參數

    --start-index

    來設定每次重新運作時的起始位置;
  2. download_pdfs.py

    :下載下傳論文并儲存到檔案夾

    pdf

  3. parse_pdf_to_text.py

    :輸出所有 pdfs 中的文字部分,儲存到

    txt

    檔案夾
  4. thumb_pdf.py

    :生成 pdfs 的略縮圖,儲存到檔案夾

    thumb

  5. analyze.py

    :基于

    bigrams

    來計算所有文檔的

    tfidf

    向量,生成檔案

    tfidf.p

    ,

    tfidf_meta.p

    ,

    sim_dict.p

  6. buildsvm.py

    :對所有使用者訓練 SVMs ,并輸出檔案

    user_sim.p

  7. make_cache.py

    :主要是進行預處理來加快伺服器啟動的速度,如果是第一次運作該代碼需要確定執行指令

    sqlite3 as.db < schema.sql

    來初始化一個空的資料庫
  8. 在背景開啟一個

    mongodb

    守護程序。Mongodb可以通過這篇教程來安裝--https://docs.mongodb.com/tutorials/install-mongodb-on-ubuntu/
  • sudo service mongod start

    指令開啟 mongodb 服務
  • 确定服務在背景運作:在檔案

    /var/log/mongodb/mongod.log

    中最後一行必須是

    [initandlisten] waiting for connections on port <port>

  1. 運作

    serve.py

    代碼來開啟

    flask

    服務。通過通路

    localhost:5000

    來檢視最終運作的效果!

另外,也可以運作

twitter_daemon.py

來啟動一個螢幕會話,它會采用你的

twitter

API(儲存在檔案

twitter.txt

)來查找在 Twitter 上被提及到的在資料庫中的論文,并儲存結果到檔案

twitter.p

作者寫了一個簡單的指令行腳本依次執行上述代碼,每天都會運作依次這個腳本來抓取新的論文,并儲存到現有資料庫中,然後重新計算所有的

tfidf

向量或分類器。

注意

:對于代碼

analyze.py

,它利用

numpy

來做很多計算工資,這裡推薦安裝

BLAS

(比如

OpenBLAS

)方面的庫來提高計算速度,安裝後,對于 25000 篇論文和 5000 多個使用者僅需要幾個小時即可完成計算。

線上運作

如果希望線上運作

flask

伺服器,比如在 AWS 上,運作指令

python serve.py --prod

另外,你還需要建立一個密鑰檔案

secret_key.txt

,并添加随機的文字(具體做法可以檢視

server.py

代碼)

目前工作流程

目前對于該網站還不能實作全自動,需要每天都手動運作部分代碼來擷取最新的論文,這裡作者給出剛剛提到的腳本檔案内容:

python fetch_papers.py
python download_pdfs.py
python parse_pdf_to_text.py
python thumb_pdf.py
python analyze.py
python buildsvm.py
python make_cache.py
           

然後會通過一個螢幕會話運作服務,這需要執行指令

screen -S serve

來建立會話(或者參數

-r

來重新連接配接),然後運作下列指令:

python serve.py --prod --port 80
           

那麼伺服器會載入新的檔案并展示在網站上。不過有些系統可能需要加上指令

sudo

才可以使用 80 端口,這裡有兩個解決辦法,一個是使用

iptables

來變更端口,或者采用

setcap

來提高你的

python

解釋器的權限,參考文章:

http://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-1024-on-l

但對于這個方法,需要謹慎使用,最好是采用

virtualenv

等虛拟環境。

小結

最後,再次給出網站和項目的位址:

http://www.arxiv-sanity.com/

https://github.com/karpathy/arxiv-sanity-preserver