Подтвердить что ты не робот

Согласование приблизительной строки в хранилище основных данных

У меня небольшая проблема с основным приложением данных, которое я сейчас пишу. У меня две разные модели, контексты и постоянные магазины. Один для моих данных приложения, другой для веб-сайта с соответствующей информацией для меня.

В большинстве случаев я сопоставляю ровно одну запись из своего приложения с другой записью из другого источника. Иногда, однако, я должен вернуться к нечеткой строке, чтобы связать две записи. Я пытаюсь соответствовать названиям песен. Мой локальный заголовок может быть (составлен) "The French Idealist is in your pensée", а название удаленной песни может быть "01 - 10 - French idealist in in you're pensee, The (dub remix, feat. DJ Objective-C)"

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

Regexp не будет делать, ни NSPredicates, Soundex не будет работать с иностранными именами, и, может быть, Levenshtein будет недостаточно (или будет?).

Я ищу заголовок в наборе из примерно дюжины потенциальных матчей, но мне очень сложно сделать эту операцию. 100% точность не является целью.

Я думал об удалении игнорируемых слов, извлечении ключевых слов (в этом примере, "французский, идеалист, pensée" ), объединить их, а затем использовать расстояние Левенштейна (слова в названии песни должны быть в том же порядке),

В моем специальном случае это сработает? Что такое отраслевой стандарт в отношении этой проблемы (я не могу быть единственным в мире, который хочет сопоставить несколько разных имен песен) Может ли Core Core Data, cocoa или Objective-C помочь мне?

Большое спасибо.

4b9b3361

Ответ 1

Вы хотите, чтобы ваш поиск был диакритическим нечувствительным, чтобы соответствовать "é" в pensée и "e" в pensee. Вы получите это, добавив [d] после атрибута. Вот так:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@)", yourSongSubstring];
"c" в [cd] - для нечувствительности к регистру.

Поскольку ваша строка может отображаться в любом порядке в строке, которую вы ищете, вы можете подделать свою строку поиска ([... componentsByString: @""]), а затем создать предикат типа

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@) and (songTitle like[cd] %@)", songToken1, songToken2];
Этот синтаксис для объединения предикатов выше может быть выключен, переходя из памяти.

Ответ 2

Я считаю, что инструмент, который вы хотите использовать здесь, SearchKit. Я говорю, что, как будто я просто упростил вашу работу... У меня нет, но у нее должны быть инструменты, необходимые для успеха здесь. LNC по-прежнему предлагает свои SearchKit Podcast бесплатно (очень приятно).

Каждый трек будет документом в этом случае, и вам нужно будет найти хороший способ индексировать их с помощью идентификатора, который может быть использован для их поиска. Затем вы можете загружать их метаданными и искать их. Возможно, создание заголовка "в документе" было бы полезно здесь, чтобы облегчить использование поиска подобия (kSKSearchOptionFindSimilar). Это может работать или не работать очень хорошо.

Вопрос, который вы задали, является хорошим, но для него, безусловно, нет отраслевого стандарта, потому что любой, кто хорошо решает эту проблему (т.е. каждая крупная поисковая система), сохраняет свои алгоритмы очень секретными. Это сложная проблема; никто не готов отдать свой ответ.

Ответ 3

Рассмотрим q-граммы, которые являются подстроками длины q (Gravano et al., 2001).

Вы можете для двух строк s1 и s2 определить для каждого q-грамма s1 соответствующий q-грамм s2 с наименьшим расстоянием редактирования. Затем добавьте все эти расстояния, и вы получите метрику, которая очень надежна для перестановки слов и дополнительных символов.

Как правило, q следует адаптировать к вашей проблемной области (эксперимент с q = 3, 4, 5...).