Чтобы начать работу, после клонирования репозитория нужно установить необходимые зависимости (используемые версии python 3.10-3.12, cuda 12.8 => в requirements ставится torch+cu128)
pip install --upgrade pip
pip install -r requirements.txt
Скачать MinerU для локального запуска можно по ссылке, разместить ее в папке model, туда же потребуется скачать GLiNER-PII для извлеченения авторов.
mineru_compact.py -- содержит в себе необходимые функции для инференса модели, возвращает content_list
extractor.py -- содержит класс ArticleExtractor, который реализуют основную логику извлечения данных
demo.py -- пример работы (см. ниже):
import os
import torch
from extractor import ArticleExtractor
from mineru_compact import parse_doc
# данные заполнены для примера
path_to_file = 'articles/demo1.pdf' # путь к pdf-файлу (статье)
output_dir = 'output/' # директория для сохранения результатов
path_to_model = 'model/MinerU2.5-2509-1.2B' # путь к локально установленной модели
backend = 'hybrid-auto-engine' # [hybrid-auto-engine, pipeline, vlm-auto-engine]
ner_path = 'nvidia/gliner-pii' # path to gliner-pii (ner) for author`s extraction [default: 'nvidia/gliner-pii' from hf]
ner_device = 'cuda' if torch.cuda.is_available() else 'cpu' # for ner model
print(f'Device: {ner_device}')
ner_batch_size = 16
file_name, _ext = os.path.splitext(os.path.basename(path_to_file))
content_list = parse_doc([path_to_file], output_dir, backend=backend, model_path=path_to_model)
extractor = ArticleExtractor(ner_path = ner_path, device = ner_device, ner_batch_size = ner_batch_size)
extractor.extract_from_article(content_list, output_dir, file_name) # извлечение данных из документа и создание структуры
extractor.dump_to_json(output_dir) # сохранение результатов в формате jsonДля извлечения данных необходимо запустить demo.py (со всеми аргументами можно ознакомиться с помощью --help):
python demo.py -i path_to_file.pdf -o output_dir/
Выходной файл имеет следующую структуру (output/demo1.json):
{
title : str,
authors: [
{
name: str,
affiliations: str,
orcid: str
}
],
abstract : str,
keywords : [str,],
language: str,
sections: [ # содержание статьи, разбитое по секциям (главам)
{
title : str,
text : str,
type : str (enum.Enum),
page_start : int,
page_end : int
},
],
references: [
{
id : int,
text : str,
authors : [str,],
year : int,
page_end : int
},
],
figures: [
{
id : str,
type : str,
caption : [str,],
img_path : [str,],
page : int
},
],
tables: [
{
id : str,
type : str,
caption : [str,],
table_body : str,
img_path : str,
page : int
}
]
}