Как установить максимальную длину предложения в пространстве?

#nlp #spacy

Вопрос:

У меня есть строка, которую я преобразовал в spacy Doc . Однако, когда я перебираю Doc.sents объект, я получаю предложения, которые, как я обнаружил, слишком длинные.

Есть ли способ при выполнении doc = nlp(string) установить максимальную длину для одного предложения?

Большое спасибо, это действительно помогло бы.

Ответ №1:

Нет, нет никакого способа сделать это.

На нормальном языке, хотя практически предложения не становятся слишком длинными, строгих ограничений на длину предложения не существует. Представьте себе список всех фруктов или что-то в этом роде.

Отчасти из-за этого непонятно, что делать с слишком длинными предложениями. Вы разделяете их на сегменты максимальной длины или меньше? Вы выбрасываете их полностью или обрываете слова после первого куска? Правильный подход зависит от вашего приложения.

Обычно должно быть легко реализовать нужную стратегию поверх .sents итератора.


Чтобы разделить предложения на максимальную длину или меньше, вы можете сделать это:

 def my_sents(doc, max_len):
    for sent in doc.sents:
        if len(sent) < max_len:
            yield sent
            continue

        # this is a long one
        offset = 0
        while offset < len(sent):
            yield sent[offset:offset max_len]
            offset  = max_len
 

Однако обратите внимание, что для многих приложений это бесполезно. Если у вас есть максимальная длина предложений, вам действительно следует подумать о том, почему она у вас есть, и скорректировать свой подход на основе этого.

Комментарии:

1. В моем случае я бы разделил их на сегменты максимальной длины или меньше . Как бы вы это сделали?

2. Я ограничен в плане памяти CUDA. Если я загружаю модель PyTorch слишком длинными последовательностями, я получаю CUDA ошибки выполнения из памяти. Вы знаете обходной путь для этого?

3. Ладно, это все объясняет. Я понятия не имею, как вы интегрируете свою модель PyTorch со spaCy, но либо сделайте то, что описано выше, либо посмотрите на геттеры spaCy. Может быть, вам следует открыть другой вопрос, в котором непосредственно задается проблема, которую вы пытаетесь решить, и подробно описывается ваша сетевая архитектура? spacy.io/api/transformer#span_getters