

نموذج استخراج المعلومات السريع وخفيف الوزن لربط الكيان واستخراج العلاقة .
التثبيت من PYPI
pip install relikتثبيت مع جميع التبعيات الاختيارية.
pip install relik[all]التثبيت مع تبعيات اختيارية للتدريب والتقييم.
pip install relik[train]التثبيت مع تبعيات اختيارية لفايس
حزمة FAISS PYPI متاحة فقط لوحدة المعالجة المركزية. ل GPU ، قم بتثبيته من المصدر أو استخدم حزمة Conda.
ل CPU:
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] RECER كبيرة لاستخراج العلاقة (؟ كبير Re V2 ، Colab ✅) : relik-ie/relik-relation-extraction-large
RELIK كبير لاستخراج المعلومات المغلقة (؟ EL + RE كبيرة ، كولاب ✅) : https://huggingface.co/relik-ie/relik-cie-large
REF EXTER LAGE لاستخراج المعلومات المغلقة ( relik-ie/relik-cie-xl
RELIK صغير لربط الكيان (؟؟ ⚡ صغير وسريع EL ، كولاب ✅) : sapienzanlp/relik-entity-linking-small
REWIK صغير لربط الكيان (⚡ صغير وسريع EL) : sapienzanlp/relik-entity-linking-small
REWIK صغير لاستخراج المعلومات المغلقة (EL + RE) : relik-ie/relik-cie-small
ريب كبير لربط الكيان (EL for the Wild) : relik-ie/relik-entity-linking-large-robust
RELIK صغير لربط الكيان (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"}},
...
]
]
]
),
)
يمكن استخدام المسترجعين والقراء بشكل منفصل. في حالة Retriever-Only Relik فقط ، سيحتوي المخرجات على المرشحين لنص الإدخال.
مثال Retriever فقط:
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.jsonlتتوفر صور Docker لـ RELIK على Docker Hub. يمكنك سحب أحدث صورة مع:
docker pull sapienzanlp/relik:latestوتشغيل الصورة مع:
docker run -p 12345:8000 sapienzanlp/relik:latest -c relik-ie/relik-cie-small ستكون واجهة برمجة التطبيقات متاحة على http://localhost:12345 . يكشف نقطة نهاية واحدة /relik مع العديد من المعلمات التي يمكن تمريرها إلى النموذج. يمكن العثور على توثيق سريع لـ API في http://localhost:12345/docs . فيما يلي مثال بسيط على كيفية الاستعلام عن واجهة برمجة التطبيقات:
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 لتدريب Retriever ومجموعة بيانات 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 مأخوذة من COPERRE. قم بتنزيل مجموعة البيانات إلى Data/Raw_nyt ثم قم بتشغيلها:
python scripts/data/nyt/preprocess_nyt.py data/raw_nyt data/nyt/processed/يرجى العلم أنه للمقارنة العادلة ، استنسخنا المعالجة المسبقة من العمل السابق ، مما يؤدي إلى تكرار ثلاثة توائم بسبب التعامل غير الصحيح لأشكال السطح المتكررة لترتيب الكيان. إذا كنت ترغب في تحليل البيانات الأصلية بشكل صحيح لتنسيق ، فيمكنك تعيين العلامة-فالفسيق. فقط كن على علم بأن نماذج RE NYT المقدمة تم تدريبها على التنسيق القديم.
نقوم بإجراء عملية تدريب من خطوتين للمسترد. أولاً ، نحن "مسبقًا" للمسترد باستخدام مجموعة بيانات Blink (Wu et al. ، 2019) ، ثم "نتحمل" باستخدام Aida (Hoffart et al ، 2011).
يتطلب Retriever مجموعة بيانات بتنسيق مشابه لملف 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 ، يمكنك إنشاء Windows مع البرنامج النصي التالي:
# 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 ثم إنشاء Windows مع البرنامج النصي التالي:
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 ، نعيد تخصيص واحد قبل وميض في الخطوة السابقة.
على سبيل المثال ، لتدريب المسترد على مجموعة بيانات 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 إلى قيادة relik retriever train ، يمكنك تخطي التدريب وتقييم النموذج فقط. يحتاج أيضًا إلى المسار إلى نقطة تفتيش Lightning Pytorch ومجموعة البيانات لتقييمها.
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 سيتم دفع النموذج إلى؟ Hugging Face Hub مع 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 لاستخراج Span ، أي كيان ربط ، في حين يتم استخدام 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. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯نحتاج إلى إضافة مرشحين إلى كل نافذة سيتم استخدامها من قبل القارئ ، باستخدام Retriever المدربة مسبقًا. فيما يلي مثال باستخدام Retriever المدربين بالفعل على 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 على غرار Retriever ، يمكن استخدام أمر 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 سيتم دفع النموذج إلى؟ Hugging Face Hub مع 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 على الكيان الذي يربط باستخدام GERBIL. يوضح الجدول التالي نتائج (INKB micro F1) من RELIK كبيرة وقاعدة:
| نموذج | عايدة | 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 |
| قاعدة ريك | 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-RS-500 (R500) ، OKE-15 (OKE-5) و OKE-28. BOLD يشير إلى أفضل نموذج. يستخدم النوع قواميس ذكر. يُظهر عمود 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 كبيرة على مجموعة بيانات 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 " ,
}البيانات والبرامج مرخصة بموجب الإسناد الإبداعي المشترك--Noncommercial-Sharealike 4.0.