日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

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

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

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

這類數(shù)據(jù)清理任務是大多數(shù)處理文本的數(shù)據(jù)科學項目必須要做的。

數(shù)據(jù)科學從清理數(shù)據(jù)開始

本文作者是 Belong.co 的一名數(shù)據(jù)科學家,需要從事有關自然語言處理的工作,于是遇到了這個問題。當我在自己的文檔語料庫中開始訓練 Word2Vec 模型時,它開始將同義詞歸為同類項,「Javascripting」被歸類為「JavaScript」的同類項。

為了解決這個問題,我寫了一個正則表達式(Regex),用標準化命名來替換所有已知的同義詞。Regex 會將「Javascripting」替換為「JavaScript」,這解決了一個問題,卻又帶來了另一個問題。

有些人遇到問題時會想:「沒關系,我們有正則表達式?!宫F(xiàn)在問題變成了兩個。

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

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

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

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

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

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

所以我開始自己動手,F(xiàn)lashText 誕生了。

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

下面的紅線是 FlashText 的搜索耗時

如上圖所示,Regex 算法和 FlashText 搜索同一篇文檔的耗時相差很大。隨著關鍵詞數(shù)量的增加,Regex 的耗時呈線性增長,而對于 FlashText 來說并沒有影響。

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

這是 FlashText 替換的速度:

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

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

FlashText 是我在 GitHub 上開源的一個 Python 庫,它能高效地提取和替換關鍵詞。

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

在替換時,它會創(chuàng)建一個新字符串來替換關鍵詞。在搜索時,它會返回一個關鍵詞列表。這一切都將在輸入字符串上進行。

有的用戶是這樣評價FastText的:

Radim ?eh??ek 是著名 Python 庫 Gensim 的作者

FlashText 為什么那么快?

我們用一個例子來嘗試和理解這一部分。假設我們有一個包含三個單詞的句子 I like Python,和一個有四個單詞的語料庫 {Python,Java,J2ee,Ruby}。

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

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

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

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

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

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

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

它的工作方式為:

首先由語料庫創(chuàng)建一個如下圖所示的前綴樹字典:

語料庫的前綴樹字典

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

下一步我們將取輸入字符串為 I like Python,并按字符逐個對齊進行搜索。

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

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

由于這是一個字符匹配過程,我們可以輕易地在進行到l 的時候跳過整個like,因為 start 并沒有和 l 相連。這使得跳過缺失單詞的過程變得非???。

FlashText 算法只需要遍歷輸入字符串『I like Python』的每一個字符。即使字典有上百萬個關鍵詞,對運行時間也沒有任何影響。這是 FlashText 算法的真正威力。

什么時候需要使用 FlashText?

簡單的回答是:當關鍵詞數(shù)量>500 的時候

當關鍵詞數(shù)量>500 的時候,F(xiàn)lashText 的搜索速度開始超過 Regex

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

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

用于尋找關鍵詞的代碼

# 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 提取關鍵詞的簡單例子

用于替換關鍵詞的代碼

FlashText 不僅可以提取句子中的關鍵詞還可以對其進行替換。我們將此作為數(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 替換關鍵詞的簡單例子


分享題目:用Python只花十五分鐘完成正則表達式五天任務量
標題網址:http://www.dlmjj.cn/article/cceohpo.html