سؤال

أحتاج إلى قياس المسافة المادية بين مكانين يتم توفير أسمائه كسلاسل. نظرا لأحيانا يتم كتابة الأسماء بشكل مختلف قليلا، كنت أبحث عن مكتبة قد تساعدني في قياس الفرق ثمدمجها بقياس خطوط الطول والعرض لتحديد المباريات الصحيحة. اللغات المفضلة: Java أو PHP.

أي اقتراحات؟

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

المحلول

إلقاء نظرة على Levenshtein المسافة. وبعد هذه هي وسيلة لقياس مدى اختلاف سلوتين من بعضها البعض.

آمل أن أفهم سؤالك بشكل صحيح؛ باستخدام "المسافة" في نفس الجملة ك "خط الطول والعرض" قد يكون مربكا!

نصائح أخرى

على الرغم من مكتوب في C (مع Bython و TCL Bindings)، libdistance ستكون أداة لتطبيق عدة مسافات مقاييس على السلاسل / البيانات.

وشملت المقاييس:

  • إزهار
  • دميراو
  • euclid.
  • hamming.
  • جاكسارد
  • Levenshtein.
  • مانهاتن
  • minkowski.
  • needleman_wunsch.

قد تحصل على بعض النتائج اللائقة باستخدام خوارزمية صوفية للعثور على أسماء misspelld قليلا.

أيضا، إذا كنت تستخدم مسافة تحرير ميكانيكية أكثر، فمن المحتمل أن ترى نتائج أفضل باستخدام وظيفة مرجحة تحسيم هندسة لوحة المفاتيح (أي مفاتيح إغلاق جسديا "أرخص" لاستبدالها من غير متوقفة). هذه طريقة حاصلة على براءة اختراع، لذلك توخي الحذر عدم كتابة شيء يصبح تحظى بشعبية كبيرة؛)

أخذت الحرية لترجمة قطعة من كود C # كتبت لحساب المسافة Levenshtein إلى رمز Java. يستخدم صفيفان فقط بعيد الأبعاد الذي يتبعه بدلا من صفيف خشن كبير:

public static int getDifference(String a, String b)
{
    // Minimize the amount of storage needed:
    if (a.length() > b.length())
    {
        // Swap:
        String x = a;
        a = b;
        b = x;
    }

    // Store only two rows of the matrix, instead of a big one
    int[] mat1 = new int[a.length() + 1];
    int[] mat2 = new int[a.length() + 1];

    int i;
    int j;

    for (i = 1; i <= a.length(); i++)
        mat1[i] = i;

    mat2[0] = 1;

    for (j = 1; j <= b.length(); j++)
    {
        for (i = 1; i <= a.length(); i++)
        {
            int c = (a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1);

            mat2[i] =
                Math.min(mat1[i - 1] + c,
                Math.min(mat1[i] + 1, mat2[i - 1] + 1));
        }

        // Swap:
        int[] x = mat1;
        mat1 = mat2;
        mat2 = x;

        mat2[0] = mat1[0] + 1;
    }

    // It's row #1 because we swap rows at the end of each outer loop,
    // as we are to return the last number on the lowest row
    return mat1[a.length()];
}

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

أود أن أوصي إما Levenshtein المسافة أو ال Jaccard المسافة لمقارنة النص.

وجدت سام في جافا، لكنها لم تستخدمها.

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