سؤال

أنا على دراية بـ Soundex و (مزدوج) الميتافون ، لكن هذه لا تسمح لي باختبار تشابه الكلمات ككل - على سبيل المثال "مرحبًا" يبدو مشابهًا جدًا لـ "Bye" مختلف تماما.

هل هناك أي مكتبات في روبي ، أو أي طرق تعرفها ، قادرة على تحديد التشابه بين كلمتين؟ (إما أن يكون منطقية/غير متشابهة ، أو عددي 40 ٪ متشابهة)

تعديل: نقاط إضافية إضافية إذا كانت هناك طريقة سهلة "لإسقاط" لهجة أو لغة مختلفة!

هل كانت مفيدة؟

المحلول

أعتقد أنك تصف مسافة Levenshtein. ونعم ، هناك جواهر لذلك. إذا كنت في روبي نقي ، فاذهب إلى جوهرة النص.

$ gem install text

المستندات لديك المزيد من التفاصيل ، ولكن إليك جوهره:

Text::Levenshtein.distance('test', 'test')    # => 0
Text::Levenshtein.distance('test', 'tent')    # => 1

إذا كنت موافقًا على الامتدادات الأصلية ...

$ gem install levenshtein

الاستخدام مشابه. الأداء جيد جدا. (إنه يتعامل مع 1000 تصحيحات إملائية في الدقيقة على أنظامي.)

إذا كنت بحاجة إلى معرفة مدى تشابه كلمتين ، فاستخدم المسافة على طول الكلمة.

إذا كنت تريد اختبار تشابه بسيط ، فكر في شيء مثل هذا:

لم يخبر ، ولكن مباشرة إلى الأمام:

String.module_eval do
   def similar?(other, threshold=2)
    distance = Text::Levenshtein.distance(self, other)
    distance <= threshold
  end
end

نصائح أخرى

يمكنك أولاً معالجة الكلمات المسبقة باستخدام قاعدة بيانات Thesaurus ، والتي ستحول الكلمات ذات معنى مماثل لنفس الكلمة. هناك العديد من قواعد بيانات Thesaurus هناك ، للأسف لم أتمكن من العثور على واحدة لائقة مجانية للغة الإنجليزية ( http://www.gutenberg.org/etext/3202 هو الشخص الذي وجدته ، لكن هذا لا يوضح العلاقات التي تتمتع بها الكلمات المحددة (مثل مماثلة ؛ عكس ؛ معنى بديل ؛ إلخ) ، لذلك كل الكلمات على نفس الخط لها بعض العلاقة ، لكنك لن تعرف ما هي هذه العلاقة)

ولكن على سبيل المثال بالنسبة إلى الهنغارية ، هناك قاعدة بيانات جيدة مجانية ، لكن ليس لديك Soundex/Metaphone للنصوص المجرية ...

إذا كان لديك قاعدة البيانات التي تكتب برنامجًا يسرع معالجة النصوص ليست صعبة للغاية (إنها في نهاية المطاف عبارة عن تبادل بحث بسيط ، ولكن قد ترغب في معالجة قاعدة بيانات Thesaurus باستخدام Simplex أو الميثافون أيضًا)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top