def construct_neg_samples(
            self, ent_id2ent: Dict, ent_id2ent_tag: Dict, doc: List
    ) -> List[Tuple[Tuple[List, List], List]]:
        """
        Turn the annotated documents but without any positive relation label to the negative samples in a format of
            the DocRED reader output.

        Args:
            ent_id2ent: a dictionary {entity id: [entity mentions' positions]}
            ent_id2ent_tag: a dictionary {entity id: entity NER tag}
            doc: list of all tokens of the document
        Returns:
            a tuple with list of all doc tokens, entity information (positions & NER tags) and relation (=neg_label).
        """
        neg_data_samples = []
        neg_label_one_hot = self.label_to_one_hot([self.rel2id[self.negative_label]])
        for ent1, ent2 in itertools.permutations(ent_id2ent.keys(), 2):
            neg_data_samples.append(
                self.generate_data_sample(doc, ent1, ent2, neg_label_one_hot, ent_id2ent, ent_id2ent_tag)
            )

            self.stat["NEG_REL"] += 1
        return neg_data_samples

        Turn the annotated documents but without any positive relation label to the negative samples in a format of
            the DocRED reader output.

        Args:
            ent_id2ent: a dictionary {entity id: [entity mentions' positions]}
            ent_id2ent_tag: a dictionary {entity id: entity NER tag}
            doc: list of all tokens of the document
        Returns:
            a tuple with list of all doc tokens, entity information (positions & NER tags) and relation (=neg_label).
        
deeppavlov/dataset_readers/docred_reader.py