
Unicode TR39 से गायब 793 भ्रामक जोड़े, दुनिया का पहला क्रॉस-स्क्रिप्ट डेटासेट, 230 फोंट और 22,000+ वर्णों में फ़ॉन्ट-जागरूक SSIM स्कोरिंग
वेक्टर-आउटलाइन रे कास्टिंग का उपयोग करके अनुभवजन्य ग्लिफ़ समानता स्कोरिंग। 245 सिस्टम फ़ॉन्ट्स में यूनिकोड कन्फ्यूज़ेबल कैरेक्टर पेयर प्रस्तुत करता है, फ़ॉन्ट आउटलाइन से सीधे संरचनात्मक समानता मापता है (कोई रैस्टराइज़ेशन नहीं), और प्रति-फ़ॉन्ट सतत दूरी स्कोर के साथ स्कोर किए गए JSON आर्टिफैक्ट तैयार करता है।
22,581 कैरेक्टर और 12 लेखन प्रणालियों में 52.6 मिलियन सिंगल-चार और 190 मिलियन मल्टी-चार तुलनाओं के प्रमुख परिणाम:
आउटपुट सीधे namespace-guard में फीड होता है, पैकेज नामों, डोमेन नामों और पहचानकर्ताओं में रनटाइम कन्फ्यूज़ेबल डिटेक्शन के लिए।
RaySpace 36 कोणों पर फ़ॉन्ट आउटलाइन के माध्यम से समानांतर किरणें डालता है और प्रति ग्लिफ़ पाँच परतों की जानकारी कैप्चर करता है: क्रॉसिंग काउंट, क्रॉसिंग पोज़िशन, क्रॉसिंग एंगल, पिंग दूरियाँ (प्रत्येक क्रॉसिंग पर स्ट्रोक चौड़ाई), और पिंग मैक्स (क्रॉसिंग के बीच काउंटर चौड़ाई)। यह प्रति कैरेक्टर प्रति फ़ॉन्ट एक कॉम्पैक्ट सिग्नेचर तैयार करता है। दो सिग्नेचर की तुलना सभी पाँच परतों पर भारित L1 दूरी से की जाती है।
एक तीन-चरणीय फिल्टर कैस्केड व्यापक तुलना को संभव बनाता है:
सिग्नेचर बैंक (245 फ़ॉन्ट्स में 294,646+ प्रविष्टियाँ; --include-uppercase के साथ अधिक) एक बार प्रीकंप्यूट किया जाता है। फिर खोज बैंक पर सिंगल-थ्रेडेड अंकगणित के रूप में चलती है, बिना किसी वर्कर थ्रेड या GPU के 52.6 मिलियन जोड़ी तुलनाओं को 31 मिनट में पूरा करती है।
npm install
# 1. Build the ray signature bank (prerequisite, ~24 min)
npx tsx scripts/build-signature-bank.ts
# 1b. Include uppercase Latin A-Z (optional)
# By default the bank only includes IDNA PVALID codepoints (lowercase,
# digits, symbols). Use --include-uppercase to add uppercase A-Z, useful
# for font identification and trademark visual comparison where uppercase
# glyph shapes matter. The builder is resumable, so this only computes
# the additional codepoints.
npx tsx scripts/build-signature-bank.ts --include-uppercase
# 1c. Include arbitrary codepoint ranges (optional)
npx tsx scripts/build-signature-bank.ts --extra-range=0041-005A
# 2. Single-char discovery (22,581 chars, 12 scripts, ~36 min)
npx tsx scripts/discover-singlechar-sdf.ts --scorer=ray
# 3. Multi-char (bigram) discovery (676 bigrams, ~63 min)
npx tsx scripts/discover-multichar-sdf.ts --scorer=ray
# 4. Score known TR39 multi-char confusables (~5 min)
npx tsx scripts/score-multichar-sdf.ts --scorer=ray
मूल SSIM-आधारित पाइपलाइन ने 230 फ़ॉन्ट्स में 26.5 मिलियन तुलनाओं को स्कोर किया। यह अभी भी कार्यात्मक है, लेकिन सभी खोज और स्कोरिंग कार्यों के लिए RaySpace द्वारा प्रतिस्थापित किया गया है।
# TR39 confusable pair scoring
npx tsx scripts/build-index.ts # Render index (~160s, 11,370 PNGs)
npx tsx scripts/score-all-pairs.ts # Score all pairs (~65s, 235K comparisons)
# Novel confusable discovery
npx tsx scripts/build-candidates.ts # Candidate set (~23K chars)
npx tsx scripts/build-index.ts --candidates # Render candidates (~40min, 89K PNGs)
npx tsx scripts/score-candidates.ts # Score against Latin targets (~15min, 2.9M comparisons)
# Extract high-scoring discoveries from both pipelines
npx tsx scripts/extract-discoveries.ts
"ज़ीरोज़" = वे फ़ॉन्ट जहाँ आउटलाइन बिट-समान रे सिग्नेचर (दूरी 0.000) उत्पन्न करते हैं। लैटिन w/सिरिलिक ԝ उन सभी 19 फ़ॉन्ट्स में समान है जिनमें दोनों ग्लिफ़ मौजूद हैं।
जॉर्जियाई कोडा (U+10FF) लैटिन o, सिरिलिक o, और ग्रीक ओमाइक्रोन के साथ चार-तरफ़ा कन्फ्यूज़ेबल रिंग बनाता है, सभी दूरी 0.08 से नीचे।
oy/सिरिलिक uk खोज सबसे उल्लेखनीय नई खोज है: लैटिन बिग्राम "oy" सिरिलिक डाइग्राफ अक्षर uk (ѹ) के साथ हेल्वेटिका में 0.000 और एरियल यूनिकोड MS में 0.0005 दूरी पर दृष्टिगत रूप से समान है।
तीन अनुशंसित ऑपरेटिंग स्तर:
पता करें कि किसी विशिष्ट फ़ॉन्ट के लिए कौन से कन्फ्यूज़ेबल जोड़े मौजूद हैं। एक नया टाइपफ़ेस जारी करने वाले फ़ॉन्ट डिज़ाइनरों, सिस्टम फ़ॉन्ट परिवर्तन का मूल्यांकन करने वाले ब्राउज़र विक्रेताओं, या IDN डोमेन जैसे सुरक्षा-संवेदनशील संदर्भों में प्रदर्शन फ़ॉन्ट चुनने वाले किसी भी व्यक्ति के लिए उपयोगी।
npx tsx scripts/query-font.ts --list-fonts # 218 फ़ॉन्ट खोज डेटा में
npx tsx scripts/query-font.ts "Arial" # Arial के सभी जोड़े (SSIM >= 0.7)
npx tsx scripts/query-font.ts "Arial" --threshold 0.8 # केवल उच्च-आत्मविश्वास वाले
npx tsx scripts/query-font.ts "Arial" --compare "Georgia" # SSIM डेल्टा द्वारा दो फ़ॉन्ट की तुलना
npx tsx scripts/query-font.ts "Arial" --json # डाउनस्ट्रीम प्रसंस्करण के लिए JSON
फ़ॉन्ट नाम मिलान केस-असंवेदनशील सबस्ट्रिंग है, इसलिए "arial" Arial, Arial Black, और Arial Unicode MS से मेल खाता है। तुलना मोड सबसे बड़े SSIM अंतरों के अनुसार क्रमबद्ध करता है, जिससे पता चलता है कि फ़ॉन्ट बदलने पर वास्तव में कौन से जोड़े बेहतर या बदतर होते हैं।
स्कोरिंग पाइपलाइन से खोज फ़ाइलों की आवश्यकता है (gitignored, स्थानीय रूप से पुनर्जनरेट करें)।
| फ़ाइल | विवरण |
|---|---|
data/output/render-index/ | रेंडर PNGs + इंडेक्स (SSIM पाइपलाइन) |
confusable-weights-v2.json तैयार करें: मीन, p50, p90, फ़ॉन्ट गणना, शून्य-दूरी गणना, शून्य अंश, और अनुशंसित स्तर (सख्त/मानक/खोजपूर्ण)। RaySpace दूरियाँ SSIM को बदलती हैं। मानक थ्रेसहोल्ड पर 4,174 जोड़े।confusable-weights.json का उपभोग करता है confusableDistance({ weights }) के माध्यम सेpaultendo.github.io पर इस परियोजना के निष्कर्षों और पद्धति को कवर करने वाली लेख:
RaySpace पद्धति और निष्कर्ष:
SSIM पाइपलाइन निष्कर्ष:
वे पोस्ट जो व्यापक समस्या स्थान को कवर करते हैं जिसने इस परियोजना को प्रेरित किया:
| स्रोत | लक्ष्य | स्क्रिप्ट्स | मीन | फ़ॉन्ट्स | ज़ीरोज़ |
|---|
| w U+0077 | ԝ U+051D | लैटिन-सिरिलिक | 0.000 | 19 | 19 |
| j U+006A | ϳ U+03F3 | लैटिन-ग्रीक | 0.013 | 21 | 18 |
| i U+0069 | і U+0456 | लैटिन-सिरिलिक | 0.018 | 62 | 50 |
| s U+0073 | ѕ U+0455 | लैटिन-सिरिलिक | 0.018 | 62 | 46 |
| c U+0063 | с U+0441 | लैटिन-सिरिलिक | 0.019 | 61 | 45 |
| o U+006F | о U+043E | लैटिन-सिरिलिक | 0.020 | 61 | 44 |
| j U+006A | ј U+0458 | लैटिन-सिरिलिक | 0.021 | 60 | 48 |
| x U+0078 | х U+0445 | लैटिन-सिरिलिक | 0.023 | 59 | 50 |
| p U+0070 | р U+0440 | लैटिन-सिरिलिक | 0.024 | 61 | 46 |
| e U+0065 | е U+0435 | लैटिन-सिरिलिक | 0.032 | 61 | 44 |
| a U+0061 | а U+0430 | लैटिन-सिरिलिक | 0.042 | 61 | 45 |
| स्रोत | लक्ष्य | स्क्रिप्ट्स | मीन | फ़ॉन्ट्स |
|---|
| ο U+03BF | ჿ U+10FF | ग्रीक-जॉर्जियाई | 0.057 | 2 |
| ヘ U+30D8 | へ U+3078 | कटकाना-हिरागाना | 0.122 | 11 |
| 丶 U+4E36 | ヽ U+30FD | हान-कटकाना | 0.125 | 9 |
| 二 U+4E8C | ニ U+30CB | हान-कटकाना | 0.249 | 11 |
| 口 U+53E3 | ロ U+30ED | हान-कटकाना | 0.268 | 11 |
| बिग्राम | लक्ष्य | मीन | फ़ॉन्ट्स | नोट्स |
|---|
| ll | ॥ U+0965 (देवनागरी डबल दंड) | 0.176 | 8 | क्रॉस-स्क्रिप्ट |
| oy | ѹ U+0479 (सिरिलिक uk) | 0.322 | 16 | नई क्रॉस-स्क्रिप्ट बिग्राम कन्फ्यूज़ेबल |
| rn | m U+006D | 0.531 | 95 | 33 फ़ॉन्ट 0.40 से नीचे |
| bl | ы U+044B (सिरिलिक yeru) | 0.797 | 49 | क्रॉस-स्क्रिप्ट |
| मीन थ्रेसहोल्ड |
|---|
| सिंगल-चार अद्वितीय जोड़े |
|---|
| मल्टी-चार अद्वितीय जोड़े |
|---|
| < 0.50 | 138 | 13 |
| < 1.00 | 4,174 | 1,631 |
| < 1.50 | 59,700 | (शोर) |
| < 2.00 | 249,976 | 2,524,275 |
| फ़ाइल | विवरण |
|---|
data/output/confusable-discoveries.json | 110 TR39 जोड़े उच्च SSIM (>= 0.7) या पिक्सेल-समान के साथ |
data/output/candidate-discoveries.json | 793 नए जोड़े TR39 में नहीं, मीन SSIM >= 0.7 |
data/output/confusable-weights.json | 1,397 भारित किनारे namespace-guard एकीकरण के लिए |
data/output/cross-script-discoveries.json | 563 क्रॉस-स्क्रिप्ट कन्फ्यूज़ेबल जोड़े |
data/output/cross-script-summary.json | स्क्रिप्ट जोड़ी द्वारा क्रॉस-स्क्रिप्ट सारांश |
data/output/multichar-discoveries.json | मल्टी-चार कन्फ्यूज़ेबल खोजें |
data/output/singlechar-sdf-scores.jsonl |
| सिंगल-चार RaySpace स्कोर |
data/output/multichar-rayspace-scores.jsonl | मल्टी-चार RaySpace स्कोर |
data/output/signature-bank/ | रे सिग्नेचर बैंक (294,646 प्रविष्टियाँ, 7.9GB संपीड़ित) |