diff --git a/ChangeLog.md b/ChangeLog.md index 6917fed..25ef65c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,7 @@ # [Change Log](https://github.com/anyks/asc/archive/release.tar.gz) +## [1.0.2](https://github.com/anyks/asc/archive/v1.0.2.tar.gz) Other optimization + ## [1.0.1](https://github.com/anyks/asc/archive/v1.0.1.tar.gz) Bug fixes ## [1.0.0](https://github.com/anyks/asc/archive/v1.0.0.tar.gz) Creating a repository diff --git a/app/asc.cpp b/app/asc.cpp index 11b6153..7a173ac 100644 --- a/app/asc.cpp +++ b/app/asc.cpp @@ -3389,7 +3389,7 @@ int main(int argc, char * argv[]) noexcept { // Если адрес скрипта получен if((value = env.get("word-script")) != nullptr) toolkit.setWordScript(value); // Выполняем инициализацию алгоритма сглаживания - if(env.is("smoothing")) { + if(env.is("smoothing")){ // Дополнительный коэффициент алгоритма сглаживания double mod = 0.0; // Если алгоритм сглаживания ConstDiscount или AddSmooth, запрашиваем дополнительные параметры @@ -3442,7 +3442,7 @@ int main(int argc, char * argv[]) noexcept { ); // Устанавливаем путь назначения if((value = env.get("train-intermed-dest")) != nullptr) collector.setDest(value); - // Выполняем чтение данных файла + // Выполняем чтение данных каталога collector.readDir(path, ext); // Иначе выполняем сборку обычным способом } else { diff --git a/app/asc.hpp b/app/asc.hpp index e5bbab3..c74358e 100644 --- a/app/asc.hpp +++ b/app/asc.hpp @@ -9,7 +9,7 @@ // Название языковой модели #define ANYKS_ASC_NAME "asc" // Версия приложения -#define ANYKS_ASC_VERSION "1.0.1" +#define ANYKS_ASC_VERSION "1.0.2" // Версия словаря #define ANYKS_ASC_DICT_VERSION "1.0.0" // Автор приложения diff --git a/include/ascb.hpp b/include/ascb.hpp index c264c89..5e3db3e 100644 --- a/include/ascb.hpp +++ b/include/ascb.hpp @@ -65,6 +65,8 @@ namespace anyks { map altLetters; // Список альтернативных слов unordered_map altWords; + // Функция прогресс бара + function progressFn = nullptr; private: // Объект языковой модели alm_t * alm = nullptr; @@ -177,11 +179,16 @@ namespace anyks { * @param filename адрес файла словаря */ void setFilename(const string & filename) noexcept; + /** + * setProgressFn Метод установки внешнего прогресс-бара + * @param fn функция внешнего прогресс-бара + */ + void setProgressFn(function fn) noexcept; public: /** * ASCb Конструктор */ - ASCb() noexcept {}; + ASCb() noexcept; /** * ASCb Конструктор * @param filename адрес файла словаря diff --git a/include/dict.hpp b/include/dict.hpp index 64d1f02..45e486d 100644 --- a/include/dict.hpp +++ b/include/dict.hpp @@ -220,6 +220,17 @@ namespace anyks { * @param words список идентификаторов слов для добавления */ void setUWords(const map & words) noexcept; + public: + /** + * setLMethod Метод установки функции получения леммы + * @param fn функция для установки + */ + void setLMethod(stemmer_t::stemming_t fn) noexcept; + /** + * setVMethod Метод установки функции подбора вариантов + * @param fn функция для установки + */ + void setVMethod(stemmer_t::variants_t fn) noexcept; public: /** * setALM Метод установки языковой модели diff --git a/include/stemmer.hpp b/include/stemmer.hpp index 5d98781..246dff4 100644 --- a/include/stemmer.hpp +++ b/include/stemmer.hpp @@ -37,8 +37,9 @@ namespace anyks { private: // Мютекс для блокировки потока mutable mutex locker; + public: // Тип функции для извлечения леммы - typedef function lemma_t; + typedef function stemming_t; // Тип функции для подбора вариантов слова typedef function (const wstring &, const wstring &)> variants_t; private: @@ -48,7 +49,7 @@ namespace anyks { size_t variantsScript = 0; private: // Функция для получения леммы - lemma_t lemmaFn = nullptr; + stemming_t lemmaFn = nullptr; // Функция для подбора вариантов слова variants_t variantsFn = nullptr; private: @@ -67,15 +68,15 @@ namespace anyks { const bool check(const wstring & word) const noexcept; public: /** - * setLFunction Метод установки функции получения леммы + * setLMethod Метод установки функции получения леммы * @param fn функция для установки */ - void setLFunction(lemma_t fn) noexcept; + void setLMethod(stemming_t fn) noexcept; /** - * setVFunction Метод установки функции подбора вариантов + * setVMethod Метод установки функции подбора вариантов * @param fn функция для установки */ - void setVFunction(variants_t fn) noexcept; + void setVMethod(variants_t fn) noexcept; /** * setLScript Метод установки скрипта лемматизатора * @param script python скрипт для установки diff --git a/src/ascb.cpp b/src/ascb.cpp index d549ebd..21d5401 100644 --- a/src/ascb.cpp +++ b/src/ascb.cpp @@ -258,7 +258,7 @@ void anyks::ASCb::read() noexcept { // Устанавливаем пользовательский токен this->alm->setUserToken(token); // Если отладка включена - if((this->debug > 0) && (this->pss != nullptr)){ + if(this->debug > 0){ // Увеличиваем индекс добавленного токена index++; // Подсчитываем статус выполнения @@ -267,11 +267,15 @@ void anyks::ASCb::read() noexcept { if(rate != status){ // Запоминаем текущее процентное соотношение rate = status; - // Отображаем ход процесса - switch(this->debug){ - case 1: this->pss->update(status); break; - case 2: this->pss->status(status); break; - } + // Если прогресс-бар передан + if(this->pss != nullptr){ + // Отображаем ход процесса + switch(this->debug){ + case 1: this->pss->update(status); break; + case 2: this->pss->status(status); break; + } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading user token", status); } } } @@ -282,7 +286,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading user token", 100); }{ // Буфер бинарных данных словаря vector buffer; @@ -311,7 +316,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(status); break; case 2: this->pss->status(status); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading dictionary", status); }); // Если объект индикатора загрузки передан if(this->pss != nullptr){ @@ -320,7 +326,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading dictionary", 100); // Очищаем буфер данных buffer.clear(); /* @@ -352,7 +359,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(status); break; case 2: this->pss->status(status); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading Bloom filter", status); }); // Если объект индикатора загрузки передан if(this->pss != nullptr){ @@ -361,7 +369,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading Bloom filter", 100); // Если отладка включена, выводим индикатор загрузки if((this->debug > 0) && (this->pss != nullptr)){ // Очищаем предыдущий прогресс-бар @@ -383,7 +392,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(status); break; case 2: this->pss->status(status); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading stemming", status); }); // Если объект индикатора загрузки передан if(this->pss != nullptr){ @@ -392,7 +402,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading stemming", 100); // Сообщаем, что загрузить данные словаря не получилось } else { // Выводим сообщение об ошибке @@ -428,18 +439,22 @@ void anyks::ASCb::read() noexcept { // Если буфер данных существует if(!buffer.empty()) this->alm->setBin(buffer); // Если отладка включена - if((this->debug > 0) && (this->pss != nullptr)){ + if(this->debug > 0){ // Подсчитываем статус выполнения status = u_short(i / double(countAlm) * 100.0); // Если процентное соотношение изменилось if(rate != status){ // Запоминаем текущее процентное соотношение rate = status; - // Отображаем ход процесса - switch(this->debug){ - case 1: this->pss->update(status); break; - case 2: this->pss->status(status); break; - } + // Если объект индикатора загрузки передан + if(this->pss != nullptr){ + // Отображаем ход процесса + switch(this->debug){ + case 1: this->pss->update(status); break; + case 2: this->pss->status(status); break; + } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading language model", status); } } } @@ -450,7 +465,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading language model", 100); } // Если количество альтернативных слов получено if(countAltWords > 0){ @@ -479,18 +495,22 @@ void anyks::ASCb::read() noexcept { // Если список альтернативных слов получен if(words.size() == 2) this->dict->addAlt(this->alphabet->convert(words.front()), this->alphabet->convert(words.back())); // Если отладка включена - if((this->debug > 0) && (this->pss != nullptr)){ + if(this->debug > 0){ // Подсчитываем статус выполнения status = u_short(i / double(countAltWords) * 100.0); // Если процентное соотношение изменилось if(rate != status){ // Запоминаем текущее процентное соотношение rate = status; - // Отображаем ход процесса - switch(this->debug){ - case 1: this->pss->update(status); break; - case 2: this->pss->status(status); break; - } + // Если объект индикатора загрузки передан + if(this->pss != nullptr){ + // Отображаем ход процесса + switch(this->debug){ + case 1: this->pss->update(status); break; + case 2: this->pss->status(status); break; + } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading alternative words", status); } } } @@ -501,7 +521,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading alternative words", 100); } // Если список букв для исправления слов из смешанных алфавитов получен if(countSubstitutes > 0){ @@ -532,18 +553,22 @@ void anyks::ASCb::read() noexcept { // Если слова получены, добавляем полученные буквы if(!words.empty()) letters.emplace(words.front(), words.back()); // Если отладка включена - if((this->debug > 0) && (this->pss != nullptr)){ + if(this->debug > 0){ // Подсчитываем статус выполнения status = u_short(i / double(countSubstitutes) * 100.0); // Если процентное соотношение изменилось if(rate != status){ // Запоминаем текущее процентное соотношение rate = status; - // Отображаем ход процесса - switch(this->debug){ - case 1: this->pss->update(status); break; - case 2: this->pss->status(status); break; - } + // Если объект индикатора загрузки передан + if(this->pss != nullptr){ + // Отображаем ход процесса + switch(this->debug){ + case 1: this->pss->update(status); break; + case 2: this->pss->status(status); break; + } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading substitutes letters", status); } } } @@ -558,7 +583,8 @@ void anyks::ASCb::read() noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Loading substitutes letters", 100); } // Если список доменных зон получен, устанавливаем его if(!domainZones.empty()) this->alphabet->setzones(domainZones); @@ -646,7 +672,8 @@ void anyks::ASCb::write() const noexcept { case 1: this->pss->update(status); break; case 2: this->pss->status(status); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump dictionary", status); }); // Если буфер данных получен if(!buffer.empty()){ @@ -670,7 +697,8 @@ void anyks::ASCb::write() const noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump dictionary", 100); }{ // Параметры индикаторы процесса size_t index = 0, status = 0, rate = 0, count = 0; @@ -705,18 +733,22 @@ void anyks::ASCb::write() const noexcept { // Увеличиваем индекс обработанных букв index++; // Если отладка включена - if((this->debug > 0) && (this->pss != nullptr)){ + if(this->debug > 0){ // Подсчитываем статус выполнения status = u_short(index / double(count) * 100.0); // Если процентное соотношение изменилось if(rate != status){ // Запоминаем текущее процентное соотношение rate = status; - // Отображаем ход процесса - switch(this->debug){ - case 1: this->pss->update(status); break; - case 2: this->pss->status(status); break; - } + // Если объект индикатора загрузки передан + if(this->pss != nullptr){ + // Отображаем ход процесса + switch(this->debug){ + case 1: this->pss->update(status); break; + case 2: this->pss->status(status); break; + } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump alternative letters", status); } } } @@ -727,7 +759,8 @@ void anyks::ASCb::write() const noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump alternative letters", 100); } // Если список альтернативных слов получен if(!this->altLetters.empty() && !this->altWords.empty()){ @@ -760,18 +793,22 @@ void anyks::ASCb::write() const noexcept { // Увеличиваем индекс обработанных слов index++; // Если отладка включена - if((this->debug > 0) && (this->pss != nullptr)){ + if(this->debug > 0){ // Подсчитываем статус выполнения status = u_short(index / double(count) * 100.0); // Если процентное соотношение изменилось if(rate != status){ // Запоминаем текущее процентное соотношение rate = status; - // Отображаем ход процесса - switch(this->debug){ - case 1: this->pss->update(status); break; - case 2: this->pss->status(status); break; - } + // Если объект индикатора загрузки передан + if(this->pss != nullptr){ + // Отображаем ход процесса + switch(this->debug){ + case 1: this->pss->update(status); break; + case 2: this->pss->status(status); break; + } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump alternative words", status); } } } @@ -782,7 +819,8 @@ void anyks::ASCb::write() const noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump alternative words", 100); } }{ // Параметры индикаторы процесса и количество N-грамм @@ -814,7 +852,8 @@ void anyks::ASCb::write() const noexcept { case 1: this->pss->update(status); break; case 2: this->pss->status(status); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump language model", status); }); // Записываем количество записанных буферов this->aspl->set("countAlm", index); @@ -827,7 +866,8 @@ void anyks::ASCb::write() const noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump language model", 100); }{ // Устанавливаем размер словаря this->aspl->set("sizeAlm", this->alm->getSize()); @@ -930,18 +970,22 @@ void anyks::ASCb::write() const noexcept { // Увеличиваем индекс обработанных слов index++; // Если отладка включена - if((this->debug > 0) && (this->pss != nullptr)){ + if(this->debug > 0){ // Подсчитываем статус выполнения status = u_short(index / double(count) * 100.0); // Если процентное соотношение изменилось if(rate != status){ // Запоминаем текущее процентное соотношение rate = status; - // Отображаем ход процесса - switch(this->debug){ - case 1: this->pss->update(status); break; - case 2: this->pss->status(status); break; - } + // Если объект индикатора загрузки передан + if(this->pss != nullptr){ + // Отображаем ход процесса + switch(this->debug){ + case 1: this->pss->update(status); break; + case 2: this->pss->status(status); break; + } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump substitutes letters", status); } } } @@ -952,7 +996,8 @@ void anyks::ASCb::write() const noexcept { case 1: this->pss->update(100); break; case 2: this->pss->status(100); break; } - } + // Выводим индикацию во внешнюю функцию + } else this->progressFn(L"Dump substitutes letters", 100); } } // Выполняем запись данных словаря @@ -1385,6 +1430,27 @@ void anyks::ASCb::setFilename(const string & filename) noexcept { // Если адрес файла передан, устанавливаем его if(!filename.empty()) this->filename = filename; } +/** + * setProgressFn Метод установки внешнего прогресс-бара + * @param fn функция внешнего прогресс-бара + */ +void anyks::ASCb::setProgressFn(function fn) noexcept { + // Зануляем основной пргресс-бар + this->pss = nullptr; + // Устанавливаем функцию внешнего прогресс-бара + this->progressFn = fn; +} +/** + * ASCb Конструктор + */ +anyks::ASCb::ASCb() noexcept { + // Устанавливаем внешнюю болванку прогресс-бара + this->progressFn = [](const wstring & text, const u_short status) noexcept { + // Блокируем варнинги на неиспользуемые переменные + (void) text; + (void) status; + }; +} /** * ASCb Конструктор * @param filename адрес файла словаря @@ -1398,6 +1464,12 @@ anyks::ASCb::ASCb(const string & filename, const string & password, const char * this->setFilename(filename); // Устанавливаем пароль шифрования словаря this->setPassword(password); + // Устанавливаем внешнюю болванку прогресс-бара + this->progressFn = [](const wstring & text, const u_short status) noexcept { + // Блокируем варнинги на неиспользуемые переменные + (void) text; + (void) status; + }; } /** * ~ASCb Деструктор diff --git a/src/dict.cpp b/src/dict.cpp index 2649b78..85fdc96 100644 --- a/src/dict.cpp +++ b/src/dict.cpp @@ -502,6 +502,22 @@ void anyks::Dict::setUWords(const map & words) noexcept { // Устанавливаем список слов this->alt.setUWords(words); } +/** + * setLMethod Метод установки функции получения леммы + * @param fn функция для установки + */ +void anyks::Dict::setLMethod(stemmer_t::stemming_t fn) noexcept { + // Устанавливаем функцию стемминга + if(fn != nullptr) this->stemmer->setLMethod(fn); +} +/** + * setVMethod Метод установки функции подбора вариантов + * @param fn функция для установки + */ +void anyks::Dict::setVMethod(stemmer_t::variants_t fn) noexcept { + // Устанавливаем функцию подбора вариантов + if(fn != nullptr) this->stemmer->setVMethod(fn); +} /** * setALM Метод установки языковой модели * @param alm объект языковой модели diff --git a/src/stemmer.cpp b/src/stemmer.cpp index 7d2c9d0..4034fb2 100644 --- a/src/stemmer.cpp +++ b/src/stemmer.cpp @@ -59,18 +59,18 @@ const bool anyks::Stemmer::check(const wstring & word) const noexcept { return result; } /** - * setLFunction Метод установки функции получения леммы + * setLMethod Метод установки функции получения леммы * @param fn функция для установки */ -void anyks::Stemmer::setLFunction(lemma_t fn) noexcept { +void anyks::Stemmer::setLMethod(stemming_t fn) noexcept { // Если функция передана, устанавливаем её if(fn != nullptr) this->lemmaFn = fn; } /** - * setVFunction Метод установки функции подбора вариантов + * setVMethod Метод установки функции подбора вариантов * @param fn функция для установки */ -void anyks::Stemmer::setVFunction(variants_t fn) noexcept { +void anyks::Stemmer::setVMethod(variants_t fn) noexcept { // Если функция передана, устанавливаем её if(fn != nullptr) this->variantsFn = fn; }