Алгоритм подобия текста

У меня есть два файла субтитров. Мне нужна функция, которая сообщает, представляют ли они один и тот же текст или аналогичный текст

Иногда бывают такие комментарии, как "Ветер дует... музыка играет" только в одном файле. Но 80% процентов будет одинаковым. Функция должна возвращать TRUE (файлы представляют один и тот же текст). И иногда встречаются орфографические ошибки, такие как 1 вместо l (один - L), как здесь: Она достала багаж. Конечно, это означает, что функция должна возвращать TRUE.

Мои комментарии:
Функция должна возвращать процент сходства текстов - AGREE

"все люди были счастливы" и "все люди были недовольны" - здесь это будет рассматриваться как орфографическая ошибка, так что это будет считаться одним и тем же текстом. Точнее, процент возвращаемой функции будет ниже, но достаточно высок, чтобы сказать, что фразы похожи.

Учтите, хотите ли вы применить Levenshtein на весь файл или только строку поиска - не уверены в Levenshtein, но алгоритм должен применяться к файлу в целом. Это будет очень длинная строка.

Ответы

Ответ 1

Алгоритм Левенштейна: http://en.wikipedia.org/wiki/Levenshtein_distance

Все, кроме результата нуля, означает, что текст не является "идентичным". "Подобный" является мерилом того, насколько они находятся рядом. Результат - целое число.

Ответ 2

Для описанной проблемы (например, для объединения больших строк) вы можете использовать "Косинус подобие" , которые возвращают число между 0 ( совершенно разные) до 1 (идентичные), основываясь на срок частоты.

Возможно, вам стоит взглянуть на несколько реализаций, которые описаны здесь: Косинус сходство

Ответ 3

Посмотрите приблизительный grep. Это может дать вам указатели, хотя он почти наверняка совершит ужасно большие куски текста, как вы говорите.

EDIT: оригинальная версия agrep не является открытым исходным кодом, поэтому вы можете получить ссылки на версии OSS из http://en.wikipedia.org/wiki/Agrep p >

Ответ 4

Вы ожидаете слишком много здесь, похоже, вам нужно написать функцию для ваших конкретных потребностей. Я бы рекомендовал начать с существующего приложения сравнения файлов (возможно, diff уже есть все, что вам нужно) и улучшить его, чтобы обеспечить хорошие результаты для вашего вход.

Ответ 5

Существует много альтернатив левенштейновскому расстоянию. Например, расстояние Jaro-Winkler.

Выбор для такого алгоритма зависит от языка, типа слов, слов, введенных человеком и многих других...

Здесь вы найдете полезную реализацию нескольких алгоритмов в одной библиотеке