def __call__(self, chunk, src_docs):

        if chunk.get_mod_type() == ModType.ORIG:
            return

        src_filename = chunk.get_orig_doc_filename()
        if not src_filename in src_docs:
            #this another error, that is checked in another place
            return

        self._check_duplicates(chunk)

        parsed_doc = src_docs[src_filename]
        not_found_cnt = 0
        sents = chunk.get_orig_sents()
        for sent in sents:
            if not parsed_doc.is_sent_in_doc(sent):
                not_found_cnt += 1

        if not_found_cnt == len(sents):
            self._errors.append(
                ChunkError(
                    "Исходное предложение не было найдено в документе-источнике",
                    chunk.get_chunk_id(), ErrSeverity.HIGH))

        elif not_found_cnt != 0:
            self._errors.append(
                ChunkError(
                    "Некоторые предложения не были найдены в документе-источнике",
                    chunk.get_chunk_id(), ErrSeverity.HIGH))
    def __call__(self, chunk, _):
        if self._find_sents_wo_term_in_the_end(chunk):
            self._errors.append(
                ChunkError("Предложение должно заканчиваться точкой (или !?)!",
                           chunk.get_chunk_id(), ErrSeverity.NORM))

        if self._find_sents_wo_title_case(chunk):
            self._errors.append(
                ChunkError("Предложение должно начинаться с заглавной буквы!",
                           chunk.get_chunk_id(), ErrSeverity.NORM))
    def __call__(self, chunk, src_docs):
        if not self._should_run(chunk):
            return
        if chunk.get_orig_text():
            self._errors.append(
                ChunkError(
                    "Поле 'оригинальное предложение' должно быть пустым, если это предложением написано вами",
                    chunk.get_chunk_id(), ErrSeverity.HIGH))
        if not chunk.get_mod_text():
            self._errors.append(
                ChunkError(
                    "Поле 'заимствованное предложение' должно быть заполнено, если это предложением написано вами",
                    chunk.get_chunk_id(), ErrSeverity.HIGH))

        self._try_find_chunk_in_src(chunk, src_docs)
    def __call__(self, chunk, src_docs):
        if chunk.get_mod_type() == ModType.ORIG:
            return

        if not chunk.get_mod_text():
            self._errors.append(
                ChunkError("Пустое модифицированное предложение.",
                           chunk.get_chunk_id(), ErrSeverity.HIGH))
            return

        diff_perc = chunk.measure_dist()
        diff_perc *= 100

        logging.debug("BaseChunkSimChecker: for sent %d: %f ",
                      chunk.get_chunk_id(), diff_perc)

        error_level = None
        etal_diff_perc_tuple = self._diff_perc_dict[chunk.get_mod_type()]
        if diff_perc < etal_diff_perc_tuple[0]:
            msg = "малы"
            if diff_perc + self._fluctuation_delta >= \
               etal_diff_perc_tuple[0]:
                error_level = ErrSeverity.LOW
            elif diff_perc < 3:
                error_level = ErrSeverity.HIGH
            else:
                error_level = ErrSeverity.NORM
        elif etal_diff_perc_tuple[1] < diff_perc:
            msg = "слишком велики"
            if etal_diff_perc_tuple[1] >= \
               diff_perc - self._fluctuation_delta:
                error_level = ErrSeverity.LOW
            else:
                error_level = ErrSeverity.NORM

        if error_level is None:
            return

        common_msg = "Различия между оригинальным и модифицированным предложением %s для %s (различаются на %f%%)"
        self._errors.append(
            ChunkError(
                common_msg %
                (msg, chunks.mod_type_to_str(chunk.get_mod_type()), diff_perc),
                chunk.get_chunk_id(), error_level))
    def __call__(self, chunk, src_docs):
        if chunk.get_mod_type() == ModType.ORIG:
            return
        for sent in chunk.get_orig_sents():
            res = text_proc.seg_text_as_list(sent)

            if len(res) > 1:
                self._errors.append(
                    ChunkError(
                        "Ячейка Оригинальный фрагмент содержит больше 1ого предложения",
                        chunk.get_chunk_id(), ErrSeverity.HIGH))
    def __call__(self, chunk, src_docs):
        if chunk.get_mod_type() == ModType.ORIG:
            return

        res = text_proc.seg_text_as_list(chunk.get_mod_text())
        if not chunk.has_mod_type(ModType.SEP) and not chunk.has_mod_type(ModType.SSP) and\
           not chunk.has_mod_type(ModType.HPR) and len(res) > 1:

            self._errors.append(
                ChunkError(
                    "Модифицированный фрагмент содержит несколько предложений, но его тип не SSP/SEP",
                    chunk.get_chunk_id(), ErrSeverity.HIGH))
    def __call__(self, chunk, src_docs):
        if chunk.get_mod_type() != ModType.DEL:
            return
        super(DelChecker, self).__call__(chunk, src_docs)

        if len(chunk.get_orig_tokens()) <= \
           len(chunk.get_mod_tokens()):
            self._errors.append(
                ChunkError(
                    "Тип сокрытия DEL: количество слов в модифицированном предложении\
                больше или равно количеству слов в оригинальном.",
                    chunk.get_chunk_id(), ErrSeverity.HIGH))
    def __call__(self, chunk, src_docs):
        if not chunk.get_orig_doc():
            return

        if chunk.get_orig_doc() not in self._used_source_docs_set:
            self._used_source_docs_set.add(chunk.get_orig_doc())

            if not self._check_existance(chunk.get_orig_doc_filename()):

                logging.debug("this doc does not exist!! %s",
                              chunk.get_orig_doc_filename())
                self._errors.append(
                    ChunkError(
                        "Документ '%s' не существует " % chunk.get_orig_doc(),
                        chunk.get_chunk_id(), ErrSeverity.HIGH))
    def __call__(self, chunk, src_docs):

        if not chunk.has_mod_type(ModType.CCT):
            return

        orig_sents = chunk.get_orig_sents()
        if len(orig_sents) < 2:
            self._errors.append(
                ChunkError(
                    "Тип заимствования CCT: оригинальный фрагмент должен содержать несколько предложений ",
                    chunk.get_chunk_id(), ErrSeverity.HIGH))

        if chunk.get_mod_type() != ModType.CCT:
            return
        super(CctChecker, self).__call__(chunk, src_docs)
Esempio n. 10
0
 def _try_find_chunk_in_src(self, chunk, src_docs):
     for src in src_docs:
         sent_holder = chunk.get_mod_sent_holder()
         sents = sent_holder.get_sents()
         found_sents = 0
         for num, sent in enumerate(sents):
             if sent_holder.get_sent_info(num).word_cnt < 6:
                 continue
             if src_docs[src].is_sent_in_doc(sent):
                 found_sents += 1
         if found_sents == len(sents):
             self._errors.append(
                 ChunkError(
                     "Оригинальное предложение было найдено в документе '%s'"
                     % src, chunk.get_chunk_id(), ErrSeverity.HIGH))
             break
Esempio n. 11
0
    def __call__(self, chunk, src_docs):
        reports = []
        found = self._find_homoglyphs(chunk)

        for char_info in found:
            reports.append(
                'В слове "{}" заменена буква "{}" на "{}" ({}).'.format(
                    char_info['word'], char_info['homoglyphs']['c'],
                    char_info['character'], char_info['alias']))

        if reports:
            self._errors.append(
                ChunkError(
                    "Модифицированное предложение содержит замены отдельных букв! {}"
                    .format(';'.join(reports)), chunk.get_chunk_id(),
                    ErrSeverity.HIGH))
Esempio n. 12
0
    def __call__(self, chunk, src_docs):
        if chunk.get_mod_type() == ModType.ORIG:
            return

        lex_dist = chunk.lexical_dist()
        lex_dist *= 100
        logging.debug("LexicalSimChecker:: lex_dist=%f", lex_dist)

        err_sev = None
        if lex_dist < self._opts.min_lexical_dist:
            err_sev = ErrSeverity.NORM
            if lex_dist + self._fluctuation_delta < self._opts.min_lexical_dist:
                err_sev = ErrSeverity.HIGH

        if err_sev is not None:
            common_msg = "Значительное совпадение по лексике у оригинального "\
                         "и модифицированного предложений (различаются на %f%%)"
            self._errors.append(
                ChunkError(common_msg % lex_dist, chunk.get_chunk_id(),
                           err_sev))
Esempio n. 13
0
 def _check_duplicates(self, chunk):
     unique_sents = frozenset(chunk.get_orig_sents())
     if len(unique_sents) != len(chunk.get_orig_sents()):
         self._errors.append(
             ChunkError("Исходные предложения дублируются!", chunk.get_id(),
                        ErrSeverity.HIGH))