Мне сообщили, что расстояние Левенштейна симметрично. Когда я использовал инструмент diffMatchPatch Google, который вычисляет расстояние Левенштейна между прочим, результаты не подразумевают, что расстояние Левенштейна симметрично. т. е. Левенштейн (x1, x2) не равен Левенштейну (x2, x1). Является ли Levenshtein несимметричным или существует проблема с этой конкретной реализацией? Благодарю.Левенштейн расстояние симметричное?
ответ
Просто глядя на базовый алгоритм это, безусловно, является симметричным при той же стоимости для операций - количество добавлений, удалений и замен, чтобы получить от слова А к слову В то же самое, как получение от слова B к слову A.
Если существует какая-либо другая стоимость для любой из операций, может быть разница, например, если добавление имеет стоимость 2 и удаление стоимость 1, чтобы получить от Zombie
до Zombies
, результат на расстоянии 2, наоборот - 1 - несимметричный.
Да, расстояние levenshtein - это расстояние в собственном смысле, то есть dist(a,b)==dist(b,a)
является частью определения расстояния. Если функция не обладает этим свойством, это не функция расстояния. Это говорит о проблеме с этой реализацией.
Классический алгоритм Левенштейна является симметричным - то, что является вставкой, идущей от x1 до x2, является удалением, идущим от x2 до x1.
К сожалению, алгоритм O (длина (x1) * длина (x2)). После краткого взгляда на библиотеку google, кажется, он пытается несколько эвристик, чтобы гарантировать, что время выполнения не слишком велико. Я думаю, там лежит ваше несоответствие.
, пожалуйста, следуйте код, который implmented по myselef
общественного класса ReadTextFile {
static void readFile(String filepath){
CharSequence sequence1 = null;
CharSequence sequence2 = null;
int levenshteinDistance = 0;
String line1 = "";
String line2 = "";
int minLevenshteinDistance = -1;
try {
BufferedReader br = new BufferedReader(new FileReader(filepath));
String line = "";
while((line=br.readLine())!=null)
{
if(sequence1==null){
line = line.split(" ")[1];
sequence1 = line;
if((line=br.readLine())!=null){
line = line.split(" ")[1];
sequence2 = line;
}
}else{
sequence1 = sequence2;
line = line.split(" ")[1];
sequence2 = line;
}
if(null!=sequence1 && null!=sequence2){
levenshteinDistance = StringUtils.getLevenshteinDistance(sequence1,sequence2);
if(minLevenshteinDistance==-1){
minLevenshteinDistance = levenshteinDistance;
line1= sequence1.toString();
line2= sequence2.toString();
}else if(levenshteinDistance < minLevenshteinDistance){
minLevenshteinDistance = levenshteinDistance;
line1= sequence1.toString();
line2= sequence2.toString();
}
}
}
br.close();
System.out.println("line1 "+line1);
System.out.println("line2 "+line2);
System.out.println("minlevenshteinDistance "+minLevenshteinDistance);
}catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
- 1. полулокального расстояние Левенштейн
- 2. Обратный Левенштейн расстояние
- 3. Tail Рекурсивного Расстояние Левенштейн
- 4. Левенштейн расстояние в T-SQL
- 5. Левенштейн расстояние с скремблированием персонажей?
- 6. Дамерау-Левенштейн расстояние для слов
- 7. Левенштейн расстояние для неанглийских языков
- 8. Итерационная версии Damerau-Левенштейн расстояние
- 9. Кратчайшее расстояние Левенштейн? Нужно ли мне это?
- 10. Изменить Левенштейн-Расстояние до игнорирования порядка
- 11. Левенштейн расстояние, отдельно прослеживание вставки/удаления/замены
- 12. Дамеру-Левенштейн расстояние для специфических особенностей языка
- 13. Найти минимальный Левенштейн Расстояние между одним словом и массивом тысяч
- 14. Левенштейн DFA в .NET
- 15. Левенштейн вопросы
- 16. Дайеру-Левенштейн.
- 17. Swift Trie поиск Левенштейн
- 18. Левенштейн разделяет слишком много подстрок
- 19. Алгоритм для расстояния Левенштейн от многомерных строк
- 20. Excel vba Левенштейн Алгоритм
- 21. cheking on симметричное число
- 22. Симметричное шифрование: вопросы производительности
- 23. Симметричное шифрование с GMGME
- 24. Django симметричное отношение
- 25. Симметричное шифрование с NodeJS
- 26. симметричное дифференциальное равенство
- 27. Левенштейн сравнения строк без изменения числа
- 28. Детальное расстояние между словами
- 29. Левенштейн C# счетчик типа ошибки
- 30. Симметричное дешифрование возвращает значение NULL