Untitled
unknown
python
9 months ago
3.6 kB
16
Indexable
import unicodedata
def normalize_arabic_text(text):
"""
Complete normalization: Convert presentation forms to base + standard normalization
Args:
text: Arabic text string
Returns:
Normalized text with base characters only
"""
# Pre-built comprehensive mapping
PRESENTATION_TO_BASE = {
# FE70-FEFC range (most common)
0xFE80: 0x0621, 0xFE81: 0x0622, 0xFE82: 0x0622, 0xFE83: 0x0623,
0xFE84: 0x0623, 0xFE85: 0x0624, 0xFE86: 0x0624, 0xFE87: 0x0625,
0xFE88: 0x0625, 0xFE89: 0x0626, 0xFE8A: 0x0626, 0xFE8B: 0x0626,
0xFE8C: 0x0626, 0xFE8D: 0x0627, 0xFE8E: 0x0627, 0xFE8F: 0x0628,
0xFE90: 0x0628, 0xFE91: 0x0628, 0xFE92: 0x0628, 0xFE93: 0x0629,
0xFE94: 0x0629, 0xFE95: 0x062A, 0xFE96: 0x062A, 0xFE97: 0x062A,
0xFE98: 0x062A, 0xFE99: 0x062B, 0xFE9A: 0x062B, 0xFE9B: 0x062B,
0xFE9C: 0x062B, 0xFE9D: 0x062C, 0xFE9E: 0x062C, 0xFE9F: 0x062C,
0xFEA0: 0x062C, 0xFEA1: 0x062D, 0xFEA2: 0x062D, 0xFEA3: 0x062D,
0xFEA4: 0x062D, 0xFEA5: 0x062E, 0xFEA6: 0x062E, 0xFEA7: 0x062E,
0xFEA8: 0x062E, 0xFEA9: 0x062F, 0xFEAA: 0x062F, 0xFEAB: 0x0630,
0xFEAC: 0x0630, 0xFEAD: 0x0631, 0xFEAE: 0x0631, 0xFEAF: 0x0632,
0xFEB0: 0x0632, 0xFEB1: 0x0633, 0xFEB2: 0x0633, 0xFEB3: 0x0633,
0xFEB4: 0x0633, 0xFEB5: 0x0634, 0xFEB6: 0x0634, 0xFEB7: 0x0634,
0xFEB8: 0x0634, 0xFEB9: 0x0635, 0xFEBA: 0x0635, 0xFEBB: 0x0635,
0xFEBC: 0x0635, 0xFEBD: 0x0636, 0xFEBE: 0x0636, 0xFEBF: 0x0636,
0xFEC0: 0x0636, 0xFEC1: 0x0637, 0xFEC2: 0x0637, 0xFEC3: 0x0637,
0xFEC4: 0x0637, 0xFEC5: 0x0638, 0xFEC6: 0x0638, 0xFEC7: 0x0638,
0xFEC8: 0x0638, 0xFEC9: 0x0639, 0xFECA: 0x0639, 0xFECB: 0x0639,
0xFECC: 0x0639, 0xFECD: 0x063A, 0xFECE: 0x063A, 0xFECF: 0x063A,
0xFED0: 0x063A, 0xFED1: 0x0641, 0xFED2: 0x0641, 0xFED3: 0x0641,
0xFED4: 0x0641, 0xFED5: 0x0642, 0xFED6: 0x0642, 0xFED7: 0x0642,
0xFED8: 0x0642, 0xFED9: 0x0643, 0xFEDA: 0x0643, 0xFEDB: 0x0643,
0xFEDC: 0x0643, 0xFEDD: 0x0644, 0xFEDE: 0x0644, 0xFEDF: 0x0644,
0xFEE0: 0x0644, 0xFEE1: 0x0645, 0xFEE2: 0x0645, 0xFEE3: 0x0645,
0xFEE4: 0x0645, 0xFEE5: 0x0646, 0xFEE6: 0x0646, 0xFEE7: 0x0646,
0xFEE8: 0x0646, 0xFEE9: 0x0647, 0xFEEA: 0x0647, 0xFEEB: 0x0647,
0xFEEC: 0x0647, 0xFEED: 0x0648, 0xFEEE: 0x0648, 0xFEEF: 0x0649,
0xFEF0: 0x0649, 0xFEF1: 0x064A, 0xFEF2: 0x064A, 0xFEF3: 0x064A,
0xFEF4: 0x064A, 0xFEF5: 0x0644, 0xFEF6: 0x0644, 0xFEF7: 0x0644,
0xFEF8: 0x0644, 0xFEF9: 0x0644, 0xFEFA: 0x0644, 0xFEFB: 0x0644,
0xFEFC: 0x0644,
# FB50-FDFF range (extended forms)
0xFB50: 0x0671, 0xFB51: 0x0671, 0xFB56: 0x067E, 0xFB57: 0x067E,
0xFB58: 0x067E, 0xFB59: 0x067E, 0xFB66: 0x0679, 0xFB67: 0x0679,
0xFB68: 0x0679, 0xFB69: 0x0679, 0xFB6A: 0x06A4, 0xFB6B: 0x06A4,
0xFB6C: 0x06A4, 0xFB6D: 0x06A4, 0xFB7A: 0x0686, 0xFB7B: 0x0686,
0xFB7C: 0x0686, 0xFB7D: 0x0686, 0xFB88: 0x0683, 0xFB89: 0x0683,
0xFB92: 0x06AF, 0xFB93: 0x06AF, 0xFB94: 0x06AF, 0xFB95: 0x06AF,
}
# Step 1: Convert presentation forms to base
result = []
for char in text:
code = ord(char)
result.append(chr(PRESENTATION_TO_BASE.get(code, code)))
text = ''.join(result)
# Step 2: Apply Unicode normalization
text = unicodedata.normalize('NFC', text)
return text
# Usage example
test_text = extracted_name # Arabic with presentation forms
normalized = normalize_arabic_text(test_text)
print(f"Original: {test_text}")
print(f"Normalized: {normalized}")Editor is loading...
Leave a Comment