Skip to content

Commit 08db8ce

Browse files
committed
Added metrics.csv
1 parent 071ab8a commit 08db8ce

4 files changed

Lines changed: 60 additions & 11 deletions

File tree

server/src/main/kotlin/org/ivdnt/galahad/evaluation/EvaluationEntry.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ const val MAX_SAMPLE_LENGTH: Int = 10
99

1010
data class EvaluationEntry(
1111
val count: Int = 0,
12-
@JsonIgnore val samples: MutableList<TermComparison> = mutableListOf(),
12+
val samples: MutableList<TermComparison> = mutableListOf(),
1313
) {
14-
@get:JsonProperty("samples")
15-
val jsonSamples: List<TermComparison> get() = samples.asSequence().shuffled().take(MAX_SAMPLE_LENGTH).toList()
14+
// @get:JsonProperty("samples")
15+
// val jsonSamples: List<TermComparison> get() = samples.asSequence().shuffled().take(MAX_SAMPLE_LENGTH).toList()
1616

1717
companion object {
1818
/**

server/src/main/kotlin/org/ivdnt/galahad/evaluation/metrics/DocumentMetric.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,16 @@ class ClsMetrics(
2929
)
3030
}
3131

32+
class FlatMetricsSettings(
33+
val id: String,
34+
val annotation: String,
35+
val group: String,
36+
) {
37+
constructor(settings: MetricsSettings) : this(settings.id, settings.annotation, settings.group)
38+
}
39+
3240
class NewMetric(
33-
val settings: MetricsSettings,
41+
val settings: FlatMetricsSettings,
3442
val grouped: MutableMap<String, ClsClasses> = mutableMapOf(),
3543
val classes: ClsClasses = grouped.filter { it.key != TermComparison.MISSING_MATCH }.values.reduce { a, b -> a + b },
3644
val accuracy: Float = classes.truePositive.count / classes.count.toFloat(),
@@ -126,7 +134,7 @@ class DocumentMetric(
126134
}
127135
}
128136
}
129-
}.mapValues { NewMetric(METRIC_TYPES.first{mt -> mt.id == it.key}, it.value)}.toMutableMap()
137+
}.mapValues { NewMetric(FlatMetricsSettings(METRIC_TYPES.first{mt -> mt.id == it.key}), it.value)}.toMutableMap()
130138
)
131139

132140
private fun truesFalses(

server/src/main/kotlin/org/ivdnt/galahad/evaluation/metrics/JobMetric.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,58 @@ package org.ivdnt.galahad.evaluation.metrics
33
import com.fasterxml.jackson.annotation.JsonValue
44
import org.ivdnt.galahad.corpora.Corpus
55
import org.ivdnt.galahad.evaluation.DocumentEvaluations
6+
import org.ivdnt.galahad.export.csv.CsvFile
7+
import org.ivdnt.galahad.export.csv.CsvString
68
import org.ivdnt.galahad.util.merge
79

810
class JobMetric(
911
@JsonValue
1012
val classesByGroup: Map<String, NewMetric>
1113
) {
14+
15+
fun toGlobalCsv(): CsvString = buildString {
16+
append(CsvFile.toCsvString(listOf("annotation", "grouped by", "macro precision", "macro recall", "macro f1", "micro accuracy", "count", "true positive", "false negative", "no match")))
17+
for ((key, value) in classesByGroup) {
18+
append(CsvFile.toCsvString(listOf(
19+
value.settings.annotation,
20+
value.settings.group,
21+
value.macro.precision,
22+
value.macro.recall,
23+
value.macro.f1,
24+
value.accuracy,
25+
value.classes.count,
26+
value.classes.truePositive.count,
27+
value.classes.falseNegative.count,
28+
value.classes.noMatch.count,
29+
)))
30+
}
31+
}
32+
1233
companion object {
1334
fun create(corpus: Corpus, docEvals: DocumentEvaluations): JobMetric = JobMetric(
1435
corpus.documents.readAllSequence().map { docEvals.createOrThrow(it.name).metrics.classesByGroup }
1536
.reduce { map1, map2 ->
1637
map1.merge(map2) { a, b -> a.apply { grouped.merge(b.grouped) { x, y -> x.add(y) } } } as MutableMap<String, NewMetric>
1738
}.mapValues { NewMetric(it.value.settings, it.value.grouped) }
1839
)
40+
41+
fun toCsv(metric: NewMetric): CsvString = buildString {
42+
append(CsvFile.toCsvString(listOf("group", "precision", "recall", "f1", "count", "true positive", "false positive", "false negative", "no match")))
43+
for ((key, value) in metric.grouped) {
44+
append(
45+
CsvFile.toCsvString(listOf(
46+
key,
47+
value.metrics.precision,
48+
value.metrics.recall,
49+
value.metrics.f1,
50+
value.count,
51+
value.truePositive.count,
52+
value.falsePositive.count,
53+
value.falseNegative.count,
54+
value.noMatch.count,
55+
))
56+
)
57+
}
58+
}
1959
}
2060
}

server/src/main/kotlin/org/ivdnt/galahad/web/service/EvaluationService.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class EvaluationService(val corpora: CorporaService) {
150150
createDistributionCsv(dir.resolve("distribution"), corpus, job)
151151
createEntitiesCsv(dir.resolve("entities"), corpus)
152152
if (reference != null) {
153-
// createMetricsCsv(dir, corpus, job, reference)
153+
createMetricsCsv(dir.resolve("metrics"), corpus, job, reference)
154154
createConfusionCsv(dir.resolve("confusion"), corpus, job, reference)
155155
}
156156
val metadata = writeMetadataToDir(corpus, job, reference, dir)
@@ -187,14 +187,15 @@ class EvaluationService(val corpora: CorporaService) {
187187
}
188188
}
189189

190-
private fun createMetricsCsv(dir: File, corpus: UUID, job: String, reference: String?) {
191-
val metrics = getMetrics(corpus, job = job, reference = reference)
190+
private fun createMetricsCsv(dir: File, corpus: UUID, hypothesis: String, reference: String) {
191+
dir.mkdirs()
192+
val metrics = getJobMetric(corpus, hypothesis, reference)
192193
val globFile = CsvFile(dir.resolve("metrics-global.csv"))
193194
globFile.append(metrics.toGlobalCsv())
194195

195-
metrics.metricTypes.values.forEach { mt ->
196-
val file = CsvFile(dir.resolve("metrics-${mt.setting.id}.csv"))
197-
file.append(mt.toGroupedCsv())
196+
metrics.classesByGroup.values.forEach { mt ->
197+
val file = CsvFile(dir.resolve("metrics-${mt.settings.id}.csv"))
198+
file.append(JobMetric.toCsv(mt))
198199
}
199200
}
200201

0 commit comments

Comments
 (0)