2014-04-15 3 views
0

Моя проблема заключается в следующем. У меня есть строка, содержащая несколько английских предложений. У меня также есть отдельный список аннотаций, которые были сделаны на этой строке, имеют видаПреобразование числа символов в число токенов

char_index_start | char_index_end | annotation 

Таким образом, для каждой аннотации, слова (или слов), которые были аннотированными показаны, как и где они появляются в предложении через индекс символа, где начинается слово (ы), и индекс, где они заканчиваются. Если аннотация содержит несколько слов, то они смежны внутри предложения. Ниже приведен пример аннотации

230 | 240 | 2006 Civic 

То, что я хочу сделать, это преобразовать индекс символа в лексемы индекса (т.е. подсчет жетонов вместо подсчета символов). Проблема в том, что я не могу придумать прямой способ сопоставления индексов символов с индексами токенов. Проблема в том, что токенизаторы игнорируют пробелы. Таким образом, токенизация строки и сопоставление их с символьными индексами, если предположить, что один символ пробела между каждым токеном не будет работать. Например, если бы где-то было двойное пространство, количество символов было бы неверным. Я предполагаю, что один из способов сделать это - сделать список смежных пробелов, которые встречаются между каждым символом без пробелов, а затем сопоставить их между токенами. Однако это создаст проблемы и потому, что токенизатор может разделять токены, у которых нет места между ними. Есть ли прямой способ сделать это? Или существующий код?

+0

Является ли индекс символов байт, код, кодовая точка, графема или графем-кластер? Кроме того, какой набор символов имеет входной текст? – Deduplicator

+0

Я не уверен, что означают эти термины, но каждому символу присваивается индекс поэтапной последовательной основе. то есть первый символ имеет индекс 1, второй - индекс 2 и т. д. Я также не уверен, что вы подразумеваете под «набором символов». Это utf-8, если это то, что вы имеете в виду. – user1893354

+1

Проблема заключается в следующем: характер символа перегружен, и я пытался определить, какая возможная интерпретация применима к вашим входным данным и, в частности, соответствует ли она интерпретации python. Если это так, замечательно. Если это не так, вы должны пройти под абстракцией строки питона, что будет больно. – Deduplicator

ответ

0

Мне удалось найти решение следующим образом. До того, как я использовал токенизатор nltk для токенизации моей строки. Проблема заключалась в том, что я не смог получить индексы символов для токенов, которые он произвел (возможно, это возможно, но после небольшого количества времени, проведенного исследованиями, я все еще не мог найти способ). Поэтому, в конце концов, я решил создать свой собственный токенизатор, основанный на регулярном выражении, который также даст мне персональные индексы токенов. Дана строка, список всех его лексем и их индексы могут быть найдены с помощью

[(m.start(0), m.end(0),m.group()) for m in re.finditer("\w+|\$[\d\.]+|\S+",input_string)] 

Так что теперь я остался со списком лексем и их индексов символов и список аннотаций и их индексов символов, и это было довольно тривиально, чтобы соответствовать им. Затем я остался с аннотациями на уровне токена, которые я хотел.

Смежные вопросы