
機器學習發展到現在,已經積累了非常多的文章,特别是深度學習火起來後,每年新增加的論文非常多,如果需要研究某個領域,不僅需要閱讀這個領域經典的論文,也必須時刻關注最新的學術進展,比如最近兩年特别火的 GAN,不僅需要先了解它的第一篇開山之作--"Generative Adversarial Nets",也需要關注最新發表的該領域的論文。
而查找論文,除了直接谷歌搜尋外,通常都會到 arxiv 網站上查找,下圖顯示的是在計算機視覺和模式識别這個類别下的最新論文:
不過,從上圖也可以知道,這裡僅僅展示了論文名字和作者、發表時間等資訊,如果是熟悉的作者,比如一些大牛,當然就值得我們一看,但如果作者不熟悉,就隻能通過論文名字判斷是否值得點選論文名字,檢視論文簡介,再通過論文簡介判斷是否值得下載下傳 pdf 來精讀或者泛讀。
如果可以,我們當然希望在這個頁面就可以展示論文簡介,這樣可以減少一個步驟。
是以今天推薦一個基于 arXiv 提供的 API 實作的更加易于閱讀機器學習方面論文的網站,網站如下所示:
網址:http://www.arxiv-sanity.com/
上圖左上角,可以這個網站目前收集了過去幾年大約總共 62820 篇論文,都是機器學習方面的論文,然後下方有幾個頁籤,分别是:
most recent展示最新的論文。對于每篇論文,都會展示名字、作者、發表時間,論文的圖示,論文的簡介,然後可以下載下傳 pdf,并且還可以搜尋相似論文和有讨論區。
不過對于讨論區,似乎因為使用人數不多,或者是發表評論的人不多,直接展示的論文基本都沒有評論留言,需要直接點選
discussions這個頁籤才會展示有評論的論文,但基本都是隻有一條評論,不多于兩條評論。
top recent根據登入使用者收藏到其 library 的論文展示,可以選擇展示最近幾天的範圍,包括最近一天、三天、一周、一個月、一年以及所有。
這主要是展示在 Twitter 上提及過的論文,可以檢視提及的使用者,以及發的 twitter 内容,不過我看基本都是屬于直接轉發 arxiv 的官方twitter 發表的推文,類似于我們直接轉發微網誌。
後面的幾個頁籤,除了
discussions,其餘幾個都是需要進行登入的,
friends就是展示你朋友的論文,
recommanded就是基于你收藏在你的
library的論文來展示,這裡開發者還給出采用的方法,是基于 SVM 算法。
Github 項目
這個網站的實作代碼是開源在 Github 上的:
https://github.com/karpathy/arxiv-sanity-preserver
其中通過 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
但這個指令會還需要繼續安裝其他依賴庫
運作流程
整個項目的運作流程需要依次運作好幾個腳本檔案,這裡最好仔細檢視每個腳本代碼,它們包含不少設定,這些設定可能是你希望修改的。按如下順序來依次執行下列代碼:
-
:通過 arxiv API 進行查詢并建立一個包含每篇論文所有資訊的檔案fetch_papers.py
。這份代碼可以修改你想查詢的内容,比如不是查詢機器學習,而是其他計算機内容,如資料庫等類别。這裡需要注意,**一次性查詢太多論文會受到 arxiv 的限制,**是以最好分批運作這份代碼,并通過參數db.p
來設定每次重新運作時的起始位置;--start-index
-
:下載下傳論文并儲存到檔案夾download_pdfs.py
;pdf
-
:輸出所有 pdfs 中的文字部分,儲存到parse_pdf_to_text.py
檔案夾txt
-
:生成 pdfs 的略縮圖,儲存到檔案夾thumb_pdf.py
thumb
-
:基于analyze.py
來計算所有文檔的bigrams
向量,生成檔案tfidf
,tfidf.p
,tfidf_meta.p
sim_dict.p
-
:對所有使用者訓練 SVMs ,并輸出檔案buildsvm.py
user_sim.p
-
:主要是進行預處理來加快伺服器啟動的速度,如果是第一次運作該代碼需要確定執行指令make_cache.py
來初始化一個空的資料庫sqlite3 as.db < schema.sql
- 在背景開啟一個
守護程序。Mongodb可以通過這篇教程來安裝--https://docs.mongodb.com/tutorials/install-mongodb-on-ubuntu/mongodb
-
指令開啟 mongodb 服務sudo service mongod start
- 确定服務在背景運作:在檔案
中最後一行必須是/var/log/mongodb/mongod.log
[initandlisten] waiting for connections on port <port>
- 運作
代碼來開啟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