加载中…
加载中…
This model is the retriever for ROR set point matching. It finds candidate ROR records for an affiliation string. The matcher uses this model.
The model learns from the judgments of StartLux-Decision v1.1 27B Instant, a decision model with open weights by StartLux Labs. ror-set-point-retriever-e5-base-openalex-jev-distill is a retriever that learns from Jev's judgments of the same pairs (see Evaluation).
Part of the ROR set point matching collection. The code is in ror-set-point-matching on GitHub.
The model changes text into vectors. It changes an affiliation string into a query vector, and the text of each ROR record into a record vector. A high dot product means a good candidate. The matcher searches all 143,284 records and keeps the top 32. It adds the top 10 records of a lexical index. The set model ror-set-point-set-model-mmbert-base-mask then selects the records that the string names.
The model is one shared encoder with mean pooling. The output vectors have a length of 1. The weights are fp16.
from sentence_transformers import SentenceTransformer
from datasets import load_dataset
model = SentenceTransformer("adambuttrick/ror-set-point-retriever-e5-base")
records = load_dataset("adambuttrick/ror-set-point-matching-train-validation-test", "ror_records", split="train")
model.max_seq_length = 128 # record texts: 128 tokens, as in training
r = model.encode(records["text"], prompt_name="passage", batch_size=256, convert_to_tensor=True)
model.max_seq_length = 512 # strings: up to 512 tokens
q = model.encode(["Dept. of Physics, University of Tokyo, Japan"], prompt_name="query", convert_to_tensor=True)
top = (q @ r.T).topk(32)
candidates = [records[int(i)]["ror_id"] for i in top.indices[0]]
The prompts are "query: " for strings and "passage: " for records.
All training data comes from the dataset ror-set-point-matching-train-validation-test. The exact rows are in training_data/.
| Part | Config and split | Hard negatives | Rows |
|---|---|---|---|
| Teacher | teacher_judgments train: 176,551 strings, one row for each record with p ≥ 0.5. 42,951 strings have no such record and give no row |
The records of the same string with p < 0.1 | 158,183 |
| Labeled | affiliations_unseen_institutions train: 16,448 strings. Each link is used 3 times |
The lexical top 10 that are not labels | 49,878 |
| Synthetic | synthetic_non_latin train: 130,882 strings. The 2,871 strings that name a held-out record are not used |
Mined (see below) | 136,184 |
The training data has 344,245 rows. In each step, each string has its positive record and 3 hard negatives, drawn at random from the hard negatives of the row. When the row has fewer than 3, random records fill the list. All other records of the batch are also negatives, except the other labels of the string.
These strings are not used:
Thus no training row has a held-out record as a positive.
The teacher judged the (string, organization) pairs that Jev judged for openalex-affiliation-matcher v3.0.0. Platt scaling on 615,010 labeled pairs calibrates its p. The dataset card gives the question and the procedure.
A first retriever trained by the same procedure, but without the synthetic strings (208,061 rows, 1,625 steps). It searched each synthetic string and kept the top 64 records. The procedure read these records in rank order and dropped:
The first 10 records that remain are the negatives.
| Setting | Value |
|---|---|
| Base model | intfloat/multilingual-e5-base, revision d128750597153bb5987e10b1c3493a34e5a4502a |
| Loss | InfoNCE, temperature 0.02, over all records of the batch |
| Batch | 128 strings, each with 1 positive and 3 hard negatives |
| Epochs | 1 (2,689 steps) |
| Optimizer | AdamW, learning rate 2e-5, weight decay 0.01 |
| Schedule | Linear warm-up for 5% of the steps, then linear decay |
| Precision | bf16 autocast |
| Gradient clipping | 1.0 |
| Maximum length | 96 tokens for strings and 128 tokens for records. The search uses 512 tokens for strings |
| Gradient checkpointing | Off |
| Seed | 1363 |
| Hardware | 1 × NVIDIA H200: 12 minutes (745 s) of training. The first retriever trained in 8 minutes (455 s) |
The training script saves the model, loads it again, and compares the vectors. The smallest cosine is 0.999997 for strings and 0.999998 for records (logs/training_summary.json).
Recall of the gold links in percent, on the test split of affiliations_unseen_institutions (1,957 strings, 2,620 links). Its strings name institutions that are not in the train split. "New" links go to records that no training string names. "Known" links go to the other records. "Held out" links go to the 1,255 held-out institutions.
| Candidates | Records for each string | All links | Known | New | Non-Latin strings | Held out |
|---|---|---|---|---|---|---|
| Lexical top 10 | 8.9 | 82.5 | 75.6 | 84.6 | 76.3 | 86.6 |
| This model, top 1 | 1.0 | 59.1 | 35.6 | 66.4 | 77.1 | 70.5 |
| This model, top 10 | 10.0 | 93.9 | 90.3 | 95.0 | 97.0 | 96.8 |
| This model, top 32 | 32.0 | 96.9 | 94.7 | 97.5 | 98.3 | 98.5 |
| This model, top 64 | 64.0 | 97.7 | 95.6 | 98.3 | 98.7 | 99.1 |
| This model, top 32 + lexical top 10 (the matcher's candidates) | 37.8 | 97.7 | 96.5 | 98.1 | 98.3 | 99.0 |
| The candidates of the baseline (lexical, dense, acronym and alias generators) | 18.0 | 94.6 | 95.6 | 94.3 | 85.2 | 95.7 |
"New" refers to the train split only: the teacher and synthetic strings can name a new record. The held-out institutions have no string in the train split.
Recall of the gold links on the other test splits, in percent:
| Split | Strings | Lexical top 10 | This model, top 32 | The matcher's candidates |
|---|---|---|---|---|
affiliations test |
1,947 | 81.1 | 99.0 | 99.1 |
datacite test |
3,000 | 96.6 | 99.7 | 99.8 |
openalex_sample test |
40,000 | 86.4 | 98.7 | 99.1 |
The test figures come from the search in search/topk_test_splits.jsonl.gz.
The validation split of affiliations_unseen_institutions (1,914 strings, 3,292 links) contains all 272 links to CNRS (https://ror.org/02feahw73). Most of these strings name CNRS only with its acronym, inside the name of a laboratory. On this split, the recall of the top 32 is 95.5, and the matcher's candidates hold 96.8% of the links and 239 of the 272 links to CNRS. These figures come from the search of the training run (search/topk.jsonl.gz).
ror-set-point-retriever-e5-base-openalex-jev-distill learns from Jev's judgments of the same pairs. Recall in percent:
| Split | Candidates | Jev teacher | This model |
|---|---|---|---|
affiliations_unseen_institutions test |
Top 32 | 96.3 | 96.9 |
affiliations_unseen_institutions validation |
Top 32 | 92.8 | 95.5 |
| Top 32 + lexical top 10 | 94.3 | 96.8 | |
affiliations test |
Top 32 | 98.7 | 99.0 |
openalex_sample test |
Top 32 | 98.6 | 98.7 |
The rows of the Jev retriever also differ in these ways:
affiliations validation strings.| Path | Content |
|---|---|
| Model files | The sentence-transformers model, with the prompts query and passage |
training_data/ |
The training folder: records.jsonl.gz (ror_id, text), train.jsonl.gz (the rows), queries.jsonl.gz (set, id, text: the strings to search) and manifest.json (counts and sha256) |
search/topk.jsonl.gz |
set, id, ids, scores: the top 64 records for every query in training_data/queries.jsonl.gz, from a search on one NVIDIA H200. The set model's rows come from this file |
search/topk_test_splits.jsonl.gz |
The top 64 records for each string of the test splits affiliations_test, unseen_test, datacite_test and openalex_sample_test, from a search on one NVIDIA H200 |
logs/ |
The training log and summary |
Each training row has the fields q (the string), pos (the positive record), negs (the hard negatives), pos_all (all labels of the string) and src (teacher, labelled or synthetic). The query sets are teacher, labelled, synthetic (whose id is the line in synthetic_non_latin) and the evaluation sets.
The evaluation sets have these names in the files:
| Name | Split |
|---|---|
unseen_validation |
affiliations_unseen_institutions validation |
unseen_test |
affiliations_unseen_institutions test |
affiliations_validation |
affiliations validation |
affiliations_test |
affiliations test |
datacite_test |
datacite test |
openalex_sample_test |
openalex_sample test |
The weights come from intfloat/multilingual-e5-base and use the MIT license.
The teacher judgments come from StartLux-Decision v1.1 27B Instant by StartLux Labs. The weights of the teacher (CC BY-NC 4.0) are not part of this repository.