2016-09-22 4 views
0

Мне нужно извлечь количество кодовых единиц UTF-16 с начала строки, в которой имя места начинается с жало Python. Я использую Polyglot NER, чтобы пометить местоположение в строке Python. Например, «Обама родился в Соединенных Штатах, но я родился в Алабаме», будет отмечать «Соединенные Штаты» и «Алабама». Экстрактор Polyglot Python просто возвращается в теги, помеченные тегами, и сколько слов с фронта они начинают. Как узнать количество кодовых единиц UTF-16 от начала строки, в которой происходит слово?Кодовые модули UTF-16 в Polyglot Python

Java интерфейс, который требует информации https://github.com/Berico-Technologies/CLAVIN/blob/master/src/main/java/com/bericotech/clavin/extractor/LocationOccurrence.java

+2

Вы не можете его декодировать первым, чтобы вместо этого работать с текстом? –

+0

Я работаю с текстом. Я честно не могу понять, как он использует единицы кода как расстояние или как получить это расстояние. –

+0

Если вам нужно заботиться о кодировке, вы работаете с байтами, а не с текстом. –

ответ

0

Просто чтобы прояснить некоторые из комментариев @Ignacio Васкес-Абрамса. При обработке или анализе текста вы не хотите беспокоиться о том, сколько байтов занимает данный символ. Вот почему вы берете «кодировку» из уравнения, сначала «декодируя» кодированный текст в отдельное представление text/str.

>>> 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 

Я действительно видел UTF-16 code units в Java код, который вы публикуемую ...

Вы могли бы сделать что-то вроде этого, чтобы получить число байтов от начала:

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 

Но это все еще неясно, если UTF-16 кодовые единицы == байт. У меня такое чувство, что на самом деле просто нужно количество символов с самого начала. И если это все, что вам нужно, вы можете использовать метод .index() объекта 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

Требование к интерфейсу - это коды кода UTF-16, поэтому важно «кодировать» и сколько байтов занимает символ. –

+0

Да, я заметил это, обновленный ответ ... – monkut