# -*- coding: utf-8 -*- """Ищет подозрительные записи в doctor_bio_entries: обрывки ФИО, мусор, слишком короткие/бессмысленные строки, попавшие туда из исходника Bitrix.""" import csv, io, re NAME_RE = re.compile(r'^[А-ЯЁ][а-яё]+(?:-[А-ЯЁ][а-яё]+)?\s+[А-ЯЁ][а-яё]+\s+[А-ЯЁ][а-яё]+\.?$') NAME_RE_SHORT = re.compile(r'^[А-ЯЁ][а-яё]+\s+[А-ЯЁ]\.\s?[А-ЯЁ]\.$') HAS_DIGIT = re.compile(r'\d') EDU_KEYWORDS = re.compile( r'(?i)(оконч|университет|академи|институт|ординатур|интернатур|специальност|' r'сертификат|курс|повышени|переподготовк|обучени|стажировк|конгресс|конференц|' r'семинар|мастер-класс|диплом|premij|награжд|лауреат|грамот|благодарност|' r'участ|доклад|школ|цикл|факультет)') rows = list(csv.reader(io.open('bio_entries.csv', encoding='utf-8'))) suspicious = [] for doc_id, doc_name, entry_id, kind, year, title in rows: t = title.strip() flags = [] if NAME_RE.match(t) or NAME_RE_SHORT.match(t): flags.append('похоже на голое ФИО') if len(t) < 15 and not HAS_DIGIT.search(t): flags.append('слишком короткая, без года/деталей') if not EDU_KEYWORDS.search(t) and not HAS_DIGIT.search(t): flags.append('нет ни года, ни ключевых слов образования/наград') if flags: suspicious.append((doc_name, kind, year, t, flags)) out = io.open('bio_glitches_report.txt', 'w', encoding='utf-8') out.write('Всего записей: %d\nПодозрительных: %d\n\n' % (len(rows), len(suspicious))) for doc_name, kind, year, t, flags in suspicious: out.write('%-30s [%s] год=%-5s %s\n -> %s\n\n' % (doc_name, kind, year or '-', t, ', '.join(flags))) out.close() print('suspicious:', len(suspicious), 'of', len(rows))