999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

如何利用Python 為自然語言處理加速

2019-09-10 07:22:44
電腦報 2019年34期

自去年發(fā)布 Python 的指代消解包(coreference resolution package)之后,很多用戶開始用它來構(gòu)建許多應用程序,而這些應用與我們最初的對話應用完全不同。我們發(fā)現(xiàn),盡管在處理對話時這個包的速度完全沒問題,但在處理較大的問題時卻非常慢。

筆者決定調(diào)查一下這個問題,于是就產(chǎn)生了 NeuralCoref v3.0(https://github.com/huggingface

/neuralcoref/)這一項目,它比上一個版本快 100 倍(每秒能分析幾千個單詞),同時保持準確度、易用性,并且依然在 Python 庫的生態(tài)系統(tǒng)中。

在本文中筆者想分享一些在這個項目中學習到的經(jīng)驗,具體來說包括:

1.怎樣用 Python 設計高速的模塊;

2.怎樣利用 spaCy 的內(nèi)部數(shù)據(jù)結(jié)構(gòu)來有效地設計高速的 NLP 函數(shù)。

雖然我們是在討論 Python,但還要用一些 Cython的魔法。但別忘了,Cython 是 Python 的超集(http://cython.org/),所以別被它嚇住了!

為 pyTorch 或 TensorFlow 等深度學習框架預處理一個大型數(shù)據(jù)集,或者在深度學習的批次加載器中有個很復雜的處理邏輯使得訓練變慢。

加速的第一步:性能分析

首先要明確一點,絕大部分純 Python 的代碼是沒有問題的,但有幾個瓶頸函數(shù)如果能夠解決,就能給速度帶來數(shù)量級上的提升。

因此首先應該用分析工具分析 Python 代碼,找出哪里慢。一個辦法是使用cProfile(https://docs.python.org/3/library/profile.html):

import cProfile

import pstats

import my_slow_module

cProfile.run(‘my_slow_module.run()’, ‘restats’)

p = pstats.Stats(‘restats’)

p.sort_stats(‘cumulative’).print_stats(30)

也許你會發(fā)現(xiàn)有幾個循環(huán)比較慢,如果用神經(jīng)網(wǎng)絡的話,可能有幾個 NumPy 數(shù)組操作會很慢(但這里我不會討論如何加速 NumPy,那么,應該如何加快循環(huán)的速度?

利用 Cython 實現(xiàn)更快的循環(huán)

用個簡單的例子來說明。假設我們一個巨大的集合里包含許多長方形,保存為 Python 對象(即 Rectangle 類的實例)的列表。模塊的主要功能就是遍歷該列表,數(shù)出有多少個長方形超過了某個閾值。

我們的 Python 模塊非常簡單,如下所示:

from random import random

class Rectangle:

def __init__(self, w, h):

self.w = w

self.h = h

def area(self):

return self.w * self.h

def check_rectangles(rectangles, threshold):

n_out = 0

for rectangle in rectangles:

if rectangle.area() > threshold:

n_out += 1

return n_out

def main():

n_rectangles = 10000000

rectangles = list(Rectangle(random(), random()) for i in range(n_rectangles))

n_out = check_rectangles(rectangles, threshold=0.25)

print(n_out)

這里 check_rectangles 函數(shù)就是瓶頸!它要遍歷大量 Python 對象,而由于每次循環(huán)中 Python 解釋器都要在背后進行許多工作(如在類中查找 area 方法、打包解包參數(shù)、調(diào)用 Python API 等),這段代碼就會非常慢。

Cython 能幫我們加快循環(huán)

Cython 語言是 Python 的一個超集,它包含兩類對象:

1.Python 對象是在正常的 Python 中操作的對象,如數(shù)字、字符串、列表、類實例等。

2.Cython C 對象是 C 或 C++ 對象,如 dobule、int、float、struct、vectors,這些可以被 Cython 編譯成超級快的底層代碼。

高速循環(huán)就是 Cython 程序中只訪問 Cython C 對象的循環(huán)。

設計這種高速循環(huán)最直接的辦法就是,定義一個 C 結(jié)構(gòu),它包含計算過程需要的一切。在這個例子中,該結(jié)構(gòu)需要包含長方形的長和寬。

然后我們就可以將長方形列表保存在一個 C 數(shù)組中,傳遞給 check_rectangles 函數(shù)。現(xiàn)在該函數(shù)就需要接收一個 C 數(shù)組作為輸入,因此它應該用 cdef 關(guān)鍵字(而不是 def)定義為 Cython 函數(shù)。(注意 cdef 也被用來定義 Cython C 對象。)

試一下這段代碼

有許多方法可以測試、編譯并發(fā)布 Cython 代碼!Cython 甚至可以像 Python 一樣直接用在 Jupyter Notebook 中,首先用 pip install cython 安裝 Cython:

編寫、使用并發(fā)布 Cython 代碼

Cython 代碼保存在 .pyx 文件中。這些文件會被 Cython 編譯器編譯成 C 或 C++ 文件,然后再被系統(tǒng)的 C 編譯器編譯成字節(jié)碼。這些字節(jié)碼可以直接被 Python 解釋器使用。

可以在 Python 中使用 pyximport 直接加載 .pyx 文件:

>>> import pyximport; pyximport.install()

>>> import my_cython_module

也可以將Cython代碼構(gòu)建成Python包,并作為正常的Python包導入或發(fā)布。這項工作比較花費時間,主要是要處理所有平臺上的兼容性問題。在進入 NLP 之前,我們先快速討論下 def、cdef 和 cpdef 關(guān)鍵字,這些是學習 Cython 時最關(guān)鍵的概念。

通過 spaCy 使用 Cython 加速 NLP

前面說的這些都很好……但這跟 NLP 還沒關(guān)系呢!沒有字符串操作,沒有 Unicode 編碼,自然語言處理中的難點都沒有支持啊!而且 Cython 的官方文檔甚至還反對使用 C 語言級別的字符串。一般來說,除非你知道你在做什么,否則盡量不要使用 C 字符串,而應該使用 Python 字符串對象,這就輪到 spaCy 出場了,spaCy 解決這個問題的辦法特別聰明。

將所有字符串轉(zhuǎn)換成 64 比特 hash

在 spaCy 中,所有 Unicode 字符串(token 的文本,token 的小寫形式,lemma 形式,詞性標注,依存關(guān)系樹的標簽,命名實體標簽……)都保存在名為 StringStore 的單一數(shù)據(jù)結(jié)構(gòu)中,字符串的索引是 64 比特 hash,也就是 C 語言層次上的 unit64_t。

StringStore 對象實現(xiàn)了在 Python unicode 字符串和 64 比特 hash 之間的查找操作。StringStore 可以從 spaCy 中的任何地方、任何對象中訪問,例如可以通過 nlp.vocab.string、doc.vocab.strings 或 span.doc.vocab.string 等。當模塊需要在某些 token 上進行快速處理時,它只會使用 C 語言層次上的 64 比特 hash,而不是使用原始字符串。調(diào)用 StringStore 的查找表就會返回與該 hash 關(guān)聯(lián)的 Python unicode 字符串。但是 spaCy 還做了更多的事情,我們可以通過它訪問完整的 C 語言層次上的文檔和詞匯表結(jié)構(gòu),因此可以使用 Cython 循環(huán),不需要再自己構(gòu)建數(shù)據(jù)結(jié)構(gòu)。

主站蜘蛛池模板: 伊人福利视频| 亚洲精品图区| 这里只有精品在线| 久久精品91麻豆| 国产在线视频自拍| 欧美日韩免费在线视频| 亚洲国产成人久久77| 中文字幕人妻无码系列第三区| 国产av一码二码三码无码| аⅴ资源中文在线天堂| 无码福利日韩神码福利片| 国产成人啪视频一区二区三区| 亚洲黄色激情网站| 综合天天色| 午夜福利在线观看入口| 国产成人啪视频一区二区三区| 免费看的一级毛片| 午夜国产精品视频| 国产高清毛片| 国产精品亚洲精品爽爽| 欧美有码在线| 国产女人在线视频| 中美日韩在线网免费毛片视频 | 欧美色伊人| 国产美女无遮挡免费视频| 久久精品电影| 国产激爽爽爽大片在线观看| 国产偷国产偷在线高清| 9久久伊人精品综合| 亚洲国产日韩欧美在线| 精品一区二区三区无码视频无码| 一级毛片中文字幕| 91综合色区亚洲熟妇p| 波多野结衣在线se| 一本色道久久88亚洲综合| 久久精品中文字幕少妇| 色精品视频| 青青极品在线| 美女被操91视频| 91免费片| 香港一级毛片免费看| 成人午夜久久| 国产肉感大码AV无码| 国产成人区在线观看视频| 一本大道视频精品人妻| 欧美日本在线播放| 亚洲人人视频| 午夜小视频在线| 欧美精品亚洲精品日韩专区va| 国产不卡一级毛片视频| 国产午夜在线观看视频| 免费无码AV片在线观看国产| 99视频在线免费| 日韩毛片在线视频| a级毛片免费看| 亚洲黄网在线| 19国产精品麻豆免费观看| 亚洲 欧美 中文 AⅤ在线视频| 亚洲一区二区无码视频| 国产99免费视频| 成人免费网站久久久| 永久天堂网Av| 国产精品不卡片视频免费观看| 亚洲欧美另类日本| 国产成人精品日本亚洲77美色| 在线观看视频一区二区| 亚洲有无码中文网| 成人看片欧美一区二区| 国产成人免费观看在线视频| 亚洲高清中文字幕在线看不卡| 色网站在线免费观看| 五月婷婷激情四射| 国产免费怡红院视频| 高清无码不卡视频| 日韩精品无码免费专网站| 极品国产在线| 黄色网站在线观看无码| 国产精品偷伦视频免费观看国产| 午夜毛片免费观看视频 | 精品第一国产综合精品Aⅴ| a级毛片免费播放| 色悠久久综合|