Как детоксифицировать просторный текст без контекста документа? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть последовательность от модели последовательности, обученная на токенах, сформированных в результате пространственного токенизации.Это и кодер, и декодер.

Выходные данные представляют собой поток токенов из модели seq2seq.Я хочу детокенизировать текст, чтобы сформировать естественный текст.

Пример:

Вход в Seq2Seq: Некоторый текст

Выход из Seq2Seq: Это не работает.

Есть ли какой-либо API-интерфейс в простом месте для обратного токенизации, выполняемой правилами в его токенизаторе?

1 Ответ

0 голосов
/ 14 мая 2018

Внутренне spaCy отслеживает логический массив, чтобы определить, есть ли у токенов конечный пробел. Вам нужен этот массив, чтобы собрать строку обратно. Если вы используете модель seq2seq, вы можете предсказать пробелы отдельно.

Джеймс Брэдбери (автор TorchText) жаловался мне именно на это. Он прав, что я не думал о моделях seq2seq, когда проектировал систему токенизации в spaCy. Он разработал ревток, чтобы решить свою проблему.

В основном, что делает revtok (если я правильно понимаю), упаковывает два дополнительных бита в идентификаторы лексемы: имеет ли лексема сходство с предыдущим пробелом и имеет ли он сходство со следующим пробелом. Пробелы вставляются между токенами, лексемы которых имеют сродство к пространству.

Вот код, чтобы найти эти биты для spaCy Doc:

def has_pre_space(token):
    if token.i == 0:
        return False
    if token.nbor(-1).whitespace_:
        return True
    else:
        return False

def has_space(token):
    return token.whitespace_

Хитрость заключается в том, что вы отбрасываете пробел, когда либо текущая лексема говорит "нет пробела" или следующая лексема говорит "нет начального пробела". Это означает, что вы можете решить, какую из этих двух лексем «обвинить» в недостатке места, используя статистику частот.

Смысл Джеймса в том, что эта стратегия добавляет очень мало энтропии к решению о предсказании слова. Альтернативные схемы расширят словарный запас с помощью записей типа hello. или "Hello. Его подход не делает ни того, ни другого, потому что вы можете закодировать строку hello. как (hello, 1, 0), (., 1, 1) или как (hello, 1, 0), (., 0, 1). Этот выбор прост: мы определенно должны «винить» период за недостаток места.

...