Untitled

 avatar
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