Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2008, 09:22   #1
PUH
Пользователь
 
Регистрация: 21.02.2008
Сообщений: 35
По умолчанию Сравнение текстов на схожесть

Как то давно, я писал софт для релевантного сравнения строк.
На входе - 2 строки. На выходе - % схожести.

Сейчас нужно написать софтину для сравнения 2-х текстовых файлов по тому же принципу. Помогите, пожалуйста! У кого какие идеи?
PUH вне форума Ответить с цитированием
Старый 21.02.2008, 09:40   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Раз вы писал алгоритм рассчета релевантности на примере двух строк, что же вам мешает его применить к файлам ?
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 21.02.2008, 10:04   #3
PUH
Пользователь
 
Регистрация: 21.02.2008
Сообщений: 35
По умолчанию

Алгоритм то писался... Но для целых файлов слишком неточен(
PUH вне форума Ответить с цитированием
Старый 21.02.2008, 10:28   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В чем же неточность?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.02.2008, 11:49   #5
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от PUH Посмотреть сообщение
Как то давно, я писал софт для релевантного сравнения строк.
На входе - 2 строки. На выходе - % схожести.

Сейчас нужно написать софтину для сравнения 2-х текстовых файлов по тому же принципу. Помогите, пожалуйста! У кого какие идеи?
откріваешь файлы (AssignFile) ищешь пробелы, символ конца строки(#13) перевода каретки (#10).... А там уже применяй свой алгоритм... Нужно,наверное, первое слово первого файла сравнивать со всеми словами 2-го файла... Потому-что слова могут біть раскидані по файлу.... А принцип оценки схожести файлов - єто сами решайте....
А можно полностью строку считівать и потом сравнивать..(TstringList)Тоесть тут Вам самим нужно определиться,что ві хотите получить
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 21.02.2008 в 11:55.
Pitbull вне форума Ответить с цитированием
Старый 21.02.2008, 11:54   #6
PUH
Пользователь
 
Регистрация: 21.02.2008
Сообщений: 35
По умолчанию

на выходе - тупо процент схожести.
дело в том что алгоритм, который я нашел, нечеткого сравнения строк, анализировал 2 статьи по 1000 символов 5 минут...
Вот думаю, что делать?..
PUH вне форума Ответить с цитированием
Старый 21.02.2008, 11:56   #7
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от PUH Посмотреть сообщение
на выходе - тупо процент схожести.
дело в том что алгоритм, который я нашел, нечеткого сравнения строк, анализировал 2 статьи по 1000 символов 5 минут...
Вот думаю, что делать?..
алгоритм в студию
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 21.02.2008, 22:18   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Функция нечеткого сравнения строк БЕЗ УЧЕТА РЕГИСТРА :

Код:
//------------------------------------------------------------------------------
//MaxMatching - максимальная длина подстроки (достаточно 3-4)
//strInputMatching - сравниваемая строка
//strInputStandart - строка-образец

// Сравнивание без учета регистра
// if IndistinctMatching(4, "поисковая строка", "оригинальная строка  - эталон") > 40 then ...
type
  TRetCount = packed record
    lngSubRows: Word;
    lngCountLike: Word;
  end;

//------------------------------------------------------------------------------

function Matching(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

  Matching.lngCountLike := TempRet.lngCountLike;
  Matching.lngSubRows := TempRet.lngSubRows;
end; { function }

//------------------------------------------------------------------------------

function IndistinctMatching(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
    IndistinctMatching := 0;
    exit;
  end;

  gret.lngCountLike := 0;
  gret.lngSubRows := 0;
    // Цикл прохода по длине сравниваемой фразы
  for lngCurLen := 1 to MaxMatching do
  begin
        //Сравниваем строку A со строкой B
    tret := Matching(strInputMatching, strInputStandart, lngCurLen);
    gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
    gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
        //Сравниваем строку B со строкой A
    tret := Matching(strInputStandart, strInputMatching, lngCurLen);
    gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
    gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
  end;

  if gret.lngSubRows = 0 then
  begin
    IndistinctMatching := 0;
    exit;
  end;

  IndistinctMatching := Trunc((gret.lngCountLike / gret.lngSubRows) * 100);
end;
___________________________________ _________
Из DelphiWorld ...%
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оцените PGF-улучшенный форматизатор исходных текстов Pascal + Delphi программ. Sasvi Софт 5 18.10.2008 01:26
Сравнение макросов valerij Microsoft Office Excel 24 09.06.2008 00:57
сравнение дат Geddar Общие вопросы Delphi 2 04.06.2008 19:09