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? p>
merci p>
5 Réponses :
Vous reflètez le même travail pour chaque personnage. Lorsque vous faites 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. P> data = data.replace (k, v) code>, qui remplace toutes les occurrences em> 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. P>
Chaque fois que vous devez faire la translittération comme vous pouvez le voir même pour les petites chaînes str.translate code> est la méthode à utiliser:
str.translate code> est 2 fois plus rapide. p> p>
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 code> 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?
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> 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
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!
Chaque fois que j'utilise 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> 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 .
>>> 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'
M'a sauvé beaucoup de temps. Merci
Répondre de @ Larapsodia, voici le code complet avec Dictionnaire: Ceci tiré de http://www.redhat.com/archives/fedora-extras-commits/2007-june/msg03617.html agréé sous la GPLV2 ou ultérieure. P> P>
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'))) code>
@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. :)