capitalize() on a hyphenated compound surname now uppercases a conjunction inside it. Measured on the released wheels and on the 2.2 branch, all with force=True:
| input |
1.4.0 |
2.0.0 |
2.1.0 |
2.2 |
jose ortega-y-gasset |
Jose Ortega-y-Gasset |
Jose Ortega-y-Gasset |
Jose Ortega-y-Gasset |
Jose Ortega-Y-Gasset |
JOSE ORTEGA-Y-GASSET |
Jose Ortega-Y-Gasset |
Jose Ortega-Y-Gasset |
Jose Ortega-Y-Gasset |
Jose Ortega-Y-Gasset |
The two spellings disagreed on every version through 2.1. #458 made them agree — by taking the uppercase answer, which is a deviation from 1.4.0 for the lowercase spelling. The same applies to Silva-e-Sousa, -et-, -und- and every other member of Lexicon.conjunctions.
Why it happens
#458 moved the conjunction-or-initial decision into the parse, and the decision is the whole token's. Ortega-y-Gasset is one family token carrying no conjunction tag, so repair capitalizes each word of it.
The spaced spelling is unaffected and still reads the convention correctly — there y is a token of its own and is tagged conjunction:
parse("jose ortega y gasset") # family "ortega y gasset", the `y` tagged conjunction
# capitalize() -> "Jose Ortega y Gasset" (unchanged on every version)
The case for leaving it
A hyphenated token is one word to the parser, and re-deciding per sub-word inside a token is exactly what #458 removed — it was producing two answers for one name. Reintroducing a sub-word rule for conjunctions only would be a narrower version of the thing that was wrong.
The case for changing it
Ortega-y-Gasset is a real orthography with a real convention, and the hyphenated spelling is common in library catalogues and bibliographies. The library gets the spaced form right, so a user reasonably expects the hyphenated form to match. Today the two spellings of one name repair differently.
Scope, measured
- The parse is unaffected.
Ortega-y-Gasset is a single family token before and after; only capitalized() differs.
- 0 of 1,103 differential corpus names have a conjunction inside a hyphenated token, and
compare.py never calls capitalized() anyway (decisions.md#R4), so no gate run can see this either way.
- No safe workaround today. A
capitalization_exceptions key of ortega-y-gasset never matches — keys are looked up per word. A 'y' -> 'y' entry does restore it, but breaks initials: y. smith repairs to y Smith.
Found while replacing the constructed e-f example in 2.2's release note with a real name (#477).
capitalize()on a hyphenated compound surname now uppercases a conjunction inside it. Measured on the released wheels and on the 2.2 branch, all withforce=True:jose ortega-y-gassetJose Ortega-y-GassetJose Ortega-y-GassetJose Ortega-y-GassetJose Ortega-Y-GassetJOSE ORTEGA-Y-GASSETJose Ortega-Y-GassetJose Ortega-Y-GassetJose Ortega-Y-GassetJose Ortega-Y-GassetThe two spellings disagreed on every version through 2.1. #458 made them agree — by taking the uppercase answer, which is a deviation from 1.4.0 for the lowercase spelling. The same applies to
Silva-e-Sousa,-et-,-und-and every other member ofLexicon.conjunctions.Why it happens
#458 moved the conjunction-or-initial decision into the parse, and the decision is the whole token's.
Ortega-y-Gassetis onefamilytoken carrying noconjunctiontag, so repair capitalizes each word of it.The spaced spelling is unaffected and still reads the convention correctly — there
yis a token of its own and is taggedconjunction:The case for leaving it
A hyphenated token is one word to the parser, and re-deciding per sub-word inside a token is exactly what #458 removed — it was producing two answers for one name. Reintroducing a sub-word rule for conjunctions only would be a narrower version of the thing that was wrong.
The case for changing it
Ortega-y-Gassetis a real orthography with a real convention, and the hyphenated spelling is common in library catalogues and bibliographies. The library gets the spaced form right, so a user reasonably expects the hyphenated form to match. Today the two spellings of one name repair differently.Scope, measured
Ortega-y-Gassetis a singlefamilytoken before and after; onlycapitalized()differs.compare.pynever callscapitalized()anyway (decisions.md#R4), so no gate run can see this either way.capitalization_exceptionskey ofortega-y-gassetnever matches — keys are looked up per word. A'y' -> 'y'entry does restore it, but breaks initials:y. smithrepairs toy Smith.Found while replacing the constructed
e-fexample in 2.2's release note with a real name (#477).