/***************************************************************************** ФОНЕТИЧЕСКИЙ АЛЕФ-АВТОМАТ. Именно его деятельность привносит в Систему особый шик распознавания слов, написанных НЕ СОВСЕМ верно, к примеру, с орфографическими ошибками. ВХОДНЫЕ ПАРАМЕТРЫ; proj - задание на проекцию, содержит мультилексему, реально присутствующую в исходном предложении. ВОЗВРАЩАЕМЫЙ РЕЗУЛЬТАТ: Через параметр proj возвращается список фонетических инвариантов дл слова-аргумента. *****************************************************************************/ void LexicalAutomat::ProducePhonInv(MLProjList &proj, int id_language, LA_RecognitionTrace *trace) { // В число оригиналов входят и "ломанные" int n_org = 1 + CastSizeToInt(proj.get_Broken().size()); std::set<lem::UCString> created_phonetic_variants; for (int iorg = 0; iorg < n_org; iorg++) { const RC_Lexem &word = !iorg ? proj.GetContent() : proj.get_Broken()[iorg - 1]; const Lexem &mlex = *word; // Сама исходная, неискаженная лексема также примет участие в микшировании. // Для однолексем брать оригинал не имеет смысла - его и так спроецировали. if (created_phonetic_variants.find(mlex) == created_phonetic_variants.end()) { created_phonetic_variants.insert(mlex); // Получим списки фонетических инвариантов для каждой из nlex лексем, // входящий в мультилексему. MCollect<LA_AA_list*> packs; LA_AA_list *list = new LA_AA_list; list->reserve(16); list->push_back(LA_AA_item(mlex, Real1(100))); // Теперь мутированные варианты. LA_Pack *pack = AlephAuto(id_language, mlex, proj.get_Miss_Parameter(), trace); for (Container::size_type j = 0; j < pack->size(); j++) { const Solarix::Lexem &ph_lex = *(pack->get(j)); if (created_phonetic_variants.find(ph_lex) == created_phonetic_variants.end()) { created_phonetic_variants.insert(ph_lex); list->push_back(LA_AA_item(ph_lex, pack->get(j)->get_Val())); } } delete pack; packs.push_back(list); const int NTOT = CastSizeToInt(packs.front()->size()); // Пропускаем начальную немутированную лексему for (int i = 1; i < NTOT; i++) { const LA_AA_item &x = packs.front()->get(i); Lexem *mutated = new Lexem(x); proj.AddPhonInv(RC_Lexem(mutated), x.val); } // Удаляем ненужные далее списки фонетических инвариантов для однолексем. ZAP_A(packs); // Отсортируем мутации по убыванию достоверности. proj.SortPhonInv(); /* // Можем журнализовать результат. const int ninv=proj.GetnPhonInv(); if( ninv && GetDebugLevel()>=2 ) { lem::LogFile::logfile->printf( "LA: Phonetic invariants production: %d item(s)\n", ninv ); for( int i=0; i<ninv; i++ ) { lem::LogFile::logfile->printf( "#%d ", i ); const RC_Lexem &ml = proj.GetPhonInv(i); lem::LogFile::logfile->printf( "%us\n", ml->c_str() ); } lem::LogFile::logfile->eol(); } */ } } // for - цикл по оригиналам return; }