feat(benchmarks): expand multilingual stemming quality evaluation

* cover all Radixor dictionary languages
* add PRIMARY_OUTPUT, ANY_CANDIDATE, and ALL_CANDIDATES policies
* measure pairwise over-stemming and under-stemming
* add balanced accuracy and complementary quality metrics
* compare single-output and multi-output stemmers fairly
* improve result validation, reporting, and documentation
* move stemming quality tests into the standard test source set
* preserve the existing JMH benchmark structure and badge output
This commit is contained in:
2026-07-20 23:20:17 +02:00
parent 6d35f01303
commit 05f3855b99
62 changed files with 11472 additions and 75 deletions

View File

@@ -67,6 +67,104 @@
padding: 0.45rem 0.7rem;
}
/* Publication-quality benchmark tables retain identity columns while scrolling. */
.quality-table {
max-width: 100%;
overflow-x: auto;
margin: 0.65rem 0 1rem;
border: 1px solid var(--md-default-fg-color--lightest);
border-radius: 0.2rem;
scrollbar-gutter: stable;
}
.quality-table:focus {
outline: 0.15rem solid var(--md-accent-fg-color);
outline-offset: 0.1rem;
}
.quality-table::before {
content: "Scrollable table: Rank, Stemmer, and Output policy remain visible.";
display: block;
padding: 0.35rem 0.55rem;
color: var(--md-default-fg-color--light);
font-size: 0.68rem;
}
.quality-table .md-typeset__table,
.quality-table table {
margin: 0;
}
.quality-table table th:nth-child(1),
.quality-table table td:nth-child(1),
.quality-table table th:nth-child(2),
.quality-table table td:nth-child(2),
.quality-table table th:nth-child(3),
.quality-table table td:nth-child(3) {
position: sticky;
z-index: 2;
background: var(--md-default-bg-color);
background-clip: padding-box;
}
.quality-table table th:nth-child(1),
.quality-table table td:nth-child(1) {
left: 0;
min-width: 2.8rem;
}
.quality-table table th:nth-child(2),
.quality-table table td:nth-child(2) {
left: 2.8rem;
min-width: 13rem;
white-space: normal;
}
.quality-table table th:nth-child(3),
.quality-table table td:nth-child(3) {
left: 15.8rem;
min-width: 8.5rem;
box-shadow: 0.2rem 0 0.25rem rgb(0 0 0 / 8%);
}
.quality-details > summary {
font-weight: 600;
}
@media screen and (max-width: 44.99em) {
.quality-table table th:nth-child(2),
.quality-table table td:nth-child(2) {
min-width: 10rem;
}
.quality-table table th:nth-child(3),
.quality-table table td:nth-child(3) {
position: static;
min-width: 7.5rem;
box-shadow: none;
}
}
@media print {
.quality-table {
overflow: visible;
border: 0;
}
.quality-table::before {
display: none;
}
.quality-table table th,
.quality-table table td {
position: static !important;
}
.quality-details:not([open]) > *:not(summary) {
display: block;
}
}
/* Code blocks */
.md-typeset pre > code {
font-size: 0.72rem;