Поэтапно добавляет единицу в список индексов с учетом позиций указанного элемента в списке - PullRequest
3 голосов
/ 10 октября 2019

Учитывая список токенов, введите:

>>> tokenized_text = "[CLS] my dog is cute [SEP] he likes slack ##ing [SEP]".split()
>>> tokenized_text 
['[CLS]', 'my', 'dog', 'is', 'cute', '[SEP]', 'he', 'likes', 'slack', '##ing', '[SEP]']

Цель состоит в том, чтобы создать индекс на срок до каждого [SEP] слева направо, найти токены [SEP], а затем постепенно добавить1 после каждого [SEP], поэтому желаемые выходные индексы для списка tokenize_text выше:

[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

Я пробовал:

# Find the indices of `[SEP]`.
>>> sep_indices = np.array(np.where(np.array(tokenized_text) == "[SEP]"))[0]
>>> sep_indices
array([ 5, 10])

>>> prev = 0
>>> out =[]
>>> for i, idx in enumerate(sep_indices):
...     for _ in range(idx-prev):
...         out.append(i)
...     prev = idx
... 
>>> out = [0] + out[:-1]
>>> out
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

Но есть ли более простой способдобиться правильного вывода?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

А как насчет cumsum? Вывод не согласован в вашем вопросе, но такие ошибочные ошибки легко исправить.

>>> np.cumsum(np.array(tokenized_text) == "[SEP]")
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2])

Для тех, кому по какой-либо причине не нужно / не нужно использовать numpy, естьтакже itertools.accumulate

>>> from itertools import accumulate
>>> list(accumulate(int(elem == '[SEP]') for elem in tokenized_text))
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2]
2 голосов
/ 10 октября 2019

Простой и векторизованный способ с NumPy -

In [116]: a = np.asarray(tokenized_text)

In [117]: m = a == "[SEP]"

In [118]: m.cumsum()-m
Out[118]: array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...