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)
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
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))
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))
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))