數(shù)據(jù)清洗工具flashtext,效率直接提升了幾十倍數(shù)

在平常的一些的小規(guī)模的數(shù)據(jù)的過濾迅细、清洗過程中使用最多的就是正則表達式,但是隨著數(shù)據(jù)規(guī)模的增大淘邻,正則表達式就顯得有些心有余力不足了茵典。

【閱讀全文】

正則表達式在一個 10k 的詞庫中查找 15k 個關(guān)鍵詞的時間差不多是 0.165 秒。但是對于 Flashtext 而言只需要 0.002 秒宾舅。因此统阿,在這個問題上 Flashtext的速度大約比正則表達式快 82 倍。

file

從上面的示例圖的性能對比中筹我,可以發(fā)現(xiàn)隨著我們需要處理的字符越來越多扶平,正則表達式的處理速度幾乎都是線性增加的。然而蔬蕊,F(xiàn)lashtext 幾乎是一個常量结澄。

1、準(zhǔn)備flashtext環(huán)境

通過pip的方式來安裝flashtext岸夯,或是其他的方式也是可以的麻献,這里默認(rèn)使用的是清華大學(xué)的鏡像站。

pip install flashtext -i https://pypi.tuna.tsinghua.edu.cn/simple

在準(zhǔn)備好flashtext環(huán)境以后囱修,來看一下flashtext重要的使用過程赎瑰,幫助我們能更好的完成數(shù)據(jù)清洗操作。

2破镰、添加關(guān)鍵詞

這里添加關(guān)鍵詞時是通過單個關(guān)鍵詞的來添加到關(guān)鍵詞詞庫中餐曼,使用add_keyword函數(shù)來添加。第一次參數(shù)表示需要添加的關(guān)鍵詞鲜漩,第二個參數(shù)則表示為第一個關(guān)鍵詞的別名源譬,如果關(guān)鍵詞被找到了則顯示為別名的形式,若是沒有使用第二個參數(shù)作為別名則還是顯示原有的名稱孕似。

from flashtext import KeywordProcessor

# 初始化關(guān)鍵詞庫處理器

processor = KeywordProcessor()

# 常規(guī)方式添加關(guān)鍵詞

processor.add_keyword('Python')

# 別名方式添加關(guān)鍵詞

processor.add_keyword('Scala', 'Java')

這樣分別使用兩種方式已經(jīng)將需要的關(guān)鍵詞添加到詞庫處理器中了踩娘。

3、提取關(guān)鍵詞

通過上一步添加關(guān)鍵詞喉祭,現(xiàn)在詞庫處理器中已經(jīng)存在有關(guān)鍵詞的信息了养渴,再使用extract_keywords將關(guān)鍵詞提取出來即可。

# 在一個字符串中提取出關(guān)鍵詞信息

found = processor.extract_keywords('I like Python and Scala.')

# 結(jié)果

print(found)

# ['Python', 'Java']

結(jié)果出來了泛烙,跟我們預(yù)想的是一樣的理卑,并Scala也顯示為了Java。

4蔽氨、替換關(guān)鍵詞

替換關(guān)鍵詞使用的是replace_keywords函數(shù)藐唠,前提是詞庫中擁有別名的詞才能被替換帆疟,就像上面的Scala被顯示成了的Java一樣。

替換一個字符串中的Scala關(guān)鍵詞宇立,由于Scala對應(yīng)的別名是Java踪宠,所以一個字符串中的Scala應(yīng)該被替換為Java。

replaced = processor.replace_keywords('I like Scala.')

# 結(jié)果

print(replaced)

# I like Java.

# Scala 果真就被替換為了Java妈嘹。

5柳琢、獲取所有關(guān)鍵詞

有些時候,在KeywordProcessor詞庫處理器中添加了哪些關(guān)鍵詞可能自己都記不清楚了润脸,這個時候可以使用get_all_keywords函數(shù)來獲取當(dāng)前的所有關(guān)鍵詞染厅。

all_keywords = processor.get_all_keywords()

# 結(jié)果

print(all_keywords)

# {'python': 'Python', 'scala': 'Java'}

6、批量的添加關(guān)鍵詞

當(dāng)關(guān)鍵詞庫需要更多的關(guān)鍵詞的時候津函,可以通過列表或是字典的方式來進行批量的添加。對應(yīng)的函數(shù)分別是add_keywords_from_list孤页、add_keywords_from_dict函數(shù)尔苦。

# 初始化一個字典通過用來做批量添加

dict_ = {
    'java': ['java_ee', 'java_se', 'java_me'],
    'python': ['pandas', 'all']
}

# 通過字典的方式來批量添加關(guān)鍵詞

processor.add_keywords_from_dict(dict_)

# 從批量添加的關(guān)鍵詞中匹配關(guān)鍵詞

result = processor.extract_keywords('looking for java_ee and pandas.')

# 結(jié)果

print(result)

# ['java', 'python']

# 通過列表的方式批量添加關(guān)鍵詞

processor.add_keywords_from_list(['scala', 'python', 'scala', 'go'])

# 通過get_all_keywords查看一下所有關(guān)鍵詞

all_keywords = processor.get_all_keywords()

# 結(jié)果

print(all_keywords)

# {'python': 'python', 'pandas': 'python', 'scala': 'scala', 'java_ee': 'java', 'java_se': 'java', 'java_me': 'java', 'all': 'python', 'go': 'go'}

發(fā)現(xiàn)所有的關(guān)鍵詞已經(jīng)添加到詞庫處理器中,并且重復(fù)的不會再次添加行施。

7允坚、批量刪除關(guān)鍵詞

批量刪除詞庫處理器中的關(guān)鍵詞同樣是有兩種方式,一個是列表蛾号、另一個是字典稠项。對應(yīng)的函數(shù)分別是remove_keywords_from_list、remove_keywords_from_dict函數(shù)鲜结。

# 批量移除列表中的關(guān)鍵詞

processor.remove_keywords_from_list(['python','java_ee','java_me'])

# 批量移除字典中的關(guān)鍵詞

processor.remove_keywords_from_dict({'python': ['pandas','all']})

# 通過get_all_keywords查看一下所有關(guān)鍵詞

all_keywords = processor.get_all_keywords()

# 結(jié)果

print(all_keywords)

# {'scala': 'scala', 'java_se': 'java', 'go': 'go'}

發(fā)現(xiàn)需要移除的關(guān)鍵詞已經(jīng)被全部移除了展运。

8、執(zhí)行效率對比

為了更可觀的展示效果精刷,找了兩個flashtext在搜索和替換關(guān)鍵詞過程中的效率對比圖可以一目了然拗胜。

flashtext、正則表達式搜索效率對比

file

flashtext怒允、正則表達式搜索替換對比

file

【往期精彩】

一個help函數(shù)解決了python的所有文檔信息查看...

python 自定義異常/raise關(guān)鍵字拋出異常

python 本地音樂播放器制作過程(附完整源碼)

自動化工具:PyAutoGUI的鼠標(biāo)與鍵盤控制埂软,解放雙手的利器!

來自程序猿的生日蛋糕你見過嗎纫事?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勘畔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丽惶,更是在濱河造成了極大的恐慌炫七,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚊夫,死亡現(xiàn)場離奇詭異诉字,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門壤圃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陵霉,“玉大人,你說我怎么就攤上這事伍绳∮荒樱” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵冲杀,是天一觀的道長效床。 經(jīng)常有香客問我,道長权谁,這世上最難降的妖魔是什么剩檀? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮旺芽,結(jié)果婚禮上沪猴,老公的妹妹穿的比我還像新娘。我一直安慰自己采章,他們只是感情好运嗜,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悯舟,像睡著了一般担租。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抵怎,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天奋救,我揣著相機與錄音,去河邊找鬼便贵。 笑死菠镇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的承璃。 我是一名探鬼主播利耍,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盔粹!你這毒婦竟也來了隘梨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤舷嗡,失蹤者是張志新(化名)和其女友劉穎轴猎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體进萄,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡捻脖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年锐峭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可婶。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡沿癞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矛渴,到底是詐尸還是另有隱情椎扬,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布具温,位于F島的核電站蚕涤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铣猩。R本人自食惡果不足惜揖铜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望达皿。 院中可真熱鬧蛮位,春花似錦、人聲如沸鳞绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽们何。三九已至,卻和暖如春控轿,著一層夾襖步出監(jiān)牢的瞬間冤竹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工茬射, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹦蠕,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓在抛,卻偏偏與公主長得像钟病,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刚梭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容