Как найти лучшее нечеткое соответствие для строки в большой строковой базе данных

Поскольку закрытие XY не включает в себя все атрибуты отношения, оно не может быть ключом-кандидатом. Ключ-кандидат - это минимальное количество атрибутов, которые можно использовать для уникальной идентификации кортежа. Закрытие XY будет включать только X и Y.

20
задан guillermooo 21 November 2008 в 17:02
поделиться

6 ответов

Если Ваша поддержка БД это, необходимо использовать полнотекстовый поиск. Иначе можно использовать индексатор как lucene и его различные реализации.

1
ответ дан 30 November 2019 в 01:33
поделиться

Данная статья, кажется, описывает точно, что Вы хотите.

Lucene ( http://lucene.apache.org/ ) также реализует расстояние редактирования Levenshtein.

5
ответ дан 30 November 2019 в 01:33
поделиться

Вычислите хеш SOUNDEX (который встроен во многие механизмы базы данных SQL), и индекс им.

SOUNDEX является хешем на основе звука слов, таким образом, орфографические ошибки того же слова, вероятно, будут иметь тот же хеш SOUNDEX.

Затем находят хеш SOUNDEX строки поиска и соответствие на нем.

0
ответ дан 30 November 2019 в 01:33
поделиться

Вы не упоминали свою систему баз данных, но для PostrgreSQL Вы могли использовать следующий contrib модуль: trgm - Триграмма, соответствующая для PostgreSQL

, pg_trgm contrib модуль обеспечивает функции и индексные классы для определения подобия текста на основе триграммного соответствия.

2
ответ дан 30 November 2019 в 01:33
поделиться

Так как объем данных является большим при вставке записи, я вычислил бы и сохранил бы значение фонетического алгоритма в индексированном столбце и затем ограничил бы (оператор Where) свои запросы Select в диапазоне на том столбце.

0
ответ дан 30 November 2019 в 01:33
поделиться

XHTML MP 1.2 DTD является текущей рекомендацией, доработанной в марте 2008 года.

Источник:

http://en.wikipedia.org/wiki/XHTML_Mobile_Profile

-121--1628879-

Этот жадный алгоритм производит довольно короткие минимальные последовательности.

UPDATE: Обратите внимание, что для n ≥ 6 этот алгоритм не создает максимально короткую строку!

  • Составить совокупность всех перестановок.
  • Удалите первую перестановку из коллекции.
  • Пусть a = первая перестановка.
  • Найдите последовательность в коллекции, которая имеет наибольшее перекрытие с концом a . При наличии галстука выберите последовательность сначала в лексикографическом порядке. Удалите выбранную последовательность из коллекции и добавьте неперекрывающуюся деталь в конец a . Повторяйте этот шаг до тех пор, пока коллекция не будет пуста.

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

Я подтвердил (написав гораздо более длинную, более медленную программу), что ответ, который этот алгоритм дает для длины 4, 123412314231243121342132413214321 действительно является самым коротким ответом. Однако для длины 6 он дает ответ длиной 873, которая длиннее, чем самое короткое известное решение.

Алгоритм O ( n ! 2).

Реализация в Python:

import itertools

def costToAdd(a, b):
    for i in range(1, len(b)):
        if a.endswith(b[:-i]):
            return i
    return len(b)

def stringContainingAllPermutationsOf(s):
    perms = set(''.join(tpl) for tpl in itertools.permutations(s))
    perms.remove(s)
    a = s
    while perms:
        cost, next = min((costToAdd(a, x), x) for x in perms)
        perms.remove(next)
        a += next[-cost:]
    return a

Длина строк, генерируемых этой функцией, равна 1, 3, 9, 33, 153, 873, 5913,... которая является этой целочисленной последовательностью .

У меня есть предчувствие, что вы можете сделать лучше, чем O ( n ! 2).

-121--3140546-

Очень подробное объяснение соответствующих алгоритмов содержится в книге Алгоритмы на струнах, деревьях и последовательностях: информатика и вычислительная биология Дэна Гусфилда .

0
ответ дан 30 November 2019 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: