RapidFuzz هي مكتبة سريعة لمطابقة السلاسل لـ Python وC++، والتي تستخدم حسابات تشابه السلسلة من FuzzyWuzzy. ومع ذلك، هناك بعض الجوانب التي تميز RapidFuzz عن FuzzyWuzzy:
إنه مرخص من معهد ماساتشوستس للتكنولوجيا (MIT) لذا يمكن استخدامه أي ترخيص قد ترغب في اختياره لمشروعك، بينما تضطر إلى اعتماد ترخيص GPL عند استخدام FuzzyWuzzy
يوفر العديد من مقاييس السلسلة مثل hamming أو jaro_winkler، والتي لم يتم تضمينها في FuzzyWuzzy
تتم كتابته في الغالب بلغة C++ ويأتي علاوة على ذلك مع الكثير من التحسينات الخوارزمية لجعل مطابقة السلسلة أسرع، مع الاستمرار في تقديم نفس النتائج. للحصول على معايير مفصلة تحقق من الوثائق
يعمل على إصلاح أخطاء متعددة في تطبيق partial_ratio
يمكن استخدامه إلى حد كبير كقطرة بديلة لـ fuzzywuzzy
. ومع ذلك، هناك بعض الاختلافات في واجهة برمجة التطبيقات الموضحة هنا
بايثون 3.9 أو الأحدث
على نظام التشغيل Windows، يلزم توفر Visual C++ 2019 القابل لإعادة التوزيع
هناك عدة طرق لتثبيت RapidFuzz، والطرق الموصى بها هي إما استخدام pip
(مدير حزم Python) أو conda
(مدير حزم مفتوح المصدر ومتعدد المنصات)
يمكن تثبيت RapidFuzz باستخدام pip
بالطريقة التالية:
نقطة تثبيت Rapidfuzz
توجد ثنائيات (عجلات) مدمجة مسبقًا لـ RapidFuzz لنظام التشغيل MacOS (10.9 والإصدارات الأحدث) وLinux x86_64 وWindows. تتوفر عجلات لـarmv6l (Raspberry Pi Zero) وarmv7l (Raspberry Pi) على عجلات.
✖️ فشل "خطأ الاستيراد: فشل تحميل DLL"
إذا واجهت هذا الخطأ على نظام التشغيل Windows، فالسبب على الأرجح هو عدم تثبيت Visual C++ 2019 القابل لإعادة التوزيع، وهو أمر مطلوب للعثور على مكتبات C++ (يتضمن إصدار C++ 2019 إصدار 2015 و2017 و2019).
يمكن تثبيت RapidFuzz باستخدام conda
:
conda install -c conda-forge Rapidfuzz
يمكن تثبيت RapidFuzz مباشرة من التوزيع المصدر عن طريق استنساخ المستودع. وهذا يتطلب مترجم قادر على C++ 17.
git clone - العودي https://github.com/rapidfuzz/rapidfuzz.gitcd Rapidfuzz تثبيت النقطة.
بعض الوظائف البسيطة موضحة أدناه. يمكن العثور على الوثائق الكاملة لجميع الوظائف هنا.
لاحظ أنه من RapidFuzz 3.0.0، لم تتم معالجة السلاسل مسبقًا (إزالة كافة الأحرف غير الأبجدية الرقمية، وتقليص المسافات البيضاء، وتحويل كافة الأحرف إلى أحرف صغيرة) بشكل افتراضي. مما يعني أنه عند مقارنة سلسلتين لهما نفس الأحرف ولكن حالات مختلفة ("هذه كلمة"، "هذه كلمة") قد تكون قيمة درجة التشابه بينهما مختلفة، لذلك عند مقارنة هذه السلاسل قد ترى اختلافًا في النتيجة القيمة مقارنة بالإصدارات السابقة. يمكن العثور هنا على بعض الأمثلة على مطابقة السلسلة مع المعالجة المسبقة.
يمكن العثور على الهدافين في RapidFuzz في وحدات fuzz
distance
.
> من Rapidfuzz Import Fuzz> Fuzz.ratio("هذا اختبار"، "هذا اختبار!")96.55172413793103
> من Rapidfuzz import fuzz> fuzz.partial_ratio("هذا اختبار"، "هذا اختبار!")100.0
> من Rapidfuzz استيراد fuzz> fuzz.ratio ("كان غامض غامض دبًا"، "كان غامض غامض دبًا")90.9090909090909> fuzz.token_sort_ratio ("كان غامض غامض دبًا"، "كان غامض غامض دبًا")100.0
> من Rapidfuzz استيراد fuzz> fuzz.token_sort_ratio("كان غامض دبًا"، "كان غامضًا دبًا")84.21052631578947> fuzz.token_set_ratio ("كان غامضًا دبًا"، "كان غامضًا دبًا")100.0# إرجاع 100.0 إذا كانت إحدى السلسلة عبارة عن مجموعة فرعية من الأخرى، بغض النظر عن المحتوى الإضافي فيها السلسلة الأطول> fuzz.token_set_ratio("كان غامض دب ولكن ليس كلبًا"، "كان غامض دبًا")100.0# يتم تقليل النتيجة فقط عندما يكون هناك خلاف صريح في السلسلتين> fuzz.token_set_ratio("كان غامض دب ولكن ليس كلبًا"، "كان غامض دبًا ولكن ليس قطة")92.3076923076923
> من Rapidfuzz import fuzz> fuzz.WRatio("هذا اختبار"، "هذا اختبار جديد!!!")85.5> من Rapidfuzz import fuzz, utils> # إزالة الأحرف غير الأبجدية الرقمية("!") من string> fuzz.WRatio("هذا اختبار"، "هذا اختبار جديد!!!"،process=utils.default_process) # هنا "هذا اختبار جديد!!!" تم تحويله إلى "هذا اختبار جديد"95.0> fuzz.WRatio("هذا اختبار"، "هذا اختبار جديد")95.0> # تحويل السلسلة إلى أحرف صغيرة> fuzz.WRatio("هذه كلمة" ، "هذه كلمة")21.42857142857143> fuzz.WRatio("هذه كلمة"، "هذه كلمة"، المعالج=utils.default_process) # هنا يتم تحويل "هذه كلمة" إلى "هذه كلمة"100.0
> من Rapidfuzz import fuzz> fuzz.QRatio("هذا اختبار"، "هذا اختبار جديد!!!")80.0> من Rapidfuzz import fuzz, utils> # إزالة الأحرف غير الأبجدية الرقمية("!") من سلسلة> fuzz.QRatio("هذا اختبار"، "هذا اختبار جديد!!!"، المعالج=utils.default_process)87.5> fuzz.QRatio("هذا اختبار"، "هذا اختبار جديد")87.5> # تحويل السلسلة إلى أحرف صغيرة> fuzz.QRatio("هذه كلمة"، "هذه كلمة")21.42857142857143> fuzz.QRatio("هذه كلمة"، "هذه كلمة" هي كلمة"، المعالج=utils.default_process)100.0
وحدة العملية تجعلها تقارن السلاسل بقوائم السلاسل. يعد هذا بشكل عام أكثر أداءً من استخدام أدوات التسجيل مباشرة من Python. فيما يلي بعض الأمثلة على استخدام المعالجات في RapidFuzz:
> من عملية الاستيراد Rapidfuzz، fuzz> Choices = ["Atlanta Falcons"، "New York Jets"، "New York Giants"، "Dallas Cowboys"]> العملية.extract("new york jets"، options, 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( "طائرات نيويورك"، والخيارات، Scorer=fuzz.WRatio, Limit=2,process=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 عنصر من هذه القائمة:
الكلمات = ["".join(random.choice(string.ascii_letters + string.digits) for _ in range(10))for _ in range(10_000) ]العينات = الكلمات[:: لين(كلمات) // 100]
يقارن المعيار الأول أداء الهدافين في FuzzyWuzzy وRapidFuzz عند استخدامهما مباشرة من Python بالطريقة التالية:
للعينة في العينات: للكلمة بالكلمات: الهداف (عينة، كلمة)
يوضح الرسم البياني التالي عدد العناصر التي تتم معالجتها في الثانية مع كل من أدوات تسجيل النقاط. هناك اختلافات كبيرة في الأداء بين الهدافين المختلفين. ومع ذلك، فإن كل من الهدافين يكون أسرع في RapidFuzz
يقارن المعيار الثاني الأداء عند استخدام الهدافين مع قرص مضغوط بالطريقة التالية:
قرص مضغوط (عينات، كلمات، هداف = هداف)
يوضح الرسم البياني التالي عدد العناصر التي تتم معالجتها في الثانية مع كل من أدوات تسجيل النقاط. في RapidFuzz، يعد استخدام أدوات التسجيل من خلال معالجات مثل cdist
أسرع بكثير من استخدامه مباشرة. ولهذا السبب ينبغي استخدامها كلما أمكن ذلك.
إذا كنت تستخدم RapidFuzz في عملك وتشعر بالرغبة في رد القليل من منفعتك الخاصة لدعم المشروع، ففكر في إرسال الأموال إلينا من خلال رعاة GitHub أو PayPal والتي يمكننا استخدامها لشراء وقت فراغ لنا لصيانة هذه المكتبة الرائعة، لإصلاح الأخطاء في البرنامج، أو مراجعة مساهمات التعليمات البرمجية ودمجها، أو تحسين ميزاته ووثائقه، أو مجرد أخذ نفس عميق وتناول كوب من الشاي بين الحين والآخر. شكرا لدعمكم.
ادعم المشروع من خلال رعاة GitHub أو عبر PayPal:
تم ترخيص RapidFuzz بموجب ترخيص MIT لأنني أعتقد أنه يجب أن يتمكن الجميع من استخدامه دون الاضطرار إلى اعتماد ترخيص GPL. ولهذا السبب تعتمد المكتبة على إصدار أقدم من Fuzzywuzzy المرخص من معهد ماساتشوستس للتكنولوجيا أيضًا. يمكن العثور على هذه النسخة القديمة من Fuzzywuzzy هنا.