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

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出安寧免費(fèi)做網(wǎng)站回饋大家。
這類數(shù)據(jù)清理任務(wù)是大多數(shù)處理文本的數(shù)據(jù)科學(xué)項(xiàng)目必須要做的。
數(shù)據(jù)科學(xué)從清理數(shù)據(jù)開始
本文作者是 Belong.co 的一名數(shù)據(jù)科學(xué)家,需要從事有關(guān)自然語言處理的工作,于是遇到了這個(gè)問題。當(dāng)我在自己的文檔語料庫中開始訓(xùn)練 Word2Vec 模型時(shí),它開始將同義詞歸為同類項(xiàng),「Javascripting」被歸類為「JavaScript」的同類項(xiàng)。
為了解決這個(gè)問題,我寫了一個(gè)正則表達(dá)式(Regex),用標(biāo)準(zhǔn)化命名來替換所有已知的同義詞。Regex 會(huì)將「Javascripting」替換為「JavaScript」,這解決了一個(gè)問題,卻又帶來了另一個(gè)問題。
有些人遇到問題時(shí)會(huì)想:「沒關(guān)系,我們有正則表達(dá)式?!宫F(xiàn)在問題變成了兩個(gè)。
上文所述引自 Stack-exchange question,現(xiàn)在讓我遇到了。
事實(shí)證明,正則表達(dá)式的速度很快——如果要搜索和替換的關(guān)鍵詞數(shù)量是一百多個(gè)的話。但是面對超過 20k 個(gè)關(guān)鍵詞,300 萬個(gè)文件的語料庫,事情就會(huì)變得很糟。當(dāng)我測試我的代碼時(shí),我發(fā)現(xiàn)完全運(yùn)行需要 5 天之久。
通常,面對這種情況我們的解決方案是并行運(yùn)算。但在面對上千萬個(gè)文件中成百上千出現(xiàn)頻次的關(guān)鍵詞,并行的性能提升有限,我們必須找到更好的方法!
幸好,在 Stack Overflow 上我的疑問獲得了大家的關(guān)注,網(wǎng)友們和公司同事 Vinay Pandey、Suresh Lakshmanan 等人提到了一個(gè)名叫 Aho-Corasick 算法的神奇工具,以及前綴樹數(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
所以我開始自己動(dòng)手,F(xiàn)lashText 誕生了。
在介紹 FlashText 的結(jié)構(gòu)和工作原理之前,先看看它的搜索性能表現(xiàn):
下面的紅線是 FlashText 的搜索耗時(shí)
如上圖所示,Regex 算法和 FlashText 搜索同一篇文檔的耗時(shí)相差很大。隨著關(guān)鍵詞數(shù)量的增加,Regex 的耗時(shí)呈線性增長,而對于 FlashText 來說并沒有影響。
FlashText 可以把 5 天的工作縮短到 15 分鐘!
這是 FlashText 替換的速度:
同樣,下面的紅線是 FlashText 的替換速度。
所以,F(xiàn)lashText 是什么?
FlashText 是我在 GitHub 上開源的一個(gè) Python 庫,它能高效地提取和替換關(guān)鍵詞。
使用 FlashText 時(shí),首先你需要發(fā)送一系列關(guān)鍵詞,這個(gè)列表將被用于在內(nèi)部建立一個(gè)前綴樹字典。隨后你需要傳遞一個(gè)字符串,告訴它你需要執(zhí)行替換還是搜索。
在替換時(shí),它會(huì)創(chuàng)建一個(gè)新字符串來替換關(guān)鍵詞。在搜索時(shí),它會(huì)返回一個(gè)關(guān)鍵詞列表。這一切都將在輸入字符串上進(jìn)行。
有的用戶是這樣評價(jià)FastText的:
Radim ?eh??ek 是著名 Python 庫 Gensim 的作者
FlashText 為什么那么快?
我們用一個(gè)例子來嘗試和理解這一部分。假設(shè)我們有一個(gè)包含三個(gè)單詞的句子 I like Python,和一個(gè)有四個(gè)單詞的語料庫 {Python,Java,J2ee,Ruby}。
如果每次取出語料庫中的一個(gè)單詞,并檢查其在句子中是否出現(xiàn),這需要四次操作。
is 'Python' in sentence? is 'Java' in sentence?...
如果語料庫有 n 個(gè)單詞,意味著需要做 n 次的循環(huán)操作,并且每一個(gè)時(shí)間步的搜索都是 isin sentence ? 這有點(diǎn)像正則表示式相配(Regex match)中的過程。
還有另一種和***種相反的方法。對于句子中的每一個(gè)單詞,檢查其是否在語料庫中出現(xiàn)。
is 'I' in corpus?is 'like' in corpus?is 'python' in corpus?
如果句子 m 個(gè)單詞,意味著需要做 m 次的循環(huán)操作。在這個(gè)例子中所需的時(shí)間步取決于句子中的單詞數(shù)。而使用字典查詢進(jìn)行 isin corpus ? 會(huì)快得多。
FlashText 基于第二種方法,由 Aho-Corasick 算法和前綴樹(Trie)數(shù)據(jù)結(jié)構(gòu)所啟發(fā)。
它的工作方式為:
首先由語料庫創(chuàng)建一個(gè)如下圖所示的前綴樹字典:
語料庫的前綴樹字典
Start 和 EOT(End Of Term,期末)表示單詞的邊界比如 space、period 和 new_line。只有兩側(cè)都有邊界的關(guān)鍵詞才能得到匹配,這可以防止把 apple 匹配到 pineapple。
下一步我們將取輸入字符串為 I like Python,并按字符逐個(gè)對齊進(jìn)行搜索。
Step 1: is Iin dictionary? NoStep 2: is likein dictionary? NoStep 3: is Pythonin dictionary? Yes
Python出現(xiàn)在字典中。
由于這是一個(gè)字符匹配過程,我們可以輕易地在進(jìn)行到l 的時(shí)候跳過整個(gè)like,因?yàn)?start 并沒有和 l 相連。這使得跳過缺失單詞的過程變得非???。
FlashText 算法只需要遍歷輸入字符串『I like Python』的每一個(gè)字符。即使字典有上百萬個(gè)關(guān)鍵詞,對運(yùn)行時(shí)間也沒有任何影響。這是 FlashText 算法的真正威力。
什么時(shí)候需要使用 FlashText?
簡單的回答是:當(dāng)關(guān)鍵詞數(shù)量>500 的時(shí)候
當(dāng)關(guān)鍵詞數(shù)量>500 的時(shí)候,F(xiàn)lashText 的搜索速度開始超過 Regex
完整的回答是:Regex 可以搜索基于特殊字符比如^、$、*、d 等的關(guān)鍵詞,而 FlashText 不支持這種搜索。
所以如果想要匹配部分單詞比如『worddvec』,使用 FlashText 并沒有好處,但其非常善于提取完整的單詞比如『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)鍵詞的簡單例子
用于替換關(guān)鍵詞的代碼
FlashText 不僅可以提取句子中的關(guān)鍵詞還可以對其進(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)鍵詞的簡單例子
網(wǎng)站題目:用Python只花十五分鐘完成正則表達(dá)式五天任務(wù)量
路徑分享:http://m.fisionsoft.com.cn/article/cceohpo.html


咨詢
建站咨詢
