當前位置:
首頁 > 最新 > 如何將Python自然語言處理速度提升100倍:用spaCy/Cython加速NLP

如何將Python自然語言處理速度提升100倍:用spaCy/Cython加速NLP

作者|ThomasWolf譯者|王強來自|AI前線AI前線導讀:去年我們發布了基於Python的共指解析包之後,社區反饋非常熱烈,大家開始在各式應用中使用它,有些應用場景與我們原來的對話用例非常不一樣。之後我們發現,雖然這個解析包的性能對於對話消息來說是足夠的,但涉及到大篇幅新聞文章時就遠遠不夠了。

讓我們通過一個簡單的例子來解決這個問題。假設有一堆矩形,我們將它們存儲成一個由Python對象(例如Rectangle類實例)構成的列表。我們的模塊的主要功能是對該列表進行迭代運算,從而統計出有多少個矩形的面積是大於所設定閾值的。我們的Python模塊非常簡單,看起來像這樣:

這個check_rectangles函數就是我們的瓶頸所在!它對大量Python對象進行循環檢查,而因為Python解釋器在每次迭代中都要做很多工作(比如在類中查找area方法、打包和解包參數、調用PythonAPI等),這個循環就會非常影響性能。這時就該引入Cython來幫助我們加速循環了。

這裡我們使用了C指針的原始數組,但你也可以選擇其它方案,特別是諸如向量、二元組、隊列之類的C++結構(http://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html#standard-library)。

StringStore對象實現了Pythonunicode字元串與64位哈希值之間的映射。我們可以從spaCy的任意位置和任意對象訪問它,例如npl.vocab.strings、doc.vocab.strings或span.doc.vocab.string。當一個模塊需要在某些節點上獲得更高的性能時,只要使用C類型的64位哈希值代替字元串即可。

我寫了一個腳本,創建一個包含10個文檔(經過spaCy處理)的列表,每個文檔有大約17萬個單詞。當然,我們也可以做17萬個文檔(每個文檔包含10個單詞),但是創建這麼多文檔會很慢,所以我們還是選擇10個文檔。我們想要在這個數據集上執行一些NLP任務。例如,我們想要統計數據集中單詞「run」作為名詞出現的次數(也就是被spaCy標記為「NN」)。

但它也非常慢!這段代碼在我的筆記本上需要運行1.4秒才能獲得結果。如果我們的數據集中包含數以百萬計的文檔,我們也許要花費一天以上才能看到結果。我們可以使用多線程來提速,但在Python中這往往不是最佳方案(https://youtu.be/yJR3qCUB27I?

代碼有點長,因為我們必須在調用Cython函數[*](https://medium.com/huggingface/100-times-faster-natural-language-processing-in-python-ee32033bdced#a220)之前在main_nlp_fast中聲明和計算C結構。但它的性能得到大幅提升!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python虛擬環境的安裝與配置
怎麼讓代碼更Pythonic?光有技巧可不行,你還需要看這些

TAG:Python |