比正則快N倍的新姿勢,用Python替換字元串

来源:https://www.cnblogs.com/123456feng/archive/2022/04/04/16084421.html
-Advertisement-
Play Games

假期就要好好利用,不然怎麼捲死同齡人,今天給大家分享替換字元串。 FlashText 演算法是由 Vikash Singh 於2017年發表的大規模關鍵詞替換演算法,這個演算法的時間複雜度僅由文本長度(N)決定,演算法時間複雜度為O(N) 而對於正則表達式的替換,演算法時間複雜度還需要考慮被替換的關鍵詞數量( ...


假期就要好好利用,不然怎麼捲死同齡人,今天給大家分享替換字元串。
在這裡插入圖片描述

FlashText 演算法是由 Vikash Singh 於2017年發表的大規模關鍵詞替換演算法,這個演算法的時間複雜度僅由文本長度(N)決定,演算法時間複雜度為O(N)

而對於正則表達式的替換,演算法時間複雜度還需要考慮被替換的關鍵詞數量(M),因此時間複雜度為O(MxN)

簡而言之,基於FlashText演算法的字元串替換比正則表達式替換快M倍以上,這個M是需要替換的關鍵詞數量,關鍵詞越多,FlashText演算法的優勢就越明顯

下麵就給大家介紹如何在 Python 中基於 flashtext 模塊使用 FlashText 演算法進行字元串查找和替換。

在這裡插入圖片描述

搞錯了,重來。

1.準備

請選擇以下任一種方式輸入命令安裝依賴:

  1. Windows 環境 打開 Cmd (開始-運行-CMD)。
  2. MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install flashtext

在這裡插入圖片描述

2.基本使用

提取關鍵詞

一個最基本的提取關鍵詞的例子如下:

Python學習交流Q群:906715085###
from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
keyword_processor = KeywordProcessor()
#2. 添加關鍵詞
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
#3. 處理目標句子並提取相應關鍵詞
keywords_found = keyword_processor.extract_keywords('I love Big Apple and Bay Area.')
#4. 結果
print(keywords_found)
#['New York', 'Bay Area']

 

其中 add_keyword 的第一個參數代表需要被查找的關鍵詞,第二個參數是給這個關鍵詞一個別名,如果找到了則以別名顯示。

替換關鍵詞

如果你想要替換關鍵詞,只需要調用處理器的 replace_keywords 函數:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
keyword_processor = KeywordProcessor()
#2. 添加關鍵詞
keyword_processor.add_keyword('New Delhi', 'NCR region')
#3. 替換關鍵詞
new_sentence = keyword_processor.replace_keywords('I love Big Apple and new delhi.')
#4. 結果
print(new_sentence)
#'I love New York and NCR region.'

 

關鍵詞大小寫敏感

如果你需要精確提取,識別大小寫字母,那麼你可以在處理器初始化的時候設定 sensitive 參數:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器, 註意設置大小寫敏感(case_sensitive)為TRUE
keyword_processor = KeywordProcessor(case_sensitive=True)
#2. 添加關鍵詞
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
#3. 處理目標句子並提取相應關鍵詞
keywords_found = keyword_processor.extract_keywords('I love big Apple and Bay Area.')
#4. 結果
print(keywords_found)
#['Bay Area']

 

標記關鍵詞位置

如果你需要獲取關鍵詞在句子中的位置,在 extract_keywords 的時候添加 span_info=True 參數即可:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
keyword_processor = KeywordProcessor()
#2. 添加關鍵詞
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
#3. 處理目標句子並提取相應關鍵詞, 並標記關鍵詞的起始、終止位置
keywords_found = keyword_processor.extract_keywords('I love big Apple and Bay Area.', span_info=True)
#4. 結果
print(keywords_found)
#[('New York', 7, 16), ('Bay Area', 21, 29)]

 

獲取目前所有的關鍵詞

如果你需要獲取當前已經添加的所有關鍵詞,只需要調用處理器的 get_all_keywords 函數:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
keyword_processor = KeywordProcessor()
#2. 添加關鍵詞
keyword_processor.add_keyword('j2ee', 'Java')
keyword_processor.add_keyword('colour', 'color')
#3. 獲取所有關鍵詞
keyword_processor.get_all_keywords()
#output: {'colour': 'color', 'j2ee': 'Java'}

 

批量添加關鍵詞

批量添加關鍵詞有兩種方法,一種是通過詞典,一種是通過數組:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
keyword_processor = KeywordProcessor()
#2. (第一種)通過字典批量添加關鍵詞
keyword_dict = {
    "java": ["java_2e", "java programing"],
    "product management": ["PM", "product manager"]
}
keyword_processor.add_keywords_from_dict(keyword_dict)
#2. (第二種)通過數組批量添加關鍵詞
keyword_processor.add_keywords_from_list(["java", "python"])
#3. 第一種的提取效果如下
keyword_processor.extract_keywords('I am a product manager for a java_2e platform')
#output ['product management', 'java']

 

單一或批量刪除關鍵詞

刪除關鍵詞也非常簡單,和添加類似:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
keyword_processor = KeywordProcessor()
#2. 通過字典批量添加關鍵詞
keyword_dict = {
    "java": ["java_2e", "java programing"],
    "product management": ["PM", "product manager"]
}
keyword_processor.add_keywords_from_dict(keyword_dict)
#3. 提取效果如下
print(keyword_processor.extract_keywords('I am a product manager for a java_2e platform'))
#['product management', 'java']
#4. 單個刪除關鍵詞
keyword_processor.remove_keyword('java_2e')
#5. 批量刪除關鍵詞,也是可以通過詞典或者數組的形式
keyword_processor.remove_keywords_from_dict({"product management": ["PM"]})
keyword_processor.remove_keywords_from_list(["java programing"])
#6. 刪除了java programing關鍵詞後的效果如下
keyword_processor.extract_keywords('I am a product manager for a java_2e platform')
#['product management']

 

3.高級使用

支持額外信息

前面提到在添加關鍵詞的時候第二個參數為其別名,其實你不僅可以指示別名,還可以將額外信息放到第二個參數中:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
kp = KeywordProcessor()
#2. 添加關鍵詞並附帶額外信息
kp.add_keyword('Taj Mahal', ('Monument', 'Taj Mahal'))
kp.add_keyword('Delhi', ('Location', 'Delhi'))
#3. 效果如下
kp.extract_keywords('Taj Mahal is in Delhi.')
#[('Monument', 'Taj Mahal'), ('Location', 'Delhi')]

 

這樣,在提取關鍵詞的時候,你還能拿到其他一些你想要在得到此關鍵詞時輸出的信息。

支持特殊單詞邊界

Flashtext 檢測的單詞邊界一般局限於 \w [A-Za-z0-9_] 外的任意字元,但是如果你想添加某些特殊字元作為單詞的一部分也是可以實現的:

from flashtext import KeywordProcessor
#1. 初始化關鍵字處理器
keyword_processor = KeywordProcessor()
#2. 添加關鍵詞
keyword_processor.add_keyword('Big Apple')
#3. 正常效果
print(keyword_processor.extract_keywords('I love Big Apple/Bay Area.'))
#['Big Apple']
#4. 將 '/' 作為單詞一部分
keyword_processor.add_non_word_boundary('/')
#5. 優化後的效果
print(keyword_processor.extract_keywords('I love Big Apple/Bay Area.'))
#[]

 

在這裡插入圖片描述

4.結尾

個人認為這個模塊已經滿足我們的基本使用了,如果你有一些該模塊提供的功能之外的使用需求,可以給 flashtext 貢獻代碼:
https://github.com/vi3k6i5/flashtext

附 FlashText 與正則相比 查詢關鍵詞 所花費的時間之比:

在這裡插入圖片描述

附 FlashText 與正則相比 替換關鍵詞 所花費的時間之比:

在這裡插入圖片描述

這篇文章到這裡就結束了,喜歡的話記得點贊收藏,有疑問的話記得評論留言。

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註意如果你的mac是M1處理器 那抱歉當前文章可能不支持了,因為當前模擬器不支持。 3步完成mac uniapp 模擬器配置 1.下載網易mumu模擬器 https://mumu.163.com/mac/index.html 2.安裝 設置 下載完成後安裝運行就是這樣的 選擇屏幕旋轉 手機模式 3. ...
  • 工廠方法模式是什麼 工廠方法模式是一種創建型設計模式, 其在父類中提供一個創建對象的方法, 允許子類決定實例化對象的類型。 為什麼用工廠方法模式 在新增一個產品時,不用去修改已有的代碼。工廠方法將創建產品的代碼與實際使用產品的代碼分離,從而能在不影響其他代碼的情況下擴展產品創建部分代碼。例如,如果需 ...
  • 08-Functions, Parameters、 functions、 first class、 function signatures、 parameter、 pass by value、 p... ...
  • java是什麼? java是java面向對象程式設計語言和java平臺的總稱 java的開發平臺 javaSE:標準版 javaEE:企業版 javaME:嵌入式 JRE和JDK JRE:jre是java運行時環境,包含JVM和運行時所需要的核心類庫 JDK:jdk時java程式開發工具包,包含jr ...
  • 方法重載的規則,main方法也可以重載,JVM在調用main方法的時候傳入了一個空字元串數組 構成方法重載的規則: 1.首先必須是在同一個類中 2.函數名相同 3.形參列表不同(形參個數,類型,順序不同都可以構成方法重載) 只有返回值不同不能構成方法重載。 只有訪問修飾符不同也不能構成方法重載 ma ...
  • 有沒有小火伴是特別喜歡玩五子棋的,我記得我初中是特別喜歡的。於是,我今天就用Python給大家寫了一個黑白棋游戲。代碼放在下麵了。 01、繪製棋盤 Python學習交流Q群:906715085### import pygame, sys, random from pygame.locals impo ...
  • 多線程方式實現(1) 方式1:繼承Thread類。 * 步驟 * A:自定義類MyThread繼承Thread類。 * B:MyThread類裡面重寫run()? * 為什麼是run()方法呢? * C:創建對象 * D:啟動線程 */ package cn.itcast_02; /* * 該類要重 ...
  • Windows微信清理工具v.3.0.2 更新內容: 1、清理完成時可顯示刪除了哪些文件。 軟體截圖: 所有版本及源碼下載鏈接: 百度網盤:https://pan.baidu.com/s/1OSIpvZEOvd-lVZb_82BnKg 提取碼:ylzh (請下載v.3.0.2版本) 阿裡雲盤:htt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...