Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
_mik ©   (2006-07-14 22:18) [0]

Сдравствуйте!

Как можно организовать  быстрый перебор теста по словарю!

Причем словарь имеет довольно большой размер ~35000 слов и словосочетаний!, причем синтаксис словаря такой:
[$][*][слово][*]=[чему то]
где
$ -  учитывать ли индекс;
* - любое кол-во символов;


 
Leonid Troyanovsky ©   (2006-07-14 22:34) [1]


> _mik ©   (14.07.06 22:18)  
> Сдравствуйте!


И тебе тогож.

> Как можно организовать  быстрый перебор теста по словарю!

MSSQL.

> [$][*][слово][*]=[чему то]

Плиз, подробней, про [чему то].

--
Regards, LVT.


 
Gero ©   (2006-07-15 00:14) [2]

Последовательным перебором и проверкой каждой строки на соответствие шаблону.


 
Servelat ©   (2006-07-15 01:40) [3]

> Плиз, подробней, про [чему то].

подозреваю, что что-то - это перевод слова, если словарь иностранного языка =).


> перебор теста

какого такого теста?


 
Leonid Troyanovsky ©   (2006-07-15 01:45) [4]


> rvelat ©   (15.07.06 01:40) [3]

> перебор теста

> какого такого теста?


Ну, хоть какого-нибудь.

--
Regards, LVT.


 
Pavia ©   (2006-07-15 15:32) [5]

Я бы помог автору если понял, что нужно.

> перебор теста по словарю!

Что сие значит? Найти слово или слово сочитание в словоре?
Ну так это просто. B+ деревья или поиск по хэш.


 
Ketmar ©   (2006-07-15 16:33) [6]

RBTrees. AVLTrees. и ты ды, и ты пы... подробности, блин, подробности!


 
_mik ©   (2006-07-16 21:32) [7]

Прошу прощения за не точный вопрос!
- у меня есть какой либо текст (научный, художественный и т.п. и т.д)
- есть словарь произношений под этот текст (он содержит слова и словосочентания )

я беру небольшие куски текста и заменяю в них текст по словарю,
а потом отправляю в компонент, который заставляет голосовой движек произносить это текст!


 
_mik ©   (2006-07-16 21:35) [8]

Вся загвоздка у меня в том, что словарь содержит словосочетания, и обобщающие символы (синтаксис приведен выше), что существенно замедляет перебор текста!

Тупой перебор на Pentium 2.4HT теста ~500 символов занимает 10 сек при полной загрузки процессора, что для меня не приемлемо!

п.с. если когота заинтересовал компонент для работы с голосовыми движками (spichapi 4.0) могу выложить!


 
Virgo_Style ©   (2006-07-16 21:55) [9]

БД, "грубая" выборка с помощью LIKE, затем проверка?


 
_mik ©   (2006-07-16 22:29) [10]

Нет я не использую БД, в дянный момент я использую тестовый файл, который грузится в TStringList после чего я беру первое слово из теста и ищу
бинарным поискомв словаре подходящее слово, а затем меняю!

Даже со словарем в 150 тыс слов (без обобщающих символов, кроме
"$" - учитывать ли регистр или нет)
к списку во время поиска программа обращается от силы 30~40 раз!

Я бы хотел реализовать обобшающие символы:
например: "*" хотябы в начале и конце слова,
а также поддержку словосочетаний для обработки ОМОГРАФОВ!


 
_mik ©   (2006-07-16 22:34) [11]

Уточню формат ловаря

[$][*]слово[*]=замена

например:
$Москва=мос>ква
или

2012-й г=две тысячи двена<дцатый год
$*—ХIX=- 19

т.е. если в тексте встретится например: "Москва" то она должна поменятся на "мос>ква"


 
Virgo_Style ©   (2006-07-16 22:47) [12]

Бинарный поиск занимает 10 секунд для ~500 символов (грубо - 100 слов)? Хм...

Я бы пользовался не StringList, а массивом записей (и вынес бы флаги в отдельные поля). А можно и БД попробовать...


 
_mik ©   (2006-07-16 23:22) [13]

Нет бинарный поиск, я начал использовать не давно!

Грубый перебор текста на наличие вхождений всех записей словаря начинающихся например с символа "*", да еще и наличие словосочетаний в словаре сильно замедляет процесс замены!

По этому в данный момент, я отказался от словосочетаний и обобщающих символов и испоьзую бинарный поиск!


 
Ketmar ©   (2006-07-17 03:43) [14]

если я правильно понял, то спасёт написание своих регулярных выражений. и не надо говорить, что это сложно -- это просто. %-)) даже без автоматов.


 
_mik ©   (2006-07-17 10:10) [15]

- А каким образом можно написать свои регулярные выражения без конечных автоматов?

- Да так, чтобы не потерять при этом скорость обработки?


 
Ketmar ©   (2006-07-17 10:19) [16]

>_mik ©   (17.07.06 10:10) [15]
а вот сесть -- и написать. досовые маски -- тоже регэкспы. Вы и для них будете автомат городить?
фильтры -- тоже в какой-то мере регэкспы. можно написать без автоматов.
и так дале...


 
_mik ©   (2006-07-17 12:08) [17]

Спасибо.
А где мне взять подробный материал?


 
Ketmar ©   (2006-07-17 12:34) [18]

в интернете? %-)


 
atruhin ©   (2006-07-17 13:20) [19]

По условия задачи не нужно ни каких регулярных выражений (это не очень быстро).
Во первых:
ОБЯЗАТЕЛЬНО убери из строк равно и сделай двумерный массив + модификаторы. Сократится область поиска.
Далее: словарь сделать отсортированным, сделать хэш по первым символам, далее бинарный поиск в оставшемся фрагменте.
Далее двигашся по текстовому потоку выбираеш слово ищеш в словаре, если найдено пытаешся удлиннить (т.е. словосочитание), если не найдено поиск по кажддой букве.
Думаю будет работать на несколько порядков быстрее. На самом деле подходящих алгоритмов много.
PS Не понимаю одного в задаче, на входе слово содружество в словаре его нет , нашли дружество запомнили, а куда девать со


 
_mik ©   (2006-07-17 16:59) [20]

Спасибо за дельный совет!

В настоящее время я деляю так:

1 выбираю кусок текста и разбиваю его на составные части путем добавления после каждого слова символов #10#13 а затем помещаю все в
StringList

2 обращаюсь через метод StringList.items к отдельным словам и произвожу поиск их по словарю, а затем меняю!

примерно так:

    str := TStringList.Create();
     _GetTextBlock (REEdit.Text, SpeechPosition, str);
      // вставляем теги
      _TextAnalise (str);
      // отслеживание позиции чтения
      _TextHig (0,SpeechPosition, clGreen);
      // замена по словарю
      replaseOnDic (str);
      TTSSpeech.Speech(str.Text);

где

procedure replaseOnDic (var Data: TStringList);
var i, psn: Integer;
   str1, str2: String;
begin
for i:=0 to Data.Count-1 do
  begin
     str1 := Data.Strings[i];

     if str1[1] in separators then continue;
{separators - множество разделителей слов set of char = [",", ".", ":"]}

     // проверка на регистрозависимость
     psn:=FindItem ("$"+str1);
     if psn>=0 then
     begin
        {получаем слово перед знаком "="}
        str1:=GetDest(SEDicEditor.Lines[psn]);

        Data.Strings[i]:=str1;
        continue;
     end;

     // замена текста
     str1:=AnsiLowerCase (str1);
     psn:=FindItem (str1);
     if psn>=0 then
     begin
         {получаем слово после знака "="}
         str1:=self.GetDest(SEDicEditor.Lines[psn]);
         {SEDicEditor - TStringList со словарем}
        Data.Strings[i]:=str1;
     end;

  end;  
end;


 
Stanislav ©   (2006-07-17 17:14) [21]

Для начала словарь данных нужно отсортировать и вести поиск не по всем записям, а по сортированным.

Лучше всего использовать БД. хотябы организованную на MS ACCESS т.к. алгоритмы быстрого поиска там уже реализованы.


 
atruhin ©   (2006-07-17 17:53) [22]

> [21] Stanislav ©   (17.07.06 17:14)

Незачем использовать БД где не попадя. Словарь фиксированный, маленький. Менее 1 мб, поиск в памяти будет эффективнее.

> [20] _mik ©   (17.07.06 16:59)

Ерунда какая то. Я тебе описал простой алгоритм, зачем ты приводиш то, что у тебя работает плохо? Ответь на:

> PS Не понимаю одного в задаче, на входе слово содружество
> в словаре его нет , нашли дружество запомнили, а куда девать
> со


 
_mik ©   (2006-07-17 18:05) [23]

Вообще я привел то, что работает хорошо!
Я уже писал, что я произовожу бинарный поиск по словарю (это значит что словарь заранее отсортирован)

Вариант с базой данных мне не подходит, т.к. я планирую использовать программу на компютерах с win95 и выше! (не охото утяжилять дистрибутив драйверами)
Плюс к тому, я пытаюсь обеспечить совместимость по словарями ГОВОРИЛКИ!

В Данный момент я не могу решить проблему с быстрым поиском слов  и словосочетаний по маске, т.е. с обобщающими символами!

Подчеркиваю именно быстрого!!
СПАСИБО ЗА СОВЕТЫ


 
Ketmar ©   (2006-07-17 20:45) [24]

насчёт регулярных выражений. проверил только что свой движок (далеко не самый шустрый, кстати). на файле объёмом 400 кил отрабатывает практически мгновенно. машина -- pIII/600. просто dos-like wildcards ещё шустрее.


 
_mik ©   (2006-07-17 20:49) [25]

А не мог бы ты привести исходники!
Или хотябы адрес сайта с которого ты взял информацию!
Спасибо!


 
_mik ©   (2006-07-17 20:50) [26]

Лучше приведи (или пошли напочту если не жалко)информацию по написанию!
Это очень интересно!
СПАСИБО!


 
Ketmar ©   (2006-07-17 21:39) [27]

>_mik ©   (17.07.06 20:50) [26]
к сожалению, переходник "мозг-USB" ещё не придумали. а писать статью мне лениво. %-)


 
_mik ©   (2006-07-17 21:51) [28]

Может хотябы исходиники скинеш?
viri@yandex.ru


 
Ketmar ©   (2006-07-17 23:35) [29]

может, хотя бы в анкету глянешь? %-)


 
_mik ©   (2006-07-18 01:10) [30]

Спасибо!


 
Ketmar ©   (2006-07-18 01:53) [31]

не вопрос. если поймёшь, как и почему оно работает -- поделись знанием. я не понимаю. %-)


 
Stanislav ©   (2006-07-18 09:45) [32]

Если БД на ACCESS драйвера не нужны.

Тупой перебор на Pentium 2.4HT теста ~500 символов занимает 10 сек при полной загрузки процессора, что для меня не приемлемо!

Это очень медлено. Ты дольше провозишься с оптимизацией поиска, и всеравно такой скорости как у БД не добьешься.
Хотя есть примеры в книгах быстрой сортировки, это сортировка путем половинчатого деления.


 
atruhin ©   (2006-07-18 18:20) [33]

> Ты дольше провозишься с оптимизацией поиска, и всеравно
> такой скорости как у БД не добьешься.

Почему ты так решил? В БД что поиск какой то особенный секретный. Все алгоритмы известны. Реализуются максимем за 1 день. Можно найти готовые реализации. А алгоритм заточенный под конкретную задачу будет быстрее.
Автору:
Не нужны в данном случае регулярные выражения, да и как ты их хочешь прикрутить?


 
Ketmar ©   (2006-07-18 20:41) [34]

>Stanislav ©   (18.07.06 09:45) [32]
> Если БД на ACCESS драйвера не нужны.
да??? ого. Дед Мороз приносит?

>atruhin ©   (18.07.06 18:20) [33]
нафиг не нужны. просто разговор о них зашёл. %-)


 
atruhin ©   (2006-07-18 22:49) [35]

Автору.
Ты так и не ответил на вопрос:
> PS Не понимаю одного в задаче, на входе слово содружество
> в словаре его нет , нашли дружество запомнили, а куда девать
> со

От этого сильно зависит алгоритм и все советы. Например:
Есть предложение:
"абвгд ежзи клм"
есть слова в словаре:
*бвгд е*
*гд ежзи ел*
Что должен найти алгоритм, более длинную или с которой раньше начинается?
И что делать с первыми (пропущеными) буквами?


 
Stanislav ©   (2006-07-19 10:45) [36]

Ketmar ©   (18.07.06 20:41) [34]
Ага, Только не дед могроз, а стандартная поставка Windows.
atruhin ©   (18.07.06 18:20) [33]
Может и за день, но мы тут 5 дней уже разговариваем.


 
_mik ©   (2006-07-19 18:21) [37]

Поиск слов и словосечетаний в словаре я уже решил!
это можно сделать:

- либо бинарным поиском, что реализуется довольно просто
а скорость выполнения данной операции составляет O(log n)
- либо при помощи хэш таблиц при этом скорость будет O(1) что еще быстрее

вся загвоздка состоит в замене в тексте с использованием "*",
Например:

есть текст : "http:\\www.randex.ru"
и есть определение в словаре: "*www*=вэ вэ вэ"

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

"http:\\вэ вэ вэ.randex.ru"

Причем таких записей в словаре как "*www*=вэ вэ вэ" может быть несколько сотен!


 
Romkin ©   (2006-07-19 18:37) [38]

А. Теперь я врубился. Фактически, в словаре у тебя шаблоны, и рассматривая строку ты прилагаешь к ней все шаблоны (оптимизируя выбор), делая замену какая пойдет. Так?
Ты лучше скажи полностью постановку. Что * - любое число символов, я понял, а что такое $? И что еще есть?


 
Romkin ©   (2006-07-19 18:40) [39]

Поясню: фактически, то, что ты хочешь, называется синтаксическим анализом, хоть и простеньким. А тут уже и алгоритны другие.


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

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

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



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

Форум: "Основная";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.058 c
9-1134243326
Click
2005-12-10 22:35
2006.09.03
DelphiX


2-1155296090
fast2
2006-08-11 15:34
2006.09.03
Как сделать, чтоб можна было двигать дочерней формой...


1-1153302570
JorSand
2006-07-19 13:49
2006.09.03
Вопрос по отображению формы.


2-1155229044
ViktorZ
2006-08-10 20:57
2006.09.03
Сложно разобраться. прошу помощи!!!


15-1155305195
tButton
2006-08-11 18:06
2006.09.03
опять реклама пива





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский