2016-09-22 1 views
0

Je dois extraire le nombre d'unités de code UTF-16 à partir du début de la chaîne à laquelle un nom d'emplacement commence à partir d'une piqûre Python. J'utilise Polyglot NER pour marquer un emplacement dans une chaîne Python. Par exemple, «Obama est né aux États-Unis, mais je suis né en Alabama», marquerait «États-Unis» et «Alabama». L'extracteur Python Polyglot retourne simplement aux emplacements marqués, et le nombre de mots de l'avant qu'ils commencent. Comment puis-je déterminer le nombre d'unités de code UTF-16 à partir du début de la chaîne le mot se produit?Unités de code UTF-16 en Python Polyglot

interface Java qui nécessite les informations https://github.com/Berico-Technologies/CLAVIN/blob/master/src/main/java/com/bericotech/clavin/extractor/LocationOccurrence.java

+2

Vous ne pouvez pas le décoder en premier pour utiliser du texte à la place? –

+0

Je travaille avec du texte. Honnêtement, je ne peux pas comprendre comment il utilise les unités de code comme distance, ou comment obtenir cette distance –

+0

Si vous avez besoin de vous soucier de l'encodage, alors vous travaillez avec des octets, pas de texte. –

Répondre

0

Juste pour clarifier certaines @Ignacio Vazquez-Abrams commentaires de. Lors du traitement ou de l'analyse de texte, vous ne devez pas vous soucier du nombre d'octets qu'un caractère donné occupe. C'est pourquoi vous sortez l'encodage de l'équation en décodant d'abord le texte codé dans une représentation texte/str séparée.

>>> encoded_text = 'hello world'.encode('utf16') 
>>> encoded_text 
b'\xff\xfeh\x00e\x00l\x00l\x00o\x00 \x00w\x00o\x00r\x00l\x00d\x00' 
>>> type(encoded_text) 
<class 'bytes'> 
>>> len(encoded_text) 
24 


>>> decoded_text = encoded_text.decode('utf16') 
>>> decoded_text 
'hello world' 
>>> type(decoded_text) 
<class 'str'> 
>>> 
>>> len(decoded_text) 
11 

Je l'ai vu le UTF-16 code units dans le code java que vous avez posté ...

Vous pourriez faire quelque chose comme ça pour obtenir le nombre d'octets depuis le début:

sentence = "Obama was born in the United States. But I was born in Alabama".encode('UTF-16LE') 
word = 'United States'.encode('UTF-16LE') 

bytes_from_start = None 
for start_byte_position in range(len(sentence)): 
    candidate = sentence[start_byte_position: start_byte_position + len(word)] 
    if word == candidate: 
     bytes_from_start = len(sentence[:start_byte_position]) 
     print('bytes from start: ', bytes_from_start) 
     print('len(sentence[:start_byte_position]): ', len(sentence[:start_byte_position])) 
     print('Preceding text: "{}"'.format(sentence[:start_byte_position].decode('UTF-16LE'))) 
     break 

Mais il est toujours pas clair si unités de code UTF-16 == octets. J'ai le sentiment qu'il ne veut vraiment que le nombre de caractères dès le départ. Et si c'est tout ce dont vous avez besoin, vous pouvez utiliser la méthode .index() de l'objet str:

sentence = "Obama was born in the United States. But I was born in Alabama" 
word = 'United States' 
characters_from_start = sentence.index(word) 
+0

L'exigence de l'interface est UTF-16 unités de code, de sorte que «codage» est et combien d'octets est le caractère est important. –

+0

Oui, j'ai remarqué cela, mise à jour réponse ... – monkut