Я хочу сравнить несколько строк друг с другом и найти наиболее похожие. Мне было интересно, есть ли какая-нибудь библиотека, метод или передовой опыт, которые вернут мне, какие строки больше похожи на другие строки. Например:
- «Лисица прыгнула» -> «Лиса прыгнула»
- «Лисица прыгнула» -> «Лисица»
Это сравнение покажет, что первое более похоже, чем второе.
Думаю, мне нужен какой-то метод, например:
double similarityIndex(String s1, String s2)
Есть где-нибудь такое?
РЕДАКТИРОВАТЬ: Почему я это делаю? Я пишу сценарий, который сравнивает вывод файла MS Project с выводом некоторой устаревшей системы, которая обрабатывает задачи. Поскольку в унаследованной системе ширина поля очень ограничена, при добавлении значений описания сокращаются. Мне нужен полуавтоматический способ найти, какие записи из MS Project похожи на записи в системе, чтобы я мог получить сгенерированные ключи. У него есть недостатки, так как его все еще нужно проверять вручную, но это сэкономит много работы.
источник
Обычный способ вычисления сходства между двумя строками по методу 0% -100% , который используется во многих библиотеках, - это измерить, насколько (в%) вам придется изменить более длинную строку, чтобы превратить ее в более короткую:
Вычисление
editDistance()
:Ожидается, что
editDistance()
приведенная выше функция вычислит расстояние редактирования между двумя строками. Есть несколько реализаций этого шага, каждая из которых может лучше соответствовать конкретному сценарию. Наиболее распространенным является алгоритм расстояния Левенштейна, и мы будем использовать его в нашем примере ниже (для очень больших строк другие алгоритмы, вероятно, будут работать лучше).Вот два варианта расчета расстояния редактирования:
apply(CharSequence left, CharSequence rightt)
Рабочий пример:
Смотрите онлайн-демонстрацию здесь.
Вывод:
источник
org.apache.commons.lang3.StringUtils
.Я перевел алгоритм расстояния Левенштейна на JavaScript:
источник
Вы можете использовать расстояние Левенштейна для вычисления разницы между двумя строками. http://en.wikipedia.org/wiki/Levenshtein_distance
источник
На самом деле существует множество мер схожести строк:
Вы можете найти объяснение и реализацию на языке Java здесь: https://github.com/tdebatty/java-string-similarity
источник
Вы можете добиться этого с помощью java-библиотеки apache commons . Взгляните на эти две функции в нем:
- getLevenshteinDistance
- getFuzzyDistance
источник
Теоретически вы можете сравнить расстояния редактирования .
источник
Обычно это делается с помощью меры расстояния редактирования . Поиск по запросу «редактировать расстояние java» обнаруживает несколько библиотек, например эту .
источник
Для меня это похоже на средство поиска плагиата , если ваша строка превращается в документ. Возможно, поиск по этому запросу даст что-то хорошее.
В «Программировании коллективного разума» есть глава, посвященная определению схожести двух документов. Код написан на Python, но он чист и легко переносится.
источник
Спасибо первому ответившему, думаю, есть 2 вычисления computeEditDistance (s1, s2). Из-за того, что на это уходит много времени, было решено улучшить производительность кода. Так:
источник
Вы также можете использовать алгоритм z, чтобы найти сходство в строке. Нажмите здесь https://teakrunch.com/2020/05/09/string-similarity-hackerrank-challenge/
источник