juste un mot d'avertissement: en utilisant list('...')
(en AP3, c'est u'...'
pour AP2) ne pas, au sens général, vous donner les caractères d'une chaîne de caractères Unicode; au contraire, il se traduira très probablement par une série de points de code 16 bits. ceci est vrai pour toutes les constructions CPython 'étroites', ce qui représente la grande majorité des installations python actuelles. Quand unicode a été proposé pour la première fois dans les années 90, il a été suggéré que 16 bits seraient plus que suffisants pour couvrir tous les besoins d'un encodage de texte universel, car il permettait de passer de 128 points de code (7 bits) à 256 points de code. (8 bits) à 65'536 points de code. il devint bientôt évident, cependant, que cela avait été un vœu pieux; Aujourd'hui, environ 100'000 points de code sont définis dans la version 5.2 d'Unicode, et des milliers d'autres sont en attente d'inclusion. pour que cela devienne possible, unicode devait passer de 16 à 32 bits (conceptuellement) (bien qu'il n'utilise pas pleinement l'espace d'adressage 32 bits). Afin de maintenir la compatibilité avec un logiciel construit sur l'hypothèse que l'Unicode était encore 16 bits, on a conçu des paires de substitution, où deux codes de 16 bits provenant de blocs spécifiquement désignés sont utilisés pour exprimer des points de code au-delà de 65'536. est, au-delà de ce qu'unicode appelle le «plan multilingue de base», ou BMP, et qu'on appelle en plaisantant les plans «astral» de cet encodage, pour leur insaisissabilité relative et leurs maux de tête constants qu'ils offrent aux personnes travaillant dans le domaine du traitement de texte et l'encodage. Maintenant que le CPython étroit traite les paires de substitution de façon assez transparente dans certains cas, il ne réussira toujours pas à faire la bonne chose dans d'autres cas, le fractionnement des chaînes étant l'un de ces cas les plus gênants. dans une construction python étroite, list('abc大def')
(ou list('abc\u5927\U00027C3Cdef')
lorsqu'il est écrit avec des échappements) se traduira par ['a', 'b', 'c', '大', '\ud85f', '\udc3c', 'd', 'e', 'f']
, avec '\ud85f', '\udc3c'
étant une paire de substitution. incidemment, '\ud85f\udc3c'
est ce que le standard JSON attend que vous écriviez pour représenter U-27C3C
.l'un ou l'autre de ces points de code est inutile en soi; une chaîne unicode bien formée ne peut avoir que des paires de substituts.
donc ce que vous voulez diviser une chaîne en caractères est vraiment:
from re import compile as _Re
_unicode_chr_splitter = _Re('(?s)((?:[\ud800-\udbff][\udc00-\udfff])|.)').split
def split_unicode_chrs(text):
return [ chr for chr in _unicode_chr_splitter(text) if chr ]
qui retourne correctement ['a', 'b', 'c', '大', '', 'd', 'e', 'f']
(note: vous pouvez probablement réécrire l'expression régulière de sorte que le filtrage des chaînes vides devient inutile). Si tout ce que vous voulez faire est de diviser un texte en caractères chinois, vous seriez à peu près fait à ce stade. Je ne suis pas sûr du concept de «mot» de l'OP, mais pour moi, 这 是 一个 句子 peut être divisé en 这 |是 |一 |个 | As子 ainsi que 这 是 |一个 |句子, en fonction de votre point de vue. cependant, tout ce qui dépasse le concept de caractères (éventuellement composés) et de classes de caractères (symboles vs espaces vs lettres et autres) va bien au-delà de ce qui est construit en unicode et en python; vous aurez besoin d'un traitement en langage naturel pour le faire. permettez-moi de remarquer que, bien que votre exemple 'yes the United Nations can!'.split()
démontre avec succès que la méthode split fait quelque chose d'utile pour beaucoup de données, elle n'analyse pas correctement le texte anglais: elle ne reconnaît pas United Nations
comme un seul mot, alors qu'elle suppose faussement can!
un mot, ce qui n'est clairement pas. cette méthode donne à la fois des faux positifs et des faux négatifs. en fonction de vos données et de ce que vous avez l'intention d'accomplir, cela peut être ou ne pas être ce que vous voulez.
Réponse courte: vous n'avez pas. –
Eh bien, qu'est-ce que les Chinois utilisent comme séparateur de mots? –
@Continuation: "mot" n'est pas un mot? Les "limites de caractères" ne posent aucun problème, car tout simplement un caractère Unicode est un caractère chinois. Le plus difficile est de savoir quels caractères chinois appartiennent au même mot. – sth