-
Notifications
You must be signed in to change notification settings - Fork 5
/
ComputeScores.java
119 lines (99 loc) · 4.6 KB
/
ComputeScores.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package org.genericsystem.cv.comparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.genericsystem.common.Generic;
import org.genericsystem.common.Root;
import org.genericsystem.cv.Levenshtein;
import org.genericsystem.cv.comparator.ComputeScores.ComputeScript;
import org.genericsystem.cv.model.Doc;
import org.genericsystem.cv.model.Doc.DocInstance;
import org.genericsystem.cv.model.DocClass;
import org.genericsystem.cv.model.ImgFilter;
import org.genericsystem.cv.model.MeanLevenshtein;
import org.genericsystem.cv.model.ImgFilter.ImgFilterInstance;
import org.genericsystem.cv.model.MeanLevenshtein.MeanLevenshteinInstance;
import org.genericsystem.cv.model.Score;
import org.genericsystem.cv.model.Score.ScoreInstance;
import org.genericsystem.cv.model.ZoneGeneric;
import org.genericsystem.cv.model.ZoneGeneric.ZoneInstance;
import org.genericsystem.cv.model.ZoneText;
import org.genericsystem.reactor.annotations.DependsOnModel;
import org.genericsystem.reactor.annotations.RunScript;
import org.genericsystem.reactor.appserver.ApplicationServer;
import org.genericsystem.reactor.appserver.Script;
import org.genericsystem.reactor.gscomponents.RootTagImpl;
import org.opencv.core.Core;
/**
* The ComputeScores class computes the {@link Score} and the
* {@link MeanLevenshtein} for each zone and each filter.
*
* The data is retrieved from GS, and stored in GS.
*
* @author Pierrik Lassalas
*
*/
@RunScript(ComputeScript.class)
@DependsOnModel({ Doc.class, ImgFilter.class, ZoneGeneric.class, ZoneText.class, Score.class, MeanLevenshtein.class })
public class ComputeScores extends RootTagImpl {
public static void main(String[] mainArgs) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
ApplicationServer.startSimpleGenericApp(mainArgs, ComputeScores.class, "/gs-cv_model");
}
public static class ComputeScript implements Script {
private final static String docType = "id-fr-front";
private final static String imgClassDirectory = "classes/" + docType;
@Override
public void run(Root engine) {
Generic currentDocClass = engine.find(DocClass.class).getInstance(docType);
ImgFilter imgFilter = engine.find(ImgFilter.class);
ZoneText zoneText = engine.find(ZoneText.class);
Score score = engine.find(Score.class);
MeanLevenshtein meanLevenshtein = engine.find(MeanLevenshtein.class);
System.out.println("Current doc class : " + currentDocClass);
// TODO convert to Stream?
List<DocInstance> docInstances = (List) currentDocClass.getHolders(engine.find(Doc.class)).toList();
List<ZoneInstance> zoneInstances = (List) currentDocClass.getHolders(engine.find(ZoneGeneric.class))
.toList();
List<ImgFilterInstance> imgFilterInstances = (List) imgFilter.getInstances()
.filter(f -> !"reality".equals(f.getValue())).toList();
ImgFilterInstance realityInstance = imgFilter.getImgFilter("reality");
// Loop over all zone instances
for (ZoneInstance zoneInstance : zoneInstances) {
System.out.println("=> Zone " + zoneInstance);
List<Float> meanLevDistances = new ArrayList<Float>();
List<Float> probabilities = new ArrayList<Float>();
// Loop over all filters
for (ImgFilterInstance imgFilterInstance : imgFilterInstances) {
int lev = 0; // contains the sum of all Levenshtein
// distances for a given zone
int count = 0; // contains the number of perfect matches
// Loop over all documents in this class
for (DocInstance docInstance : docInstances) {
String realText = (String) zoneText.getZoneText(docInstance, zoneInstance, realityInstance)
.getValue();
String text = (String) zoneText.getZoneText(docInstance, zoneInstance, imgFilterInstance)
.getValue();
// TODO : manipulate the Strings before comparison?
// (remove spaces, etc.)
int dist = Levenshtein.distance(text.replaceAll("[\n ,.]", "").trim(),
realText.replaceAll("[\n ,.]", "").trim());
count += (dist == 0) ? 1 : 0;
lev += dist;
}
float probability = (float) count / (float) docInstances.size();
float meanDistance = (float) lev / (float) docInstances.size();
ScoreInstance scoreInstance = score.addScore(probability, zoneInstance, imgFilterInstance);
MeanLevenshteinInstance meanLevenshteinInstance = meanLevenshtein.addMeanLev(meanDistance,
scoreInstance);
meanLevDistances.add(meanDistance);
probabilities.add(probability);
}
for (int i = 0; i < imgFilterInstances.size(); i++) {
System.out.println(imgFilterInstances.get(i) + " : " + meanLevDistances.get(i) + " (proba : "
+ probabilities.get(i) + ")");
}
}
}
}
}