Алгоритм расчета процентной разницы между двумя текстовыми пятнами - PullRequest
3 голосов
/ 24 июня 2010

Я искал эффективное решение этой проблемы. Я посмотрел на разные движки (Google diff-match-patch, Python's diff) и некоторые самые длинные алгоритмы цепочки.

Я надеялся получить от вас предложения, как решить эту проблему. Какой-нибудь алгоритм или библиотеку, в частности, вы хотели бы порекомендовать?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 24 июня 2010

Я не знаю, что "самый длинный общий [[цепочка? Substring?]]" Имеет отношение к "разнице в процентах", особенно после того, как вы увидели в комментарии, что вы ожидаете очень небольшую разницу в% между двумя строками, один символ посередине (поэтому их самая длинная общая подстрока составляет около половины длины строки).

Игнорирование «самой длинной общей» странности и определение «процентной разницы» в качестве расстояния редактирования между строками, разделенного на максимальную длину (умноженное на 100, конечно ;-), как насчет:

def levenshtein_distance(first, second):
    """Find the Levenshtein distance between two strings."""
    if len(first) > len(second):
        first, second = second, first
    if len(second) == 0:
        return len(first)
    first_length = len(first) + 1
    second_length = len(second) + 1
    distance_matrix = [[0] * second_length for x in range(first_length)]
    for i in range(first_length):
       distance_matrix[i][0] = i
    for j in range(second_length):
       distance_matrix[0][j]=j
    for i in xrange(1, first_length):
        for j in range(1, second_length):
            deletion = distance_matrix[i-1][j] + 1
            insertion = distance_matrix[i][j-1] + 1
            substitution = distance_matrix[i-1][j-1]
            if first[i-1] != second[j-1]:
                substitution += 1
            distance_matrix[i][j] = min(insertion, deletion, substitution)
    return distance_matrix[first_length-1][second_length-1]

def percent_diff(first, second):
    return 100*levenshtein_distance(a, b) / float(max(len(a), len(b)))

a = "the quick brown fox"
b = "the quick vrown fox"
print '%.2f' % percent_diff(a, b)

Функция Левенштейна из блога Ставроса . Результат в этом случае будет 5,26 (разница в процентах).

2 голосов
/ 24 июня 2010

В дополнение к difflib и другим распространенным библиотекам подпоследовательностей, если это текст на естественном языке, вы можете посмотреть на основание, которое нормализует слова к их корневой форме. Вы можете найти несколько реализаций в библиотеке Natural Language Toolkit (http://www.nltk.org/). Вы также можете сравнивать двоичные объекты текста на естественном языке с помощью N-граммы (http://en.wikipedia.org/wiki/N-gram).

1 голос
/ 24 июня 2010

Самая длинная общая цепь? Возможно, это поможет тогда: http://en.wikipedia.org/wiki/Longest_common_subsequence_problem

0 голосов
/ 24 июня 2010

текст ссылки Другой областью интереса может быть описанное здесь расстояние Левенштейна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...