Repository: opennlp Updated Branches: refs/heads/master a13691b5b -> 1484f1d63
OPENNLP-1086: Refactor the Data Indexers The following has been done: - Use Java 8 streams where it makes sense - Deduplicate the index method and have one common one - Avoid having all predicate Strings twice in memory for cutoff filter Project: http://git-wip-us.apache.org/repos/asf/opennlp/repo Commit: http://git-wip-us.apache.org/repos/asf/opennlp/commit/1484f1d6 Tree: http://git-wip-us.apache.org/repos/asf/opennlp/tree/1484f1d6 Diff: http://git-wip-us.apache.org/repos/asf/opennlp/diff/1484f1d6 Branch: refs/heads/master Commit: 1484f1d637b4d33490d15a905d8d736de850e9b5 Parents: a13691b Author: Jörn Kottmann <[email protected]> Authored: Tue May 30 11:21:14 2017 +0200 Committer: Jörn Kottmann <[email protected]> Committed: Tue Jun 6 17:10:25 2017 +0200 ---------------------------------------------------------------------- .../tools/ml/model/AbstractDataIndexer.java | 67 +++++++++--- .../tools/ml/model/OnePassDataIndexer.java | 95 ++++------------- .../ml/model/OnePassRealValueDataIndexer.java | 55 +--------- .../tools/ml/model/TwoPassDataIndexer.java | 101 +++++-------------- .../opennlp/tools/eval/ArvoresDeitadasEval.java | 4 +- .../tools/eval/Conll02NameFinderEval.java | 12 +-- .../opennlp/tools/eval/ConllXPosTaggerEval.java | 2 +- 7 files changed, 110 insertions(+), 226 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/opennlp/blob/1484f1d6/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractDataIndexer.java ---------------------------------------------------------------------- diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractDataIndexer.java b/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractDataIndexer.java index be6a6e4..3a3fb73 100644 --- a/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractDataIndexer.java +++ b/opennlp-tools/src/main/java/opennlp/tools/ml/model/AbstractDataIndexer.java @@ -17,14 +17,20 @@ package opennlp.tools.ml.model; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import opennlp.tools.ml.AbstractTrainer; import opennlp.tools.util.InsufficientTrainingDataException; +import opennlp.tools.util.ObjectStream; import opennlp.tools.util.TrainingParameters; @@ -152,6 +158,35 @@ public abstract class AbstractDataIndexer implements DataIndexer { return numUniqueEvents; } + protected List<ComparableEvent> index(ObjectStream<Event> events, + Map<String, Integer> predicateIndex) throws IOException { + Map<String, Integer> omap = new HashMap<>(); + + List<ComparableEvent> eventsToCompare = new ArrayList<>(); + + Event ev; + while ((ev = events.read()) != null) { + + omap.putIfAbsent(ev.getOutcome(), omap.size()); + + int[] cons = Arrays.stream(ev.getContext()) + .map(pred -> predicateIndex.get(pred)) + .filter(Objects::nonNull) + .mapToInt(i -> i).toArray(); + + // drop events with no active features + if (cons.length > 0) { + int ocID = omap.get(ev.getOutcome()); + eventsToCompare.add(new ComparableEvent(ocID, cons, ev.getValues())); + } else { + display("Dropped event " + ev.getOutcome() + ":" + + Arrays.asList(ev.getContext()) + "\n"); + } + } + outcomeLabels = toIndexedStringArray(omap); + predLabels = toIndexedStringArray(predicateIndex); + return eventsToCompare; + } public int getNumEvents() { return numEvents; @@ -163,17 +198,14 @@ public abstract class AbstractDataIndexer implements DataIndexer { * @param predicateSet The set of predicates which will be used for model building. * @param counter The predicate counters. * @param cutoff The cutoff which determines whether a predicate is included. + * @deprecated will be removed after 1.8.1 release */ + @Deprecated protected static void update(String[] ec, Set<String> predicateSet, Map<String,Integer> counter, int cutoff) { for (String s : ec) { - Integer i = counter.get(s); - if (i == null) { - counter.put(s, 1); - } - else { - counter.put(s, i + 1); - } + counter.merge(s, 1, (value, one) -> value + one); + if (!predicateSet.contains(s) && counter.get(s) >= cutoff) { predicateSet.add(s); } @@ -181,6 +213,17 @@ public abstract class AbstractDataIndexer implements DataIndexer { } /** + * Updates the set of predicated and counter with the specified event contexts. + * @param ec The contexts/features which occur in a event. + * @param counter The predicate counters. + */ + protected static void update(String[] ec, Map<String,Integer> counter) { + for (String s : ec) { + counter.merge(s, 1, (value, one) -> value + one); + } + } + + /** * Utility method for creating a String[] array from a map whose * keys are labels (Strings) to be stored in the array and whose * values are the indices (Integers) at which the corresponding @@ -188,14 +231,10 @@ public abstract class AbstractDataIndexer implements DataIndexer { * * @param labelToIndexMap a <code>TObjectIntHashMap</code> value * @return a <code>String[]</code> value - * @since maxent 1.2.6 */ - protected static String[] toIndexedStringArray(Map<String,Integer> labelToIndexMap) { - final String[] array = new String[labelToIndexMap.size()]; - for (String label : labelToIndexMap.keySet()) { - array[labelToIndexMap.get(label)] = label; - } - return array; + protected static String[] toIndexedStringArray(Map<String, Integer> labelToIndexMap) { + return labelToIndexMap.entrySet().stream().sorted(Comparator.comparingInt(Map.Entry::getValue)) + .map(Map.Entry::getKey).toArray(String[]::new); } public float[][] getValues() { http://git-wip-us.apache.org/repos/asf/opennlp/blob/1484f1d6/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassDataIndexer.java ---------------------------------------------------------------------- diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassDataIndexer.java b/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassDataIndexer.java index cf8fb7f..2f9c719 100644 --- a/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassDataIndexer.java +++ b/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassDataIndexer.java @@ -18,17 +18,13 @@ package opennlp.tools.ml.model; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Set; import opennlp.tools.util.ObjectStream; +import opennlp.tools.util.ObjectStreamUtils; /** * An indexer for maxent model data which handles cutoffs for uncommon @@ -44,28 +40,24 @@ public class OnePassDataIndexer extends AbstractDataIndexer { int cutoff = trainingParameters.getIntParameter(CUTOFF_PARAM, CUTOFF_DEFAULT); boolean sort = trainingParameters.getBooleanParameter(SORT_PARAM, SORT_DEFAULT); - Map<String, Integer> predicateIndex = new HashMap<>(); - List<Event> events; - List<ComparableEvent> eventsToCompare; + long start = System.currentTimeMillis(); - display("Indexing events using cutoff of " + cutoff + "\n\n"); + display("Indexing events with OnePass using cutoff of " + cutoff + "\n\n"); display("\tComputing event counts... "); - events = computeEventCounts(eventStream, predicateIndex, cutoff); + Map<String, Integer> predicateIndex = new HashMap<>(); + List<Event> events = computeEventCounts(eventStream, predicateIndex, cutoff); display("done. " + events.size() + " events\n"); display("\tIndexing... "); - eventsToCompare = index(events, predicateIndex); - // done with event list - events = null; - // done with predicates - predicateIndex = null; + List<ComparableEvent> eventsToCompare = + index(ObjectStreamUtils.createObjectStream(events), predicateIndex); display("done.\n"); display("Sorting and merging events... "); sortAndMerge(eventsToCompare, sort); - display("Done indexing.\n"); + display(String.format("Done indexing in %.2f s.\n", (System.currentTimeMillis() - start) / 1000d)); } /** @@ -84,71 +76,26 @@ public class OnePassDataIndexer extends AbstractDataIndexer { */ private List<Event> computeEventCounts(ObjectStream<Event> eventStream, Map<String, Integer> predicatesInOut, int cutoff) throws IOException { - Set<String> predicateSet = new HashSet<>(); + Map<String, Integer> counter = new HashMap<>(); List<Event> events = new LinkedList<>(); Event ev; while ((ev = eventStream.read()) != null) { events.add(ev); - update(ev.getContext(), predicateSet, counter, cutoff); + update(ev.getContext(), counter); } - predCounts = new int[predicateSet.size()]; - int index = 0; - for (Iterator<String> pi = predicateSet.iterator(); pi.hasNext(); index++) { - String predicate = pi.next(); - predCounts[index] = counter.get(predicate); - predicatesInOut.put(predicate, index); - } - return events; - } - protected List<ComparableEvent> index(List<Event> events, - Map<String, Integer> predicateIndex) { - Map<String, Integer> omap = new HashMap<>(); - - int numEvents = events.size(); - int outcomeCount = 0; - List<ComparableEvent> eventsToCompare = new ArrayList<>(numEvents); - List<Integer> indexedContext = new ArrayList<>(); - - for (Event ev:events) { - String[] econtext = ev.getContext(); - ComparableEvent ce; - - int ocID; - String oc = ev.getOutcome(); - - if (omap.containsKey(oc)) { - ocID = omap.get(oc); - } else { - ocID = outcomeCount++; - omap.put(oc, ocID); - } - - for (String pred : econtext) { - if (predicateIndex.containsKey(pred)) { - indexedContext.add(predicateIndex.get(pred)); - } - } - - // drop events with no active features - if (indexedContext.size() > 0) { - int[] cons = new int[indexedContext.size()]; - for (int ci = 0; ci < cons.length; ci++) { - cons[ci] = indexedContext.get(ci); - } - ce = new ComparableEvent(ocID, cons); - eventsToCompare.add(ce); - } else { - display("Dropped event " + ev.getOutcome() + ":" - + Arrays.asList(ev.getContext()) + "\n"); - } - // recycle the TIntArrayList - indexedContext.clear(); + String[] predicateSet = counter.entrySet().stream() + .filter(entry -> entry.getValue() >= cutoff) + .map(Map.Entry::getKey).sorted() + .toArray(String[]::new); + + predCounts = new int[predicateSet.length]; + for (int i = 0; i < predicateSet.length; i++) { + predCounts[i] = counter.get(predicateSet[i]); + predicatesInOut.put(predicateSet[i], i); } - outcomeLabels = toIndexedStringArray(omap); - predLabels = toIndexedStringArray(predicateIndex); - return eventsToCompare; - } + return events; + } } http://git-wip-us.apache.org/repos/asf/opennlp/blob/1484f1d6/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassRealValueDataIndexer.java ---------------------------------------------------------------------- diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassRealValueDataIndexer.java b/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassRealValueDataIndexer.java index a5abb34..2cb23b2 100644 --- a/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassRealValueDataIndexer.java +++ b/opennlp-tools/src/main/java/opennlp/tools/ml/model/OnePassRealValueDataIndexer.java @@ -17,11 +17,7 @@ package opennlp.tools.ml.model; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import opennlp.tools.util.InsufficientTrainingDataException; @@ -41,7 +37,7 @@ public class OnePassRealValueDataIndexer extends OnePassDataIndexer { return values; } - protected int sortAndMerge(List<ComparableEvent> eventsToCompare,boolean sort) + protected int sortAndMerge(List<ComparableEvent> eventsToCompare, boolean sort) throws InsufficientTrainingDataException { int numUniqueEvents = super.sortAndMerge(eventsToCompare,sort); values = new float[numUniqueEvents][]; @@ -55,53 +51,4 @@ public class OnePassRealValueDataIndexer extends OnePassDataIndexer { } return numUniqueEvents; } - - @Override - protected List<ComparableEvent> index(List<Event> events, Map<String,Integer> predicateIndex) { - Map<String,Integer> omap = new HashMap<>(); - - int numEvents = events.size(); - int outcomeCount = 0; - List<ComparableEvent> eventsToCompare = new ArrayList<>(numEvents); - List<Integer> indexedContext = new ArrayList<>(); - - for (Event ev:events) { - String[] econtext = ev.getContext(); - ComparableEvent ce; - - int ocID; - String oc = ev.getOutcome(); - - if (omap.containsKey(oc)) { - ocID = omap.get(oc); - } else { - ocID = outcomeCount++; - omap.put(oc, ocID); - } - - for (String pred : econtext) { - if (predicateIndex.containsKey(pred)) { - indexedContext.add(predicateIndex.get(pred)); - } - } - - //drop events with no active features - if (indexedContext.size() > 0) { - int[] cons = new int[indexedContext.size()]; - for (int ci = 0; ci < cons.length; ci++) { - cons[ci] = indexedContext.get(ci); - } - ce = new ComparableEvent(ocID, cons, ev.getValues()); - eventsToCompare.add(ce); - } else { - System.err.println("Dropped event " + ev.getOutcome() + ":" + Arrays.asList(ev.getContext())); - } - - indexedContext.clear(); - } - outcomeLabels = toIndexedStringArray(omap); - predLabels = toIndexedStringArray(predicateIndex); - return eventsToCompare; - } - } http://git-wip-us.apache.org/repos/asf/opennlp/blob/1484f1d6/opennlp-tools/src/main/java/opennlp/tools/ml/model/TwoPassDataIndexer.java ---------------------------------------------------------------------- diff --git a/opennlp-tools/src/main/java/opennlp/tools/ml/model/TwoPassDataIndexer.java b/opennlp-tools/src/main/java/opennlp/tools/ml/model/TwoPassDataIndexer.java index b3cc89b..5e347e8 100644 --- a/opennlp-tools/src/main/java/opennlp/tools/ml/model/TwoPassDataIndexer.java +++ b/opennlp-tools/src/main/java/opennlp/tools/ml/model/TwoPassDataIndexer.java @@ -23,14 +23,10 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; -import java.util.ArrayList; -import java.util.Arrays; +import java.nio.charset.StandardCharsets; import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import opennlp.tools.util.ObjectStream; @@ -52,26 +48,30 @@ public class TwoPassDataIndexer extends AbstractDataIndexer { int cutoff = trainingParameters.getIntParameter(CUTOFF_PARAM, CUTOFF_DEFAULT); boolean sort = trainingParameters.getBooleanParameter(SORT_PARAM, SORT_DEFAULT); - Map<String,Integer> predicateIndex = new HashMap<>(); - List<ComparableEvent> eventsToCompare; + long start = System.currentTimeMillis(); - display("Indexing events using cutoff of " + cutoff + "\n\n"); + display("Indexing events with TwoPass using cutoff of " + cutoff + "\n\n"); display("\tComputing event counts... "); + Map<String,Integer> predicateIndex = new HashMap<>(); + File tmp = File.createTempFile("events", null); tmp.deleteOnExit(); - Writer osw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tmp),"UTF8")); - int numEvents = computeEventCounts(eventStream, osw, predicateIndex, cutoff); + int numEvents; + try (Writer osw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tmp), + StandardCharsets.UTF_8))) { + numEvents = computeEventCounts(eventStream, osw, predicateIndex, cutoff); + } display("done. " + numEvents + " events\n"); display("\tIndexing... "); + List<ComparableEvent> eventsToCompare; try (FileEventStream fes = new FileEventStream(tmp)) { - eventsToCompare = index(numEvents, fes, predicateIndex); + eventsToCompare = index(fes, predicateIndex); } - // done with predicates - predicateIndex = null; + tmp.delete(); display("done.\n"); @@ -82,9 +82,9 @@ public class TwoPassDataIndexer extends AbstractDataIndexer { display("Collecting events... "); } sortAndMerge(eventsToCompare,sort); - display("Done indexing.\n"); - + display(String.format("Done indexing in %.2f s.\n", (System.currentTimeMillis() - start) / 1000d)); } + /** * Reads events from <tt>eventStream</tt> into a linked list. The * predicates associated with each event are counted and any which @@ -100,75 +100,26 @@ public class TwoPassDataIndexer extends AbstractDataIndexer { Map<String,Integer> predicatesInOut, int cutoff) throws IOException { Map<String,Integer> counter = new HashMap<>(); int eventCount = 0; - Set<String> predicateSet = new HashSet<>(); Event ev; while ((ev = eventStream.read()) != null) { eventCount++; eventStore.write(FileEventStream.toLine(ev)); String[] ec = ev.getContext(); - update(ec,predicateSet,counter,cutoff); + update(ec, counter); } - predCounts = new int[predicateSet.size()]; - int index = 0; - for (Iterator<String> pi = predicateSet.iterator(); pi.hasNext(); index++) { - String predicate = pi.next(); - predCounts[index] = counter.get(predicate); - predicatesInOut.put(predicate,index); - } - eventStore.close(); - return eventCount; - } - - // TODO: merge this code with the copy and paste version in OnePassDataIndexer - private List<ComparableEvent> index(int numEvents, ObjectStream<Event> es, - Map<String,Integer> predicateIndex) throws IOException { - Map<String,Integer> omap = new HashMap<>(); - int outcomeCount = 0; - List<ComparableEvent> eventsToCompare = new ArrayList<>(numEvents); - List<Integer> indexedContext = new ArrayList<>(); + String[] predicateSet = counter.entrySet().stream() + .filter(entry -> entry.getValue() >= cutoff) + .map(Map.Entry::getKey).sorted() + .toArray(String[]::new); - Event ev; - while ((ev = es.read()) != null) { - String[] econtext = ev.getContext(); - ComparableEvent ce; - - int ocID; - String oc = ev.getOutcome(); - - if (omap.containsKey(oc)) { - ocID = omap.get(oc); - } - else { - ocID = outcomeCount++; - omap.put(oc, ocID); - } - - for (String pred : econtext) { - if (predicateIndex.containsKey(pred)) { - indexedContext.add(predicateIndex.get(pred)); - } - } - - // drop events with no active features - if (indexedContext.size() > 0) { - int[] cons = new int[indexedContext.size()]; - for (int ci = 0;ci < cons.length; ci++) { - cons[ci] = indexedContext.get(ci); - } - ce = new ComparableEvent(ocID, cons); - eventsToCompare.add(ce); - } - else { - display("Dropped event " + ev.getOutcome() + ":" + Arrays.asList(ev.getContext()) + "\n"); - } - // recycle the TIntArrayList - indexedContext.clear(); + predCounts = new int[predicateSet.length]; + for (int i = 0; i < predicateSet.length; i++) { + predCounts[i] = counter.get(predicateSet[i]); + predicatesInOut.put(predicateSet[i], i); } - outcomeLabels = toIndexedStringArray(omap); - predLabels = toIndexedStringArray(predicateIndex); - return eventsToCompare; + + return eventCount; } } - http://git-wip-us.apache.org/repos/asf/opennlp/blob/1484f1d6/opennlp-tools/src/test/java/opennlp/tools/eval/ArvoresDeitadasEval.java ---------------------------------------------------------------------- diff --git a/opennlp-tools/src/test/java/opennlp/tools/eval/ArvoresDeitadasEval.java b/opennlp-tools/src/test/java/opennlp/tools/eval/ArvoresDeitadasEval.java index 7e55165..dd54480 100644 --- a/opennlp-tools/src/test/java/opennlp/tools/eval/ArvoresDeitadasEval.java +++ b/opennlp-tools/src/test/java/opennlp/tools/eval/ArvoresDeitadasEval.java @@ -199,7 +199,7 @@ public class ArvoresDeitadasEval { @Test public void evalPortugueseChunkerQn() throws IOException { chunkerCrossEval(EvalUtil.createMaxentQnParams(), - 0.9652111035230788d); + 0.9648211936491359d); } @Test @@ -208,7 +208,7 @@ public class ArvoresDeitadasEval { params.put("Threads", 4); // NOTE: Should be the same as without multiple threads!!! - chunkerCrossEval(params, 0.9647304571382662); + chunkerCrossEval(params, 0.9649180953528779d); } @Test http://git-wip-us.apache.org/repos/asf/opennlp/blob/1484f1d6/opennlp-tools/src/test/java/opennlp/tools/eval/Conll02NameFinderEval.java ---------------------------------------------------------------------- diff --git a/opennlp-tools/src/test/java/opennlp/tools/eval/Conll02NameFinderEval.java b/opennlp-tools/src/test/java/opennlp/tools/eval/Conll02NameFinderEval.java index abe53aa..c064e3f 100644 --- a/opennlp-tools/src/test/java/opennlp/tools/eval/Conll02NameFinderEval.java +++ b/opennlp-tools/src/test/java/opennlp/tools/eval/Conll02NameFinderEval.java @@ -346,10 +346,10 @@ public class Conll02NameFinderEval { Conll02NameSampleStream.GENERATE_PERSON_ENTITIES); eval(maxentModel, spanishTestAFile, LANGUAGE.ES, - Conll02NameSampleStream.GENERATE_PERSON_ENTITIES, 0.7432498772704957d); + Conll02NameSampleStream.GENERATE_PERSON_ENTITIES, 0.7454634624816087d); eval(maxentModel, spanishTestBFile, LANGUAGE.ES, - Conll02NameSampleStream.GENERATE_PERSON_ENTITIES, 0.8218773096821878d); + Conll02NameSampleStream.GENERATE_PERSON_ENTITIES, 0.8215339233038348d); } @Test @@ -388,10 +388,10 @@ public class Conll02NameFinderEval { Conll02NameSampleStream.GENERATE_ORGANIZATION_ENTITIES); eval(maxentModel, spanishTestAFile, LANGUAGE.ES, - Conll02NameSampleStream.GENERATE_ORGANIZATION_ENTITIES, 0.6827859978347167d); + Conll02NameSampleStream.GENERATE_ORGANIZATION_ENTITIES, 0.682961897915169d); eval(maxentModel, spanishTestBFile, LANGUAGE.ES, - Conll02NameSampleStream.GENERATE_ORGANIZATION_ENTITIES, 0.7766212970376302d); + Conll02NameSampleStream.GENERATE_ORGANIZATION_ENTITIES, 0.7776447105788423d); } @Test @@ -472,10 +472,10 @@ public class Conll02NameFinderEval { Conll02NameSampleStream.GENERATE_MISC_ENTITIES); eval(maxentModel, spanishTestAFile, LANGUAGE.ES, - Conll02NameSampleStream.GENERATE_MISC_ENTITIES, 0.47095761381475676d); + Conll02NameSampleStream.GENERATE_MISC_ENTITIES, 0.470219435736677d); eval(maxentModel, spanishTestBFile, LANGUAGE.ES, - Conll02NameSampleStream.GENERATE_MISC_ENTITIES, 0.4926931106471817d); + Conll02NameSampleStream.GENERATE_MISC_ENTITIES, 0.5020576131687243d); } @Test http://git-wip-us.apache.org/repos/asf/opennlp/blob/1484f1d6/opennlp-tools/src/test/java/opennlp/tools/eval/ConllXPosTaggerEval.java ---------------------------------------------------------------------- diff --git a/opennlp-tools/src/test/java/opennlp/tools/eval/ConllXPosTaggerEval.java b/opennlp-tools/src/test/java/opennlp/tools/eval/ConllXPosTaggerEval.java index 8ac7b3a..98a0ded 100644 --- a/opennlp-tools/src/test/java/opennlp/tools/eval/ConllXPosTaggerEval.java +++ b/opennlp-tools/src/test/java/opennlp/tools/eval/ConllXPosTaggerEval.java @@ -163,6 +163,6 @@ public class ConllXPosTaggerEval { "conllx/data/swedish/talbanken05/train/swedish_talbanken05_train.conll"), "se", params); eval(maxentModel, new File(EvalUtil.getOpennlpDataDir(), - "conllx/data/swedish/talbanken05/test/swedish_talbanken05_test.conll"), 0.9322842998585573d); + "conllx/data/swedish/talbanken05/test/swedish_talbanken05_test.conll"), 0.9347595473833098d); } }
