[voikko] Ääkkösbugi tokens-funktiossa

Hannu Väisänen hannu.vaisanen at uef.fi
Sun Jan 10 09:12:42 EET 2016


Kun teen ison tiedoston tämmöisellä ohjelmalla

$ cat 0.sh
#!/bin/bash
gawk 'BEGIN{
  for (i = 0; i < 500000; i++) {
    print "Kissa on 29 vuotta vanha... Onhan se silloin vanha. "
  }
}'

./0.sh >0.dat

kaikki menee hyvin, mutta kun muutan sanan "Kissa" sanaksi "Kissä",
tokens() jää ikuiseen silmukkaan:

$ ./voikkotester.sh 0.dat
Sun Jan 10 09:03:05 EET 2016
27000000[Kissä] 0
26999994[ ] 5
26999993[on] 6
26999991[ ] 8
26999990[29] 9
26999988[ ] 11
26999987[vuotta] 12
26999981[ ] 18
26999980[vanha] 19
26999975[...] 24
26999972[] 27
26999972[] 27
26999972[] 27
26999972[] 27



Funktioon tokensNonNull() olen lisännyt tulostuslauseen

            String tokenText = text.substring(textStart, textStart + tokenLen);
System.out.println (bytesLen + "[" + tokenText + "] " + textStart);



Testausohjelma:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Date;
import java.util.List;
import org.puimula.libvoikko.*;


public class VoikkoTester {
  public static void main (String[] args)
  {
    try {
      voikko = new Voikko ("fi", VOIKKO_PATH);

      if (args.length == 0) throw new RuntimeException ("Tiedoston nimi puuttuu.");

      for (int i = 0; i < args.length; i++) {
        Reader reader = new FileReader (args[i]);
        test (reader);
      } 
    }
    catch (Throwable t)
    {
      System.out.println (t.getMessage());
      t.printStackTrace (System.out);
      Throwable u = t.getCause();
      if (u != null) System.out.println (u.getMessage());
    }
  }


  private static void test (Reader reader)
    throws FileNotFoundException, IOException
  {
    fillBuffer (reader);

    System.out.println ((new Date()));
    List<Token> list = voikko.tokens (sb.toString());
    System.out.println ((new Date()));
  }


  private static void fillBuffer (Reader input) throws IOException
  {
    int len;
    sb.setLength (0);
    while ((len = input.read (buffer)) > 0) {
      sb.append (buffer, 0, len);
    }
  }


  private static StringBuilder sb = new StringBuilder();
  private final static char[] buffer = new char[8192];

  private static final String HOME = System.getProperty ("user.home");
  private static final String VOIKKO_PATH = HOME + "/vvfst/voikkodict";
  private static Voikko voikko;
}

=====================

Ja ohjelma, jolla ajan testausohjelmaa

$ cat voikkotester.sh
#!/bin/bash

CP=.
CP=${CP}:$HOME/.m2/repository/net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar
CP=${CP}:$HOME/.m2/repository/org/puimula/voikko/libvoikko/4.0.1-SNAPSHOT/libvoikko-4.0.1-SNAPSHOT.jar

 javac -cp ${CP} VoikkoTester.java


if test $? -eq 0 ; then
  java -cp ${CP} -Djna.library.path=$HOME/vvfst/lib VoikkoTester $@
fi


More information about the voikko mailing list