[voikko-devel] Ehdotus: lisäys libvoikkoon

Harri Pitkänen hatapitk at cc.jyu.fi
Thu Jan 11 14:27:00 EET 2007


On Thursday 11 January 2007 07:53, Hannu Väisänen wrote:
> On Wed, Jan 10, 2007 at 07:31:05PM +0200, Harri Pitkänen wrote:
> > Hmm. Mahtaakohan tuollainen toimia kunnolla todellisissa sovelluksissa?
> > Tämähän tarkoittaisi sitä, että kutsuva sovellus itse käyttää suoraan
> > Suomi-malagan Voikko-versiota, enkä heti kyllä keksi mikä muu kuin
> > libvoikko voisi järkevästi niin tehdä. Sukija ei ainakaan niin
> > tietääkseni tee :)
>
> Tarkoitus onkin käyttää Suomi-malagan Sukija-versiota (-:
> ja funktiota voikko_suggest_ucs4. Jotenkin näin:
>
> iterator first (worddb->get_word_db(), DB_NEXT);
> iterator last;
>
> for ( ; first != last; ++first) {
>   if (malaga ei tunnista sanaa *first) {
>     wchar_t **w = voikko_suggest_ucs4 (handle, first->c_str());
>     if (w) {
>       for (wchar_t **i = w; *i; ++i) {
>         if (malaga tunnistaa sanan *i) {
>           tallenna sanan *i perusmuoto perusmuototietokantaan
>         }
>       }
>     }
>   }
> }
>
> Äääh!!! Voiko tuo ylipäänsä toimia, sillä voikko_suggest_ucs4 näköjään
> käyttää Suomi-malagan Voikko-versiota, ja Sukija tarvitsee tietenkin
> Sukija-version. Minulla kun oli sellainen mielikuva, että
> suggest-funktiot eivät käytä malagaa ollenkaan.

Niinpä. Ne valitettavasti käyttävät, joten tuo ei toimi.

> > Jos sovelluksen on käytettävä sekä malagaa että libvoikkoa suoraan,
> > parempi olisi toimia jotenkin seuraavasti:
> >
> > terminate_libmalaga();
> > const char * voikko_error = voikko_init(&handle, "fi_FI", 0);
> > [ käytetään Voikkoa mihin käytetään ]
> > voikko_terminate(handle);
> > init_libmalaga(sovelluksen_oma_malaga_projekti);
>
> Siis näin...
>
> iterator first (worddb->get_word_db(), DB_NEXT);
> iterator last;
> for ( ; first != last; ++first) {
>   if (malaga ei tunnista sanaa *first) {
> x    terminate_libmalaga();
> x    const char * voikko_error = voikko_init(&handle, "fi_FI", 0);
> x    wchar_t **w = voikko_suggest_ucs4 (handle, first->c_str());
> x    voikko_terminate(handle);
> x    init_libmalaga(sovelluksen_oma_malaga_projekti)
>     if (w) {
>       for (wchar_t **i = w; *i; ++i) {
>         if (malaga tunnistaa sanan *i) {
>           tallenna sanan *i perusmuoto perusmuototietokantaan
>         }
>       }
>     }
>   }
> }
>
> x:llä merkityt rivit voi paketoida funktion tai luokan sisälle.
>
> Suoritusajan kannalta on tietysti parempi, että tunnistamattomat sanat
> tallennetaan väliaikaisesti johonkin ja yritetään tunnistaa
> voikko_suggest_ucs4:n avulla kaikki yhdellä kertaa.

Tuon pitäisi jotakuinkin toimia. Korjausehdotusten varaama muisti pitää itse 
vapauttaa (ellei sitä halua käyttää), eli

if (w) {
  for (wchar_t **i = w; *i; ++i) {
    if (malaga tunnistaa sanan *i) {
      tallenna sanan *i perusmuoto perusmuototietokantaan
    }
    free(*i);
  }
  free(w);
}


Harri



More information about the devel mailing list