Анализ качества учебных материалов, или как у нас ничего не вышло +1


image

Доброго времени суток.

Сегодня расскажу вам о попытках осилить анализ учебных материалов, борьбе за качество этих документов и разочаровании, которое мы познали. «Мы» это пара студентов из МГТУ им. Н. Э. Баумана. Если вам интересно, добро пожаловать под кат!

Задача


Мы собирались оценивать качество учебных материалов (методических указаний, учебников и пр.) по статистическим показателям. Показателей таких было немало, вот некоторые из них: отклонение числа глав от «идеального» (равного пяти), среднее число символов на страницу, среднее число схем на страницу и так далее по списку. Не так уж и сложно, да? Но это было только начало, ведь дальше, в случае успеха, нас ждало построение онтологии и семантический анализ.

Инструменты и исходные данные


Проблема заключалась в исходных материалах, а ими были всевозможные методички/учебники в PDF. Вернее, проблема была даже не в самих материалах, а в PDF и качестве конвертации.
Для работы с PDF было решено использовать Python и какую-нибудь модную молодежную библиотеку на роль которой была выбрана pdfminer.six.

История


Вообще, сначала мы пробовали разные библиотеки для питона, но все они не очень дружили с кириллицей, а литература у нас написана на русском языке. К тому же, самые простые библиотеки умели только вытаскивать текст, чего нам было недостаточно. Остановившись на pdfminer.six, мы начали прототипировать, экспериментировать и развлекаться. К счастью, для начала примеров из документации нам хватило.

Мы создавали свои PDF-документы с текстом, изображениями, таблицами и прочим. Всё у нас шло хорошо, мы могли спокойно вытащить любой элемент из нашего документа.

Вот как выглядит страница документа в нашем представлении

image

Приведу небольшой пример взаимодействия с документом: получение текста документа.

file = open(path, 'rb')
parser = PDFParser(file)
document = PDFDocument(parser)

output = StringIO()
manager = PDFResourceManager()
converter = TextConverter(manager, output, laparams=LAParams())
interpreter = PDFPageInterpreter(manager, converter)

    for page in PDFPage.get_pages(file):
        interpreter.process_page(page)

converter.close()
text = output.getvalue()
output.close()

Как можно увидеть, получить текст из документа довольно просто. Всякое взаимодействие осуществляется согласно схеме ниже

image

Почему ничего не вышло?


Все эксперименты были удачными и на тестовых PDF-файлах всё было прекрасно. Как оказалось, сломать всё – задача тривиальная и идея разбилась о суровую действительность.
После экспериментов мы взяли несколько настоящих учебников и обнаружили, что всё что угодно может пойти не так.

Первое, что мы заметили: количество изображений, подсчитанных программой, не соответствует действительности, а части текста просто теряются.

Выяснилось, что некоторые (иногда даже многие) части текста в документе были представлены не в виде текста и неизвестно как так получилось. Этот факт сразу же отмел анализ частотного распределения символов/слов/словосочетаний, семантики, да и вообще любой другой вид анализа текста.

Возможно, что при конвертации или создании этих документов произошло что-то непредвиденное, а возможно, что никому и не было нужно, чтобы они были сформированы «правильно». К сожалению, таких материалов было большинство, что и привело к разочарованию в идее подобного анализа.

Литература


Раздел документации из репозитория pdfminer.six был использован для написания статьи и в качестве справочника.




К сожалению, не доступен сервер mySQL