7
votes

Translittération rapide pour le texte arabe avec python

Je travaille toujours sur des fichiers texte arabes et pour éviter les problèmes d'encodage I Translitère des caractères arabes en anglais selon le schéma de Buckwalter (http://www.qamus.org/transliteration.htm)

Père est mon code à faire Donc, mais c'est très lent, même avec de petits fichiers comme 400 Ko. Des idées pour la rendre plus rapide?

merci xxx


0 commentaires

5 Réponses :


3
votes

Vous reflètez le même travail pour chaque personnage. Lorsque vous faites data = data.replace (k, v) , qui remplace toutes les occurrences du caractère donné dans l'ensemble du fichier. Mais vous faites cela encore et encore dans une boucle, lorsque vous n'avez besoin que de le faire une fois pour chaque paire de translittération. Il suffit de retirer votre boucle la plus externe et il devrait accélérer votre code immensément.

Si vous devez l'optimiser plus, vous pouvez regarder la chaîne Traduire la méthode < / a>. Je ne sais pas comment c'est la performance-sage.


0 commentaires

5
votes

Chaque fois que vous devez faire la translittération str.translate est la méthode à utiliser: xxx

comme vous pouvez le voir même pour les petites chaînes str.translate est 2 fois plus rapide.


3 commentaires

buck = u "'|> & <} ABPTVJHXD * rzs $ sdtzeg_fqklmnhwyyfnkaui ~ o" arabe = u "ءآأؤإئابةتثعغفقكلمنهوىى" Trant = Maketrans (arabe, buck) Mon code STOP est la 3ème ligne avec le message d'erreur: UnicodeencodeError: "ASCII' codec Impossible de coder les caractères en position 0-44: ordinal non dans la plage (128)


Je pense que le problème est que string.maketrans ne fonctionne que pour les chaînes ASCII pendant que vous souhaitez le faire pour l'UNICODES. Vous avez déjà un dictionnaire qui mappe arabe en anglais, pourquoi ne pas l'utiliser cela comme je l'ai fait?


Y a-t-il un dictionnaire comme celui-ci pour la langue d'Urdu?



8
votes

edit oct octobre 2021 strong>

Il y avait un paquet Python publié récemment qui le fait (et beaucoup plus), alors que toute personne lisant ce message doit maintenant ignorer toutes les autres réponses et utiliser des outils de chameaux . (Nizar Habash et son équipe à Nyu Abu Dhabi sont géniaux pour le développer et la rendre si accessible!) P> xxx pré>

sortie: p>

def transString(string, reverse=0):
    '''Given a Unicode string, transliterate into Buckwalter. To go from
    Buckwalter back to Unicode, set reverse=1'''

    for k, v in buck2uni.items():
        if not reverse:
            string = string.replace(v, k)
        else:
            string = string.replace(k, v)

    return string


2 commentaires

Y a-t-il un dictionnaire pour la langue d'ourdou?


@Shankhan - pas que je sache de (non pas que je sache), mais vous pouvez prendre le script ci-dessus et simplement modifier le dictionnaire pour travailler avec Urdu. Vous avez juste besoin de rechercher les codes Unicode pour toutes les lettres. Bonne chance!



4
votes

Chaque fois que j'utilise str.translate code> sur des objets Unicode, il renvoie le même objet exact. Peut-être que cela est dû à Le changement de comportement fait allusion à Martijn Peters .

Si quelqu'un d'autre, il y a du mal à translitterrer unicode telle que l'arabe à ASCII, j'ai constaté que les ordonnances de mappage des littérales Unicode fonctionne bien. P>

>>> buckArab = {"'":"ء", "|":"آ", "?":"أ", "&":"ؤ", "<":"إ", "}":"ئ", "A":"ا", "b":"ب", "p":"ة", "t":"ت", "v":"ث", "g":"ج", "H":"ح", "x":"خ", "d":"د", "*":"ذ", "r":"ر", "z":"ز", "s":"س", "$":"ش", "S":"ص", "D":"ض", "T":"ط", "Z":"ظ", "E":"ع", "G":"غ", "_":"ـ", "f":"ف", "q":"ق", "k":"ك", "l":"ل", "m":"م", "n":"ن", "h":"ه", "w":"و", "Y":"ى", "y":"ي", "F":"ً", "N":"ٌ", "K":"ٍ", "~":"ّ", "o":"ْ", "u":"ُ", "a":"َ", "i":"ِ"}
>>> ordbuckArab = {ord(v.decode('utf8')): unicode(k) for (k, v) in buckArab.iteritems()}
>>> ordbuckArab
{1569: u"'", 1570: u'|', 1571: u'?', 1572: u'&', 1573: u'<', 1574: u'}', 1575: u'A', 1576: u'b', 1577: u'p', 1578: u't', 1579: u'v', 1580: u'g', 1581: u'H', 1582: u'x', 1583: u'd', 1584: u'*', 1585: u'r', 1586: u'z', 1587: u's', 1588: u'$', 1589: u'S', 1590: u'D', 1591: u'T', 1592: u'Z', 1593: u'E', 1594: u'G', 1600: u'_', 1601: u'f', 1602: u'q', 1603: u'k', 1604: u'l', 1605: u'm', 1606: u'n', 1607: u'h', 1608: u'w', 1609: u'Y', 1610: u'y', 1611: u'F', 1612: u'N', 1613: u'K', 1614: u'a', 1615: u'u', 1616: u'i', 1617: u'~', 1618: u'o'}
>>> u'طعصط'.translate(ordbuckArab)
u'TEST'


1 commentaires

M'a sauvé beaucoup de temps. Merci



2
votes

Répondre de @ Larapsodia, voici le code complet avec Dictionnaire: xxx

Ceci tiré de http://www.redhat.com/archives/fedora-extras-commits/2007-june/msg03617.html agréé sous la GPLV2 ou ultérieure.


4 commentaires

Pouvez-vous s'il vous plaît fournir une certaine référence sur le dictionnaire pour la langue d'Urdu


J'avais besoin de >>> Imprimer (transstring (variable.decode ('utf8')))


@Flimm Le lien exact que vous avez fourni est déjà en haut de la prise de code :)


@Azizalto True, mais pas les informations de licence, ce qui est le but réel de mon édition. :)