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

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

Страниц: 1 ... 10 11 [12] 13 14 ... 18   Вниз
  Печать  
Автор Тема: Регулярное выражение с QString  (Прочитано 161611 раз)
Spark
Гость
« Ответ #165 : Август 01, 2013, 09:58 »

Лучше подумайте как организовать 2 и более вариантов вместе (сейчас будет "страшнэ")
Не понял постановки задачи.
Сейчас у меня работают вместе три варианта сортировки. Два из них не хуже ваших. Третий работает медленно, но никто не предлагал решение. Ну и плюс уборка английского/русского/без уборки.  Размер, повторы.

В общем то сам модуль готов и прекрасно работает, но раз можно лучше, надо лучше.
« Последнее редактирование: Август 01, 2013, 10:05 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #166 : Август 01, 2013, 11:24 »

писать слова без пробелов в интерфейсе — это не уважать пользователей. суть первых двух спинбоксов и кнопок непонятна.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #167 : Август 01, 2013, 11:35 »

Это тестовый вариант.
Спинбоксы ограничивают длину слова по количеству символов.
Ну а пара кнопок для того что бы пользователь быстро мог делать крайние ограничения:
Мах - 99 символов (фактически без ограничений)
Min  - MaxSizeWord = MinSazeWord

Однако и третий вариант не дал никаких преимуществ:
Код
C++ (Qt)
   // ВАРИАНТ3
   QHash<QString, int> frequencyHash;
   foreach (QString Item, itemList) ++frequencyHash[Item];
   itemList.removeDuplicates();
   QString IterW;
   QListIterator<QString> Iter(itemList);
   while(Iter.hasNext())
   {
       IterW = Iter.next();
       countItemFull = countItemFull + frequencyHash.value(IterW);
       countItemString.setNum(frequencyHash.value(IterW));
 
       trimmedStr = IterW + "\t" + countItemString;
       frequencyList.prepend( trimmedStr );
   }

Ладно видимо не в том направлении роем.
Будем искать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #168 : Август 01, 2013, 12:11 »

вместо удаления дублей и прохода по списку можно просто пройтись конст_итератором по хэшу
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #169 : Август 01, 2013, 13:48 »

Ладно видимо не в том направлении роем.
Будем искать.
Код
C++ (Qt)
QHash<QString, int> freqHash;
foreach (QString s, itemList) ++freqHash[s];
foreach (QString s, itemList) {
int & num = freqHash[s];
if (num < 0) continue;
frequencyList.prepend(s + '\t' + QString::Number(num));
num = -num;
}
Записан
Spark
Гость
« Ответ #170 : Август 01, 2013, 13:49 »

вместо удаления дублей и прохода по списку можно просто пройтись конст_итератором по хэшу
Поставил счетчик. Удаление дублей оказалась, вроде, действительно то же не менее тормознутым процессом чем пословно искать, как это дела я в первом варианте. Я то думал, оптимизирована функция. И результаты схожи. Получается примерно одинаков алгоритм.
Сейчас подумаю над вашим вариантом. Хотя с хешитераторм и мапитератором экспериментровал. Перемешивают списки. Попробую конст_итератор.

В общем на очередное поругание:
Код
C++ (Qt)
void MainWindow::bufferButtonSave()
{
   QTime tm;
 
   tm.start();
 
   QClipboard *clipboard = QApplication::clipboard();
   QString originalText = clipboard->text();
   QString countItemFullString;
   QString countItemString, countItemStringZero;
   QStringList itemList;
   QStringList frequencyList;
   int countItemFull(0);
   int minSizeWord(cfg.preferences.minSizeWord);
   int maxSizeWord(cfg.preferences.maxSizeWord);
   int minRepeats(cfg.preferences.minRepeats);
 
   qDebug() << "Reade Data: " << tm.elapsed();
 
   tm.start();
 
   originalText = originalText.toLower();
 
   qDebug() << "Data toLower: " << tm.elapsed();
 
   textory.clear();
 
   tm.start();
 
   // ОСТАВЛЯЕМ ТЕКСТ
   if(cfg.preferences.langStatSort == 0)itemList = originalText.split(QRegExp("[\\s\\W\\d]+"),QString::SkipEmptyParts);
 
   // ОСТАВЛЯЕМ АНГЛИЙКИЙ
   if(cfg.preferences.langStatSort == 1)itemList = originalText.split(QRegExp("[^a-z]"),QString::SkipEmptyParts);
 
   // ОСТАВЛЯЕМ РУССКИЙ
   if(cfg.preferences.langStatSort == 2)itemList = originalText.split(QRegExp(QString::fromUtf8("[^а-яё]")),QString::SkipEmptyParts);
 
   qDebug() << "Data split1: " << tm.elapsed();
   tm.start();
 
   if(cfg.preferences.typeOfSort == 2)
   QHash<QString, int> frequencyHash;
   foreach (QString Item, itemList) ++frequencyHash[Item];
   itemList.removeDuplicates();
   QString IterW;
   QListIterator<QString> Iter(itemList);
   while(Iter.hasNext())
   {
       IterW = Iter.next();
       countItemFull = countItemFull + frequencyHash.value(IterW);
       countItemString.setNum(frequencyHash.value(IterW));
 
       trimmedStr = IterW + "\t" + countItemString;
       frequencyList.prepend( trimmedStr );
   }
 
   if(cfg.preferences.typeOfSort == 0 || cfg.preferences.typeOfSort == 1)
   {
       QHash<QString, int> frequencyHash;
       foreach (QString Item, itemList) ++frequencyHash[Item];
 
       qDebug() << "Data split2: " << tm.elapsed();
 
       tm.start();
 
       QHashIterator<QString,int> Iter(frequencyHash);
       while(Iter.hasNext())
       {
           Iter.next();
           countItemFull = countItemFull + Iter.value();
           if(Iter.key().size() < minSizeWord || Iter.key().size() > maxSizeWord || Iter.value() < minRepeats )continue;
           countItemString.setNum(Iter.value());
           countItemStringZero = countItemString;
           // ОРГАНИЗОВЫВАЕМ СОРТИРОВКУ
           countItemStringZero = QString("%1")
                   .arg(countItemString, 6, '0');
 
           if(cfg.preferences.typeOfSort == 0)frequencyList.append(countItemStringZero + "_" + Iter.key() + "\t" + countItemString );
           if(cfg.preferences.typeOfSort == 1 || cfg.preferences.typeOfSort == 2)frequencyList.prepend(Iter.key() + "\t" + countItemString );
       }
   }
 
 
   qDebug() << "Count: " << tm.elapsed();
 
   tm.start();
 
   // СТРОИМ СПИСОК
   if(cfg.preferences.typeOfSort != 2)qSort(frequencyList);
 
   textory.enableAdd( true );
 
   qDebug() << "Data sort: " << tm.elapsed();
 
   tm.start();
 
   if(cfg.preferences.typeOfSort == 0 || cfg.preferences.typeOfSort == 2)
   {
       foreach (QString itm, frequencyList)
       {
           if(cfg.preferences.typeOfSort == 0)itm.remove(0,7);
           textory.addItem( Textory::Item( 1, itm ) );
       }
   }
 
   if(cfg.preferences.typeOfSort == 1)
   {
       QListIterator<QString>itm(frequencyList);
       itm.toBack();
       while (itm.hasPrevious())
       textory.addItem( Textory::Item( 1, itm.previous() ) );
   }
 
   qDebug() << "Clear zero: " << tm.elapsed();
 
   tm.start();
 
   countItemFullString.setNum(countItemFull);
 
   ui.textoryPaneWidget->getTextoryLabel().setText( "Frequency list (" + countItemFullString + ")" );
 
   qDebug() << "Write name: " << tm.elapsed();
}
Записан
Spark
Гость
« Ответ #171 : Август 01, 2013, 13:50 »

Ладно видимо не в том направлении роем.
Будем искать.
Код
C++ (Qt)
QHash<QString, int> freqHash;
foreach (QString s, itemList) ++freqHash[s];
foreach (QString s, itemList) {
int & num = freqHash[s];
if (num < 0) continue;
frequencyList.prepend(s + '\t' + QString::Number(num));
num = -num;
}

Спасибо сейчас оценим.
Записан
Spark
Гость
« Ответ #172 : Август 01, 2013, 15:02 »

Igors Спасибо! Протестировал ваш код. Очень хорошо. На порядок быстрее чем то, что смог я сделать. Но на порядок (почти в 30раз) медленнее остальных вариантов (сортировка в порядке частотности и по алфавиту).
Наверное можно остановиться на этом Улыбающийся. Во всяком случае теперь не  придется час ждать вывода, если кому то понадобится проанализировать текст миллионов на пять слов. В штатном режиме тормоза не наблюдаются.
Аналоги считают из рук вон плохо. Стандартный функционал отработан. Теперь можно приступить к более крутой обработке.
« Последнее редактирование: Август 01, 2013, 15:04 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #173 : Август 01, 2013, 17:19 »

Igors Спасибо! Протестировал ваш код. Очень хорошо. На порядок быстрее чем то, что смог я сделать. Но на порядок (почти в 30раз) медленнее остальных вариантов (сортировка в порядке частотности и по алфавиту).
Что-то Вы не так меряли - возможно все съедается на построении itemList, этот код я не видел. Кстати тут было замечание насчет reserve, оно справедливо и для QHash
Код
C++ (Qt)
QHash<QString, int> freqHash;
freqHash.reserve(itemList.size());  // так должно быть быстрее (правда хз насколько)
foreach (QString s, itemList) ++freqHash[s];
 
Записан
Spark
Гость
« Ответ #174 : Август 01, 2013, 17:26 »

Сейчас счетчики выставлю и дам результаты. Может я чего недопонимаю.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #175 : Август 01, 2013, 17:52 »

2Igors: а почему foreach без константных ссылок?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #176 : Август 01, 2013, 18:09 »

Немного погорячился. Видимо сравнивал со старыми данными, после этого код пополнел. Но все таки на порядок.
В общем тестировал этот код:
Код
C++ (Qt)
void MainWindow::bufferButtonSave()
{
   QTime tm;
   tm.start();
 
   QClipboard *clipboard = QApplication::clipboard();
   QString originalText = clipboard->text();
   QString countItemFullString;
   QString countItemString, countItemStringZero;
   QStringList itemList;
   QStringList frequencyList;
   int countItemFull(0);
   int minSizeWord(cfg.preferences.minSizeWord);
   int maxSizeWord(cfg.preferences.maxSizeWord);
   int minRepeats(cfg.preferences.minRepeats);
 
   qDebug() << "Reade Data: " << tm.elapsed();
   tm.start();
 
   originalText = originalText.toLower();
 
   qDebug() << "Data toLower: " << tm.elapsed();
   tm.start();
 
   textory.clear();
 
   // ОСТАВЛЯЕМ ТЕКСТ
   if(cfg.preferences.langStatSort == 0)itemList = originalText.split(QRegExp("[\\s\\W\\d]+"),QString::SkipEmptyParts);
 
   // ОСТАВЛЯЕМ АНГЛИЙКИЙ
   if(cfg.preferences.langStatSort == 1)itemList = originalText.split(QRegExp("[^a-z]"),QString::SkipEmptyParts);
 
   // ОСТАВЛЯЕМ РУССКИЙ
   if(cfg.preferences.langStatSort == 2)itemList = originalText.split(QRegExp(QString::fromUtf8("[^а-яё]")),QString::SkipEmptyParts);
 
   qDebug() << "Data split1: " << tm.elapsed();
   tm.start();
 
   // ВАРИАНТ БЕЗ СОРТИРОВКИ (frequencyList)
   if(cfg.preferences.typeOfSort == 2)
   {
       QHash<QString, int> frequencyHash;
       foreach (QString s, itemList) ++frequencyHash[s];
       foreach (QString s, itemList)
       {
           int & num = frequencyHash[s];
           countItemString.setNum(num);
           if (num < 0) continue;
           countItemFull = countItemFull + num;
           if(s.size() < minSizeWord || s.size() > maxSizeWord || frequencyHash[s] < minRepeats )continue;
           frequencyList.prepend(s + '\t' + countItemString);
           num = -num;
       }
   }
 
   // СОРТИРОВКА В ПОРЯДКЕ ЧАСТОТНОСТИ И АЛФАВИТУ
   if(cfg.preferences.typeOfSort == 0 || cfg.preferences.typeOfSort == 1)
   {
       QHash<QString, int> frequencyHash;
       foreach (QString Item, itemList) ++frequencyHash[Item];
 
       QHashIterator<QString,int> Iter(frequencyHash);
       while(Iter.hasNext())
       {
           Iter.next();
           countItemFull = countItemFull + Iter.value();
           if(Iter.key().size() < minSizeWord || Iter.key().size() > maxSizeWord || Iter.value() < minRepeats )continue;
           countItemString.setNum(Iter.value());
           countItemStringZero = countItemString;
           // ОРГАНИЗОВЫВАЕМ СОРТИРОВКУ
           countItemStringZero = QString("%1")
                   .arg(countItemString, 6, '0');
 
           if(cfg.preferences.typeOfSort == 0)frequencyList.append(countItemStringZero + "_" + Iter.key() + "\t" + countItemString );
           if(cfg.preferences.typeOfSort == 1 || cfg.preferences.typeOfSort == 2)frequencyList.append(Iter.key() + "\t" + countItemString );
       }
   }
 
   qDebug() << "Count: " << tm.elapsed();
   tm.start();
 
   // СТРОИМ СПИСОК
   if(cfg.preferences.typeOfSort != 2)qSort(frequencyList);
 
   textory.enableAdd( true );
 
   qDebug() << "Data sort: " << tm.elapsed();
   tm.start();
 
   if(cfg.preferences.typeOfSort == 0 || cfg.preferences.typeOfSort == 2)
   {
       foreach (QString itm, frequencyList)
       {
           if(cfg.preferences.typeOfSort == 0)itm.remove(0,7);
           // textory.addItem( Textory::Item( 1, itm ) );
       }
   }
 
   if(cfg.preferences.typeOfSort == 1)
   {
       QListIterator<QString>itm(frequencyList);
       itm.toBack();
       while (itm.hasPrevious())
           // textory.addItem( Textory::Item( 1, itm.previous() ) );
   }
 
   qDebug() << "Clear zero: " << tm.elapsed();
   tm.start();
 
   countItemFullString.setNum(countItemFull);
 
   ui.textoryPaneWidget->getTextoryLabel().setText( "Frequency list (" + countItemFullString + ")" );
 
   qDebug() << "Write name: " << tm.elapsed();
}
« Последнее редактирование: Август 01, 2013, 18:11 от Spark » Записан
Spark
Гость
« Ответ #177 : Август 01, 2013, 18:17 »

Текст довольно сложный. Смешанный текст, с большим количеством мусора. Всего  5812355 слов.

ПО ЧАСТОТНОСТИ:
Reade Data:  8943
Data toLower:  310
Data split:  9624
Count:  4992
Data sort:  421
Clear zero:  296
Write name:  0

========================
ПО АЛФАВИТУ:
Reade Data:  8948
Data toLower:  311
Data split:  9702
Count:  4316
Data sort:  301
Clear zero:  0
Write name:  0

===================
БЕЗ СОРТИРОВКИ:
Reade Data:  8961
Data toLower:  308
Data split:  9716
Count:  16154
Data sort:  0
Clear zero:  11
Write name:  0

Но!
« Последнее редактирование: Август 01, 2013, 18:24 от Spark » Записан
Spark
Гость
« Ответ #178 : Август 01, 2013, 18:21 »

Если произведем сортировку. Оставим английский текст:

ПО ЧАСТОТНОСТИ:
Reade Data:  8906
Data toLower:  311
Data split:  15298
Count:  1524
Data sort:  90
Clear zero:  79
Write name:  0

========================
ПО АЛФАВИТУ:
Reade Data:  9009
Data toLower:  309
Data split:  15322
Count:  1351
Data sort:  68
Clear zero:  0
Write name:  0

===================
БЕЗ СОРТИРОВКИ:
Reade Data:  8861
Data toLower:  306
Data split:  15205
Count:  13837
Data sort:  0
Clear zero:  3
Write name:  0

Как бы тут уже на порядок разница.
Но может я что напутал. Однако вроде в коде за каждую часть отвечает свой раздел.
« Последнее редактирование: Август 01, 2013, 19:23 от Spark » Записан
Spark
Гость
« Ответ #179 : Август 01, 2013, 18:23 »

Справедливости ради. Мой код считал этот тест минут 70-80 Улыбающийся. Хотя этот тест я может и не дождался. Английский он выделял примерно это время Улыбающийся.
Записан
Страниц: 1 ... 10 11 [12] 13 14 ... 18   Вверх
  Печать  
 
Перейти в:  


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