2013-09-04 3 views
6

У меня есть таблица продуктов SQL Server, и каждый продукт имеет описание, которое доступно на нашем сайте. Я хочу предотвратить или, по крайней мере, предупредить наших пользователей, когда описание слишком похоже на описание другого продукта. Длина описания каждого продукта может сильно различаться.SQL - сходство между двумя строками переменной длины

Я хотел бы запросить продукты с описаниями, которые включают в себя дубликаты/аналогичные абзацы/блоки текста между собой. т.е. Строка имеет кучу уникального контента, но разделяет подобный/идентичный пункт ж/строки B. Однако, я не уверен, схожесть алгоритм лучше всего использовать: появляются

  • В Levenshtein distance и Jaro-Winler distance алгоритмов чтобы хорошо работать только с короткими струнами.

  • Я не уверен, что longest common subsequence algorithm учитывает большие различия очень хорошо. то есть он, как представляется, игнорирует потенциальное пространство между двумя символами, нахожу любую подобную комбинационную последовательность.

Fuzzy hashing рода звуков, что я ищу, но я не только ищет дублировать содержание ж/тонкие различия. Я также ищет дублирующийся контент w/тонкие различия, введенные в уникальном блоке текста. И я понятия не имел, как реализовать нечеткие хэши в SQL. SOUNDEX() и DIFFERENCE(), похоже, используют нечеткое хеширование, но для моего варианта использования довольно неточны.

В идеале функция SQL сходства была бы быстрой, но я мог бы хранить значения кеширования в другой таблице и планировать задание, которое иногда обновляется.

Какова наилучшая реализация алгоритма/SQL (или интеграция CLR) для достижения этой цели?

+0

Почему вы ограничиваете себя внедрением этого в SQL? –

+0

Ну, я полагаю, это не обязательно в SQL. Тем не менее, я предполагаю, что чистая реализация SQL будет более эффективной. Я мог бы использовать интеграцию .NET CLR, например [эту библиотеку сходства] (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- mds /) ... но у меня нет опыта интеграции с SQL Server CLR, и я до сих пор не знаю, какой алгоритм использовать. –

+0

Одна вещь, которую вы могли бы попробовать, - взять строку и рассмотреть только экземпляры определенных букв, а затем Levenshtein те строки.Например, возьмите текст, подобный «Lorem ipsum dolor sit amet», и рассмотрите только примеры e и t. Результирующей строкой будет etet, который вы могли бы использовать Levenshtein для другой отфильтрованной строки. Очевидно, требует некоторой настройки, но, надеюсь, вы получите эту идею. – kevmo314

ответ

2

Мне не так недавно пришлось присоединиться к именам групп по нечеткой последовательности.
Я пробовал около 40 различных алгоритмов, но ни один из них не был достаточно хорош для этого, хотя записи в группах писали только разные орфографические ошибки, отсутствующие пробелы и иногда добавляемые _mLF в конце.

Итак, если вы попытаетесь сделать подобное, я настоятельно рекомендую вам остановиться прямо сейчас и отправить данные (в моем случае Excel-файл) обратно пользователям для исправления, где они принадлежат.

Если вы действительно просто заинтересованы в сравнении строк, эта ссылка может быть только то, что вам нужно:
http://anastasiosyal.com/POST/2009/01/11/18.ASPX

Я нашел Яро-Винклер работать, чтобы получить лучшие результаты в моем случае, но вы можете испытайте это для себя.

+0

Да, в идеале я бы сказал пользователям прекратить ввод повторяющегося текста. Но некоторые будут продолжать делать это в любом случае ... Мне нужно иметь возможность ретроактивно обнаруживать, когда контент дублируется/аналогичен. Эта статья определенно помогает. –

+1

Я также нашел, что этот алгоритм нечеткого поиска достаточно эффективен: https://sites.google.com/site/sqlblindman/fuzzysearchalgorithm –

Смежные вопросы