|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Алгоритм нечёткого поиска
Я делаю чатбота. Мне нужен быстрый алгоритм нечёткого поиска строк в базе знаний.
|
#2
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#3
|
|||
|
|||
Не, рендомный мне не нужен. У меня уже готовый бот есть, только алгоритм нечёткого сравнения фраз у него плохой.
|
#4
|
||||
|
||||
Вот подгонял под себя, но думаю подойдет...
Код:
//********************************************************* //Функция нечеткого сравнения строк //------------------------------------------------------------------------------ //MaxMatching - максимальная длина подстроки (достаточно 3-4) //strInputMatching - сравниваемая строка //strInputStandart - строка-образец // Сравнивание без учета регистра // if IndistinctMatching(4, "поисковая строка", "оригинальная строка - эталон") > 40 then ... //------------------------------------------------------------------------------ function TParser.pMatching(StrInputA: WideString;StrInputB: WideString;lngLen: Integer) : TRetCount; Var TempRet : TRetCount; PosStrB : Integer; PosStrA : Integer; StrA : WideString; StrB : WideString; StrTempA : WideString; StrTempB : WideString; begin StrA := String(StrInputA); StrB := String(StrInputB); For PosStrA:= 1 To Length(strA) - lngLen + 1 do begin StrTempA:= System.Copy(strA, PosStrA, lngLen); //PosStrB:= 1; For PosStrB:= 1 To Length(strB) - lngLen + 1 do begin StrTempB:= System.Copy(strB, PosStrB, lngLen); If SysUtils.AnsiCompareText(StrTempA,StrTempB) = 0 Then begin Inc(TempRet.lngCountLike); break; end; end; Inc(TempRet.lngSubRows); end; // PosStrA pMatching.lngCountLike:= TempRet.lngCountLike; pMatching.lngSubRows := TempRet.lngSubRows; end; //------------------------------------------------------------------------------ function TParser.pIndistinctMatching(MaxMatching: Integer; strInputMatching: WideString; strInputStandart: WideString): Integer; Var gret : TRetCount; tret : TRetCount; lngCurLen: Integer ; //текущая длина подстроки begin //если не передан какой-либо параметр, то выход If (MaxMatching = 0) Or (Length(strInputMatching) = 0) Or (Length(strInputStandart) = 0) Then begin pIndistinctMatching:= 0; exit; end; gret.lngCountLike:= 0; gret.lngSubRows := 0; // Цикл прохода по длине сравниваемой фразы For lngCurLen:= 1 To MaxMatching do begin //Сравниваем строку A со строкой B tret:= pMatching(strInputMatching, strInputStandart, lngCurLen); gret.lngCountLike := gret.lngCountLike + tret.lngCountLike; gret.lngSubRows := gret.lngSubRows + tret.lngSubRows; //Сравниваем строку B со строкой A tret:= pMatching(strInputStandart, strInputMatching, lngCurLen); gret.lngCountLike := gret.lngCountLike + tret.lngCountLike; gret.lngSubRows := gret.lngSubRows + tret.lngSubRows; end; If gret.lngSubRows = 0 Then begin pIndistinctMatching:= 0; exit; end; pIndistinctMatching:= Trunc((gret.lngCountLike / gret.lngSubRows) * 100); end; В начале был Бит, потом Байт и только потом появилось Слово... |
#5
|
|||
|
|||
Этот алгоритм я уже пробовал прикрутить - но при базе данных в 800 КБ и входного сообщения в 8 символов обработка идёт примерно 55 секунд, и с увеличением размера входного сообщения время обработки увеличивается в несколько раз.
|
#6
|
||||
|
||||
Немного инфы...
Цитата:
В начале был Бит, потом Байт и только потом появилось Слово... |
#7
|
|||
|
|||
Второй алгоритм при поиске тоже медленно работает...
|