Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция поиска предложений 
:(
    Опции темы
DYUMON
Дата 14.10.2010, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 17.6.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Доброго всем времени суток.   есть ли функци для определения  содержание группы слов в тексте.  я делаю анализатор прайсов и там разные прайсы содержащие позиции которые могут быть по разному записаны. конечно можно сделать базу кодов и по ним искать но это займет много времени.  на данный момент у меня такая функция 
Код

function TForm1.poisk(s, s1: string): boolean;
var
i:integer;
list:Tstringlist;
n:integer;
begin
list:=Tstringlist.Create;
n:=0;
   while pos(' ',s)<>0 do begin
          list.Add(copy(s,1,pos(' ',s)-1));
          delete(s,1,pos(' ',s));
   end;
for i:=0 to list.Count-1 do
begin
if pos(list.Strings[i], s1)<>0 then inc(n);

end;
 if n>=2 then result:=true else result:=false;
 list.Free;

думаю добавить сюда еще плавающую величину точности которая будет определятс количетвом слов в строке которую ищут.
но может есть более эффективные алгоритмы поиска?


--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
Frees
Дата 14.10.2010, 08:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



попробуй почитать про полнотекстовый поиск и релевантность


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
chip_and_dayl
Дата 14.10.2010, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: 1
Всего: 9



Можно все реализовать через регулярные выражения

Добавлено @ 08:49
А вообще, было бы хорошо, если глянуть на два разных прайса, чтобы понять на сколько в них разница и как будет лучше анализировать. Ну и уточнить, что нужно с прайса выдергивать

Это сообщение отредактировал(а) chip_and_dayl - 14.10.2010, 08:50


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Akella
Дата 14.10.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(DYUMON @  14.10.2010,  08:15 Найти цитируемый пост)
есть ли функци для определения  содержание группы слов в тексте


Цитата(chip_and_dayl @  14.10.2010,  08:48 Найти цитируемый пост)
Можно все реализовать через регулярные выражения


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

http://www.google.com/search?q=sphinx+delp...=ru&prmd=iv
http://www.sql.ru/forum/actualthread.aspx?...784449&pg=1
PM MAIL   Вверх
DYUMON
Дата 14.10.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 17.6.2006
Где: Новосибирск

Репутация: нет
Всего: 3



вот смотрите есть искомая позиция  "Артроцин тб 1,6г N36" в другом прайсе она записана как "АРТРОЦИН ТАБ. №36"  или "Артроцин таб 1,6г х 36 БАД"  я думаю сделать поуровневый поиск . допустим сначало ищем "артроцин" если нашли то проверяем на наличие  "1,6"  и "36"


--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
Frees
Дата 14.10.2010, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



это так тебе для каждой позиции такие правила прописывать прейдется. что сперва искать что потом.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
DYUMON
Дата 14.10.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 17.6.2006
Где: Новосибирск

Репутация: нет
Всего: 3



да это проще мне надо то 70 позиций smile и есть кого позадить за обработку поисковых слов . конечно как вариант можно перегнать теже прайсы в sql и делать поиск оператором like %% но это лишние хлопоты


--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
RomanEEP
Дата 14.10.2010, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



В инете когда-то нашел такую функцию, которая неплохо работает для нечеткого поиска:
Код

function 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 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;

Использование:
Код

Match := PIndistinctMatching(4, SearchStr, CurText);
if Match > 20 then
 ...

где 4, 20 - экспериментальные коэффициенты в зависимости от нужд

Это сообщение отредактировал(а) RomanEEP - 14.10.2010, 10:43
PM MAIL   Вверх
DYUMON
Дата 14.10.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 17.6.2006
Где: Новосибирск

Репутация: нет
Всего: 3




RomanEEP, 
забыл приписать 
Код

  type
  TRetCount = packed record
    lngSubRows: Word;
    lngCountLike: Word;
  end;



--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
Akella
Дата 15.10.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(DYUMON @  14.10.2010,  09:40 Найти цитируемый пост)
вот смотрите есть искомая позиция  "Артроцин тб 1,6г N36" в другом прайсе она записана как "АРТРОЦИН ТАБ. №36"  или "Артроцин таб 1,6г х 36 БАД"

Я в своей программе обработки прайсов сделал так: при загрузке прайса из экселя я создавал таблицу групп. В эту таблицу попали все первые слова названия. Т.е. примерный вид таблицы был таков:

Цитата

Анальгин
Артроцин
Аспирин
Барбовал
...
...
...

Теперь пользователь может выбрать, что именно его интересует. Например, он выбрал тот же Артроцин и рядом, в другой таблице программа ему показывает все Артроцины.

Программу писал очень давно. Это была моя одна из самый первых программ по обработке аптечных прайсов. Если есть желание, то могу отправить исходники. Но предупреждаю, что прога старенькая + работает с использованием BDE.
Если её возродить и переписать под, например, Firebird, то было бы здорово. Раскрутить, выложить на сайт и ну получать небольшой профит smile

Добавлено через 56 секунд
Хотя программа до сих работает у заказчика и он не хочет от неё отказыватся smile
PM MAIL   Вверх
cat512
Дата 15.10.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Смотри в сторону алгоритма  дистанции Ливенштейна
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.