Одно простое решение должно использовать скалярное произведение символьных n-граммных векторов. Это устойчиво по упорядочиванию изменений (который много метрик расстояния редактирования не), и получает много проблем вокруг стемминга. Это также предотвращает полную AI проблему полного семантического понимания.
Для вычисления n-граммного вектора просто выберите значение n (скажите, 3), и хешируйте каждую 3 последовательности слов во фразе в вектор. Нормализуйте вектор к единичной длине, затем возьмите скалярное произведение различных векторов для обнаружения подобия.
Этот подход был описан в Дж. Mitchell и M. Lapata, “Composition в Дистрибутивных Моделях Семантики, ” Когнитивистика, издание 34, № 8, стр 1388†“1429, ноябрь 2010., DOI 10.1111/j.1551-6709.2010.01106.x
Текст ниже взят из Comparator vs Comparable
Comparable
Сопоставимый объект может сравнивать себя с другим объектом. Сам класс должен реализовывать интерфейс java.lang.Comparable
, чтобы иметь возможность сравнивать его экземпляры.
Компаратор
Объект компаратора может сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов. Этот класс компаратора должен реализовывать интерфейс java.util.Comparator
.
Comparable позволяет классу реализовать собственное сравнение:
Для сравнения, Comparator - это внешнее сравнение:
. В обеих реализациях вы все равно можете выбрать то, что вы хотите сравнивать . С помощью дженериков вы можете объявить это и проверить это во время компиляции. Это повышает безопасность, но также сложно определить подходящее значение.
В качестве руководства я обычно использую наиболее общий класс или интерфейс, с которым можно было бы сравнивать этот объект, во всех возможных вариантах использования ... Не очень точное определение! : - (
Comparable
позволяет вам использовать его во всех кодах во время компиляции (что хорошо, если необходимо, или плохо, если нет, и вы теряете ошибку времени компиляции); ваша реализация должна справиться с объектами и преобразовывать их по мере необходимости, но надежным способом. Comparable
, напротив, очень строгий. Забавно, когда вы подклассифицируете себя к подклассу, подкласс также должен быть сопоставимым и надежным об этом (или это нарушит принцип Лискова и даст вам ошибки во время выполнения).
Comparable
предназначен для обеспечения упорядочения объектов данных по умолчанию, например, если объекты данных имеют естественный порядок.
A Comparator
представляет само упорядочение для специального использования.
Сопоставимый
обычно предпочтительнее. Но иногда класс уже реализует Comparable
, но вы хотите выполнить сортировку по другому свойству. Затем вы вынуждены использовать компаратор
.
Некоторые классы фактически предоставляют компараторы
для общих случаев; например, String
s по умолчанию чувствительны к регистру при сортировке, но есть также статический Comparator
с именем CASE_INSENSITIVE_ORDER
.
Comparable
предназначен для объектов с естественным упорядочением. Сам объект знает, как его следует упорядочить.
Компаратор
предназначен для объектов без естественного упорядочивания или когда вы хотите использовать другой порядок.
Реализация Comparable
означает « Я могу сравнить себя с другим объектом. » Это обычно полезно, когда есть одно естественное сравнение по умолчанию.
Реализация Comparator
означает « Я могу сравнить два других объекта. » Это обычно полезно, когда есть несколько способов сравнения двух экземпляров типа - например, вы можете сравнивать людей по возрасту, имени и т. д.