Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Перебор текста по словарю   Найти похожие ветки 

 
_mik ©   (2006-07-19 19:09) [40]

фактически шаблон выглядит так
"$*слово*"
причем обобщающих символов может и не быть
например:
"*слово"
или  
"$слово*"
"$слово"
"слово"
"$*слово"
ну и тп.

где символ $ означает сравнение с учетом регистра,
да и еще "*" могут распологатся только в начале, либо в конце слова!


 
Pavia ©   (2006-07-19 19:55) [41]

Нет проблем ты когда строку разбираешь на слова. Ты затем будешь перебирать все варианты слова, которые можешь составить из данного слова путем удоления нескольких символов с начала или с конца. N*(N-1)/2 вариантов.
И еще совет откажись от класса TStringList.


 
Romkin_   (2006-07-19 20:16) [42]

Pavia ©   (19.07.06 19:55) [41] Обычно, когда говорят "откажись", указывают альтернативу ;)
_mik ©   (19.07.06 19:09) [40] Так * - это начало слова? Или текста?
почему нельзя вместо * ставить пробел?
Если убрать *, то у тебя словарь распадается на три, префиксов, суффиксов и подстановок слов?


 
_mik ©   (2006-07-19 20:44) [43]

звездочка означает любое количество символов перед или после слова
в зависимости от того где стоит,
если ее нет, то
значит слово в словаре должно полностью соответствовать слову в тексте!


 
_mik ©   (2006-07-19 20:45) [44]


> Нет проблем ты когда строку разбираешь на слова. Ты затем
> будешь перебирать все варианты слова, которые можешь составить
> из данного слова путем удоления нескольких символов с начала
> или с конца. N*(N-1)/2 вариантов.
> И еще совет откажись от класса TStringList.


а как же быть когда в словаре есть слово с двумя "*" в начале и в конце?


 
Ketmar ©   (2006-07-19 22:12) [45]

>_mik ©   (19.07.06 19:09) [40]
простейший фильтр.


 
Pavia ©   (2006-07-19 23:38) [46]

А что с * звездочками? А я про что говорил.
Вот перебор.
function strings(s:string):string;
var i,j:Integer;
ss,ss1,ss2,ss3:string;
begin
result:="";
For i:=Length(s) downto 1 do
For j:=1 to Length(s)-i+1 do
 begin
 ss:=copy(s,j,i);
 ss2:=Find(ss);
 if ss2<>"" then
   ss2:=Find("*"+ss);
 if ss2<>"" then
   ss2:=Find(ss+"*");
 if ss2<>"" then
   ss2:=Find("*"+ss+"*");
 if ss2<>"" then
   ss2:=Find("$*"+ss);
 if ss2<>"" then
   ss2:=Find("$"+ss+"*");
 if ss2<>"" then
   ss2:=Find("$*"+ss+"*");
 if ss2<>"" then
  begin
  if copy(s,1,j-1)="" then ss1:=""
   else ss1:=strings(copy(s,1,j-1));
  if copy(s,j+i,Length(s)-j-i+1)="" then ss2:=""
   else  ss3:=strings(copy(s,j+i,Length(s)-j-i+1));
  result:=ss1+ ss2+ss3;
  exit;
  end;
 end;
end;
Find(ss)- поиск строки, я бы сделал через хэш таблицы.
И еще совет откажись от класса TStringList.
Медленный класс. Я бы просто использовалбы строку или строки.


 
Romkin ©   (2006-07-20 11:47) [47]

_mik ©   (19.07.06 20:44) [43] Я правильно понял - если звездочки, то это часть слова, а если нет - слово целиком на замену?
То есть, звездочка означает ограничение буквами, ее отсутствие - ограничение разделителями (пробел, запятая и тд)?
Тогда ведь можно обобщить, заменить все разделители слов на пробел, а в словаре избавится от звездочек, присоединив к словам без звездочки пробелы. То есть "АБ" переходит в " АБ ", а "*АБ*" переходит в "АБ"?


 
_mik ©   (2006-07-20 12:12) [48]

Ты не совсем правильно понял >Romkin!
да "*АБ*" означает часть слова содержащего "АБ", причем "АБ" должно быть ограничено буквами, а если звездочек не то разделителями!
Но удалять разделители я не могу, это приведет к потери части смысла текста!
(Яже пишу программу озвучивания текста)


 
_mik ©   (2006-07-20 12:16) [49]

>Pavia Спасибо!
Но насколько японял, твой алгоритм онтносится примерно к O(n^2) при больших значениях!
А это я думаю врятли допустимо!
Поскольку в словаре слов со звеждочкой может быть порядка ~700-1000!
Это приведет к сильному падению быстродействия!

Я когда пытался это реализовать собственными силами делал примерно тже самое!

Хотя я попробую, наверное вечером отпишусь!


 
Romkin ©   (2006-07-20 12:26) [50]

_mik ©   (20.07.06 12:12) [48] А никто не заставляет тебя удалять их совсем. Только на вход словаря подавай с заменой. А после замены - присоединяй. Или знаки препинания тоже преобразуются?
Вообще говоря, какой объем словаря? Можешь согласится с увеличением этого объема раз в 5-10? Если использовать дерево, то можно достичь примерно O(NlogM) по моей первой прикидке, где N - число символов текста, M - число слов в словаре... (или символов? - с утра плохо думается) Или не так, но блиизко. Но за счет объема


 
_mik ©   (2006-07-20 14:22) [51]

Спасибо за советы!
Но для деревьев я пока еще мал!
Я только начинаю вникать в основные концепции!
и некоторы вещи мне сложновато понять!

я опробовал процедуру Pavia и она дола приемлемое быстродейстиве!

PS если когото интересует компонент для подключения TTS движка на основе SAPI 4 то могу скинуть на почту!

PPS о всех результатах дольнейшей работы буду сообщать сдесь!


 
atruhin ©   (2006-07-20 16:08) [52]

Вообще эта задача описана: Бакнел. "Фундаментальные алгоритмы и структуры данных в Delphi" последняя глава, сравнение текстовых файлов.
PS. Можно найти в сети.


 
_mik ©   (2006-07-20 18:09) [53]

я этоу книжку уже нашел!
сейчас дочитываю!
СПАСИБО!



Страницы: 1 2 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.06 c
2-1155646273
AlexanderMS
2006-08-15 16:51
2006.09.03
Как создать эффект нажатия левой кнопки мыши в ListBox?


2-1155281729
alles
2006-08-11 11:35
2006.09.03
Как прочитать картинку GIF из DLL?


15-1155197903
worldmen
2006-08-10 12:18
2006.09.03
Стандарты "MiniDV" и "DVD" и их отличия. Цифровые камеры.


2-1155553476
ArtemESC
2006-08-14 15:04
2006.09.03
Как убрать Beep при Application.MessageBox...


15-1154952780
ПЛОВ
2006-08-07 16:13
2006.09.03
Проблемы с сервисом