Russian Qt Forum
Ноябрь 23, 2024, 13:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 4 5 [6] 7 8 ... 18   Вниз
  Печать  
Автор Тема: Регулярное выражение с QString  (Прочитано 161088 раз)
Majestio
Гость
« Ответ #75 : Июль 27, 2013, 18:03 »

Какие же новые сущности я наплодил? Улыбающийся
struct CData
Записан
Majestio
Гость
« Ответ #76 : Июль 27, 2013, 18:08 »

Вот в этом и беда современной IT-индустрии. Поэтому и программы в своей массе все тормозят и требуют кучу ядер и памяти.
Тут другая беда, имхо. Быдлокодинг. Когда кодируют вообще без понимания применения и перспектив. Типа сдал - забыл. Повторюсь, каждому применению своя реализация. В рассматриваемом случае - если речь идет о обработке 700к-байтных текстов, моя реализация лучшая, в общем зачете. Если хотим сделать средство потоковой обработки - регэкспы нафик, возможно и С++ нафик.
Записан
Dancing_on_water
Гость
« Ответ #77 : Июль 27, 2013, 18:10 »

Участвующим в замесе. Если хотите использовать регулярки, то лучше юзайте QRegularExpression
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #78 : Июль 27, 2013, 18:37 »

Тут другая беда, имхо.
Нет беда как раз в этом. И все ваши высказывания это подтверждают. Улыбающийся

В рассматриваемом случае - если речь идет о обработке 700к-байтных текстов, моя реализация лучшая, в общем зачете.
Смешно. Чем она лучше? Улыбающийся
Если она сливается как по скорости, так и по памяти.

Если хотим сделать средство потоковой обработки - регэкспы нафик, возможно и С++ нафик.
Вы же недавно мне расписывали достоинства регулярки для подобных задач. Улыбающийся
И с++ нафик? А чем заменим? Подмигивающий
Записан
Majestio
Гость
« Ответ #79 : Июль 27, 2013, 18:53 »

По скорости сливается на 3%. По количеству кодинга - меньше в 2 раза. Алаверды в квадрате)
Про регулярки я и не спорю - отличный бытовой инструмент. Но если хотите скорость в определенной выделенной задаче - решайте ее без фреймворков. Как-то так.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #80 : Июль 27, 2013, 19:44 »

По скорости сливается на 3%. По количеству кодинга - меньше в 2 раза. Алаверды в квадрате)
Посмотрим на "отдельно взятую" ф-цию split(). По сравнению с любой др реализацией кол-во кодинга может и меньше в 5 - или даже в 10 раз Улыбающийся Но тот split Вам так или иначе придется заменить - и до 2 раз будет ой далеко  Улыбающийся
Записан
Spark
Гость
« Ответ #81 : Июль 27, 2013, 19:56 »

Igors Спасибо за развернутый пример. думаю воспользуюсь, когда окончательный вариант функции будет готов.

Сделал сортировку по убыванию частотности. Ну как смог, работает Улыбающийся. Покритикуйте, предлагайте свои варианты если не затруднит:
Код
C++ (Qt)
void MainWindow::bufferButtonSave()
{
   QClipboard *clipboard = QApplication::clipboard();
   QString originalText = clipboard->text();
   QString countItemFullString;
   QString countItemString;
   QStringList itemList;
   int countItem(0);
   int countItemFull(0);
 
   originalText = originalText.toLower();
   originalText.replace(QRegExp("\\W"), " ");
   originalText.replace(QRegExp("\\d"), " ");
   originalText.replace(QRegExp("_"), " ");
   // ЗАДАЧА1: ЭТО НЕ РАБОТАЕТ
   originalText.replace(QRegExp("[а-я]"), "");
 
   textory.clear();
 
   itemList = originalText.split(QRegExp("\\s+"),QString::SkipEmptyParts);
   QMap <QString, int> frequencyMap;
   foreach (QString Item, itemList) ++frequencyMap[Item];
 
   QList<QString> frequencyList;
   QMapIterator<QString,int> Iter(frequencyMap);
   while(Iter.hasNext())
   {
       Iter.next();
       countItem = Iter.value();
       countItemString.setNum(countItem);
       if(countItem <10 )countItemString = "0000" + countItemString;
       if(countItem >9 && countItem <100 )countItemString = "000" + countItemString;
       if(countItem >99 && countItem <1000 )countItemString = "00" + countItemString;
       if(countItem >999 && countItem <10000 )countItemString = "0" + countItemString;
       countItemFull = countItemFull + countItem;
       frequencyList.append(countItemString + "_" + Iter.key() );
   }
 
   qSort(frequencyList);
 
   textory.enableAdd( true );
 
   QString wordItem, wordCount;
 
   foreach (QString itm, frequencyList)
   {
       wordItem = itm;
       wordCount = itm;
       wordItem.remove(0,6);
       wordCount.remove(5,100);
       wordCount.remove(QRegExp("^[0]"));
       wordCount.remove(QRegExp("^[0]"));
       wordCount.remove(QRegExp("^[0]"));
       wordCount.remove(QRegExp("^[0]"));
       textory.addItem( Textory::Item( 1, wordItem + "\t" + wordCount ) );
   }
 
   countItemFullString.setNum(countItemFull);
 
   ui.textoryPaneWidget->getTextoryLabel().setText( "Frequency list (" + countItemFullString + ")" );
}
Что не нравится, так это то, что в обратном алфавитном порядке. Однако, сравнив с программой образцом, там та же ситуация. Хотелось бы улучшить.
Ну и вопрос №1 остается - оставить нужный язык.
Записан
Dancing_on_water
Гость
« Ответ #82 : Июль 27, 2013, 20:03 »

To Spark а с каким объемом текста имеет делу функция и как часто?
Записан
Spark
Гость
« Ответ #83 : Июль 27, 2013, 20:24 »

Обычный объем, для тех нужд для которых предполагается - тысячи 2-3 не больше. Но вполне реальны тексты на 2-3 сотни тысяч слов. Сложно предсказать кто для чего ее захочет использовать. На самом деле предполагается довольно крутую обработку текста делать.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #84 : Июль 27, 2013, 20:37 »

Обычный объем, для тех нужд для которых предполагается - тысячи 2-3 не больше. Но вполне реальны тексты на 2-3 сотни тысяч слов. Сложно предсказать кто для чего ее захочет использовать. На самом деле предполагается довольно крутую обработку текста делать.
Для крутой обработки текста нужны алгоритмы, которые эту о работку будут делать. Сейчас нужно обдумывать базу этих алгоритмов, что может понадобиться и в каком виде. Другими словами заняться проектированием, а вы какую-то ерунду сейчас делаете, да еще и с Gui. Когда дойдет время до крутой обработки, все что вы сделаете сейчас придется выкинуть.
Записан
Dancing_on_water
Гость
« Ответ #85 : Июль 27, 2013, 20:45 »

Ну тогда у вас в корне неверный подход 2-3 тысяч слов это объем около 20-40 кБ.  Уже много. И хотя и сильно больший объем влезет в кэш, НО

Вам надо экономить на всем и не в последнюю очередь на обращение к памяти. У вас уже здесь 5 полных прохода

Код
C++ (Qt)
originalText = originalText.toLower();
   originalText.replace(QRegExp("\\W"), " ");
   originalText.replace(QRegExp("\\d"), " ");
   originalText.replace(QRegExp("_"), " ");
   originalText.replace(QRegExp("[а-я]"), "");
 
А вот это
Код
C++ (Qt)
 
   itemList = originalText.split(QRegExp("\\s+"),QString::SkipEmptyParts);
Вообще затормозит систему так, что мама не горюй

Не говоря уже о том, что регулярные выражения для этого дела - крайне медленный и плохой инструмент.
Записан
Spark
Гость
« Ответ #86 : Июль 27, 2013, 20:58 »

Dancing_on_water
Согласен, что надо экономить. Однако я не в курсе как Улыбающийся. Слишком мал опыта. По сути каждое новое действие это единственный приобретенный опыт и сравнивать не с чем.
Но по поводу нынешнего кода. На моей системе, стандартные задачи 2 - 3 тысячи даже не стоит и беспокоится. Моментально. Текст на 40000 небольшая задержка. Пользователь не заметит и не будет раздражен.
Сделал эксперимент и подсунул текст на 5812357 слов из буфера обмена. Наибольшая частот слова в этом тексте 82110.
Забыл отметить конец теста. Ну где то 10-15 минут. Но это исключительный текст, ради эксперимента.
Записан
Spark
Гость
« Ответ #87 : Июль 27, 2013, 21:02 »

И все так по существу вопроса. Фактически надо решить последнюю задачу.
Как сделать, что бы отрабатывался такой регесп:
Код
C++ (Qt)
   originalText.replace(QRegExp("[а-я]"), "");
С английским, естественно, нет проблем и это работает:
Код
C++ (Qt)
   originalText.replace(QRegExp("[a-z]"), "");
Записан
Spark
Гость
« Ответ #88 : Июль 27, 2013, 21:04 »

Dancing_on_water
Согласен, что надо экономить. Однако я не в курсе как Улыбающийся. Слишком мал опыта. По сути каждое новое действие это единственный приобретенный опыт и сравнивать не с чем.
Но по поводу нынешнего кода. На моей системе, стандартные задачи 2 - 3 тысячи даже не стоит и беспокоится. Моментально. Текст на 40000 небольшая задержка. Пользователь не заметит и не будет раздражен.
Сделал эксперимент и подсунул текст на 5812357 слов из буфера обмена. Наибольшая частот слова в этом тексте 82110.
Забыл отметить конец теста. Ну где то 10-15 минут. Но это исключительный текст, ради эксперимента.

P.S. Я подумаю, чем заменить регулярки.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #89 : Июль 27, 2013, 21:11 »

P.S. Я подумаю, чем заменить регулярки.

Вам сейчас не об этом надо думать, а вот о чём:

Для крутой обработки текста нужны алгоритмы, которые эту о работку будут делать. Сейчас нужно обдумывать базу этих алгоритмов, что может понадобиться и в каком виде. Другими словами заняться проектированием, а вы какую-то ерунду сейчас делаете, да еще и с Gui. Когда дойдет время до крутой обработки, все что вы сделаете сейчас придется выкинуть.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 ... 4 5 [6] 7 8 ... 18   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.299 секунд. Запросов: 23.