| | | | |
Функция приблизительного/нечеткого сравнения строк | Полный текст материала
Другие публикации автора: Дмитрий Кузан
Цитата или краткий комментарий: «... о есть, например, в БД забито "Иванав Иван" - с ошибкой при наборе, а ищется "Иванов". Так вот, данный алгоритм пожет вам найти "Иванав" при вводе "Иванов",а также при "Иван Иванов" - даже наоборот с определенной степенью релеватности при сравнении. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 12 | 85.7% | | | | Ничего особенно нового и интересного | [2] | 1 | 7.1% | | | | Написано неверно (обязательно укажите почему) | [3] | 1 | 7.1% | | Всего проголосовали: 14 | | | Все понятно, материал читается легко | [1] | 6 | 75% | | | | Есть неясности в изложении | [2] | 1 | 12.5% | | | | Непонятно написано, трудно читается | [3] | 1 | 12.5% | | Всего проголосовали: 8 |
[Поиск и сортировка] [Функции для работы со строками ] [Нечеткое сравнение]
Отслеживать это обсуждение
Всего сообщений: 911-06-2004 12:47извиняюсь за неаккуратность
я использовал
function IndistinctMatchi при с=3 и это правильно работало, но функция то в общем виде, поэтому при с>3 верно
function RolevSerch(c: Integer;s1,s2:String): Integer;
Var i: Integer;
begin
Result:=0;
if(c<1)Or(Length(s1)=0)Or(Length(s2)=0)Or
(Length(s1)+Length(s2)+1-c<1) then Exit;
for i:= 1 to c do
Result:=Result+Serch(s1,s2,i)+Serch(s2,s1,i);
Result:=Trunc((Result/(c*(Length(s1)+Length(s2)+1-c)))*100)
end; |
|
08-06-2004 15:47Мне этот поиск помог, спасибо.
Тока, взял смелость откомпилировать код, чтоб работало по быстрее :).
function Matchi(s1,s2:String;c:Integer) :Integer;
Var i:Integer;
begin
Result:=0;
for i:= 1 To Length(s1)-c+1 do
if Pos(Copy(s1,i,c),s2)>0 then
Inc(Result);
end;
function IndistinctMatchi(c: Integer;s1,s2:String): Integer;
Var i: Integer
begin
Result:=0;
if (c=0)Or(Length(s1)=0)Or(Length(s2)=0) then Exit;
for i:= 1 to c do
Result:=Result+Matchi(s1,s2,i)+Matchi(s2,s1,i);
Result:=Trunc((Result/(c*(Length(s1)+Length(s2)+2-(c+1))))*100);
end; |
|
24-08-2003 02:19Similar и аналогичные имеются в hyperstr,достаточно известном наборе
средств работы со строками. Рекомендую всем. |
|
15-12-2002 06:40А зачем нужно
StrA := string(StrInputA);
StrB := string(StrInputB);
?
И почему, если это убрать,
поля записи TempRet вначале
уже имеют присвоеные значения,
не равные нулю? |
|
04-12-2002 13:34>>>Приведите, если не трудно. Только по возможности, с комментариями. |
|
04-12-2002 13:34>>>Приведите, если не трудно. Только по возможности, с комментариями. |
|
03-12-2002 11:21Данный алгоритм не совсем хорош. Не учитываются возможные разделители в строке, не учитывается регистр(иногда это нужно).
Я раньше писал подобную функцию, для сравнения двух строк.
Идея следующая:
1. Имеем две строки разной(одинаковой) длины
2. Вырезаем из первой (короткой) подстроки длиной от 3 символов до длины всей короткой строки(либо слова,ограниченного разделителем-пробелом или другим).
3.Ищем совпадение нашей вырезанной подстроки в эталонной строке(более длинной).Если есть , то коэффициент сравнения:=кооф.сравнения+длина подстроки*2^(длина подстроки-3). При этом можно учитывать и регистр, если подстрока первая.Если совпадает и регистр, то коэффициент:=коофициент+длина подстроки(или другое эмпирическое поправочное число).
4.Таким образом если коофициент>50-70%(зависит от длины строки) от эталонного коофициента - возможное совпадение. Эталонный коофициент - значение получаемое при совпадении всех подстрок в п.3.
|
|
03-12-2002 10:09>>>Если надо, код ее приведу здесь.
Лучше пришлите код с комментариями в адрес Королевства |
|
03-12-2002 07:29вот бы сравнить ее с
unit Similar_Types;
function Similar(const S1,S2 : AnsiString) : LongInt ;
неизвестного автора.
Если надо, код ее приведу здесь.
Там на ассемблере написаноСообщение не подписано |
|
|
|