35 lines
2.1 KiB
Python
35 lines
2.1 KiB
Python
# -*- 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))
|