Ответ 1
Алгоритм Левенштейна: http://en.wikipedia.org/wiki/Levenshtein_distance
Все, кроме результата нуля, означает, что текст не является "идентичным". "Подобный" является мерилом того, насколько они находятся рядом. Результат - целое число.
У меня есть два файла субтитров. Мне нужна функция, которая сообщает, представляют ли они один и тот же текст или аналогичный текст
Иногда бывают такие комментарии, как "Ветер дует... музыка играет" только в одном файле. Но 80% процентов будет одинаковым. Функция должна возвращать TRUE (файлы представляют один и тот же текст). И иногда встречаются орфографические ошибки, такие как 1 вместо l (один - L), как здесь: Она достала багаж. Конечно, это означает, что функция должна возвращать TRUE.
Мои комментарии:
Функция должна возвращать процент сходства текстов - AGREE
"все люди были счастливы" и "все люди были недовольны" - здесь это будет рассматриваться как орфографическая ошибка, так что это будет считаться одним и тем же текстом. Точнее, процент возвращаемой функции будет ниже, но достаточно высок, чтобы сказать, что фразы похожи.
Учтите, хотите ли вы применить Levenshtein на весь файл или только строку поиска - не уверены в Levenshtein, но алгоритм должен применяться к файлу в целом. Это будет очень длинная строка.
Алгоритм Левенштейна: http://en.wikipedia.org/wiki/Levenshtein_distance
Все, кроме результата нуля, означает, что текст не является "идентичным". "Подобный" является мерилом того, насколько они находятся рядом. Результат - целое число.
Для описанной проблемы (например, для объединения больших строк) вы можете использовать "Косинус подобие" , которые возвращают число между 0 ( совершенно разные) до 1 (идентичные), основываясь на срок частоты.
Возможно, вам стоит взглянуть на несколько реализаций, которые описаны здесь: Косинус сходство
Посмотрите приблизительный grep. Это может дать вам указатели, хотя он почти наверняка совершит ужасно большие куски текста, как вы говорите.
EDIT: оригинальная версия agrep не является открытым исходным кодом, поэтому вы можете получить ссылки на версии OSS из http://en.wikipedia.org/wiki/Agrep p >
Вы ожидаете слишком много здесь, похоже, вам нужно написать функцию для ваших конкретных потребностей. Я бы рекомендовал начать с существующего приложения сравнения файлов (возможно, diff уже есть все, что вам нужно) и улучшить его, чтобы обеспечить хорошие результаты для вашего вход.
Существует много альтернатив левенштейновскому расстоянию. Например, расстояние Jaro-Winkler.
Выбор для такого алгоритма зависит от языка, типа слов, слов, введенных человеком и многих других...
Здесь вы найдете полезную реализацию нескольких алгоритмов в одной библиотеке