

Прокачающая быстрая и легкая модель извлечения информации для связывания сущности и извлечения отношений .
Установка от PYPI
pip install relikУстановите со всеми дополнительными зависимостями.
pip install relik[all]Установите дополнительные зависимости для обучения и оценки.
pip install relik[train]Установить с дополнительными зависимостями для Faiss
Пакет FAISS PYPI доступен только для процессора. Для GPU установите его из Source или используйте пакет Conda.
Для процессора:
pip install relik[faiss]Для GPU:
conda create -n relik python=3.10
conda activate relik
# install pytorch
conda install -y pytorch=2.1.0 pytorch-cuda=12.1 -c pytorch -c nvidia
# GPU
conda install -y -c pytorch -c nvidia faiss-gpu=1.8.0
# or GPU with NVIDIA RAFT
conda install -y -c pytorch -c nvidia -c rapidsai -c conda-forge faiss-gpu-raft=1.8.0
pip install relikУстановите дополнительные зависимости для обслуживания моделей Fastapi и Ray.
pip install relik[serve]git clone https://github.com/SapienzaNLP/relik.git
cd relik
pip install -e .[all] RELIK Большой для экстракции relik-ie/relik-relation-extraction-large (?
RELIK https://huggingface.co/relik-ie/relik-cie-large для извлечения закрытой информации (?
Получите очень большую для извлечения закрытой информации (? Наш thicc boi для el + re) : relik-ie/relik-cie-xl
RELIK SMALL для сущности sapienzanlp/relik-entity-linking-small связывающий (??
Повторный малый для сущности, связывающий (⚡ Маленький и быстрый EL) : sapienzanlp/relik-entity-linking-small
Relik Small для извлечения закрытой информации (El + re) : relik-ie/relik-cie-small
RELIK, большой для сущности, связывающий (EL для дикой природы) : relik-ie/relik-entity-linking-large-robust
RELIK SMALT для сущности связывания (Re + NER) : relik-ie/relik-relation-extraction-small-wikipedia-ner
Модели из бумаги:
sapienzanlp/relik-entity-linking-largesapienzanlp/relik-entity-linking-basesapienzanlp/relik-relation-extraction-nyt-largeПолный список моделей можно найти? Обнимающееся лицо.
Размеры других моделей будут доступны в будущем?
RELIK - это легкая и быстрая модель для связывания сущности и извлечения отношений . Он состоит из двух основных компонентов: ретривера и читателя. Ретривер отвечает за получение соответствующих документов из большой коллекции, в то время как читатель отвечает за извлечение объектов и отношений из извлеченных документов. RELIK можно использовать с помощью метода from_pretrained для загрузки предварительно обученного трубопровода.
Вот пример того, как использовать RELIK для сущности, связывающего:
from relik import Relik
from relik . inference . data . objects import RelikOutput
relik = Relik . from_pretrained ( "sapienzanlp/relik-entity-linking-large" )
relik_out : RelikOutput = relik ( "Michael Jordan was one of the best players in the NBA." )Выход:
RelikOutput(
text="Michael Jordan was one of the best players in the NBA.",
tokens=['Michael', 'Jordan', 'was', 'one', 'of', 'the', 'best', 'players', 'in', 'the', 'NBA', '.'],
id=0,
spans=[
Span(start=0, end=14, label="Michael Jordan", text="Michael Jordan"),
Span(start=50, end=53, label="National Basketball Association", text="NBA"),
],
triples=[],
candidates=Candidates(
span=[
[
[
{"text": "Michael Jordan", "id": 4484083},
{"text": "National Basketball Association", "id": 5209815},
{"text": "Walter Jordan", "id": 2340190},
{"text": "Jordan", "id": 3486773},
{"text": "50 Greatest Players in NBA History", "id": 1742909},
...
]
]
]
),
)
и для извлечения отношений:
from relik import Relik
from relik . inference . data . objects import RelikOutput
relik = Relik . from_pretrained ( "sapienzanlp/relik-relation-extraction-nyt-large" )
relik_out : RelikOutput = relik ( "Michael Jordan was one of the best players in the NBA." )Выход:
RelikOutput(
text='Michael Jordan was one of the best players in the NBA.',
tokens=Michael Jordan was one of the best players in the NBA.,
id=0,
spans=[
Span(start=0, end=14, label='--NME--', text='Michael Jordan'),
Span(start=50, end=53, label='--NME--', text='NBA')
],
triplets=[
Triplets(
subject=Span(start=0, end=14, label='--NME--', text='Michael Jordan'),
label='company',
object=Span(start=50, end=53, label='--NME--', text='NBA'),
confidence=1.0
)
],
candidates=Candidates(
span=[],
triplet=[
[
[
{"text": "company", "id": 4, "metadata": {"definition": "company of this person"}},
{"text": "nationality", "id": 10, "metadata": {"definition": "nationality of this person or entity"}},
{"text": "child", "id": 17, "metadata": {"definition": "child of this person"}},
{"text": "founded by", "id": 0, "metadata": {"definition": "founder or co-founder of this organization, religion or place"}},
{"text": "residence", "id": 18, "metadata": {"definition": "place where this person has lived"}},
...
]
]
]
),
)
Пониматели и читатели могут использоваться отдельно. В случае Retiver Relik вывод будет содержать кандидатов для входного текста.
Пример только для ретривера:
from relik import Relik
from relik . inference . data . objects import RelikOutput
# If you want to use only the retriever
retriever = Relik . from_pretrained ( "sapienzanlp/relik-entity-linking-large" , reader = None )
relik_out : RelikOutput = retriever ( "Michael Jordan was one of the best players in the NBA." )Выход:
RelikOutput(
text="Michael Jordan was one of the best players in the NBA.",
tokens=['Michael', 'Jordan', 'was', 'one', 'of', 'the', 'best', 'players', 'in', 'the', 'NBA', '.'],
id=0,
spans=[],
triples=[],
candidates=Candidates(
span=[
[
{"text": "Michael Jordan", "id": 4484083},
{"text": "National Basketball Association", "id": 5209815},
{"text": "Walter Jordan", "id": 2340190},
{"text": "Jordan", "id": 3486773},
{"text": "50 Greatest Players in NBA History", "id": 1742909},
...
]
],
triplet=[],
),
)
Пример только для читателей:
from relik import Relik
from relik . inference . data . objects import RelikOutput
# If you want to use only the reader
reader = Relik . from_pretrained ( "sapienzanlp/relik-entity-linking-large" , retriever = None )
candidates = [
"Michael Jordan" ,
"National Basketball Association" ,
"Walter Jordan" ,
"Jordan" ,
"50 Greatest Players in NBA History" ,
]
text = "Michael Jordan was one of the best players in the NBA."
relik_out : RelikOutput = reader ( text , candidates = candidates )Выход:
RelikOutput(
text="Michael Jordan was one of the best players in the NBA.",
tokens=['Michael', 'Jordan', 'was', 'one', 'of', 'the', 'best', 'players', 'in', 'the', 'NBA', '.'],
id=0,
spans=[
Span(start=0, end=14, label="Michael Jordan", text="Michael Jordan"),
Span(start=50, end=53, label="National Basketball Association", text="NBA"),
],
triples=[],
candidates=Candidates(
span=[
[
[
{
"text": "Michael Jordan",
"id": -731245042436891448,
},
{
"text": "National Basketball Association",
"id": 8135443493867772328,
},
{
"text": "Walter Jordan",
"id": -5873847607270755146,
"metadata": {},
},
{"text": "Jordan", "id": 6387058293887192208, "metadata": {}},
{
"text": "50 Greatest Players in NBA History",
"id": 2173802663468652889,
},
]
]
],
),
)
RELIK предоставляет CLI для обслуживания сервера FASTAPI для модели или для выполнения вывода в наборе данных.
relik serverelik serve --help
Usage: relik serve [OPTIONS] RELIK_PRETRAINED [DEVICE] [RETRIEVER_DEVICE]
[DOCUMENT_INDEX_DEVICE] [READER_DEVICE] [PRECISION]
[RETRIEVER_PRECISION] [DOCUMENT_INDEX_PRECISION]
[READER_PRECISION] [ANNOTATION_TYPE]
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────╮
│ * relik_pretrained TEXT [default: None] [required] │
│ device [DEVICE] The device to use for relik (e.g., │
│ ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ retriever_device [RETRIEVER_DEVICE] The device to use for the retriever │
│ (e.g., ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ document_index_device [DOCUMENT_INDEX_DEVICE] The device to use for the index │
│ (e.g., ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ reader_device [READER_DEVICE] The device to use for the reader │
│ (e.g., ' cuda ' , ' cpu ' ). │
│ [default: None] │
│ precision [PRECISION] The precision to use for relik │
│ (e.g., ' 32 ' , ' 16 ' ). │
│ [default: 32] │
│ retriever_precision [RETRIEVER_PRECISION] The precision to use for the │
│ retriever (e.g., ' 32 ' , ' 16 ' ). │
│ [default: None] │
│ document_index_precision [DOCUMENT_INDEX_PRECISION] The precision to use for the index │
│ (e.g., ' 32 ' , ' 16 ' ). │
│ [default: None] │
│ reader_precision [READER_PRECISION] The precision to use for the reader │
│ (e.g., ' 32 ' , ' 16 ' ). │
│ [default: None] │
│ annotation_type [ANNOTATION_TYPE] The type of annotation to use (e.g., │
│ ' CHAR ' , ' WORD ' ). │
│ [default: char] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────╮
│ --host TEXT [default: 0.0.0.0] │
│ --port INTEGER [default: 8000] │
│ --frontend --no-frontend [default: no-frontend] │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
Например:
relik serve sapienzanlp/relik-entity-linking-largerelik inferencerelik inference --help
Usage: relik inference [OPTIONS] MODEL_NAME_OR_PATH INPUT_PATH OUTPUT_PATH
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────╮
│ * model_name_or_path TEXT [default: None] [required] │
│ * input_path TEXT [default: None] [required] │
│ * output_path TEXT [default: None] [required] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────╮
│ --batch-size INTEGER [default: 8] │
│ --num-workers INTEGER [default: 4] │
│ --device TEXT [default: cuda] │
│ --precision TEXT [default: fp16] │
│ --top-k INTEGER [default: 100] │
│ --window-size INTEGER [default: None] │
│ --window-stride INTEGER [default: None] │
│ --annotation-type TEXT [default: char] │
│ --progress-bar --no-progress-bar [default: progress-bar] │
│ --model-kwargs TEXT [default: None] │
│ --inference-kwargs TEXT [default: None] │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯Например:
relik inference sapienzanlp/relik-entity-linking-large data.txt output.jsonlDocker Images для Relik доступны на Docker Hub. Вы можете вытащить последнее изображение с:
docker pull sapienzanlp/relik:latestи запустите изображение с:
docker run -p 12345:8000 sapienzanlp/relik:latest -c relik-ie/relik-cie-small API будет доступен по адресу http://localhost:12345 . Он обнажает одну конечную точку /relik с несколькими параметрами, которые могут быть переданы в модель. Быстрая документация API можно найти по адресу http://localhost:12345/docs . Вот простой пример того, как запросить API:
curl -X ' GET '
' http://127.0.0.1:12345/api/relik?text=Michael%20Jordan%20was%20one%20of%20the%20best%20players%20in%20the%20NBA.&is_split_into_words=false&retriever_batch_size=32&reader_batch_size=32&return_windows=false&use_doc_topic=false&annotation_type=char&relation_threshold=0.5 '
-H ' accept: application/json 'Здесь полный список параметров, которые могут быть переданы на изображение Docker:
docker run sapienzanlp/relik:latest -h
Usage: relik [-h --help] [-c --config] [-p --precision] [-d --device] [--retriever] [--retriever-device]
[--retriever-precision] [--index-device] [--index-precision] [--reader] [--reader-device] [--reader-precision]
[--annotation-type] [--frontend] [--workers] -- start the FastAPI server for the RElik model
where:
-h --help Show this help text
-c --config Pretrained ReLiK config name (from HuggingFace) or path
-p --precision Precision, default ' 32 ' .
-d --device Device to use, default ' cpu ' .
--retriever Override retriever model name.
--retriever-device Override retriever device.
--retriever-precision Override retriever precision.
--index-device Override index device.
--index-precision Override index precision.
--reader Override reader model name.
--reader-device Override reader device.
--reader-precision Override reader precision.
--annotation-type Annotation type ( ' char ' , ' word ' ), default ' char ' .
--frontend Whether to start the frontend server.
--workers Number of workers to use.В следующих разделах мы предоставляем пошаговое руководство о том, как подготовить данные, обучить ретривера и читателя и оценивать модель.
Все ваши данные должны иметь следующую структуру:
{
"doc_id" : int, # Unique identifier for the document
"doc_text" : txt, # Text of the document
"doc_span_annotations" : # Char level annotations
[
[ start, end, label ],
[ start, end, label ],
...
]
}Мы использовали наборы данных Blink (Wu et al., 2019) и Aida (Hoffart et al, 2011) для обучения и оценки. Более конкретно, мы использовали набор данных Blink для предварительного обучения набора данных ретривера и AIDA для точной настройки ретривера и обучения читателя.
Набор данных Blink можно загрузить из жанрового репо, используя этот сценарий. Мы использовали blink-train-kilt.jsonl и blink-dev-kilt.jsonl в качестве наборов данных обучения и проверки. Предполагая, что мы загрузили два файла в папке data/blink , мы преобразовали набор данных Blink в формат RELIK, используя следующий скрипт:
# Train
python scripts/data/blink/preprocess_genre_blink.py
data/blink/blink-train-kilt.jsonl
data/blink/processed/blink-train-kilt-relik.jsonl
# Dev
python scripts/data/blink/preprocess_genre_blink.py
data/blink/blink-dev-kilt.jsonl
data/blink/processed/blink-dev-kilt-relik.jsonl Набор данных AIDA не доступен общедоступным, но мы предоставляем файл, который мы использовали без text поля. Вы можете найти файл в формате RELIK в папке data/aida/processed .
Индекс Википедии, который мы использовали, можно загрузить отсюда.
Все ваши данные должны иметь следующую структуру:
{
"doc_id" : int, # Unique identifier for the document
"doc_words: list[txt] # Tokenized text of the document
"doc_span_annotations" : # Token level annotations of mentions (label is optional)
[
[ start, end, label ],
[ start, end, label ],
...
],
"doc_triplet_annotations" : # Triplet annotations
[
{
"subject" : [ start, end, label ], # label is optional
"relation" : name, # type is optional
"object" : [ start, end, label ], # label is optional
},
{
"subject" : [ start, end, label ], # label is optional
"relation" : name, # type is optional
"object" : [ start, end, label ], # label is optional
},
]
}Для извлечения отношений мы приводим пример того, как предварительно обрабатывать набор данных NYT из RAW_NYT, взятый из CopyRe. Загрузите набор данных в DATA/RAW_NYT, а затем запустите:
python scripts/data/nyt/preprocess_nyt.py data/raw_nyt data/nyt/processed/Имейте в виду, что для справедливого сравнения мы воспроизведены предварительную обработку из предыдущей работы, что приводит к дублирующим триплетам из -за неправильной обработки повторных поверхностных форм для предприятия. Если вы хотите правильно проанализировать исходные данные в формате RELIK, вы можете установить Flag-Legacy-Format False. Просто имейте в виду, что предоставленные модели Re -NYT были обучены в устаревшем формате.
Мы проводим двухэтапный учебный процесс для ретривера. Во-первых, мы «предварительно обучаем» ретривер, используя набор данных Blink (Wu et al., 2019), а затем мы «тонко настраивать» его с использованием AIDA (Hoffart et al, 2011).
Для ретривера требуется набор данных в формате, похожий на DPR: файл jsonl , в котором каждая строка является словарем со следующими ключами:
{
"question" : " .... " ,
"positive_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}],
"negative_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}],
"hard_negative_ctxs" : [{
"title" : " ... " ,
"text" : " .... "
}]
}Потриверу также нужен индекс для поиска документов. Документы для индекса могут быть либо файлом JSONL, либо файл TSV, аналогичный DPR:
jsonl : Каждая строка представляет собой объект JSON со следующими ключами: id , text , metadatatsv : Каждая строка представляет собой разделенную вкладка строка с id и text столбцами, за которым следует любой другой столбец, который будет сохранен в поле metadata jsonl Пример:
{
"id" : " ... " ,
"text" : " ... " ,
"metadata" : [ " {...} " ]
},
... Пример tsv :
id t text t any other column
... После того, как у вас есть набор данных Blink в формате RELIK, вы можете создать окна со следующим скриптом:
# train
relik data create-windows
data/blink/processed/blink-train-kilt-relik.jsonl
data/blink/processed/blink-train-kilt-relik-windowed.jsonl
# dev
relik data create-windows
data/blink/processed/blink-dev-kilt-relik.jsonl
data/blink/processed/blink-dev-kilt-relik-windowed.jsonlа затем преобразуйте его в формат DPR:
# train
relik data convert-to-dpr
data/blink/processed/blink-train-kilt-relik-windowed.jsonl
data/blink/processed/blink-train-kilt-relik-windowed-dpr.jsonl
data/kb/wikipedia/documents.jsonl
--title-map data/kb/wikipedia/title_map.json
# dev
relik data convert-to-dpr
data/blink/processed/blink-dev-kilt-relik-windowed.jsonl
data/blink/processed/blink-dev-kilt-relik-windowed-dpr.jsonl
data/kb/wikipedia/documents.jsonl
--title-map data/kb/wikipedia/title_map.json Поскольку набор данных AIDA не доступен общедоступным, мы можем предоставить аннотации для набора данных AIDA в формате RELIK в качестве примера. Предполагая, что у вас есть полный набор данных AIDA в data/aida , вы можете преобразовать его в формат RELIK, а затем создать окна со следующим скриптом:
relik data create-windows
data/aida/processed/aida-train-relik.jsonl
data/aida/processed/aida-train-relik-windowed.jsonlа затем преобразуйте его в формат DPR:
relik data convert-to-dpr
data/aida/processed/aida-train-relik-windowed.jsonl
data/aida/processed/aida-train-relik-windowed-dpr.jsonl
data/kb/wikipedia/documents.jsonl
--title-map data/kb/wikipedia/title_map.jsonrelik data create-windows
data/data/processed/nyt/train.jsonl
data/data/processed/nyt/train-windowed.jsonl
--is-split-into-words
--window-size none а затем преобразуйте его в формат DPR:
relik data convert-to-dpr
data/data/processed/nyt/train-windowed.jsonl
data/data/processed/nyt/train-windowed-dpr.jsonl Команда relik retriever train может использоваться для обучения ретривера. Требуется следующие аргументы:
config_path : путь к файлу конфигурации.overrides : список переопределения в файл конфигурации, в key=value . Примеры файлов конфигурации можно найти в папке relik/retriever/conf .
Файлы конфигурации в relik/retriever/conf являются pretrain_iterable_in_batch.yaml и finetune_iterable_in_batch.yaml , которую мы использовали для предварительного обучения и настраивания ретривера, соответственно.
Например, чтобы обучить ретривера на наборе данных AIDA, вы можете запустить следующую команду:
relik retriever train relik/retriever/conf/finetune_iterable_in_batch.yaml
model.language_model=intfloat/e5-base-v2
data.train_dataset_path=data/aida/processed/aida-train-relik-windowed-dpr.jsonl
data.val_dataset_path=data/aida/processed/aida-dev-relik-windowed-dpr.jsonl
data.test_dataset_path=data/aida/processed/aida-test-relik-windowed-dpr.jsonl
data.shared_params.documents_path=data/kb/wikipedia/documents.jsonl Файл конфигурации в relik/retriever/conf -это finetune_nyt_iterable_in_batch.yaml , который мы использовали для тонкой настройки «Понимания» для набора данных NYT. Для CIE мы перепрофилируем предварительно проникновение от Blink на предыдущем шаге.
Например, чтобы обучить ретривера на наборе данных NYT, вы можете запустить следующую команду:
relik retriever train relik/retriever/conf/finetune_nyt_iterable_in_batch.yaml
model.language_model=intfloat/e5-base-v2
data.train_dataset_path=data/nyt/processed/nyt-train-relik-windowed-dpr.jsonl
data.val_dataset_path=data/nyt/processed/nyt-dev-relik-windowed-dpr.jsonl
data.test_dataset_path=data/nyt/processed/nyt-test-relik-windowed-dpr.jsonl Проходя мимо train.only_test=True To relik retriever train Command, вы можете пропустить обучение и только оценить модель. Это также нуждается в пути к контрольно -пропускной пунктам Pytorch Lightning и набору данных для оценки.
relik retriever train relik/retriever/conf/finetune_iterable_in_batch.yaml
train.only_test=True
test_dataset_path=data/aida/processed/aida-test-relik-windowed-dpr.jsonl
model.checkpoint_path=path/to/checkpointЭнкодер ретривера может быть сохранен с контрольной точки со следующей командой:
from relik . retriever . lightning_modules . pl_modules import GoldenRetrieverPLModule
checkpoint_path = "path/to/checkpoint"
retriever_folder = "path/to/retriever"
# If you want to push the model to the Hugging Face Hub set push_to_hub=True
push_to_hub = False
# If you want to push the model to the Hugging Face Hub set the repo_id
repo_id = "sapienzanlp/relik-retriever-e5-base-v2-aida-blink-encoder"
pl_module = GoldenRetrieverPLModule . load_from_checkpoint ( checkpoint_path )
pl_module . model . save_pretrained ( retriever_folder , push_to_hub = push_to_hub , repo_id = repo_id ) С push_to_hub=True модель будет подтолкнут к? Обнимаю границу с repo_id в качестве идентификатора репозитория, где будет протестирована модель.
Потриверу нужен индекс для поиска документов. Индекс может быть создан с помощью команды relik retriever create-index
relik retriever create-index --help
Usage: relik retriever build-index [OPTIONS] QUESTION_ENCODER_NAME_OR_PATH
DOCUMENT_PATH OUTPUT_FOLDER
╭─ Arguments ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * question_encoder_name_or_path TEXT [default: None] [required] │
│ * document_path TEXT [default: None] [required] │
│ * output_folder TEXT [default: None] [required] │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --document-file-type TEXT [default: jsonl] │
│ --passage-encoder-name-or-path TEXT [default: None] │
│ --indexer-class TEXT [default: relik.retriever.indexers.inmemory.InMemoryDocumentIndex] │
│ --batch-size INTEGER [default: 512] │
│ --num-workers INTEGER [default: 4] │
│ --passage-max-length INTEGER [default: 64] │
│ --device TEXT [default: cuda] │
│ --index-device TEXT [default: cpu] │
│ --precision TEXT [default: fp32] │
│ --push-to-hub --no-push-to-hub [default: no-push-to-hub] │
│ --repo-id TEXT [default: None] │
│ --help Show this message and exit. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯С помощью энкодера и индекса ретривер может быть загружен с идентификатора репо или локального пути:
from relik . retriever import GoldenRetriever
encoder_name_or_path = "sapienzanlp/relik-retriever-e5-base-v2-aida-blink-encoder"
index_name_or_path = "sapienzanlp/relik-retriever-e5-base-v2-aida-blink-wikipedia-index"
retriever = GoldenRetriever (
question_encoder = encoder_name_or_path ,
document_index = index_name_or_path ,
device = "cuda" , # or "cpu"
precision = "16" , # or "32", "bf16"
index_device = "cuda" , # or "cpu"
index_precision = "16" , # or "32", "bf16"
)И тогда его можно использовать для получения документов:
retriever . retrieve ( "Michael Jordan was one of the best players in the NBA." , top_k = 100 ) Читатель отвечает за извлечение организаций и отношений из документов из набора кандидатов (например, возможных объектов или отношений). Читатель может быть обучен для извлечения пролета или извлечения триплета. RelikReaderForSpanExtraction используется для извлечения пролета, то есть связывание сущности, в то время как RelikReaderForTripletExtraction используется для извлечения триплета, то есть извлечение соотношения.
Читателю требует оконного набора данных, который мы создали в разделе, прежде чем начать дополняться с кандидатами из ретривера. Кандидаты могут быть добавлены в набор данных, используя команду relik retriever add-candidates .
relik retriever add-candidates --help
Usage: relik retriever add-candidates [OPTIONS] QUESTION_ENCODER_NAME_OR_PATH
DOCUMENT_NAME_OR_PATH INPUT_PATH
OUTPUT_PATH
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * question_encoder_name_or_path TEXT [default: None] [required] │
│ * document_name_or_path TEXT [default: None] [required] │
│ * input_path TEXT [default: None] [required] │
│ * output_path TEXT [default: None] [required] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --passage-encoder-name-or-path TEXT [default: None] │
│ --relations BOOLEAN [default: False] │
│ --top-k INTEGER [default: 100] │
│ --batch-size INTEGER [default: 128] │
│ --num-workers INTEGER [default: 4] │
│ --device TEXT [default: cuda] │
│ --index-device TEXT [default: cpu] │
│ --precision TEXT [default: fp32] │
│ --use-doc-topics --no-use-doc-topics [default: no-use-doc-topics] │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯Нам нужно добавить кандидатов в каждое окно, которое будет использоваться читателем, используя наш ранее обученный ретривер. Вот пример с использованием нашего уже обученного ретривера на AIDA для разделения поездов:
relik retriever add-candidates sapienzanlp/relik-retriever-e5-base-v2-aida-blink-encoder sapienzanlp/relik-retriever-e5-base-v2-aida-blink-wikipedia-index data/aida/processed/aida-train-relik-windowed.jsonl data/aida/processed/aida-train-relik-windowed-candidates.jsonlТо же самое происходит для извлечения отношений. Если вы хотите использовать наш обученный ретривер:
relik retriever add-candidates sapienzanlp/relik-retriever-small-nyt-question-encoder sapienzanlp/relik-retriever-small-nyt-document-index data/nyt/processed/nyt-train-relik-windowed.jsonl data/nyt/processed/nyt-train-relik-windowed-candidates.jsonl Подобно ретриверу, команда relik reader train может использоваться для обучения ретривера. Требуется следующие аргументы:
config_path : путь к файлу конфигурации.overrides : список переопределения в файл конфигурации, в key=value . Примеры файлов конфигурации можно найти в папке relik/reader/conf .
Файлы конфигурации в relik/reader/conf являются large.yaml и base.yaml , которые мы использовали для обучения большого и базового считывателя, соответственно. Например, для обучения большого читателя на наборе данных AIDA:
relik reader train relik/reader/conf/large.yaml
train_dataset_path=data/aida/processed/aida-train-relik-windowed-candidates.jsonl
val_dataset_path=data/aida/processed/aida-dev-relik-windowed-candidates.jsonl
test_dataset_path=data/aida/processed/aida-dev-relik-windowed-candidates.jsonl Файлы конфигурации в relik/reader/conf являются large_nyt.yaml , base_nyt.yaml и small_nyt.yaml , которые мы использовали для обучения большого, базового и маленького читателя, соответственно. Например, для обучения большого читателя на наборе данных AIDA:
relik reader train relik/reader/conf/large_nyt.yaml
train_dataset_path=data/nyt/processed/nyt-train-relik-windowed-candidates.jsonl
val_dataset_path=data/nyt/processed/nyt-dev-relik-windowed-candidates.jsonl
test_dataset_path=data/nyt/processed/nyt-test-relik-windowed-candidates.jsonlЧитатель можно сохранить с контрольной точки со следующей командой:
from relik . reader . lightning_modules . relik_reader_pl_module import RelikReaderPLModule
checkpoint_path = "path/to/checkpoint"
reader_folder = "path/to/reader"
# If you want to push the model to the Hugging Face Hub set push_to_hub=True
push_to_hub = False
# If you want to push the model to the Hugging Face Hub set the repo_id
repo_id = "sapienzanlp/relik-reader-deberta-v3-large-aida"
pl_model = RelikReaderPLModule . load_from_checkpoint (
trainer . checkpoint_callback . best_model_path
)
pl_model . relik_reader_core_model . save_pretrained ( experiment_path , push_to_hub = push_to_hub , repo_id = repo_id ) с push_to_hub=True модель будет подтолкнут к? Объятие лица лица с repo_id в качестве идентификатора репозитория, где будет загружена модель.
Читатель может быть загружен с идентификатора репо или локального пути:
from relik . reader import RelikReaderForSpanExtraction , RelikReaderForTripletExtraction
# the reader for span extraction
reader_span = RelikReaderForSpanExtraction (
"sapienzanlp/relik-reader-deberta-v3-large-aida"
)
# the reader for triplet extraction
reader_tripltes = RelikReaderForTripletExtraction (
"sapienzanlp/relik-reader-deberta-v3-large-nyt"
)и используется для извлечения сущностей и отношений:
# an example of candidates for the reader
candidates = [ "Michael Jordan" , "NBA" , "Chicago Bulls" , "Basketball" , "United States" ]
reader_span . read ( "Michael Jordan was one of the best players in the NBA." , candidates = candidates )Мы оцениваем эффективность RELIK на сущности, связывающую с использованием песчаной. В следующей таблице показаны результаты (Inkb Micro F1) RELIK LAGIC и BASE:
| Модель | Аида | MSNBC | Девчонка | K50 | R128 | R500 | O15 | O16 | Мат | Уд | AIT (M: S) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ЖАНР | 83,7 | 73,7 | 54.1 | 60.7 | 46.7 | 40.3 | 56.1 | 50.0 | 58.2 | 54,5 | 38:00 |
| Entqa | 85,8 | 72.1 | 52,9 | 64,5 | 54.1 | 41,9 | 61.1 | 51.3 | 60.5 | 56.4 | 20:00 |
| Позвольте маленькому | 82.2 | 72,7 | 55,6 | 68.3 | 48.0 | 42.3 | 62,7 | 53,6 | 60.7 | 57.6 | 00:29 |
| RELIK BASE | 85,3 | 72,3 | 55,6 | 68.0 | 48.1 | 41.6 | 62,5 | 52,3 | 60.7 | 57.2 | 00:29 |
| Позвольте большой | 86.4 | 75.0 | 56.3 | 72,8 | 51.7 | 43,0 | 65,1 | 57.2 | 63,4 | 60.2 | 01:46 |
Оценка систем сравнения (INKB Micro F1) на тестовом наборе AIDA и вне домена MSNBC (MSN), Derczynski (DER), KORE50 (K50), N3-Reuters-128 (R128), N3-RSS-500 (R500), OKE-15 (O15) и OKE -16 (O16). Жирный жирный характер указывает на лучшую модель. Жанр использует упоминание словари. В столбце AIT показано время в минутах и секундах (M: S), что системы необходимо обработать весь тестовый набор AIDA с использованием NVIDIA RTX 4090, за исключением ENTQA, который не вписывается в 24 ГБ ОЗУ и для которого используется A100.
Чтобы оценить RELIK, мы используем следующие шаги:
Загрузите сервер GERBIL отсюда.
Запустите сервер GERBIL:
cd gerbil && ./start.sh cd gerbil-SpotWrapNifWS4Test && mvn clean -Dmaven.tomcat.port=1235 tomcat:runsapienzanlp/relik-entity-linking-large ): python relik/reader/utils/gerbil.py --relik-model-name sapienzanlp/relik-entity-linking-largeВ следующей таблице показаны результаты (Micro F1) RELIK LAGIC на наборе данных NYT:
| Модель | Нью -Йорк | NYT (Pretr) | AIT (M: S) |
|---|---|---|---|
| МЯТЕЖНИК | 93.1 | 93.4 | 01:45 |
| Uie | 93,5 | - | - |
| USM | 94.0 | 94.1 | - |
| Позвольте большой | 95.0 | 94,9 | 00:30 |
Чтобы оценить извлечение отношений, мы можем непосредственно использовать читателя с помощью сценария Relik/Reader/Trainer/Predict_re.py, указывая на файл с уже полученными кандидатами. Если вы хотите использовать нашего обученного читателя:
python relik/reader/trainer/predict_re.py --model_path sapienzanlp/relik-reader-deberta-v3-large-nyt --data_path /Users/perelluis/Documents/relik/data/debug/test.window.candidates.jsonl --is-evalИмейте в виду, что мы вычисляем порог для прогнозирования отношений на основе набора разработки. Чтобы вычислить его во время оценки, вы можете запустить следующее:
python relik/reader/trainer/predict_re.py --model_path sapienzanlp/relik-reader-deberta-v3-large-nyt --data_path /Users/perelluis/Documents/relik/data/debug/dev.window.candidates.jsonl --is-eval --compute-thresholdЕсли вы используете какую -либо часть этой работы, рассмотрите возможность ссылаться на бумагу следующим образом:
@inproceedings { orlando-etal-2024-relik ,
title = " Retrieve, Read and LinK: Fast and Accurate Entity Linking and Relation Extraction on an Academic Budget " ,
author = " Orlando, Riccardo and Huguet Cabot, Pere-Llu{'i}s and Barba, Edoardo and Navigli, Roberto " ,
booktitle = " Findings of the Association for Computational Linguistics: ACL 2024 " ,
month = aug,
year = " 2024 " ,
address = " Bangkok, Thailand " ,
publisher = " Association for Computational Linguistics " ,
}Данные и программное обеспечение лицензированы в рамках Creative Commons Attribution-Noncommercial-Sharealike 4.0.