[voikko] Malaga-Javan uusi versio julkaistu

Harri Pitkänen hatapitk at iki.fi
Tue Feb 17 18:25:25 EET 2009


On Tuesday 17 February 2009, Hannu Väisänen wrote:
> Niin, ja päämäärä on saada Suomi-Malaga toimimaan Nutchin kanssa:
> http://lucene.apache.org/nutch/

OK, tuo selventää hieman asiaa. Siihen tarkoitukseen tuo on varmasti toimiva, 
tosin en Nutchia tunne niin en voi asiasta juuri sanoa.

Jos kuitenkin haluat tehdä tästä rajapinnasta yleiskäyttöisemmän, kannattaa 
ehkä tehdä muutama asia eri tavalla.

- Ainakaan alustuksessa ei kannata silloin kutsuta System.exit-metodia, koska 
silloin sovelluksella ei ole mahdollisuutta toipua virheestä (vrt. 
tekstinkäsittelyohjelma, joka sulkeutuu välittömästi ilman näkyvää 
virheilmoitusta, jos käyttäjä yrittää avata tiedostoa, jota ei ole olemassa).

- Nykyinen analyze-metodi tuntui kutsumuodoltaan minusta hiukan hankalalta 
käyttää, vaikka ehkäpä se on tehokkain ja yksinkertaisin juuri Nutchin 
käyttöön.

> > Ehkä lisäksi kannattaisi tarkistaa, että jos alustusmetodia kutsutaan
> > toisen kerran kun malaga on jo alustettu, oliko pyydetty projektitiedosto
> > sama kuin se, millä alustus alun perin tehtiin. Jos tiedosto ei ole sama,
> > kannattaa heittää poikkeus, jotta kutsuva puoli saa tietää, ettei se
> > saanutkaan haluamaansa tiedostoa käyttöön, vaan siellä on auki joku muu
> > projekti.
>
> Miksi? Malagaa ei saa alustaa kahdesti, mutta useampi kuin yksi
> alustusyritys ei välttämättä ole virhe.

En välttämättä virhe, mutta jos kutsuja ei voi tietää, mikä käytössä oleva 
projektitiedosto sattuu olemaan, voi siitä syntyä ongelmia. (Vrt. 
tekstinkäsittelyohjelma, joka avaa ensimmäisen tiedoston oikein, mutta 
seuraaville tiedostoille se antaa aina saman sisällön kuin ensimmäiselle.)

Hahmottelin alle hiukan toisenlaisen rajapinnan, jossa nuo edellä mainitut 
ongelmat on korjattu. Täydellinen ei tämäkään vielä ole, esim. 
yksikkötestauksen helpottamiseksi voisi vielä erillisen tehdasluokan 
MalagaAnalyzer.getInstance-metodin tilalle. Alla olevaa koodia ei ole 
mitenkään testattu, eihän siinä ole edes kaikille metodeille täyttä 
toteutusta. Mutta toivottavasti edes idea selvenee.

Harri



/**
 * Interface for a general morphological analyzer that implements
 * a relation between sets of strings.
 */
public interface MorphologicalAnalyzer {

  /**
   * Return a list of analysis results for a word.
   */
  public Set<String> analyze(String word);

}

class MalagaAnalyzer implements MorphologicalAnalyzer {

  private String projectFile;

  /** Private constructor to prevent direct instantiation */
  private MalagaAnalyzer() {  }

  private void init() throws MorphologicalAnalyzerInitializationException {
    if (projectFile == null) {
      // Set projectFile to the default
    }
    // Initialize malaga using the project file, throw
    // MorphologicalAnalyzerInitializationException if that fails.
  }

  public synchronized Set<String> analyze(String word) {
    // Analyze the word and return the results as a list of Strings.
    // If the word is not recognized return an empty set.
  }

  protected void finalize throws Throwable() {
    // Release the malaga project
  }

  private static MalagaAnalyzer theAnalyzer;

  public static synchronized MorphologicalAnalyzer getInstance()
      throws MorphologicalAnalyzerInitializationException {
    if (theAnalyzer == null) {
      MalagaAnalyzer analyzer = new MalagaAnalyzer();
      analyzer.init();
      theAnalyzer = analyzer;
    }
    return theAnalyzer;
  }

  public static synchronized MorphologicalAnalyzer
      getInstanceWithProject(String projectFile)
      throws MorphologicalAnalyzerInitializationException,
             CannotChangeProjectFileException {
    if (theAnalyzer == null) {
      MalagaAnalyzer analyzer = new MalagaAnalyzer();
      analyzer.projectFile = projectFile;
      analyzer.init();
      theAnalyzer = analyzer;
    }
    else if (projectFile != null &&
             !projectFile.equals(theAnalyxer.projectFile)) {
      throw new CannotChangeProjectFileException(
          "Already initialized with different project file "
          + theAnalyzer.projectFile);
    }
    return theAnalyzer;
  }

}

/**
 * Example program to print analysis results for some strings.
 */
class Example {

  public static void main(String[] args) {
    try {
      MorphologicalAnalyzer analyzer =
          MalagaAnalyzer.getInstance("/some/file.pro");
      for (String arg: args) {
        System.out.println("Analysis results for '" + arg + "'");
        for (String result: analyzer.analyze(arg)) {
          System.out.println(result);
        }
      }
    }
    catch (CannotChangeProjectFileException e) {
      // Will never happen here, but in a complex program this is possible.
      System.err.println("Malaga was initialized with wrong project file");
    }
    catch (MorphologicalAnalyzerInitializationException e) {
      System.err.println("Something went wrong while initializing Malaga");
    }
  }
}



More information about the voikko mailing list