Skip to content

Commit b0b1f65

Browse files
committed
v1.0.6 исправление багов
1 parent 1798e38 commit b0b1f65

File tree

7 files changed

+70
-43
lines changed

7 files changed

+70
-43
lines changed

ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# [Change Log](https://github.com/anyks/asc/archive/release.tar.gz)
22

3+
## [1.0.6](https://github.com/anyks/asc/archive/v1.0.6.tar.gz) Bug fixes
4+
35
## [1.0.5](https://github.com/anyks/asc/archive/v1.0.5.tar.gz) Bug fixes
46

57
## [1.0.4](https://github.com/anyks/asc/archive/v1.0.4.tar.gz) Bug fixes

app/asc.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// Название языковой модели
1010
#define ANYKS_ASC_NAME "asc"
1111
// Версия приложения
12-
#define ANYKS_ASC_VERSION "1.0.5"
12+
#define ANYKS_ASC_VERSION "1.0.6"
1313
// Версия словаря
1414
#define ANYKS_ASC_DICT_VERSION "1.0.0"
1515
// Автор приложения

include/dict.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ namespace anyks {
5454
enum class options_t : u_short {
5555
debug, // Флаг режима отладки
5656
bloom, // Флаг разрешающий использовать фильтр Блума
57-
nopython, // Флаг запрещающий инициализацию питона
5857
stemming, // Флаг активации стемминга
5958
onlytypos // Флаг исправления только опечаток
6059
};
@@ -115,7 +114,7 @@ namespace anyks {
115114
// Идентификатор конца строки
116115
wchar_t elid;
117116
// Флаги параметров
118-
bitset <5> options;
117+
bitset <4> options;
119118
// Размер эмбеддинга
120119
u_short sizeEmbedding = 0;
121120
// Количество вариантов для анализа

src/ascb.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -229,13 +229,13 @@ void anyks::ASCb::read() noexcept {
229229
// Если опции языковой модели получены
230230
if(optionsAlm > 0){
231231
// Получаем опции языковой модели
232-
bitset <5> options = optionsAlm;
232+
bitset <4> options = optionsAlm;
233233
// Если установлена опция - использования только слов из белого списка
234-
if(options.test(2)) this->alm->setOption(alm_t::options_t::onlyGood);
234+
if(options.test(1)) this->alm->setOption(alm_t::options_t::onlyGood);
235235
// Если установлена опция - детектирования слова из смешанных словарей
236-
if(options.test(3)) this->alm->setOption(alm_t::options_t::mixdicts);
236+
if(options.test(2)) this->alm->setOption(alm_t::options_t::mixdicts);
237237
// Если установлена опция - разрешающая загружать n-граммы из arpa так-как они есть
238-
if(options.test(4)) this->alm->setOption(alm_t::options_t::confidence);
238+
if(options.test(3)) this->alm->setOption(alm_t::options_t::confidence);
239239
}
240240
// Если список пользовательских токенов получен
241241
if(!userTokensAlm.empty()){
@@ -1229,17 +1229,17 @@ void anyks::ASCb::info() const noexcept {
12291229
// Если опции языковой модели получены, устанавливаем
12301230
if(optionsAlm > 0){
12311231
// Получаем опции языковой модели
1232-
bitset <5> options = optionsAlm;
1232+
bitset <4> options = optionsAlm;
12331233
// Если установлена опция - использования только слов из белого списка
1234-
if(options.test(2)) info.append("* Only good words: YES\r\n");
1234+
if(options.test(1)) info.append("* Only good words: YES\r\n");
12351235
// Если опция не установлена
12361236
else info.append("* Only good words: NO\r\n");
12371237
// Если установлена опция - детектирования слова из смешанных словарей
1238-
if(options.test(3)) info.append("* Mix words in dicts: YES\r\n");
1238+
if(options.test(2)) info.append("* Mix words in dicts: YES\r\n");
12391239
// Если опция не установлена
12401240
else info.append("* Mix words in dicts: NO\r\n");
12411241
// Если установлена опция - разрешающая загружать n-граммы из arpa так-как они есть
1242-
if(options.test(4)) info.append("* Confidence arpa: YES\r\n\r\n");
1242+
if(options.test(3)) info.append("* Confidence arpa: YES\r\n\r\n");
12431243
// Если опция не установлена
12441244
else info.append("* Confidence arpa: NO\r\n\r\n");
12451245
}

src/dict.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -537,13 +537,13 @@ void anyks::Dict::setALM(alm_t * alm) noexcept {
537537
// Добавляем альтернативное слово
538538
this->alt.add(word, true, idw);
539539
});
540-
// Если флаг запрещения использовать Python не установлен
541-
if(!this->isOption(options_t::nopython)){
542-
// Получаем объект внешний объект питона
543-
const python_t * obj = this->stemmer->getPythonObj();
544-
// Устанавливаем объект питона
545-
if(obj != nullptr) this->alm->setPythonObj(const_cast <python_t *> (obj));
546-
}
540+
// Если работа идет не изнутри Python
541+
#ifndef NOPYTHON
542+
// Получаем объект внешний объект питона
543+
const python_t * obj = this->stemmer->getPythonObj();
544+
// Устанавливаем объект питона
545+
if(obj != nullptr) this->alm->setPythonObj(const_cast <python_t *> (obj));
546+
#endif
547547
}
548548
}
549549
/**
@@ -591,11 +591,14 @@ void anyks::Dict::setLogfile(const char * logfile) noexcept {
591591
* @param option опция для установки
592592
*/
593593
void anyks::Dict::setOption(const options_t option) noexcept {
594+
// Если работа идет не изнутри Python
595+
#ifndef NOPYTHON
594596
// Если это режим отладки
595-
if((option == options_t::debug) && !this->isOption(options_t::nopython)){
597+
if(option == options_t::debug){
596598
// Устанавливаем режим отладки модуля питона
597599
const_cast <python_t *> (this->stemmer->getPythonObj())->setDebug();
598600
}
601+
#endif
599602
// Устанавливаем опции
600603
this->options.set((u_short) option);
601604
}
@@ -1674,13 +1677,11 @@ const list <wstring> anyks::Dict::variants(const wstring & word) const noexcept
16741677
wstring words = L"";
16751678
// Переходим по всему списку вариантов
16761679
for(auto & item : result){
1680+
// Если слово уже не пустое, добавляем разделитель
1681+
if(!words.empty()) words.append(L"|");
16771682
// Добавляем в список вариантов, полученный вариант
16781683
words.append(item);
1679-
// Добавляем разделитель
1680-
words.append(L"|");
16811684
}
1682-
// Удаляем последний элемент
1683-
words.pop_back();
16841685
// Выводим основное сообщение отладки
16851686
this->alphabet->log("stemming: [%ls => %ls]\r\n", alphabet_t::log_t::info, this->logfile, word.c_str(), words.c_str());
16861687
}

src/stemmer.cpp

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const bool anyks::Stemmer::check(const wstring & word) const noexcept {
5151
// Если слово передано
5252
if(!word.empty()){
5353
// Если это не первый или последний дефис
54-
result = ((word[0] != L'-') && (word[word.length() - 1] != L'-'));
54+
result = ((word.front() != L'-') && (word.back() != L'-'));
5555
// Если слово прошло проверку
5656
if(result) result = !this->alphabet->isANumber(word);
5757
}
@@ -79,16 +79,22 @@ void anyks::Stemmer::setVMethod(variants_t fn) noexcept {
7979
* @param script python скрипт для установки
8080
*/
8181
void anyks::Stemmer::setLScript(const string & script) noexcept {
82+
// Если работа идет не изнутри Python
83+
#ifndef NOPYTHON
8284
// Если скрипт передан, устанавливаем его
8385
if(!script.empty() && (this->script != nullptr)) this->lemmaScript = this->script->add(script, 2);
86+
#endif
8487
}
8588
/**
8689
* setVScript Метод установки скрипта подбора вариантов
8790
* @param script python скрипт для установки
8891
*/
8992
void anyks::Stemmer::setVScript(const string & script) noexcept {
93+
// Если работа идет не изнутри Python
94+
#ifndef NOPYTHON
9095
// Если скрипт передан, устанавливаем его
9196
if(!script.empty() && (this->script != nullptr)) this->variantsScript = this->script->add(script, 2);
97+
#endif
9298
}
9399
/**
94100
* setTokenizer Метод установки токенизатора
@@ -99,6 +105,8 @@ void anyks::Stemmer::setTokenizer(const tokenizer_t * tokenizer){
99105
if(tokenizer != nullptr){
100106
// Устанавливаем модуль генератора
101107
this->tokenizer = tokenizer;
108+
// Если работа идет не изнутри Python
109+
#ifndef NOPYTHON
102110
// Если внешняя функция не установлена
103111
if((this->lemmaFn == nullptr) && (this->variantsFn == nullptr) && (this->script == nullptr)){
104112
try {
@@ -110,6 +118,7 @@ void anyks::Stemmer::setTokenizer(const tokenizer_t * tokenizer){
110118
exit(EXIT_FAILURE);
111119
}
112120
}
121+
#endif
113122
}
114123
}
115124
/**
@@ -139,26 +148,29 @@ const wstring anyks::Stemmer::lemma(const wstring & word, const wstring & code)
139148
wstring result = L"";
140149
// Если слово передано и скрипт загружен
141150
if(!word.empty() && !code.empty() && ((this->lemmaFn != nullptr) || (this->lemmaScript > 0)) && this->check(word)){
142-
// Блокируем остальные потоки до завершения работы скрипта
143-
this->locker.lock();
151+
// Код языка к которому принадлежит слово
152+
wstring lang = code;
144153
// Если это русский язык, проверяем на латиницу
145-
if((code.compare(L"en") != 0) && this->alphabet->isLatian(word))
146-
// Устанавливаем код языка, по умолчанию
147-
const_cast <wstring *> (&code)->assign(L"en");
154+
if((lang.compare(L"en") != 0) && this->alphabet->isLatian(word)) lang = L"en";
148155
// Если внешняя функция установлена
149-
if(this->lemmaFn != nullptr) result = this->lemmaFn(word, code);
156+
if(this->lemmaFn != nullptr) result = this->lemmaFn(word, lang);
157+
// Если работа идет не изнутри Python
158+
#ifndef NOPYTHON
150159
// Если скрипт Python установлен
151160
else if(this->script != nullptr){
161+
// Блокируем остальные потоки до завершения работы скрипта
162+
this->locker.lock();
152163
// Выполняем скрипт для получения вариантов
153164
result = this->script->run(
154165
this->lemmaScript, {
155166
this->alphabet->convert(word),
156-
this->alphabet->convert(code)
167+
this->alphabet->convert(lang)
157168
}
158169
);
170+
// Разблокируем остальные потоки
171+
this->locker.unlock();
159172
}
160-
// Разблокируем остальные потоки
161-
this->locker.unlock();
173+
#endif
162174
}
163175
// Выводим результат
164176
return result;
@@ -174,28 +186,31 @@ const list <wstring> anyks::Stemmer::variants(const wstring & word, const wstrin
174186
list <wstring> result;
175187
// Если слово передано и скрипт загружен
176188
if(!word.empty() && !code.empty() && ((this->variantsFn != nullptr) || (this->variantsScript > 0)) && this->check(word)){
177-
// Блокируем остальные потоки до завершения работы скрипта
178-
this->locker.lock();
189+
// Код языка к которому принадлежит слово
190+
wstring lang = code;
179191
// Если это русский язык, проверяем на латиницу
180-
if((code.compare(L"en") != 0) && this->alphabet->isLatian(word))
181-
// Устанавливаем код языка, по умолчанию
182-
const_cast <wstring *> (&code)->assign(L"en");
192+
if((lang.compare(L"en") != 0) && this->alphabet->isLatian(word)) lang = L"en";
183193
// Если функция подборки вариантов установлена
184-
if(this->variantsFn != nullptr) result = this->variantsFn(word, code);
194+
if(this->variantsFn != nullptr) result = this->variantsFn(word, lang);
195+
// Если работа идет не изнутри Python
196+
#ifndef NOPYTHON
185197
// Если функция подборки вариантов не передана
186198
else if(this->script != nullptr) {
199+
// Блокируем остальные потоки до завершения работы скрипта
200+
this->locker.lock();
187201
// Выполняем скрипт для получения вариантов
188202
const wstring & res = this->script->run(
189203
this->variantsScript, {
190204
this->alphabet->convert(word),
191-
this->alphabet->convert(code)
205+
this->alphabet->convert(lang)
192206
}
193207
);
208+
// Разблокируем остальные потоки
209+
this->locker.unlock();
194210
// Если результат получен
195211
if(!res.empty()) this->alphabet->split(res, L"|", result);
196212
}
197-
// Разблокируем остальные потоки
198-
this->locker.unlock();
213+
#endif
199214
// Если результат получен
200215
if(!result.empty()){
201216
// Выполняем сортировку
@@ -238,6 +253,16 @@ anyks::Stemmer::Stemmer(const alphabet_t * alphabet, const tokenizer_t * tokeniz
238253
* ~Stemmer Деструктор
239254
*/
240255
anyks::Stemmer::~Stemmer() noexcept {
256+
// Если работа идет не изнутри Python
257+
#ifndef NOPYTHON
241258
// Если объект создан, удаляем его
242259
if(this->script != nullptr) delete this->script;
260+
#endif
261+
/**
262+
* Так и не понял этот баг
263+
* Деструктор отрабатывает но из-за установленной функции lemmaFn поток блокируется намертво
264+
* Игры с py::gil_scoped_release ничего не дали, блокировки в любом случае есть
265+
* По этому просто выходим из приложения, по завершению работы деструктора
266+
*/
267+
exit(0);
243268
}

0 commit comments

Comments
 (0)