Пример #1
0
/*****************************************************************************

                         ФОНЕТИЧЕСКИЙ АЛЕФ-АВТОМАТ.

  Именно его деятельность привносит в Систему особый шик распознавания слов,
  написанных НЕ СОВСЕМ верно, к примеру, с орфографическими ошибками.

  ВХОДНЫЕ ПАРАМЕТРЫ;

   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;
}