RapidFuzz เป็นไลบรารีการจับคู่สตริงที่รวดเร็วสำหรับ Python และ C++ ซึ่งใช้การคำนวณความคล้ายคลึงกันของสตริงจาก FuzzyWuzzy อย่างไรก็ตาม มีสองด้านที่ทำให้ RapidFuzz แตกต่างจาก FuzzyWuzzy:
เป็นใบอนุญาตของ MIT ดังนั้นจึงสามารถใช้ใบอนุญาตใดก็ได้ที่คุณต้องการเลือกสำหรับโครงการของคุณ ในขณะที่คุณถูกบังคับให้ใช้ใบอนุญาต GPL เมื่อใช้ FuzzyWuzzy
มันมี 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
มีไบนารี (วงล้อ) ที่สร้างไว้ล่วงหน้าของ RapidFuzz สำหรับ MacOS (10.9 ขึ้นไป), Linux x86_64 และ Windows ล้อสำหรับ armv6l (Raspberry Pi Zero) และ armv7l (Raspberry Pi) มีอยู่ใน piwheels
✖️ ล้มเหลว "ImportError: โหลด DLL ล้มเหลว"
หากคุณพบข้อผิดพลาดนี้บน Windows สาเหตุที่เป็นไปได้มากที่สุดคือไม่ได้ติดตั้ง Visual C++ 2019 แบบแจกจ่ายต่อได้ ซึ่งจำเป็นสำหรับการค้นหาไลบรารี C++ (เวอร์ชัน C++ 2019 ประกอบด้วยเวอร์ชัน 2015, 2017 และ 2019)
RapidFuzz สามารถติดตั้งได้ด้วย conda
:
conda ติดตั้ง -c conda-forge Rapidfuzz
RapidFuzz สามารถติดตั้งได้โดยตรงจากการกระจายต้นทางโดยการโคลนพื้นที่เก็บข้อมูล สิ่งนี้ต้องการคอมไพเลอร์ที่มีความสามารถ C ++ 17
git clone -- เรียกซ้ำ https://github.com/rapidfuzz/rapidfuzz.gitcd Rapidfuzz การติดตั้ง pip
ฟังก์ชั่นง่ายๆ บางอย่างแสดงไว้ด้านล่าง สามารถดูเอกสารฉบับสมบูรณ์ของฟังก์ชันทั้งหมดได้ที่นี่
โปรดทราบว่าจาก RapidFuzz 3.0.0 สตริงจะไม่ถูกประมวลผลล่วงหน้า (ลบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมด ตัดช่องว่าง แปลงอักขระทั้งหมดเป็นตัวพิมพ์เล็ก) ตามค่าเริ่มต้น ซึ่งหมายความว่าเมื่อเปรียบเทียบสองสายที่มีอักขระเหมือนกันแต่กรณีต่างกัน ("นี่คือคำ", "นี่คือคำ") ค่าคะแนนความคล้ายคลึงกันอาจแตกต่างกัน ดังนั้นเมื่อเปรียบเทียบสตริงดังกล่าว คุณอาจเห็นความแตกต่างในคะแนน มูลค่าเมื่อเทียบกับเวอร์ชันก่อนหน้า สามารถดูตัวอย่างการจับคู่สตริงกับการประมวลผลล่วงหน้าได้ที่นี่
ผู้ทำคะแนนใน RapidFuzz สามารถพบได้ในโมดูล fuzz
และ distance
> จาก Rapidfuzz นำเข้า fuzz> fuzz.ratio("นี่คือการทดสอบ", "นี่คือการทดสอบ!")96.55172413793103
> จาก Rapidfuzz นำเข้า fuzz> fuzz.partial_ratio("นี่คือการทดสอบ", "นี่คือการทดสอบ!")100.0
> จาก Rapidfuzz นำเข้า fuzz> fuzz.ratio("fuzzy wuzzy เป็นหมี", "wuzzy fuzzy เป็นหมี")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy เป็นหมี", "wuzzy fuzzy เป็นหมี")100.0
> จาก Rapidfuzz นำเข้า fuzz> fuzz.token_sort_ratio("fuzzy เป็นหมี", "fuzzy fuzzy เป็นหมี")84.21052631578947> fuzz.token_set_ratio("fuzzy เป็นหมี", "fuzzy fuzzy เป็นหมี")100.0# ส่งคืน 100.0 ถ้าสตริงหนึ่งเป็นสับเซตของอีกสตริงหนึ่ง โดยไม่คำนึงถึง เนื้อหาพิเศษในสตริงที่ยาวกว่า> fuzz.token_set_ratio("fuzzy เคยเป็นหมี แต่ไม่ใช่สุนัข", "fuzzy เคยเป็นหมี")100.0# คะแนนจะลดลงเฉพาะเมื่อมีความขัดแย้งอย่างชัดเจนในทั้งสองสาย> fuzz.token_set_ratio(" ฟัซซี่เป็นหมี แต่ไม่ใช่สุนัข", "ฟัซซี่เป็นหมี แต่ไม่ใช่แมว")92.3076923076923
> จาก Rapidfuzz import fuzz> fuzz.WRatio("นี่คือการทดสอบ", "นี่คือการทดสอบใหม่!!!")85.5> จาก Rapidfuzz import fuzz, utils> # การลบอักขระที่ไม่ใช่ตัวเลขและตัวอักษร ("!") ออกจาก string> fuzz.WRatio("นี่คือการทดสอบ", "นี่คือการทดสอบใหม่!!!", processor=utils.default_process) # ที่นี่ "นี่คือการทดสอบใหม่!!!" ถูกแปลงเป็น "นี่คือการทดสอบใหม่"95.0> fuzz.WRatio("นี่คือการทดสอบ", "นี่คือการทดสอบใหม่")95.0> # การแปลงสตริงเป็นตัวพิมพ์เล็ก> fuzz.WRatio("นี่คือคำ" , "นี่คือคำ")21.42857142857143> fuzz.WRatio("นี่คือคำ", "นี่คือคำ", processor=utils.default_process) # ที่นี่ "นี่คือคำ" ถูกแปลงเป็น "นี่คือคำ"100.0
> จาก Rapidfuzz import fuzz> fuzz.QRatio("นี่คือการทดสอบ", "นี่คือการทดสอบใหม่!!!")80.0> จาก Rapidfuzz import fuzz, utils> # การลบอักขระที่ไม่ใช่ตัวเลขและตัวอักษร ("!") ออกจาก string> fuzz.QRatio("นี่คือการทดสอบ", "นี่คือการทดสอบใหม่!!!", processor=utils.default_process)87.5> fuzz.QRatio("นี่คือ test", "นี่คือการทดสอบใหม่")87.5> # การแปลงสตริงเป็นตัวพิมพ์เล็ก> fuzz.QRatio("นี่คือคำ", "นี่คือคำ")21.42857142857143> fuzz.QRatio("นี่คือคำ" , "นี่คือคำ", processor=utils.default_process)100.0
โมดูลกระบวนการทำให้เปรียบเทียบสตริงกับรายการสตริง โดยทั่วไปแล้วจะมีประสิทธิภาพมากกว่าการใช้เรอร์เรอร์โดยตรงจาก Python ต่อไปนี้เป็นตัวอย่างการใช้งานโปรเซสเซอร์ใน RapidFuzz:
> จากกระบวนการนำเข้า Rapidfuzz, fuzz> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]> process.extract("new york jets", choices, Scorer=fuzz. WRatio, ขีดจำกัด=2)[('นิวยอร์กเจ็ตส์', 76.92307692307692, 1), ('นิวยอร์กไจแอนต์', 64.28571428571428, 2)]> process.extractOne("cowboys", choices, Scorer=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # ด้วยการประมวลผลล่วงหน้า> จากกระบวนการนำเข้า Rapidfuzz, fuzz, utils> process.extract( "นิวยอร์กเจ็ตส์" ทางเลือก ผู้ทำประตู=fuzz.WRatio, ขีดจำกัด=2, โปรเซสเซอร์=utils.default_process)[('New York Jets', 100.0, 1), ('New York Giants', 78.57142857142857, 2)]> process.extractOne("cowboys", ตัวเลือก ผู้บันทึกคะแนน=fuzz.WRatio โปรเซสเซอร์=utils.default_process)('ดัลลัส คาวบอยส์ 90.0, 3)
สามารถดูเอกสารประกอบโปรเซสเซอร์ฉบับเต็มได้ที่นี่
เกณฑ์มาตรฐานต่อไปนี้ให้การเปรียบเทียบประสิทธิภาพอย่างรวดเร็วระหว่าง RapidFuzz และ FuzzyWuzzy คุณสามารถดูเกณฑ์มาตรฐานโดยละเอียดเพิ่มเติมสำหรับเมตริกสตริงได้ในเอกสารประกอบ สำหรับการเปรียบเทียบอย่างง่ายนี้ ฉันได้สร้างรายการสตริง 10,000 สตริงที่มีความยาว 10 ซึ่งเปรียบเทียบกับตัวอย่างองค์ประกอบ 100 รายการจากรายการนี้:
word = ["".join(random.choice(string.ascii_letters + string.digits) สำหรับ _ อยู่ในช่วง (10)) สำหรับ _ อยู่ในช่วง (10_000) ]ตัวอย่าง = คำ[:: len(คำ) // 100]
เกณฑ์มาตรฐานแรกจะเปรียบเทียบประสิทธิภาพของผู้ทำคะแนนใน FuzzyWuzzy และ RapidFuzz เมื่อใช้โดยตรงจาก Python ในลักษณะต่อไปนี้:
สำหรับตัวอย่างในตัวอย่าง:สำหรับคำต่อคำ:ผู้ทำคะแนน(ตัวอย่าง, คำ)
กราฟต่อไปนี้แสดงจำนวนองค์ประกอบที่ได้รับการประมวลผลต่อวินาทีโดยผู้บันทึกคะแนนแต่ละคน มีความแตกต่างด้านประสิทธิภาพอย่างมากระหว่างผู้ทำประตูที่แตกต่างกัน อย่างไรก็ตาม ผู้ทำคะแนนแต่ละคนจะเร็วกว่าใน RapidFuzz
เกณฑ์มาตรฐานที่สองเปรียบเทียบประสิทธิภาพเมื่อมีการใช้ผู้บันทึกคะแนนร่วมกับ cdist ในลักษณะต่อไปนี้:
cdist(ตัวอย่าง, คำ, ผู้บันทึกคะแนน=ผู้ทำประตู)
กราฟต่อไปนี้แสดงจำนวนองค์ประกอบที่ได้รับการประมวลผลต่อวินาทีโดยผู้บันทึกคะแนนแต่ละคน ใน RapidFuzz การใช้เรอร์สเซอร์ผ่านโปรเซสเซอร์ เช่น cdist
นั้นเร็วกว่าการใช้โดยตรงมาก นั่นเป็นเหตุผลว่าทำไมจึงควรใช้ทุกครั้งที่เป็นไปได้
หากคุณใช้ RapidFuzz สำหรับงานของคุณและรู้สึกอยากมอบผลประโยชน์เล็กๆ น้อยๆ ของคุณเองกลับคืนมาเพื่อสนับสนุนโครงการนี้ ลองส่งเงินให้เราผ่านผู้สนับสนุน GitHub หรือ PayPal ที่เราสามารถใช้เพื่อซื้อเวลาว่างให้กับเราในการบำรุงรักษาห้องสมุดที่ยอดเยี่ยมนี้ เพื่อแก้ไขจุดบกพร่องในซอฟต์แวร์ ตรวจสอบและบูรณาการการมีส่วนร่วมของโค้ด เพื่อปรับปรุงคุณสมบัติและเอกสารประกอบของซอฟต์แวร์ หรือเพียงแค่หายใจเข้าลึกๆ และดื่มชาเป็นครั้งคราว ขอบคุณสำหรับการสนับสนุนของคุณ
สนับสนุนโครงการผ่านผู้สนับสนุน GitHub หรือผ่าน PayPal:
RapidFuzz ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT เนื่องจากฉันเชื่อว่าทุกคนควรจะสามารถใช้งานได้โดยไม่ต้องถูกบังคับให้รับใบอนุญาต GPL นั่นเป็นเหตุผลว่าทำไมห้องสมุดจึงใช้ fuzzywuzzy เวอร์ชันเก่าที่ได้รับอนุญาตจาก MIT เช่นกัน สามารถพบ fuzzywuzzy เวอร์ชันเก่าได้ที่นี่