Система автоматической разметки научных статей

Особенности научных статей, представленных в формате PDF. Разработка классов для системы автоматической разметки. Выбор программного обеспечения для реализации и обучения нейронной сети. Алгоритмы сортировки блоков в соответствии с иерархией документа.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 13.07.2020
Размер файла 5,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Класс SegmentationModel решает задачу загрузки модели для фреймворка Detectron2, а также реализует интерфейс для нахождения элементов страницы на заданном изображении. При создании экземпляра класса в конструктор необходимо передать следующие параметры:

· path_to_model (строка) - путь до обученной модели Detectron2;

· path_to_cfg_config (строка) - путь до файла конфигурации фреймворка;

· device (строка) - тип вычислительного устройства, которое будет использоваться для работы модели;

· score_thresh_test (вещественное число) - пороговое значение для принятия решения о принадлежности найденного блока к классу.

Метод predict принимает на вход изображение, а возвращает таблицу, в которой указаны координаты каждого найденного блока, класс этого блока и уверенность модели в этом блоке.

Класс FindingFormulasModel решает задачу загрузки модели ScanSSD, созданную на фреймворке PyTorch, а также реализует интерфейс для нахождения формул на изображении страницы документа. При создании экземпляра класса в конструктор необходимо передать следующие параметры:

· path_to_model (строка) - путь до обученной модели;

· score_thresh_test (вещественное число) - пороговое значение для принятия решения о принадлежности найденного блока к классу формул.

Метод predict принимает на вход изображение, а возвращает таблицу, в которой указаны координаты найденных формул.

2.2 Поиск информационных блоков на изображении

2.2.1 Выбор данных

При реализации модели для нахождения объектов на изображении важным аспектом является набор используемых данных. Для задачи нахождения элементов научных статей на изображении существует мало данных, что усложняет работу и исследования в этой области. Основной сложностью создания необходимых наборов данных является то, что выделять и классифицировать блоки на изображении необходимо человеку, а создать искусственный набор данных под конкретную задачу зачастую сложно. На сегодняшний день существует только два релевантных решаемой задаче набора данных: «PRImA Layout Analysis Dataset» [66] и «PubLayNet» [67].

Набор данных «PRImA Layout Analysis Dataset» опубликован в 2009 году и содержит размеченные документы, в которых выделены следующие классы: текст, изображение, рисунок, таблица, диаграмма, разделитель, формула, шум и рамка. Однако в этом наборе данных есть два существенных недостатка: первый недостаток - это количество изображений в наборе, всего авторы разметили 1240 изображений, второй недостаток - это наличие в данном наборе не только научных статей, но и научно-популярных журналов, чья верстка сильно отличается от научных статей, а такое отличие может повлиять на качество моделей и алгоритмов для научных статей.

Рис. 8 Фрагмент набора данных «PRImA Layout Analysis Dataset»

Набор данных «PubLayNet» опубликован в 2019 году и содержит размеченные документы, в которых выделены следующие классы: текст, заголовок, список, таблица и фигура. Такой набор данных имеет ряд преимуществ для использования при обучении нейронных сетей. Основным преимуществом является размер: в наборе данных содержится 360000 размеченных документов. Такой большой корпус авторам удалось собрать благодаря наличию медицинских статей в XML формате. Сопоставляя XML-документ и PDF-документ, авторы научились получать координаты блоков на изображении, а уже полученные координаты использовать для обучения нейронной сети. Данный набор идеально подходит для решаемой задачи, а, следовательно, он будет использоваться при обучении нейронной сети.

Рис. 9 Пример разметки научной статьи в наборе данных PubLayNet

2.2.2 Выбор архитектуры нейронной сети

Для выбора архитектуры нейронной сети при решении задачи обнаружения объектов существуют различные наборы данных, на которых модели обучаются и сравниваются по метрикам качества. В статье [68] приводится сравнение двадцати двух моделей для решения задачи обнаружения объектов на основе набора данных Microsoft coco [69]. Согласно результату, наилучшее качество по метрике средней точности (average precision) показывает архитектура нейронной сети Mask R-CNN с извлечением признаков из изображения при помощи сети ResNeXt [70]. Плюсом арихектуры Mask R-CNN является то, что она решает задачу instance segmentation - определение пикселей, принадлежащих каждому объекту каждого класса по отдельности, что позволяет получать высокое качество при сегментации объектов на изображении.

2.2.3 Выбор программного обеспечения для реализации и обучения нейронной сети

При реализации проекта с использованием нейронных сетей важным аспектом является выбор программной библиотеки для машинного обучения. На сегодняшний день существует большое количество открытых библиотек: Tensorflow от компании Google, PyTorch, Caffe и другие. Помимо перечисленных библиотек также существуют надстройки над этими библиотеками, которые позволяют получать простой доступ к реализации различных нейросетей.

Для реализации нахождения элементов страницы была выбрана программная библиотека Detectron2, которая в свою очередь использует библиотеку PyTorch. Библиотека Detectron2 содержит в себе архитектуру Mask R-CNN с сетью ResNeXt в качества извлечения признаков.

Для обучения модели необходимо отредактировать соответствующий выбранной архитектуре YAML-документ, в котором содержится информация для обучения. Необходимо дополнительно указать следующие параметры:

· количество классов;

· имена наборов данных для обучения и тестирования полученных результатов;

· максимальное количество итераций обучения;

· скорость обучения модели.

После этого можно запускать обучение при помощи скрипта на языке Python train_net.py, передав аргументом конфигурацию используемой модели.

Метрика средней точности (average precision) полученной модели составляет 90,57%. Для обучения модели использовалось 191000 изображений, а для тестирования использовалось 11000 изображений. Пример нахождения сегментов на странице документа представлен в приложении (Приложение Б).

2.3 Алгоритмы для сортировки блоков в соответствии с иерархией документа

На основании данных, полученных от класса SegmentationModel, строится Pandas DataFrame. Таблица содержит следующие колонки: точные значения границ блока в jpg-разрешении (лево, верх, право, низ), метка класса блока (текст, заголовок, список, таблица, фигура), уверенность модели в предсказанном классе, ширина jpg-изображения и округленные до разряда десятков значения границ (лево, верх, право, низ).

Система должна работать с тремя типами иерархии научных статей:

· Формат 1: двухколонная верстка с сортировкой по правилу «если нетекстовый элемент заверстывают поперек полосы на несколько колонок, текст из каждой колонки не переходит в следующую через нетекстовый элемент»;

· Формат 2: двухколонная верстка с сортировкой по правилу «если нетекстовый элемент заверстывают поперек полосы на несколько колонок, текст из каждой колонки переходит в следующую через нетекстовый элемент»;

· Формат 3: одноколонная верстка.

Следовательно, необходимо реализовать алгоритмы сортировки найденных информационных блоков для трех форматов иерархии.

2.3.1 Формат 1

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

Затем в таблицу добавляется следующее поле: тип блока (одно- или двухколонная верстка). Тип блока вычисляется с помощью проверки условия: если разница между правой и левой координатой больше либо равна половине ширины PDF-страницы, то это блок, заверстанный под одноколонную верстку, иначе - двухколонную верстку.

Для решения проблемы с чередованием одно- и двухколонных блоков используется работа с флагами: выделяются области страницы с блоками одного типа. Результат обхода записывается в словарь result_dict.

flag_one = False

flag_two = False

i_df = 0

i_dict = 0

tmp_list = list()

result_dict = dict()

while i_df < df.shape[0]:

if df.type.iloc[i_df] == 'one' and flag_one == False and flag_two == True:

flag_one = True

flag_two = False

result_dict[i_dict] = tmp_list

tmp_list = list()

tmp_list.append(i_df)

i_dict += 1

elif df.type.iloc[i_df] == 'two' and flag_one == True and flag_two == False:

flag_one = False

flag_two = True

result_dict[i_dict] = tmp_list

tmp_list = list()

tmp_list.append(i_df)

i_dict += 1

elif df.type.iloc[i_df] == 'two' and flag_two == False:

flag_two = True

tmp_list.append(i_df)

elif df.type.iloc[i_df] == 'two' and flag_two == True:

tmp_list.append(i_df)

elif df.type.iloc[i_df] == 'one' and flag_one == False:

flag_one = True

tmp_list.append(i_df)

elif df.type.iloc[i_df] == 'one' and flag_one == True:

tmp_list.append(i_df)

i_df += 1

result_dict[i_dict] = tmp_list

Для формата 1 при сортировке элементов в двухколонной области необходимо сначала записывать элементы левой колонки (отсортированные по возрастанию верхней границы), затем - элементы правой колонки (отсортированные по возрастанию верхней границы). Создается Pandas DataFrame result_df, в котором ранее известная информация о блоке дополняется полем «маркер» - показателем является блок левой или правой колонкой (это используется только для двухколонной верстки).

result_df = pd.DataFrame()

for i in range(len(result_dict)):

tmp_df = df.iloc[result_dict[i],:]

if 'two' == tmp_df['type'].iloc[0]:

tmp_df['marker'] = tmp_df.apply(lambda x: 'left' if x['left'] <= x['image_width']/2. else 'right', axis = 1)

tmp_df['right'] = tmp_df.right.apply(math.ceil)

if tmp_df[tmp_df.marker == 'left'].shape[0] > 0:

min_l_left = math.floor(tmp_df[tmp_df.marker == 'left'].left.min())

if tmp_df[tmp_df.marker == 'right'].shape[0] > 0:

min_l_right = math.floor(tmp_df[tmp_df.marker == 'right'].left.min())

result_tmp_df = pd.DataFrame()

left_tmp_df = tmp_df[tmp_df.marker == 'left'].sort_values(by=['upper'], ascending=True)

if left_tmp_df.shape[0] > 0:

left_tmp_df.left = min_l_left

result_tmp_df = result_tmp_df.append(left_tmp_df, ignore_index=True)

right_tmp_df = tmp_df[tmp_df.marker == 'right'].sort_values(by=['upper'], ascending=True)

if right_tmp_df.shape[0] > 0:

right_tmp_df.left = min_l_right

result_tmp_df = result_tmp_df.append(right_tmp_df, ignore_index=True)

tmp_df = result_tmp_df

result_df = result_df.append(tmp_df, ignore_index=True)

if 'marker' not in result_df.columns.tolist():

result_df['marker'] = None

result_df.marker = result_df.marker.fillna('one')

Основная работа по сортировке формата 1 проведена (Приложение В). Из примера видно, что Detectron2 хорошо определяет верхнюю границу блока, но нижнюю часто обрезает, из-за чего возрастает риск потери информации. Также у данной модели есть проблема с повторами: некоторые фрагменты текста встречаются в соседних блоках. Для исправления данных проблем было решено создать алгоритм проверки на вхождение одного блока в другой по координатам для удаления повторов и правила сдвига нижней границы одного блока до верхней границы соседнего снизу блока.

Для удаления блока, целиком входящего в другой блок, необходимо проверить следующие условия:

· принадлежать к одному маркеру и одному классу (текст, заголовок, список);

· y-координаты одного блока должны находиться между y-координатами другого блока.

Для исправления случая, когда блоки пересекаются, необходимо проверить следующие условия:

· блоки должны быть соседними по сортировке;

· принадлежать к одному маркеру;

· y-координата нижней части блока ниже y-координаты верхней части следующего по сортировке блока.

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

bad_indexes = list()

for i in range(result_df.shape[0]):

for j in range(result_df.shape[0]):

bb1 = {

'x1': result_df.left.iloc[i],

'x2': result_df.right.iloc[i],

'y1': result_df.upper.iloc[i],

'y2': result_df.lower.iloc[i],

'marker': result_df.marker.iloc[i],

'label': result_df.label.iloc[i]

}

bb2 = {

'x1': result_df.left.iloc[j],

'x2': result_df.right.iloc[j],

'y1': result_df.upper.iloc[j],

'y2': result_df.lower.iloc[j],

'marker': result_df.marker.iloc[j],

'label': result_df.label.iloc[j]

}

if bb1['y1'] >= bb2['y1'] and bb1['y2'] <= bb2['y2'] and (i!=j) and (bb1['label'] in ['text', 'title', 'list']) and (bb2['label'] in ['text', 'title', 'list']) and (bb1['marker'] == bb2['marker']):

bad_indexes.append(i)

elif (bb1['y2'] > bb2['y1']) and (i+1 == j) and (bb1['marker'] == bb2['marker']):

result_df.upper.iloc[j] = result_df.upper.iloc[i]

bad_indexes.append(i)

result_df = result_df.drop(bad_indexes)

Правила склеивания соседних блоков или переноса нижней границы обрабатывают следующие случаи:

· нижняя граница блока типа одноколонной верстки сдвигается до верхней границы следующего по иерархии блока;

· нижняя граница блока из левой колонки сдвигается до верхней границы следующего по иерархии блока в случаях, если следующий блок левый или одноколонного типа (т. е. не было правой колонки);

· нижняя граница блока из левой колонки сдвигается до верхней границы блока одноколонного типа после перебора всех правых блоков;

· нижняя граница блока из левой колонки может быть сдвинута на определенное количество пикселей, если этот блок является последним;

· нижняя граница блока из правой колонки сдвигается до верхней границы следующего по иерархии блока в случаях, если следующий блок правый или одноколонного типа;

· для самого последнего по иерархии страницы блока нижняя граница сдвигается на определенное количество пикселей.

for i in range(result_df.shape[0]-1):

if result_df['type'].iloc[i] == 'one':

result_df.lower.iloc[i] = result_df.upper.iloc[i+1]

elif (result_df.marker.iloc[i] == 'left') and (result_df.marker.iloc[i+1] == 'left'):

result_df.lower.iloc[i] = result_df.upper.iloc[i+1]

elif ((result_df.marker.iloc[i] == 'right') and (result_df.marker.iloc[i+1] == 'right')) or ((result_df.marker.iloc[i] == 'right') and (result_df.marker.iloc[i+1] == 'one')):

result_df.lower.iloc[i] = result_df.upper.iloc[i+1]

elif (result_df.marker.iloc[i] == 'left') and (result_df.marker.iloc[i+1] == 'one'):

result_df.lower.iloc[i] = result_df.upper.iloc[i+1]

elif (result_df.marker.iloc[i] == 'left') and (result_df.marker.iloc[i+1] == 'right'):

k = copy.copy(i) + 1

while k <= result_df.shape[0]-1:

if result_df.marker.iloc[k] == 'one':

break

k += 1

if k <= result_df.shape[0]-1:

result_df.lower.iloc[i] = result_df.upper.iloc[k]

else:

result_df.lower.iloc[i] += min((result_df.lower.iloc[i] - result_df.upper.iloc[i]) * 0.3, img.size[1] - result_df.lower.iloc[i])

result_df.lower.iloc[result_df.shape[0]-1] += min((result_df.lower.iloc[result_df.shape[0]-1] - result_df.upper.iloc[result_df.shape[0]-1]) * 0.3, img.size[1] - result_df.lower.iloc[result_df.shape[0]-1])

return result_df

2.3.2 Формат 2

Формат 2 отличается от формата 1 только сортировкой колонок, поэтому имеет смысл использовать результат работы алгоритма для формата 1 (там уже была проведена операция по удалению повторов и сдвиганию нижних границ) для пересортировки под правило формата 2.

Для этого сначала выбираются по порядку все левые блоки двухколонной верстки и блоки одноколонной верстки, затем - все правые блоки двухколонной верстки. Работа по сортировке формата 2 проведена (Приложение В).

last_result_df = pd.DataFrame()

last_result_df = last_result_df.append(result_df[(result_df['marker'] == 'one')|(result_df['marker'] == 'left')], ignore_index = True)

last_result_df = last_result_df.append(result_df[(result_df['marker'] == 'right')], ignore_index = True)

last_result_df = last_result_df.reset_index(drop=True)

2.3.3 Формат 3

Для формата 3 используется только сортировка по верхней границе:

result_df = df.sort_values(by=['upper'], ascending=True)

result_df = result_df.reset_index(drop=True)

Для работы по удалению повторов, пересечений и сдвигу границ используется упрощенная версия алгоритма:

bad_indexes = list()

for i in range(result_df.shape[0]):

for j in range(result_df.shape[0]):

bb1 = {

'x1': result_df.left.iloc[i],

'x2': result_df.right.iloc[i],

'y1': result_df.upper.iloc[i],

'y2': result_df.lower.iloc[i],

'label': result_df.label.iloc[i]

}

bb2 = {

'x1': result_df.left.iloc[j],

'x2': result_df.right.iloc[j],

'y1': result_df.upper.iloc[j],

'y2': result_df.lower.iloc[j],

'label': result_df.label.iloc[j]

}

if bb1['y1'] >= bb2['y1'] and bb1['y2'] <= bb2['y2'] and (i!=j) and (bb1['label'] in ['text', 'title', 'list']) and (bb2['label'] in ['text', 'title', 'list']):

bad_indexes.append(i)

result_df = result_df.drop(bad_indexes)

for i in range(result_df.shape[0]-1):

if (result_df.upper.iloc[i+1] > result_df.upper.iloc[i]) and (result_df.label.iloc[i] in ['text', 'title', 'list']):

result_df.lower.iloc[i] = result_df.upper.iloc[i+1]

return result_df

2.4 Извлечение текста

2.4.1 Pdftotext

Для извлечения текста из информационных блоков с метками «текст», «заголовок» и «список» используется функция extract_text экземпляра класса TextPageElement. Для работы с документами типа searchable используется библиотека Pdftotext версии 4.02. Pdftotext преобразует файлы PDF в обычный текст.

Для использования библиотеки необходимо в командной строке ввести следующую команду: pdftotext [options] [PDF-file [text-file]], где PDF-file - это путь до файла в формате PDF, text-file - итоговый текстовый файл, а options - параметры конвертации. Если текстовый файл не указан, pdftotext преобразует файл file.pdf в файл file.txt. Если текстовым файлом является «-», текст отправляется на стандартный вывод. Для задач данной системы необходимо задавать следующие параметры:

· f (целое число) - задает первую страницу для конвертации;

· l (целое число) - указывает последнюю страницу для конвертации;

· r (целое число) - определяет разрешение в DPI. По умолчанию установлено значение 72 DPI;

· х (целое число) - определяет x-координату левого верхнего угла области обрезки;

· y (целое число) - определяет y-координату левого верхнего угла области обрезки;

· W (целое число) - определяет ширину области обрезки в пикселях (по умолчанию 0);

· Н (целое число) - определяет высоту области обрезки в пикселях (по умолчанию 0);

· enc (строка) - устанавливает кодировку, используемую для вывода текста.

Для работы с pdftotext используется библиотека Python Subprocess. Модуль подпроцесса позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать результат их выполнения. С его помощью запускается pdftotext с необходимыми параметрами, а результат выводится в переменную res, где затем декодируется и обрабатывается регулярными выражениями с целью избавиться от нечитаемых символов юникода.

2.4.2 OCR.

Для извлечения текста из информационных блоков с метками «текст», «заголовок» и «список» используется функция extract_text экземпляра класса TextPageElement. Для работы с отсканированными документами или в том случае, когда pdftotext не извлек текст из документа типа searchable, используется инструмент с открытым исходным кодом Tesseract OCR. Начиная с четвертой версии, Tesseract OCR поддерживает модели по распознаванию текста с изображения на основе нейронных сетей с LSTM архитектурой. Также, в нем остался подход на основе правил.

Общая последовательность работы системы Tesseract OCR следующая:

1) Использование метода Adaptive Thresholding, который преобразует изображение в бинарную версию [71];

2) Понимание размещения объектов на изображении для выделения только тех областей, которые содержат текст;

3) Использование LSTM-сети, на вход которой поступает изображение строки текста;

4) Проверка распознанных слов: если все распознанные слова содержатся в словаре, то на этом последовательность работы системы с текущей строкой прекращается, если нет, то происходит дальнейшая обработка;

5) Применяется распознавание слов первого этапа на основе правил;

6) Применяется распознавание слов второго этапа на основе правил.

В качестве нейронной сети применяется не классическая LSTM, а архитектура Variable Graph Specification Language (VGSL) [72]. Эта архитектура позволяет LSTM сверткам обрабатывать изображения строк текста разной длины, поступающие на вход Tesseract OCR.

Устанавливается Tesseract OCR через пакетный менеджер apt в Ubuntu:

sudo apt update && sudo apt install tesseract-ocr

Также для удобной интеграции с python устанавливаем пакет pytesseract:

pip3 install pytesseract -user

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

sudo apt install tesseract-rus && sudo apt install tesseract-lat

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

· oem (целое число) - параметр, отвечающий за тип используемой модели, необходимое значение - 1 (использование LSTM архитектуры);

· psm (целое число) - параметр, отвечающий за тип входящего изображения и режим распознавания (одно слово, одна строка, абзац), необходимое значение - 6 (абзац);

· l (строка) - параметр, отвечающий за используемый язык. Если текст распознается на нескольких языках одновременно, то передаются сокращения языков через знак «+», необходимое значение - rus+eng+lat.

Рис. 10 Пример найденного блока текста

С примером, представленным на рисунке 10, Tesseract OCR справляется и распознает текст с точностью 100%.

2.5 Извлечение нетекстовых элементов

2.5.1 Извлечение таблиц

Для работы по извлечению большинства таблиц из PDF-документов используется инструмент с открытым исходным кодом PDFPlumber версии 0.5.18. Этот инструмент позволяет извлечь таблицы, показывает подробную информацию о каждом текстовом символе в ней, прямоугольнике и строке. Также визуально отображает таблицы. Лучше всего работает с автоматически сгенерированными, а не отсканированными файлами PDF. Построен на PDFMiner и PDFMiner.six.

Сначала необходимо провести тестирование библиотеки, чтобы понять, как работает данная система на корпусе данных. Для загрузки PDF-файла используется метод open(path_to_file).

pdf = pdfplumber.open('./tables/one-2.pdf')

Для обращения к страницам PDF-файла используется метод pages. Он возвращает список, содержащий один экземпляр pdfplumber.Page для каждой загруженной страницы.

p0 = pdf.pages[0]

Метод to_image() возвращает экземпляр класса PageImage. Затем метод debug_tablefinder(table_settings={}) можно использовать для отображения таблицы на изображении (Приложение Г), т. к. этот метод возвращает экземпляр класса TableFinder с доступом к свойствам edges, intersections, cells и tables.

im = p0.to_image()

im.debug_tablefinder()

Для извлечения таблиц используется метод extract_tables(table_settings={}). Возвращает текст, извлеченный из всех таблиц, найденных на странице, в виде списка списков списков со структурой таблица, строка, ячейка (Приложение Д).

table = p0.extract_tables()

df = pd.DataFrame(table[0][1:], columns=table[0][0])

Таким образом, PDFplumber справляется с таблицами, у которых есть границы (выделены границы самой таблицы, строки и столбцы), не находит таблицы без границ и плохо справляется с теми, у которых нестандартный стиль. Соответственно, логичнее всего находить таблицы среди тех информационных блоков, которые помечены классом «таблица», и, если не получилось извлечь из блока таблицу, сохранить ее как изображение.

Для использования данного инструмента в системе была создана функция pdfplumber_extractor класса Document. Данная функция на вход получает путь до PDF-документа. Предполагалось, что поиск и извлечение таблиц будет происходить по координатам блоков с классом «таблица», полученным от SegmentationModel, но, во время экспериментов выяснилось, что модель возвращает границы слишком близко к самой таблице и PDFPlumber не всегда такую таблицу способен распознать. Поэтому было решено искать таблицы на всей странице, а не на области, а затем оставлять только те, которые имеют пересечение с блоками с классом «таблица».

Для удобного сохранения всех извлеченных с помощью PDFplumber таблиц используется структура Pandas DataFrame языка Python. Каждая строка содержит информацию об одной извлеченной таблице: номер страницы, координаты в разрешении для jpg-файла (лево, верх, право, низ) и саму извлеченную таблицу в виде Pandas DataFrame. Т. к. разрешение у PDF-страницы и jpg-файлов, с которыми работает Detectron2, не совпадает, используется свойство пропорции для перехода от одних координат к другим. После выполнения функция возвращает данную структуру.

Для сопоставления извлеченных с помощью PDFPlumber таблиц и блоков с классом «таблица», полученных в результате работы SegmantationModel, используются функции match_pdfplumber_data и calc_iou класса Document. В функции calc_iou реализовано вычисление Intersection over Union. Это метрика оценки, используемая для измерения точности детекции объекта в наборе данных. Происходит вычисление отношения площади пересечения блоков к площади объединения блоков. По этой метрике выбираются только те таблицы, которые максимально близки к области блока с классом «таблица».

2.5.2 Извлечение формул

Для обнаружения формул используется подход ScanSSD. Архитектура этого подхода заключается в использовании скользящего окна для выборки пересекающихся изображений из изображения страницы документа. Затем каждое перекрывающееся изображение передается в детектор Single-Shot (SSD), чтобы найти области формул. Для нахождения пересекающихся предсказаний используется алгоритм non-maximal suppression (NMS). Однако этого недостаточно, и поэтому, чтобы объединить предсказания внутри нескольких скользящих окон, используется объединение предсказаний от детектора SSD в рамках одной страницы документа, а после применяется метод объединения на основе голосования для получения окончательных результатов обнаружения.

Рис. 11 Архитектура ScanSSD

Поиск формул и их сохранение в контейнер происходит при вызове метода extract экземпляра класса DocumentPage. Каждая найденная формула сохраняется при помощи экземпляра класса PageElement.

2.6 Подготовка итогового docx-документа

Для сбора всей извлеченной информации в итоговый docx-документ используется библиотека с открытым исходным кодом python-docx версии 0.8.10. Python-docx - это библиотека Python для создания и обновления файлов Microsoft Word.

Самый простой способ начать работу с данной библиотекой - открыть новый документ без указания файла для открытия:

from docx import Document as DocumentDocx

document = DocumentDocx()

Это создает новый документ из встроенного шаблона по умолчанию. «Шаблон по умолчанию» - это файл Word без содержимого, сохраненный с установленным пакетом python-docx.

Название статьи можно добавить с помощью метода add_heading(text=u'', level=1), который возвращает новый заголовок, добавленный в конец документа. Заголовок абзаца будет содержать текст и его стиль, определенный уровнем. Если уровень равен 0, стиль устанавливается на Title. Если уровень равен 1 (или больше), используется заголовок 1. В противном случае стиль устанавливается в Heading {уровень}. Вызывает ValueError, если уровень находится вне диапазона 0-9.

document.add_heading('Document Title', 0) #Название статьи

document.add_heading('Heading, level 1', level=1) #Подзаголовки

Для добавления параграфа используется метод add_paragraph(text=u'', style=None), который возвращает новый абзац, добавленный в конец документа, заполненный текстом и имеющий стиль стиля абзаца. Текст может содержать символы табуляции (\t), которые преобразуются в соответствующую форму XML для вкладки. Текст также может содержать символы новой строки (\n) или возврата каретки (\r), каждый из которых преобразуется в разрыв строки.

paragraph = document.add_paragraph(plain_text) #Добавление параграфа с текстом

В метод add_paragraph передается переменная plain_text, которая будет содержать извлеченный из блока текст.

Для добавления в документ изображения используется метод add_picture(image_path_or_stream, width=None, height=None), который возвращает новую форму изображения, добавленную в отдельный абзац в конце документа. Изображение содержит изображение в image_path_or_stream, масштабированное по ширине и высоте. Если ни ширина, ни высота не указаны, картинка отображается с исходным размером. Если указан только один, он используется для вычисления коэффициента масштабирования, который затем применяется к неопределенному измерению, сохраняя соотношение сторон изображения. Также можно задать размер изображения в DPI (значение точек на дюйм).

document.add_picture('./tables/output/one-1.jpg', width=Inches(5))

Для работы с таблицей используется метод add_table(rows, cols, style=None), который добавляет таблицу с заданным количеством строк и столбцов и стилем таблицы. Style может быть объектом стиля абзаца или именем стиля абзаца. Если style - None, таблица наследует стиль таблицы документа по умолчанию. Данная таблица будет содержать одну строку, в которую будут добавлены заголовки столбцов, полученные из соответствующей таблицы из словаря таблиц.

df = tr[0][0][-1]

n_row, n_column = df.shape

table = document.add_table(rows=1, cols=n_column)

hdr_cells = table.rows[0].cells

Коллекции строк и столбцов в таблице являются итеративными, поэтому можно использовать их непосредственно в цикле for. То же самое с последовательностями cells в строке или столбце:

for i in range(n_column):

if df.columns[i] != None:

hdr_cells[i].text = str(df.columns[i])

for i in range(n_row):

row_cells = table.add_row().cells

for j in range(n_column):

if df.iloc[i, j] != None:

row_cells[j].text = str(df.iloc[i, j])

С помощью метода style, примененного к объекту Table, можно задать стиль для таблицы. Стиль таблицы по умолчанию для документа (часто «Normal Table») возвращается, если у таблицы нет непосредственно примененного стиля. Присвоение None этому свойству удаляет любой непосредственно примененный стиль таблицы, заставляя его наследовать стиль таблицы документа по умолчанию. С помощью метода alignment = WD_TABLE_ALIGNMENT.CENTER можно задать тип выравнивания таблицы по центру.

table.style = 'Table Grid'

table.alignment = WD_TABLE_ALIGNMENT.CENTER

Сохранение документа в файле с именем «test.docx»:

document.save('test.docx')

Рис. 12 Итоговый docx-документ для примера

Для использования данной библиотеки в системе была создана функция build_docx_document класса Document, которая получает на вход имя docx-файла. Для работы с таблицами любого формата была создана функция add_table_to_docx, которая получает на вход объект класса DocumentDocx и таблицу в виде структуры Pandas DataFrame. Возвращает измененный экземпляр класса DocumentDocx, в который была добавлена таблица.

2.7 Клиент-серверная система

Для оптимизации используемых вычислительных ресурсов было принято решение разделить создаваемую систему на серверную и клиентскую части, где на серверной части должна производиться полная обработка PDF-документа, а клиент должен получать только результат обработки: финальный сконвертированный документ. Такой подход позволяет нескольким клиентам подключатся к одному серверу и получать результат обработки PDF-документов одновременно. Для взаимодействия сервера и клиента был выбран HTTP протокол, а архитектурным стилем взаимодействия выбран REST.

Одним из основных требований при реализации архитектурного стиля REST является соблюдение единообразия интерфейса, что позволяет клиенту и серверу быть заменяемыми без нарушения целостности взаимодействия.

Для демонстрации возможностей использования методов сервера было разработано веб-приложение, которое использует методы сервера для передачи файлов и получения результата, однако методы сервера также могут быть использованы и сторонними системами.

Для реализации веб-сервера, обрабатывающего запросы, и клиентской части была выбрана программная библиотека Flask для языка Python [73].

2.7.1 Клиентская часть

Задача клиентской части системы - получить данные от пользователя, передать серверу и вернуть результат работы системы (Приложение Е). Для этого в клиентской части реализованы следующие методы:

· Работа с временными данными cookie браузера: установка cookie (авторизация с помощью токена), удаление cookie, проверка cookie;

· Загрузка PDF-файла, получение от пользователя информации о файле: формат (один из трех), тип PDF-файла (отсканированный или searchable). Передача информации на сервер;

· Проверка каждые 10 секунд, сформировал ли сервер результат обработки;

· Предоставление ссылки на скачивание сформированного архива.

2.7.2 Серверная часть

Серверная часть системы состоит из двух компонентов: веб-сервера, получающего и обрабатывающего GET и POST запросы клиентов, и обработчика очереди файлов, который для каждого загруженного файла создает экземпляр класса Document и производит конвертацию документа.

Хранение информации о пользователях системы, загруженных файлах и статусах их обработки производится через базу данных SQLite [74]. В базе данных находится две таблицы: tokens - это таблица, которая хранит информацию о ключах доступа и их владельцах, files_info - это таблица, которая хранит информацию о том, кто загрузил файл, где этот файл хранится на сервере, какой тип верстки используется в документе, какие языки встречаются в документе и путь до результата обработки документа.

Аутентификация клиентов производится по ключу доступа, который необходимо передавать в заголовке «Authorization» каждого HTTP запроса к серверу. Перед выполнением каждого метода сервер проверяет переданный ключ на наличие в базе данных, если ключ передан неправильно или является недействительным, то метод не продолжает выполнение, а возвращает клиенту сообщение с ошибкой доступа.

Для обеспечения полного взаимодействия с системой было выделено три основных публичных метода:

· Метод загрузки PDF-документа, возвращающий уникальный идентификатор сконвертированного файла;

· Метод получения сконвертированного файла по уникальному идентификатору;

· Метод проверки токена на корректность.

Для промышленной эксплуатации веб-сервера, встроенного во Flask, недостаточно. Для обеспечения безопасности и надежности используется WSGI сервер Waitress. Он рекомендован разработчиками библиотеки Flask, также он поддерживает использование HTTPS протокола. Для запуска с использованием шифрования в конструктор класса WSGIServer необходимо передать IP-адрес, порт, экземпляр Flask приложения, а также путь до файла ключа и SSL-сертификата. Пример запуска сервера:

if __name__ == '__main__':

app.secret_key = 'cwq$tdf-er56m(bi&1@-7t74@1i*r-4j4@m@w#isv1ud9r(b4('

http_server = WSGIServer(('0.0.0.0', 5000), app, keyfile='key.pem', certfile='cert.pem')

http_server.serve_forever()

Обработчик загруженных файлов работает каждые 10 секунд в несколько этапов. Первым этапом он загружает из таблицы files_info базы данных все записи, в которых значение атрибута zip_path не заполнено. Вторым этапом создает для каждого обрабатываемого документа экземпляр класса Document и вызывает метод convert с атрибутом to_zip. В результате обработки создается zip-архив, который содержит итоговый docx-документ и дополнительные папки с извлеченными таблицами, изображениями и формулами. На третьем этапе информация о результате конвертации записывается обратно в таблицу files_info.

2.7.3 Реализация контейнера Docker

Контейнеризацию можно назвать легковесной виртуализацией и изоляцией ресурсов на уровне операционной системы. Контейнеризация необходима для передачи и запуска разработанного программного обеспечения заказчиком без проблем. Часто при передаче инструкций по установке и установочных скриптов возникают трудности при разрешении зависимостей пакетными менеджерами или проблемы, связанные с различием архитектур у разработчика и пользователя программного обеспечения. Именно для решения таких ситуаций существует контейнеризация проектов. Для контейнеризации разрабатываемой системы будет использоваться программное обеспечение Docker [75].

Для создания контейнера в программе Docker необходимо описать Dockerfile. Dockerfile - это текстовый файл, который содержит набор команд для формирования контейнера.

Задается используемый образ операционной системы:

FROM ubuntu:18.04

Устанавливаются необходимые зависимости, пример нескольких команд:

RUN apt update

RUN apt install -y git

RUN apt install -y python3

RUN apt install -y python3-pip

Задается рабочая директория:

WORKDIR /home/flask_app/

Копируются локальные файлы:

COPY..

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

RUN chmod +x /home/flask_app/run_system.sh

CMD ["/home/flask_app/run_system.sh"]

Открываются порты для работы веб-сервера:

EXPOSE 80

EXPOSE 443

EXPOSE 5000

Для сбора контейнера из Dockerfile применяется следующая команда:

docker build -f tagging_system.Dockerfile --tag tagging_system.

Важной особенностью запускаемых контейнеров является то, что изменения, внесенные в настройки операционной системы или файловую систему контейнера, не сохраняются. Однако при работе системы может возникнуть потребность изменить базу данных, добавив или удалив пользователя, редактировать файлы конфигурации и т. д. Для этого необходимо использовать Docker-том: часть файлов, используемых в контейнере, будут храниться вне его, их можно будет изменять, и эти изменения будут оставаться после перезапуска. Для этого при запуске контейнера добавим аргумент mount, source и target. Пример запуска собранного контейнера:

docker run --name tagging_system -p 443:443/tcp -p 80:80/tcp -p 5000:5000/tcp --mount source=tagging_system_volume, target=/home/flask_app/configs/

2.8 Выводы

В рамках данного раздела продемонстрирована работа по реализации системы автоматической разметки научных статей на языке Python. Среднее время обработки одной страницы PDF-документа научной статьи составляет 33 секунды для документов типа searchable и 52 секунды для отсканированных документов. Задача выделения информационных блоков для рассматриваемых иерархий научных публикаций решается хорошо: выделяются все основные блоки вне колонтитулов. Также, следует отметить, что сортировка по иерархиям и правила удаления повторяющихся блоков и склеивания соседних блоков работают без ошибок. Изображения, таблицы не обрезаются, текст извлекается хорошо для документов типа searchable и приемлемо для отсканированных документов.

Основная проблема, которая сейчас есть в системе, это пропадание исходного абзацного членения. Это возникает в связи с тем, что в один текстовый блок попадают несколько абзацев, которые после обработки регулярными выражениями превращаются в один сплошной текст. Некоторые заголовки статей дублируются при извлечении инструментом pdftotext, вероятно, из-за особенностей PDF-документов. Изредка возникают проблемы с небольшими подписями под рисунками, которые не выделяются в текстовый блок и не попадают в область самого изображения. Больше всего проблем с теми страницами, которые содержат формулы - модель не может правильно выделить текстовый блок, в некоторых случаях определяет формулу и часть текста как изображение. Эти недочеты планируется доработать в следующей версии данной системы.

Заключение

В рамках данной выпускной квалификационной работы была создана автоматическая система разметки научных статей в PDF-формате. Были выполнены следующие поставленные задачи:

1) Распознавание текстовых и нетекстовых блоков из документа pdf-формата, классификация блоков на следующие классы: текст, заголовок, список, фигура и таблица;

2) Исследование иерархий научных статей. Выявлены три типа иерархий: одноколонная верстка и два типа двухколонной верстки;

3) Структурирование блоков в соответствии с выявленными типам иерархий. Алгоритмы удаления возможных повторяющихся извлеченных фрагментов, обработки случаев пересечения информационных блоков и склеивание соседних блоков;

4) Извлечение текста и приведение к читаемому виду;

5) Создание клиент-серверной системы: серверная часть отвечает за работу алгоритма по преобразованию статьи, клиентская - за обмен информацией между пользователем и сервером;

6) Применение технологии контейнеризации для запуска системы на облачных технологиях.

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

Возможное улучшение системы заключается в том, чтобы, используя несколько размеченных корпусов данных, научить модель сегментации находить в дополнение к пяти классам еще и формулы, а не использовать отдельную модель для их поиска. Этого можно добиться улучшением качества данных в корпусах, объединением и расширением существующих корпусов.

Проект планируется развивать на ресурсе owls-articles.xyz и других интернет-порталах.

Список используемых источников

1. Scopus Content Coverage Guige: [Электронный ресурс]. URL: https://www.elsevier.com/?a=69451. (Дата обращения: 20.05.2020).

2. arXiv: [Электронный ресурс]. URL: https://arxiv.org/. (Дата обращения: 20.05.2020).

3. PupMed: [Электронный ресурс]. URL: https://pubmed.ncbi.nlm.nih.gov/. (Дата обращения: 20.05.2020).

4. eLibrary: [Электронный ресурс]. URL: https://www.elibrary.ru/defaultx.asp. (Дата обращения: 22.03.2020).

5. Волкова Л. А. Издательско-полиграфическая техника и технология. М.: Мир книги, 1999.

6. Tkaczyk D. et al. CERMINE: automatic extraction of structured metadata from scientific literature //International Journal on Document Analysis and Recognition (IJDAR). 2015. Т. 18. №. 4. С. 317-335.

7. Chang C. C., Lin C. J. LIBSVM: A library for support vector machines //ACM transactions on intelligent systems and technology (TIST). 2011. Т. 2. №. 3. С. 1-27.

8. Lopez P. GROBID: Combining automatic bibliographic data recognition and term extraction for scholarship publications //International conference on theory and practice of digital libraries. Springer, Berlin, Heidelberg, 2009. С. 473-474.

9. Luong M. T., Nguyen T. D., Kan M. Y. Logical structure recovery in scholarly articles with rich document features //Multimedia Storage and Retrieval Innovations for Digital Library Systems. IGI Global, 2012. С. 270-292.

10. Ronzano F., Saggion H. Knowledge extraction and modeling from scientific publications //International workshop on semantic, analytics, visualization. Springer, Cham, 2016. С. 11-25.

11. Ronzano F., Saggion H. Dr. inventor framework: Extracting structured information from scientific publications //International Conference on Discovery Science. Springer, Cham, 2015. С. 209-220.

12. Constantin A., Pettifer S., Voronkov A. PDFX: fully-automated PDF-to-XML conversion of scientific literature //Proceedings of the 2013 ACM symposium on Document engineering. 2013. С. 177-180.

13. Abekawa T., Aizawa A. SideNoter: scholarly paper browsing system based on PDF restructuring and text annotation //Proceedings of COLING 2016, the 26th International Conference on Computational Linguistics: System Demonstrations. 2016. С. 136-140.

14. Chen J., Gao L., Tang Z. Information extraction from resume documents in pdf format //Electronic Imaging. 2016. Т. 2016. №. 17. С. 1-8.

15. Rahman M. M., Finin T. Understanding the logical and semantic structure of large documents //arXiv preprint arXiv:1709.00770. 2017.

16. Ferrйs D. et al. PDFdigest: an adaptable layout-aware PDF-to-XML textual content extractor for scientific articles //Proceedings of the Eleventh International Conference on Language Resources and Evaluation (LREC 2018). 2018.

17. Rahman M. M., Finin T. Unfolding the Structure of a Document using Deep Learning //arXiv preprint arXiv:1910.03678. 2019.

18. Girshick R. et al. Rich feature hierarchies for accurate object detection and semantic segmentation //Proceedings of the IEEE conference on computer vision and pattern recognition. 2014. С. 580-587.

19. Uijlings J. R. R. et al. Selective search for object recognition //International journal of computer vision. 2013. Т. 104. №. 2. С. 154-171.

20. Girshick R. Fast r-cnn //Proceedings of the IEEE international conference on computer vision. 2015. С. 1440-1448.

21. Ren S. et al. Faster r-cnn: Towards real-time object detection with region proposal networks //Advances in neural information processing systems. 2015. С. 91-99.

22. He K. et al. Mask r-cnn //Proceedings of the IEEE international conference on computer vision. 2017. С. 2961-2969.

23. Liu W. et al. Ssd: Single shot multibox detector //European conference on computer vision. Springer, Cham, 2016. С. 21-37.

24. Bast H., Korzen C. A benchmark and evaluation for text extraction from PDF //2017 ACM/IEEE Joint Conference on Digital Libraries (JCDL). IEEE, 2017. С. 1-10.

25. Pdftotext: [Электронный ресурс]. URL: https://www.xpdfreader.com/pdftotext-man.html. (Дата обращения: 20.05.2020).

26. Pdftohtml: [Электронный ресурс]. URL: https://sourceforge.net/projects/pdftohtml/. (Дата обращения: 20.05.2020).

27. Pdf2xml: [Электронный ресурс]. URL: https://sourceforge.net/projects/pdf2xml/. (Дата обращения: 20.05.2020).

28. Apache PDFBox: [Электронный ресурс]. URL: https://pdfbox.apache.org/. (Дата обращения: 20.05.2020).

29. pdf2xml: [Электронный ресурс]. URL: https://bitbucket.org/tiedemann/pdf2xml/. (Дата обращения: 20.05.2020).

30. ParsCit: [Электронный ресурс]. URL: https://github.com/knmnyn/ParsCit. (Дата обращения: 20.05.2020).

31. LA-Pdftext: [Электронный ресурс]. URL: https://github.com/GullyAPCBurns/lapdftext. (Дата обращения: 20.05.2020).

32. C. Ramakrishnan, A. Patnia, E. H. Hovy, and G. A. P. C. Burns. Layout-Aware Text Extraction from Full-Text PDF of Scientific Articles. Source Code for Biology and Medicine, 2012.

33. PdfMiner: [Электронный ресурс]. URL: https://github.com/euske/pdfminer. (Дата обращения: 20.05.2020).

34. pdfXtk: [Электронный ресурс]. URL: https://github.com/tamirhassan/pdfxtk. (Дата обращения: 20.05.2020).

35. pdf-extract: [Электронный ресурс]. URL: https://github.com/CrossRef/pdfextract/. (Дата обращения: 20.05.2020).

36. pdfx: [Электронный ресурс]. URL: http://pdfx.cs.man.ac.uk/. (Дата обращения: 20.05.2020).

37. PDFExtract: [Электронный ресурс]. URL: https://github.com/oyvindberg/PDFExtract/. (Дата обращения: 20.05.2020).

38. Tesseract OCR: [Электронный ресурс]. URL: https://github.com/tesseract-ocr/tesseract. (Дата обращения: 20.05.2020).

39. Smith R. W. The extraction and recognition of text from multimedia document images: дис. University of Bristol, 1987.

40. Shi C. et al. Scene text recognition using part-based tree-structured character detection //Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2013. С. 2961-2968.

41. Yao C. et al. Strokelets: A learned multi-scale representation for scene text recognition //Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2014. С. 4042-4049.

42. Mishra A., Alahari K., Jawahar C. V. An MRF model for binarization of natural scene text //2011 International Conference on Document Analysis and Recognition. IEEE, 2011. С. 11-16.

43. Weinman J. J. et al. Toward integrated scene text reading //IEEE transactions on pattern analysis and machine intelligence. 2013. Т. 36. №. 2. С. 375-387.

44. Neumann L., Matas J. Real-time scene text localization and recognition //2012 IEEE Conference on Computer Vision and Pattern Recognition. IEEE, 2012. С. 3538-3545.

45. Novikova T. et al. Large-lexicon attribute-consistent text recognition in natural images //European conference on computer vision. Springer, Berlin, Heidelberg, 2012. С. 752-765.

46. Bissacco A. et al. Photoocr: Reading text in uncontrolled conditions //Proceedings of the IEEE International Conference on Computer Vision. 2013. С. 785-792.

47. Hochreiter S., Schmidhuber J. Long short-term memory //Neural computation. 1997. Т. 9. №. 8. С. 1735-1780.

48. Shi B., Bai X., Yao C. An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition //IEEE transactions on pattern analysis and machine intelligence. 2016. Т. 39. №. 11. С. 2298-2304.

49. Lee C. Y., Osindero S. Recursive recurrent nets with attention modeling for ocr in the wild //Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016. С. 2231-2239.

50. B. Coьasnon and A. Lemaitre. Handbook of Document Image Processing and Recognition, chapter Recognition of Tables and Forms, pages 647-677. Springer London, 2014.

51. e Silva A. C., Jorge A. M., Torgo L. Design of an end-to-end method to extract information from tables //International Journal of Document Analysis and Recognition (IJDAR). 2006. Т. 8. №. 2-3. С. 144-171.

52. Rastan R., Paik H. Y., Shepherd J. Texus: A task-based approach for table extraction and understanding //Proceedings of the 2015 ACM Symposium on Document Engineering. 2015. С. 25-34.

53. Nurminen A. Algorithmic extraction of data in tables in PDF documents: дис. 2013.

54. Hao L. et al. A table detection method for pdf documents based on convolutional neural networks //2016 12th IAPR Workshop on Document Analysis Systems (DAS). IEEE, 2016. С. 287-292.

55. Shigarov A., Mikhailov A., Altaev A. Configurable table structure recognition in untagged PDF documents //Proceedings of the 2016 ACM Symposium on Document Engineering. 2016. С. 119-122.

56. Perez-Arriaga M. O., Estrada T., Abad-Mota S. TAO: system for table detection and extraction from PDF documents //The Twenty-Ninth International Flairs Conference. 2016.

57. PDFPlumber: [Электронный ресурс]. URL: https://github.com/jsvine/pdfplumber. (Дата обращения: 20.05.2020).

58. Chang T. Y., Takiguchi Y., Okada M. Physical structure segmentation with projection profile for mathematic formulae and graphics in academic paper images //Ninth International Conference on Document Analysis and Recognition (ICDAR 2007). IEEE, 2007. Т. 2. С. 1193-1197.

59. Garain U. Identification of mathematical expressions in document images //2009 10th International Conference on Document Analysis and Recognition. IEEE, 2009. С. 1340-1344.

60. Wang Y. et al. WikiMirs 3.0: a hybrid MIR system based on the context, structure and importance of formulae in a document //Proceedings of the 15th ACM/IEEE-CS joint conference on digital libraries. 2015. С. 173-182.

61. Deng Y., Kanervisto A., Rush A. M. What you get is what you see: A visual markup decompiler //arXiv preprint arXiv:1609.04938. 2016. Т. 10. С. 32-37.

62. Iwatsuki K. et al. Detecting in-line mathematical expressions in scientific documents //Proceedings of the 2017 ACM Symposium on Document Engineering. 2017. С. 141-144.

63. Gao L. et al. A deep learning-based formula detection method for PDF documents //2017 14th IAPR International Conference on Document Analysis and Recognition (ICDAR). IEEE, 2017. Т. 1. С. 553-558.

64. Zhang X. et al. A Symbol Dominance Based Formulae Recognition Approach for PDF Documents //2017 14th IAPR International Conference on Document Analysis and Recognition (ICDAR). IEEE, 2017. Т. 1. С. 1144-1149.


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.