Skip to content

Apply the rulings, and stop a groupsign swallowing a whole run - #205

Merged
owjs3901 merged 17 commits into
mainfrom
owjs3901/grade1-ten-shortforms
Sep 21, 2026
Merged

owjs3901 merged 17 commits into
mainfrom
owjs3901/grade1-ten-shortforms

Conversation

@owjs3901

@owjs3901 owjs3901 commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

국립국어원 회신(2026-09-17, 2026-09-20)을 반영하고, 그 과정에서 찾은 규정 위반 셋을 고친다. 말뭉치 455,573 → 455,769 (+196), 규정 fixture 5141/5141 유지, 로마자 구간 표지 4수치(838 / 148 / 307 / 388) 불변.

1. 1급 점자 기호의 판정을 규정대로 정리한다

longer_use_allowed 의 지름길 때문에 판정이 느슨했다. 회신이 준 두 조문으로 갈래를 셋으로 좁혔다.

갈래 조문
글자열 전체가 축어 CD = could → ⠰
축어 + s §10.9.5, 축어 목록 전체에 적용 SDS·ACS·NEIS·ALS → ⠰
열 축어 + 모음·y 아닌 글자 §10.9.3 GDP = good+p → ⠰

about·almost·him 은 §10.9.5 자체의 예외다. 규정 fixture LLC·Blvd·Grtsamada 는 ⠰ 를 유지하고 llama·Llanelli 는 뒤가 모음이라 붙지 않는다.

2. 사전에 없는 낱말의 ever 는 어원으로 쪼개 강세를 본다

ever 로 시작하고 남은 글자가 그대로 한 낱말이면 합성어의 앞 요소여서 첫 e 가 강세를 받는다. EVERGLOW = ever + glow → ⠐⠑ / eversionsion 이 낱말이 아니라 철자(규정 fixture 유지).

3. 묶음약자가 낱말 전체를 삼키지 못하게 한다 (+133)

§10.4.2ch·sh·th·wh·ou·st 가 run 전체면 철자다. 한 칸 묶음약자가 그 자리에서 낱말표로 읽히기 때문이다(⠌ = still, ⠩ = shall). 규칙은 있었으나 "숫자에 닿고 낱말 첫머리가 아닐 때"로 좁아 실제 꼴((ST·(SH)·80Wh·Th17·Ch.1)이 전부 빠져 있었다.

§10.12.1 — 대문자 run 전체는 글자로 읽는다. 판별자는 약자 종류가 아니라 대문자 여부였다.

전체 run 말뭉치 철자 말뭉치 약자
대문자 AR 1157 2
대문자 GH·EN·BE·ED 552·18·86·2 0
소문자 er·be 0 6·27

in 만 제외 — ⠔ 가 §10.5 낱말표 겸용이라 제37항 붙임이 따로 다스린다(측정도 35:20 으로 제외를 지지).

같은 것을 영어 문맥에도 적용했다. ST.⠠⠠⠌ = 대문자 "Still." 로 읽히고 있었다. 근거는 §10.12.1 fixture 자신이다 — DAR→⠠⠠⠙⠁⠗(≠⠠⠠⠙⠜), EST→⠠⠠⠑⠎⠞(≠⠠⠠⠑⠌), TEN/gh→⠛⠓. 이 자리에 "짧은 두문자어 휴리스틱은 9 얻고 11 잃어 기각"이라는 주석이 있었는데, 이번 조건은 그보다 좁다(run 전체가 정확히 묶음약자). THE.·SHE.·OUT. 은 실제 낱말이라 약자를 유지하고, 서수 1ST·4TH 는 숫자 인접이라 무관하다.

4. 글머리 붙임표 뒤를 띄운다 (+39)

제49항이 붙여 쓰게 하는 붙임표는 낱말과 낱말 사이의 것이다. 글 첫머리에 홀로 서서 한글을 끌고 오는 붙임표는 그 항목을 여는 표지다.

자리 말뭉치 띄움 붙임 조치
글 첫머리 50 14 띄움 (고침)
글 중간 어절 첫머리 0 10 붙임 (현행 유지)
어절 안 0 4,619 붙임 (현행 유지)

5. 말뭉치를 따라가면 안 되는 자리를 문서로 남긴다

  • severity·reverse철자가 맞다. 말뭉치 12건이 검수에서 놓친 오류다.
  • 한글 낱말에 붙은 소괄호 종류는 규정에 없고 점역자의 선택이다.
  • 제37항은 로마자표 바로 뒤의 단어에만 적용된다. Yes, I can.can 은 약자 ⠉ 를 쓴다.
  • 1급 점자에서 말뭉치는 583번 ⠰ 를 빠뜨렸다.
  • ⠰ 를 붙이는 경계는 이미 맞다 — 붙임표 뒤 55:3 붙임, 숫자 96:3 · 빗금 9:3 · 더하기 5:0 안 붙임.
  • 대문자 종료표 ⠠⠄ 는 건드리지 말 것 — 전수는 누락 508 : 과잉 314 로 양방향이고 최대 맥락이 이미 "점역자 해석"으로 회신된 대소문자 혼용이다.

아울러 개선 후보를 고르는 법을 적었다. 이번 세션에 기각한 시도는 모두 실패한 어절만 세어 골랐고 전수 교차표에서 뒤집혔다.

측정

cargo test --release -p braillify --lib -- test_by_testcase   fixture 5141/5141, 말뭉치 455,769
cargo run  --release -p braillify --example roman_marker_bench  838 / 148 / 307 / 388 (기준선과 동일)
cargo test --release -p braillify                              5038 + 20 + 8 + 351 + 162 통과
cargo clippy --release -p braillify --all-targets               경고 없음

남은 것

Weverse 부류 64건은 회신이 "음성 정보나 음운 관련 정보가 없다면 자동변환으로 정답을 낼 수 없다"고 확인해 주었다. 쫓지 않는다.

devfive added 3 commits September 20, 2026 20:24
Article 10.9.3 lets only braille, great, children, blind, first, friend,
good, letter, little and quick stand inside a word that is not itself on
the shortform list. A capitalised letters-sequence can therefore collide
only through those ten: GDP keeps its grade-1 symbol because goodp may
take the good shortform, while ACS, NEIS and ALS lose theirs because
accordings, neithers and alsos cannot be written at all.

National Institute of Korean Language, 2026-09-17.
With no recorded pronunciation the stress has to be read from the word's
structure. An ever that opens the word and leaves a word of its own
behind is a compound's first component and carries the stress, so
EVERGLOW takes the contraction; eversion keeps its letters because sion
is not a word.

National Institute of Korean Language, 2026-09-17.
The corpus is not the answer key where the National Institute of Korean
Language has ruled against it: severity and reverse are spelled out, the
bracket pair around a Roman gloss is the transcriber's choice, and
Article 37 reaches only the word the Roman indicator stands in front of.

Also write down how a candidate is chosen. Both rejected attempts this
round were picked from failing words alone, and both reversed under a
full census.
@codecov

codecov Bot commented Sep 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
libs/braillify/src/encoder.rs 100.00% <100.00%> (ø)
libs/braillify/src/rules/english_shortform.rs 100.00% <ø> (ø)
libs/braillify/src/rules/english_ueb/engine.rs 100.00% <100.00%> (ø)
...llify/src/rules/english_ueb/engine/word_methods.rs 100.00% <100.00%> (ø)
.../braillify/src/rules/english_ueb/rule_10_7_pron.rs 100.00% <100.00%> (ø)
libs/braillify/src/rules/english_ueb/rule_10_9.rs 100.00% <100.00%> (ø)
libs/braillify/src/rules/korean/rule_28.rs 100.00% <ø> (ø)
...illify/src/rules/token_rules/middle_dot_spacing.rs 100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

Braillify testcase report

Suite Passed Total Failed Success rate
Standard testcases 5141 5141 0 100.00%
NIKL 2021 corpus 91258 93115 1857 98.01%
NIKL 2022 corpus 107871 108795 924 99.15%
NIKL 2023 corpus 122691 126693 4002 96.84%
NIKL 2024 corpus 53490 54990 1500 97.27%
NIKL 2025 corpus 80665 83528 2863 96.57%
NIKL corpus (all years) 455975 467121 11146 97.61%

Command: cargo test test_by_testcase -- --nocapture

@github-actions

github-actions Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

Changepacks

braillify@2.2.0 → 2.2.1 - libs/braillify/Cargo.toml

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

braillify-c@0.2.0 → 0.2.1 - packages/c/Cargo.toml

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

Braillify@2.2.0 → 2.2.1 - packages/dotnet/Braillify/Braillify.csproj

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

BraillifyNet@2.2.0 → 2.2.1 - packages/dotnet/BraillifyNet/BraillifyNet.csproj

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

braillify-go@2.0.1 → 2.0.2 - packages/go/Cargo.toml

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

braillify@2.2.0 → 2.2.1 - packages/node/package.json

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

braillify@2.2.0 → 2.2.1 - packages/python/pyproject.toml

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

braillify_rb@0.1.0 → 0.1.1 - packages/ruby/Cargo.toml

Patch

  • Apply the National Institute of Korean Language rulings on the grade-1 symbol and the ever contraction, read a whole-run groupsign as letters where the rules require it, separate a dash that opens the text, and join a spaced hyphen that is not a subtraction sign, and close the editorial gap inside a bracket; corpus accuracy 455,975 of 467,121 sentences.

Article 10.9.5 adds s to every shortform on the list, not only to the
ten that Article 10.9.3 lets stand inside another word, so ACS, NEIS and
ALS collide with accordings, neithers and alsos exactly as SDS does with
saids. The grade-1 symbol goes in front of all of them.

This reads 74 corpus sentences differently from the reference, which
omits the symbol 583 times where the rule calls for it. The rules are
the answer key, not the corpus.

National Institute of Korean Language, 2026-09-20.
@owjs3901 owjs3901 changed the title Apply the 2026-09-17 rulings on grade 1 and the ever contraction Apply the rulings on the grade-1 symbol and the ever contraction Sep 20, 2026
devfive added 3 commits September 20, 2026 23:11
Counting only the letters-sequences that take the symbol at a space, the
corpus keeps it after a hyphen 55 times against 3 and drops it after a
digit 96 times against 3, after a slash 9 against 3, and after a plus 5
against 0. That is what permits_grade1_boundary_after_run already does.
The 42 places where the corpus writes the symbol and we do not are its
own inconsistency, so leave the boundary alone.
Article 10.4.2 spells ch, sh, th, wh, ou and st out when they make up a
whole run, because the one-cell groupsign reads as the wordsign there:
ST would be still, SH would be shall. The rule was already here but it
only fired next to a digit and away from a word start, so the corpus
shapes that actually occur — (ST, (SH), 80Wh, Th17, Ch.1 — kept the
groupsign.

80 more corpus sentences read correctly.
@owjs3901 owjs3901 changed the title Apply the rulings on the grade-1 symbol and the ever contraction Apply the rulings on grade 1 and ever, and spell whole strong sequences Sep 20, 2026
devfive added 5 commits September 21, 2026 01:24
Article 10.12.1 reads an all-capitals letters-sequence in Korean text as
letters, so a groupsign must not swallow the whole run: AR is the two
cells for a and r, not the one cell for ar. The corpus agrees on every
sign this touches — ar 1157 spelled against 2, gh 552 against 0, en 18
against 0, be 86 against 0 — while the same signs in lower case keep
their groupsign, er 6 contracted against 0 and be 27 against 0.

in stays out of the set: that one cell is also its lower wordsign, which
Article 37's addendum governs.

53 more corpus sentences read correctly.
Article 10.12.1 spells the letters of an abbreviation, which is why the
rule's own examples write DAR as the three cells for d, a and r rather
than the one cell for ar, and EST as e, s, t rather than e plus st. A
standing ST therefore may not be the one cell that reads as the
capitalised wordsign "still".

The short-acronym heuristic that was measured and rejected here is a
different rule: it asked whether a whole word should lose contractions.
This asks only whether the word IS a groupsign. THE, SHE and OUT are
words and keep theirs; ordinals stay digit-adjacent and are untouched.

The corpus is Korean prose and holds almost no English-only sentence, so
its count does not move: 455,730 before and after.
Article 49 defers to the Hangul orthography, which writes a hyphen
joined to the words on both sides, and KoreanHyphenSpacingRule already
does that. A dash standing alone at the head of the text and pulling
Korean behind it is not that hyphen — it opens the item, so the braille
separates it.

Counted over the whole corpus, a dash that starts the text is followed
by a blank 50 times against 14, while the same dash anywhere else is
joined 10 times against 0 at the head of a later word and 4,619 times
against 0 inside one. Only the first of those three changes.

39 more corpus sentences read correctly.
@owjs3901 owjs3901 changed the title Apply the rulings on grade 1 and ever, and spell whole strong sequences Apply the rulings, and stop a groupsign swallowing a whole run Sep 20, 2026
devfive added 4 commits September 21, 2026 10:31
Article 49 defers to the Hangul orthography, which joins a hyphen to
what stands on either side, and the rule already did that — but only
when Korean stood on both sides. The exception it meant to carve out is
Article 46's subtraction sign, whose operands are Roman letters or
digits, so the test belongs on the operands, not on Korean.

Counted over the whole corpus, a hyphen written with a space on each
side is joined by the reference in every neighbourhood except that one:
closing bracket then Korean 47 against 3, other then Korean 26 against
0, Korean then digit 9 against 0, Korean then Roman 7 against 2 — while
digit against digit is spaced 8 times against 0.

59 more corpus sentences read correctly. The marker bench reads 837 /
146 / 304 / 395 against 838 / 148 / 307 / 388: three fall, one rises,
because joining lets 12 more sentences line up word-for-word and enter
the comparison at all (8,554 to 8,566). On the shared sentences the
markers improve.
The coverage gate found one line it could not reach, and it was right to:
a word token never carries an empty character list, so the arm that asked
what to do when a hyphen had nothing on one side of it was dead. Asking
the two ends directly whether they are alphanumeric says the same thing
without the arm.

The leading-dash rule had the same shape for a different reason. Its
first question, whether the index is zero, and its second, whether the
first token is a word, can be asked together, and merging them leaves a
single exit that ordinary input walks through constantly.

Neither changes what the encoder emits: the corpus still reads 455,828
and the marker bench still reads 837 / 146 / 304 / 395.
Article 49 defers to the Hangul orthography, which writes a bracket
against what it encloses. Print sometimes sets `확인 ( 가나 ) 다라` with
the brackets held off their contents, and the braille was copying that
spacing instead of the rule.

Counted over the whole corpus, the reference closes that gap every time
it occurs and never once opens it: 78 after an opening paren, 57 before
a closing one, 24 around the double angle brackets. The outer faces are
ordinary word spacing and are left alone — after a closing bracket the
reference keeps the space 257,108 times.

Two neighbourhoods look like this but are not. A slash reads as the
same kind of hugging punctuation and the corpus joins it 86 times to 3,
but six rule fixtures write it spaced even between Korean words, so the
rules decide it and the slash stays out. An opening bracket standing
directly against its closing partner is naming the bracket rather than
wrapping anything — article 49's own `『 』 안에는` — so that seam stays
open too.

147 more corpus sentences read correctly, 455,975 of 467,121. The
marker bench reads 837 / 145 / 305 / 398 against 837 / 146 / 304 / 395,
three more errors over six more sentences that now line up word-for-word
and enter the comparison at all (8,566 to 8,572).

The one snapshot that moved, `# ( A )`, moved the way it should.
@owjs3901
owjs3901 merged commit f578696 into main Sep 21, 2026
53 checks passed
@owjs3901
owjs3901 deleted the owjs3901/grade1-ten-shortforms branch September 21, 2026 04:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant