В принципе на этот вопрос можно ответить независимо от языка, но в частности я ищу реализацию Javascript.Измерение идентичности строк (в Javascript)
Существуют ли библиотеки, которые позволяют мне измерять «идентичность» двух строк? В общем, есть ли какие-либо алгоритмы, которые делают это, что я мог бы реализовать (в Javascript)?
Возьмем, к примеру, следующая строка
Аномальные Эластичность монокристаллического Magnesiosiderite через спиновый переход в нижней мантии Земли
А также рассмотрим следующее, слегка скорректированы строка. Обратите внимание на выделенные жирным шрифтом части, которые отличаются
B НОРМАЛЬНО Эластичность Sin гле Cry СТАЛЬ Магне SIO-Sid erite через S пин-Tra nsition в Eart вс Нижняя Mant ле.
Собственные операторы равенства Javascript не расскажут вам о связи между этими строками. В этом конкретном случае вы можете сопоставлять строки, используя регулярное выражение, но в целом это работает только тогда, когда вы знаете, какие различия ожидать. Если входные строки являются случайными, общность этого подхода быстро разрушается.
подход ... я могу себе представить, писать алгоритм, который расщепляет до входной строки в произвольном количестве N
подстрок, а затем соответствие целевой строки со всеми этими подстроками, и используя количество матчей в качестве измерения идентичности. Но это похоже на непривлекательный подход, и я даже не хочу думать о том, насколько большой O будет зависеть от N
.
Мне кажется, что в таком алгоритме есть много свободных параметров. Например, независимо от чувствительности к регистру символов, должен вносить свой вклад в равной степени/больше/меньше для измерения, чем порядок-сохранение символов, кажется, произвольного выбора, чтобы дизайнер, то есть:
identicality("Abxy", "bAxy")
противidenticality("Abxy", "aBxy")
Определение требований к конкретному ... Первый пример - это сценарий, в котором я мог бы его использовать. Я загружаю кучу строк (заголовки научных статей), и я проверяю, есть ли у меня в моей базе данных. Тем не менее, источник может содержать опечатки, различия в соглашениях, ошибки, что угодно, что затрудняет сопоставление. Вероятно, есть более простой способ сопоставления названий в этом конкретном сценарии: поскольку вы можете ожидать, что может пойти не так, это позволяет вам записать некоторого зверя регулярного выражения.
просить библиотеки ВЗ. остальное очень интересно (для меня), вы можете взглянуть на расстояние Левенштейна (https://en.wikipedia.org/wiki/Levenshtein_distance). –
Интересно, я не знал об этом алгоритме. Я нашел реализацию javascript [здесь] (https://github.com/hiddentao/fast-levenshtein) –
, вы также должны попробовать найти самую длинную общую подпоследовательность. это то, что многие инструменты diff используют [link] (https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) – Dekay