Card quality
Card quality: what is in the fields, rather than which fields exist. Five items, no migration. The notetype is unchanged, so an existing collection needs nothing done to it and no review history is touched.
Antonyms have an offline source of their own
The weakest field on the card by a wide margin: 19.7% on a real 1054-lemma French deck, against 98.6% for definitions. make antonyms builds a 4.3 MB index from ConceptNet covering 22 languages at once, and the field is filled from it when nothing else can.
| deck | before | after |
|---|---|---|
| French, 1054 lemmas | 19.7% | 34.8% |
| German, 406 lemmas | 56.2% | 60.3% |
| Russian, 701 lemmas | 47.8% | 48.8% |
The asymmetry is the finding. ConceptNet's antonyms are Wiktionary's own, re-extracted by a different tool: kaikki runs wiktextract, ConceptNet ran wikiparsec, and on the same edition the two disagree about which words carry an antonym. The French dictionary index has one for 15,045 words and ConceptNet has 12,376, comparable in size and overlapping only partly, so the union is much larger than either. German already holds 30,616 against ConceptNet's 3,547 and Russian 23,747 against 1,857, so there it mostly hands back what is already present. See docs/ADR-010-conceptnet-antonyms.md.
Entirely optional: without the index every card is exactly what it was, and --doctor reports it as absent rather than missing.
Filler sounds no longer become cards
Ah, Bah, Euh, Tss: 3.4% of one real French run, and the cards that look broken. A per-language stoplist rather than a part-of-speech rule, because Bonsoir is also INTJ and is worth learning.
Inflection pointers resolve to a real definition
Russian was the last language still letting a pointer gloss reach a card as its definition.
The run names the words that got no definition
Instead of only counting them. On a real 406-card German run that is 28 words, most of them transcript damage or names you would delete on sight. They are deliberately not filtered: three signals were measured and none separates them from real vocabulary, so the run names them and you decide.
The definition cache key carries both languages
It is now lemma::source::target::pos. A cross-language run writes rows holding the transcript language's examples, and keyed only by the definition language those rows were readable by a run in a different language that shares a spelling. Measured on a real 5408-row cache, 265 rows were already in that state and had simply never been hit. Existing rows are set aside as definitions_v0 rather than re-keyed by guesswork, and the cache refills as words are met again.
Also in this release
The translation install no longer pulls 4.5 GB of CUDA that no machine without an NVIDIA card can use. make translate-setup installs the CPU-only torch build and repairs an environment that already has the CUDA one. Measured here, .tangovenv went from 5.9 GB to 2.2 GB.
Full changelog: https://github.com/AlphaNerdFx/Tango/blob/main/CHANGELOG.md