STANZA/ RuntimeError: Целочисленное деление тензоров с использованием div или / больше не поддерживается

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

Мой код (здесь итерация по списку списка текста и приложений к каждому из них)

t = time()

data_stanza = []
for text in data:
    stz = apply_stanza(text[0])
    data_stanza.append(stz)

print('Time to run: {} mins'.format(round((time() - t) / 60, 2)))

Это функция, которую я использую для apply_stanza к каждому тексту:

nlp = stanza.Pipeline('pt')

def apply_stanza(text):
    doc = nlp(text)
    All = []
    for sent in doc.sentences:
        for word in sent.words:
            All.append((word.id,word.text,word.lemma,word.upos,word.feats,word.head,word.deprel))
    return All

Ошибка:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-17-7ac303eec8e8> in <module>
      3 data_staza = []
      4 for text in data:
----> 5     stz = apply_stanza(text[0])
      6     data_stanza.append(stz)
      7 

<ipython-input-16-364c3ac30f32> in apply_stanza(text)
      2 
      3 def apply_stanza(text):
----> 4     doc = nlp(text)
      5     All = []
      6     for sent in doc.sentences:

~\anaconda3\lib\site-packages\stanza\pipeline\core.py in __call__(self, doc)
    174         assert any([isinstance(doc, str), isinstance(doc, list),
    175                     isinstance(doc, Document)]), 'input should be either str, list or Document'
--> 176         doc = self.process(doc)
    177         return doc
    178 

~\anaconda3\lib\site-packages\stanza\pipeline\core.py in process(self, doc)
    168         for processor_name in PIPELINE_NAMES:
    169             if self.processors.get(processor_name):
--> 170                 doc = self.processors[processor_name].process(doc)
    171         return doc
    172 

~\anaconda3\lib\site-packages\stanza\pipeline\mwt_processor.py in process(self, document)
     31                 preds = []
     32                 for i, b in enumerate(batch):
---> 33                     preds += self.trainer.predict(b)
     34 
     35                 if self.config.get('ensemble_dict', False):

~\anaconda3\lib\site-packages\stanza\models\mwt\trainer.py in predict(self, batch, unsort)
     77         self.model.eval()
     78         batch_size = src.size(0)
---> 79         preds, _ = self.model.predict(src, src_mask, self.args['beam_size'])
     80         pred_seqs = [self.vocab.unmap(ids) for ids in preds] # unmap to tokens
     81         pred_seqs = utils.prune_decoded_seqs(pred_seqs)

~\anaconda3\lib\site-packages\stanza\models\common\seq2seq_model.py in predict(self, src, src_mask, pos, beam_size)
    259             done = []
    260             for b in range(batch_size):
--> 261                 is_done = beam[b].advance(log_probs.data[b])
    262                 if is_done:
    263                     done += [b]

~\anaconda3\lib\site-packages\stanza\models\common\beam.py in advance(self, wordLk, copy_indices)
     82         # bestScoresId is flattened beam x word array, so calculate which
     83         # word and beam each score came from
---> 84         prevK = bestScoresId / numWords
     85         self.prevKs.append(prevK)
     86         self.nextYs.append(bestScoresId - prevK * numWords)

RuntimeError: Integer division of tensors using div or / is no longer supported, and in a future release div will perform 
true division as in Python 3. Use true_divide or floor_divide (// in Python) instead.

ATT: Оказывается, в конце концов, это была ошибка с модулем mwt конвейера строфы, поэтому я просто указал не использовать его.

2 ответа

Использовать // для деления вместо /.

Попробуйте отредактировать свой код следующим образом:

print('Time to run: {} mins'.format(round((time() - t) // 60, 2)))

Использование деления этажа (//) сведет результат к максимально возможному целому числу.

Использование torch.true_divide (Дивиденд, Делитель) или numpy.true_divide (Дивиденд, Делитель) вместо.

Например: 3/4 = torch.true_divide(3, 4)

https://pytorch.org/docs/stable/generated/torch.true_divide.htmlhttps://numpy.org/doc/stable/reference/generated/numpy.true_divide.html

Другие вопросы по тегам