Самое близкое соответствие для Полнотекстового поиска

Насколько я понимаю, нет способа сделать это без утверждений типа. Документы для гибридных типов также используют его таким образом, например

interface Counter {
    (start: number): string;
    interval: number;
    reset(): void;
}

function getCounter(): Counter {
    let counter = function (start: number) { };
    counter.interval = 123;
    counter.reset = function () { };
    return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;

5
задан ak3nat0n 15 January 2009 в 22:18
поделиться

4 ответа

Вы могли использовать алгоритм для определения строкового подобия и затем предложить другую строку от Вашего поискового индекса до определенного различия.

Один из этих алгоритмов является расстоянием Левенштейна.

Однако не забывайте искать существующие решения. Я думаю, например, Lucene имеет возможность искать подобные строки.

Btw, вот связанное сообщение по этой теме: Как алгоритм Google “Did you mean?” работает?

4
ответ дан 14 December 2019 в 13:49
поделиться

Это сделано, запросив через регулярное выражение самые близкие ключевые слова, которые соответствуют фразе.

Вот большая статья, которая могла бы помочь Вам.

2
ответ дан 14 December 2019 в 13:49
поделиться

С T-SQL можно использовать SOUNDEX функция для сравнения слов фонетически.

Если Вы берете пользовательский вход и затем сравниваете его с другими словами в Вашей базе данных кодом soundex, необходимо ли смочь придумать список 'Вас, означают'? слова.

Например.

select SOUNDEX('andrew')
select SOUNDEX('androo')

оба произведет тот же вывод (A536).

В эти дни существуют лучшие алгоритмы, но soundex встроен в SQL-сервер.

0
ответ дан 14 December 2019 в 13:49
поделиться

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

Я сделал это с методом ветвей и границ. Позвольте мне вскопать код:

bool matchWithinBound(char* a, char* b, int bound){
  // skip over matching characters
  while(*a && *b && *a == *b){a++; b++;}
  if (*a==0 && *b==0) return true;
  // if bound too low, quit
  if (bound <= 0) return false;
  // try assuming a has an extra character
  if (*a && matchWithinBound(a+1, b, bound-1)) return true;
  // try assuming a had a letter deleted
  if (*b && matchWithinBound(a, b+1, bound-1)) return true;
  // try assuming a had a letter replaced
  if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
  // try assuming a had two adjacent letters swapped
  if (a[0] && a[1]){
    char temp;
    int success;
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    success = matchWithinBounds(a, b, bound-1);
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    if (success) return true;
  }
  // can try other modifications
  return false;
}

int DistanceBetweenWords(char* a, char* b){
  int bound = 0;
  for (bound = 0; bound < 10; bound++){
    if (matchWithinBounds(a, b, bound)) return bound;
  }
  return 1000;
}
0
ответ дан 14 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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