RapidFuzz 是一個用於 Python 和 C++ 的快速字串匹配函式庫,它使用 FuzzyWuzzy 的字串相似度計算。然而,RapidFuzz 有幾個方面與 FuzzyWuzzy 不同:
它是 MIT 許可的,因此可以使用您想要為專案選擇的任何許可證,而在使用 FuzzyWuzzy 時您必須採用 GPL 許可證
它提供了許多 string_metrics,例如 hamming 或 jaro_winkler,這些指標未包含在 FuzzyWuzzy 中
它主要是用 C++ 編寫的,除此之外還進行了大量演算法改進,使字串匹配速度更快,同時仍然提供相同的結果。有關詳細基準,請查看文檔
修復了partial_ratio
實作中的多個錯誤
它在很大程度上可以用作fuzzywuzzy
的替代品。然而,這裡描述了一些 API 差異
Python 3.9 或更高版本
在 Windows 上,需要 Visual C++ 2019 可再發行元件
安裝RapidFuzz的方法有多種,建議的方法是使用pip
(Python套件管理器)或conda
(開源、跨平台的套件管理器)
RapidFuzz 可以透過以下方式透過pip
安裝:
pip 安裝rapidfuzz
有適用於 MacOS(10.9 及更高版本)、Linux x86_64 和 Windows 的 RapidFuzz 預先建置二進位檔案(輪子)。 piwheels 上提供了適用於armv6l(Raspberry Pi Zero)和armv7l(Raspberry Pi)的輪子。
✖️失敗“ImportError:DLL載入失敗”
如果您在 Windows 上遇到此錯誤,原因很可能是未安裝 Visual C++ 2019 可再發行元件,這是尋找 C++ 程式庫所必需的(C++ 2019 版本包括 2015、2017 和 2019 版本)。
RapidFuzz 可以使用conda
安裝:
conda install -c conda-forge Rapidfuzz
RapidFuzz 可以透過克隆儲存庫直接從來源發行版安裝。這需要支援 C++17 的編譯器。
git clone --recursive https://github.com/rapidfuzz/rapidfuzz.gitcd rapidfuzz 點安裝。
一些簡單的函數如下所示。可以在此處找到所有功能的完整文件。
請注意,從 RapidFuzz 3.0.0 開始,預設不會對字串進行預處理(刪除所有非字母數字字元、修剪空格、將所有字元轉換為小寫)。這意味著,當比較具有相同字元但大小寫不同的兩個字串時(「這是一個單字」、「這是一個單字」),它們的相似度得分值可能不同,因此在比較此類字串時,您可能會看到得分差異與先前的版本相比的價值。可以在此處找到一些使用預處理進行字串匹配的範例。
RapidFuzz 中的評分器可以在fuzz
和distance
模組中找到。
> from Rapidfuzz import fuzz> fuzz.ratio("這是一個測試", "這是一個測試!")96.55172413793103
> from Rapidfuzz import fuzz> fuzz.partial_ratio("這是測試", "這是測試!")100.0
> from Rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy 是一隻熊", "wuzzy fuzzy 是一隻熊")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy 是一隻熊熊 wuzzy 是一隻熊00
> from Rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy 是一隻熊", "fuzzy fuzzy 是一隻熊")84.21052631578947> fuzz.token_set_ratio("fuzzy 是一隻熊", "fuyy) 是一隻熊回來 000.如果一個字串是另一個字串的子集,無論較長字串中的額外內容如何> fuzz.token_set_ratio("fuzzy was a bear but not a dogs", "fuzzy was a bear")100.0# 僅當存在時分數才會降低兩個字串中存在明確的分歧> fuzz.token_set_ratio("fuzzy 是一隻熊,但不是狗", "fuzzy 是一隻熊,但不是貓")92.3076923076923
> from rapidfuzz import fuzz> fuzz.WRatio("this is a test", "this is a new test!!!")85.5> from rapidfuzz import fuzz, utils> # 從清單中刪除非字母數字字元("!" ) string> fuzz.WRatio("這是一個測試", "這是一個新的測試!!!",processor=utils.default_process) # 這裡 "這是一個新的測試!!!"轉換為 "this is a new test"95.0> fuzz.WRatio("this is a test", "this is a new test")95.0> # 將字串轉換為小寫> fuzz.WRatio("this is a word" , "THIS IS A WORD")21.42857142857143> fuzz.WRatio("this is a word", "THIS IS A WORD",processor=utils.default_process) # 這裡"THIS IS A WORD" 被轉換為"this is a word " “100.0
> from Rapidfuzz import fuzz> fuzz.QRatio("這是一個測試", "這是一個新測試!!!")80.0> from rapidfuzz import fuzz, utils> # 從列表中刪除非字母數字字元("!" ) string> fuzz.QRatio("這是一個測試", "這是一個新測試!!!",processor=utils.default_process)87.5> fuzz.QRatio("這是一個測試", "這是一個新測試" )87.5> # 將字串轉換為小寫> fuzz.QRatio("這是一個單字", "這是一個單字")21.42857142857143> fuzz.QRatio("這是一個單字", "這是一個單字", process= utils.default_process)100.0
處理模組使其將字串與字串清單進行比較。這通常比直接使用 Python 的評分器效能更高。以下是有關 RapidFuzz 中處理器的使用的一些範例:
> from rapidfuzz import process, fuzz> choice = ["亞特蘭大獵鷹隊", "紐約噴射機隊", "紐約巨人", "達拉斯牛仔"]> process.extract("紐約噴射機隊", Choices, Scorer=fuzz。 fuzz.WRatio)('達拉斯牛仔隊', 83.07692307692308, 3)> # 用預處理> fromrapidfuzz import process, fuzz, utils> process.extract("new york jets", Choices, Scorer, li. , process=utils.default_process) [('紐約噴射機隊', 100.0, 1), ('紐約巨人', 78.57142857142857, 2)]> process.extractOne("牛仔隊", Choices, Scorer=fuzz. , process=utils.default_process)('達拉斯牛仔隊,90.0,3)
處理器的完整文件可以在這裡找到
以下基準測試對 RapidFuzz 和 FuzzyWuzzy 之間的表現進行了快速比較。可以在文件中找到更詳細的字串指標基準。對於這個簡單的比較,我產生了一個包含 10.000 個長度為 10 的字串的列表,與此列表中包含 100 個元素的樣本進行比較:
字 = ["".join(random.choice(string.ascii_letters + string.digits) for _ in range(10))for _ in range(10_000) ]樣本 = 單字[:: len(單字) // 100]
第一個基準測試比較了直接從 Python 使用 FuzzyWuzzy 和 RapidFuzz 中的評分器的效能,如下所示:
對於樣本中的樣本:對於單字中的單字:scorer(樣本,單字)
下圖顯示了每個記分器每秒處理的元素數。不同得分手之間的表現有很大差異。然而,RapidFuzz 中每個得分手的速度都更快
第二個基準測試比較了記分器與 cdist 結合使用時的效能,如下所示:
cdist(樣本、單字、記分器=記分器)
下圖顯示了每個記分器每秒處理的元素數。在 RapidFuzz 中,透過cdist
等處理器使用記分器比直接使用它快得多。這就是為什麼應盡可能使用它們。
如果您在工作中使用 RapidFuzz,並且想回饋一些自己的利益來支持該項目,請考慮透過 GitHub Sponsors 或 PayPal 向我們匯款,我們可以用這些錢來購買空閒時間來維護這個偉大的庫,修復軟體中的錯誤,審查和整合程式碼貢獻,改進其功能和文檔,或只是偶爾深呼吸並喝杯茶。感謝您的支持。
透過 GitHub 贊助商或 PayPal 支持此專案:
RapidFuzz 是根據 MIT 許可證獲得許可的,因為我相信每個人都應該能夠使用它,而不必被迫採用 GPL 許可證。這就是為什麼該庫基於 fuzzywuzzy 的舊版本,該版本也獲得了 MIT 許可。這個舊版本的 fuzzywuzzy 可以在這裡找到。