Комбинация расстояний Левенштейна - PullRequest
0 голосов
/ 23 октября 2009

LD = расстояние Левенштейна

Просто делаю несколько примеров на бумаге, кажется, это работает, но кто-нибудь знает, всегда ли это так?

Допустим, у меня есть 3 строки

BOT

BOB

BOM

LD (BOT, BOB) = 1

и

LD (BOB, BOM) = 1

тогда

LD (BOT, BOM) = макс (LD (BOT, BOB), LD (BOB, DOM)) = 1

OR

BÀAB

BBAB

BCCD

LD (BBAB, BAAB) = 1

и

LD (BBAB, BCCD) = 3

затем

LD (BAAB, BCCD) = макс (LD (BBAB, BAAB), LD (BBAB, BCCD)) = 3

Я бы хотел знать, всегда ли это применимо.

То есть

LD (B, C) = max (LD (A, C), LD (A, B))


РЕДАКТИРОВАТЬ - Добавлено 22.10.2009 19:08 PST

Я начинаю думать, что это справедливо для слов одинаковой длины, в противном случае вы все равно можете это сделать, но вам нужно добавить абсолютное значение разницы в длине слова.

По существу LD (B, C) = max (LD (A, C), LD (A, B)) + abs (длина (B) -длина (C))

Ответы [ 5 ]

2 голосов
/ 06 сентября 2010

Нет, но это так:

лев (a, c) <= лев (a, b) + лев (b, c) (a.k.a "неравенство треугольника) </p>

... и используется в качестве эвристики VP-Trees и BK-Trees.

Будучи метрикой, расстояние Левенштейна следует неравенству треугольника:
http://en.wikipedia.org/wiki/Triangle_inequality

2 голосов
/ 23 октября 2009

не работает.

LD("BOB", "BOT") == 1
LD("BOT", "BOB") == 1

LD("BOB", "BOB") == 0
max(LD("BOB", "BOT"), LD("BOT", "BOB")) == 1

0 != 1

есть и более сложные примеры ...

1 голос
/ 23 октября 2009

Нет ничего лучше теста. Если вы знаете, C # запустите это через это.

public Int32 CalculateDistance(String x, String y)
{
    Int32 xl = x.Length;
    Int32 yl = y.Length;
    Int32[,] matrix = new Int32[xl + 1, yl + 1];

    for (Int32 i = 0; i <= xl; i++)
    {
        matrix[i, 0] = i;
    }

    for (Int32 i = 0; i <= yl; i++)
    {
        matrix[0, i] = i;
    }

    for (Int32 j = 1; j <= yl; j++)
    {
        for (Int32 i = 1; i <= xl; i++)
        {                   
            if (x[i - 1] == y[j - 1])
            {
                matrix[i, j] = matrix[i - 1, j - 1];
            }
            else                    
            {
                matrix[i, j] = Min((matrix[i - 1, j] + 1), (matrix[i, j - 1] + 1), (matrix[i - 1, j - 1] + 1));
            }
        }
    }   

    return matrix[xl, yl];
}
1 голос
/ 23 октября 2009

Это обычная проблема динамического программирования. Запись в Википедии содержит часть проверки правильности. Вы ищете что-то еще?

0 голосов
/ 23 октября 2009

Не верно для этого случая

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LevenshteinDistance
{
class Program
{
    static void Main(string[] args)
    {
        LevenshteinDistance ld = new LevenshteinDistance();
        string a="B";
        string b="Book";
        string c = "Sick";

        Console.WriteLine("{0} = Max( {1}, {2} )", ld.Compute(b, c), ld.Compute(a, c), ld.Compute(a, b)); 
        if (ld.Compute(b, c) == Math.Max(ld.Compute(a, c), ld.Compute(a, b)))
            Console.WriteLine("Equal");
        else
            Console.WriteLine("Not Equal");
        Console.ReadKey();

    }

}

class LevenshteinDistance
{
    //****************************
    // Get minimum of three values
    //****************************

    private int Minimum(int a, int b, int c)
    {
        int min;

        min = a;
        if (b < min)
        {
            min = b;
        }
        if (c < min)
        {
            min = c;
        }
        return min;

    }

    //*****************************
    // Compute Levenshtein distance
    //*****************************

    public int Compute(string s, string t)
    {
        int[,] matrix; // matrix
        int n; // length of s
        int m; // length of t
        int i; // iterates through s
        int j; // iterates through t
        char s_i; // ith character of s
        char t_j; // jth character of t
        int cost; // cost

        // Step 1
        n = s.Length;
        m = t.Length;
        if (n == 0)
        {
            return m;
        }
        if (m == 0)
        {
            return n;
        }
        matrix = new int[n + 1, m + 1];

        // Step 2

        for (i = 0; i <= n; i++)
        {
            matrix[i, 0] = i;
        }

        for (j = 0; j <= m; j++)
        {
            matrix[0, j] = j;
        }

        // Step 3

        for (i = 1; i <= n; i++)
        {

            s_i = s[(i - 1)];

            // Step 4

            for (j = 1; j <= m; j++)
            {

                t_j = t[(j - 1)];

                // Step 5

                if (s_i == t_j)
                {
                    cost = 0;
                }
                else
                {
                    cost = 1;
                }

                // Step 6

                matrix[i, j] = Minimum(matrix[i - 1, j] + 1, matrix[i, j - 1] + 1, matrix[i - 1, j - 1] + cost);

            }

        }

        // Step 7

        return matrix[n, m];

    }

}

}

...