[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