日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
用Python只花十五分鐘完成正則表達(dá)式五天任務(wù)量

自然語(yǔ)言處理領(lǐng)域的開(kāi)發(fā)者在處理文本之前必須對(duì)數(shù)據(jù)進(jìn)行清理。有些時(shí)候,此類(lèi)工作是由關(guān)鍵詞替換完成的,就像吧「Javascript」替換成「JavaScript」。另一些時(shí)候,我們只需要知道文檔中是否提到了「JavaScript」。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)推出安寧免費(fèi)做網(wǎng)站回饋大家。

這類(lèi)數(shù)據(jù)清理任務(wù)是大多數(shù)處理文本的數(shù)據(jù)科學(xué)項(xiàng)目必須要做的。

數(shù)據(jù)科學(xué)從清理數(shù)據(jù)開(kāi)始

本文作者是 Belong.co 的一名數(shù)據(jù)科學(xué)家,需要從事有關(guān)自然語(yǔ)言處理的工作,于是遇到了這個(gè)問(wèn)題。當(dāng)我在自己的文檔語(yǔ)料庫(kù)中開(kāi)始訓(xùn)練 Word2Vec 模型時(shí),它開(kāi)始將同義詞歸為同類(lèi)項(xiàng),「Javascripting」被歸類(lèi)為「JavaScript」的同類(lèi)項(xiàng)。

為了解決這個(gè)問(wèn)題,我寫(xiě)了一個(gè)正則表達(dá)式(Regex),用標(biāo)準(zhǔn)化命名來(lái)替換所有已知的同義詞。Regex 會(huì)將「Javascripting」替換為「JavaScript」,這解決了一個(gè)問(wèn)題,卻又帶來(lái)了另一個(gè)問(wèn)題。

有些人遇到問(wèn)題時(shí)會(huì)想:「沒(méi)關(guān)系,我們有正則表達(dá)式?!宫F(xiàn)在問(wèn)題變成了兩個(gè)。

上文所述引自 Stack-exchange question,現(xiàn)在讓我遇到了。

事實(shí)證明,正則表達(dá)式的速度很快——如果要搜索和替換的關(guān)鍵詞數(shù)量是一百多個(gè)的話。但是面對(duì)超過(guò) 20k 個(gè)關(guān)鍵詞,300 萬(wàn)個(gè)文件的語(yǔ)料庫(kù),事情就會(huì)變得很糟。當(dāng)我測(cè)試我的代碼時(shí),我發(fā)現(xiàn)完全運(yùn)行需要 5 天之久。

通常,面對(duì)這種情況我們的解決方案是并行運(yùn)算。但在面對(duì)上千萬(wàn)個(gè)文件中成百上千出現(xiàn)頻次的關(guān)鍵詞,并行的性能提升有限,我們必須找到更好的方法!

幸好,在 Stack Overflow 上我的疑問(wèn)獲得了大家的關(guān)注,網(wǎng)友們和公司同事 Vinay Pandey、Suresh Lakshmanan 等人提到了一個(gè)名叫 Aho-Corasick 算法的神奇工具,以及前綴樹(shù)數(shù)據(jù)結(jié)構(gòu)(Trie Data Structure)。然而目前網(wǎng)絡(luò)上還缺乏相關(guān)資源。

  • Aho-Corasick 算法:https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm

  • Trie Data Structure:https://en.wikipedia.org/wiki/Trie

所以我開(kāi)始自己動(dòng)手,F(xiàn)lashText 誕生了。

在介紹 FlashText 的結(jié)構(gòu)和工作原理之前,先看看它的搜索性能表現(xiàn):

下面的紅線是 FlashText 的搜索耗時(shí)

如上圖所示,Regex 算法和 FlashText 搜索同一篇文檔的耗時(shí)相差很大。隨著關(guān)鍵詞數(shù)量的增加,Regex 的耗時(shí)呈線性增長(zhǎng),而對(duì)于 FlashText 來(lái)說(shuō)并沒(méi)有影響。

FlashText 可以把 5 天的工作縮短到 15 分鐘!

這是 FlashText 替換的速度:

同樣,下面的紅線是 FlashText 的替換速度。

所以,F(xiàn)lashText 是什么?

FlashText 是我在 GitHub 上開(kāi)源的一個(gè) Python 庫(kù),它能高效地提取和替換關(guān)鍵詞。

使用 FlashText 時(shí),首先你需要發(fā)送一系列關(guān)鍵詞,這個(gè)列表將被用于在內(nèi)部建立一個(gè)前綴樹(shù)字典。隨后你需要傳遞一個(gè)字符串,告訴它你需要執(zhí)行替換還是搜索。

在替換時(shí),它會(huì)創(chuàng)建一個(gè)新字符串來(lái)替換關(guān)鍵詞。在搜索時(shí),它會(huì)返回一個(gè)關(guān)鍵詞列表。這一切都將在輸入字符串上進(jìn)行。

有的用戶(hù)是這樣評(píng)價(jià)FastText的:

Radim ?eh??ek 是著名 Python 庫(kù) Gensim 的作者

FlashText 為什么那么快?

我們用一個(gè)例子來(lái)嘗試和理解這一部分。假設(shè)我們有一個(gè)包含三個(gè)單詞的句子 I like Python,和一個(gè)有四個(gè)單詞的語(yǔ)料庫(kù) {Python,Java,J2ee,Ruby}。

如果每次取出語(yǔ)料庫(kù)中的一個(gè)單詞,并檢查其在句子中是否出現(xiàn),這需要四次操作。

is 'Python' in sentence? is 'Java' in sentence?...

如果語(yǔ)料庫(kù)有 n 個(gè)單詞,意味著需要做 n 次的循環(huán)操作,并且每一個(gè)時(shí)間步的搜索都是 isin sentence ? 這有點(diǎn)像正則表示式相配(Regex match)中的過(guò)程。

還有另一種和***種相反的方法。對(duì)于句子中的每一個(gè)單詞,檢查其是否在語(yǔ)料庫(kù)中出現(xiàn)。

is 'I' in corpus?is 'like' in corpus?is 'python' in corpus?

如果句子 m 個(gè)單詞,意味著需要做 m 次的循環(huán)操作。在這個(gè)例子中所需的時(shí)間步取決于句子中的單詞數(shù)。而使用字典查詢(xún)進(jìn)行 isin corpus ? 會(huì)快得多。

FlashText 基于第二種方法,由 Aho-Corasick 算法和前綴樹(shù)(Trie)數(shù)據(jù)結(jié)構(gòu)所啟發(fā)。

它的工作方式為:

首先由語(yǔ)料庫(kù)創(chuàng)建一個(gè)如下圖所示的前綴樹(shù)字典:

語(yǔ)料庫(kù)的前綴樹(shù)字典

Start 和 EOT(End Of Term,期末)表示單詞的邊界比如 space、period 和 new_line。只有兩側(cè)都有邊界的關(guān)鍵詞才能得到匹配,這可以防止把 apple 匹配到 pineapple。

下一步我們將取輸入字符串為 I like Python,并按字符逐個(gè)對(duì)齊進(jìn)行搜索。

Step 1: is Iin dictionary? NoStep 2: is likein dictionary? NoStep 3: is Pythonin dictionary? Yes

Python出現(xiàn)在字典中。

由于這是一個(gè)字符匹配過(guò)程,我們可以輕易地在進(jìn)行到l 的時(shí)候跳過(guò)整個(gè)like,因?yàn)?start 并沒(méi)有和 l 相連。這使得跳過(guò)缺失單詞的過(guò)程變得非??臁?/p>

FlashText 算法只需要遍歷輸入字符串『I like Python』的每一個(gè)字符。即使字典有上百萬(wàn)個(gè)關(guān)鍵詞,對(duì)運(yùn)行時(shí)間也沒(méi)有任何影響。這是 FlashText 算法的真正威力。

什么時(shí)候需要使用 FlashText?

簡(jiǎn)單的回答是:當(dāng)關(guān)鍵詞數(shù)量>500 的時(shí)候

當(dāng)關(guān)鍵詞數(shù)量>500 的時(shí)候,F(xiàn)lashText 的搜索速度開(kāi)始超過(guò) Regex

完整的回答是:Regex 可以搜索基于特殊字符比如^、$、*、d 等的關(guān)鍵詞,而 FlashText 不支持這種搜索。

所以如果想要匹配部分單詞比如『worddvec』,使用 FlashText 并沒(méi)有好處,但其非常善于提取完整的單詞比如『word2vec』。

用于尋找關(guān)鍵詞的代碼

# pip install flashtextfrom flashtext.keyword import KeywordProcessorkeyword_processor = KeywordProcessor()keyword_processor.add_keyword('Big Apple', 'New York')keyword_processor.add_keyword('Bay Area')keywords_found = keyword_processor.extract_keywords('I love Big Apple and Bay Area.')keywords_found# ['New York', 'Bay Area']

使用 FlashText 提取關(guān)鍵詞的簡(jiǎn)單例子

用于替換關(guān)鍵詞的代碼

FlashText 不僅可以提取句子中的關(guān)鍵詞還可以對(duì)其進(jìn)行替換。我們將此作為數(shù)據(jù)處理管道的數(shù)據(jù)清理步驟。

from flashtext.keyword import KeywordProcessorkeyword_processor = KeywordProcessor()keyword_processor.add_keyword('Big Apple', 'New York')keyword_processor.add_keyword('New Delhi', 'NCR region')new_sentence = keyword_processor.replace_keywords('I love Big Apple and new delhi.')new_sentence# 'I love New York and NCR region.'

使用 FlashText 替換關(guān)鍵詞的簡(jiǎn)單例子


當(dāng)前標(biāo)題:用Python只花十五分鐘完成正則表達(dá)式五天任務(wù)量
瀏覽地址:http://www.5511xx.com/article/cceohpo.html