GraphRAG druhá verzia
This commit is contained in:
parent
4ff72bb74b
commit
a3e43eac9c
517
tools/graphrag/evaluation/benchmark_v2.py
Normal file
517
tools/graphrag/evaluation/benchmark_v2.py
Normal file
@ -0,0 +1,517 @@
|
|||||||
|
"""Build a source-grounded schema-v3 regression set and profile-disjoint holdout.
|
||||||
|
|
||||||
|
This module never imports graph construction/search code and never reads any
|
||||||
|
retrieval output. Legacy cases remain development-only. New TEST subjects are
|
||||||
|
student profiles absent from every legacy start entity. TEST is generated once
|
||||||
|
from raw source facts, before the corrected implementation is evaluated.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import itertools
|
||||||
|
import json
|
||||||
|
import random
|
||||||
|
import re
|
||||||
|
from collections import Counter
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from .source_oracle import ROOT, DEFAULT_WIKI, load_source_oracle, norm, supporting_documents
|
||||||
|
|
||||||
|
BASE = Path(__file__).resolve().parent
|
||||||
|
SEED = 20261024
|
||||||
|
|
||||||
|
|
||||||
|
def fingerprint(value: Any) -> str:
|
||||||
|
return hashlib.sha256(json.dumps(value, sort_keys=True, ensure_ascii=False, separators=(',', ':')).encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def people_for(question: dict, oracle: dict) -> list[str]:
|
||||||
|
names = {norm(name): name for name in oracle['people']}
|
||||||
|
return [names[norm(item['value'])] for item in question['graph'].get('start_entities', [])
|
||||||
|
if item['type'] == 'person' and norm(item['value']) in names]
|
||||||
|
|
||||||
|
|
||||||
|
def academics(oracle: dict, person: str, *, title: str | None = None, year: int | None = None,
|
||||||
|
kind: str | None = None) -> list[dict]:
|
||||||
|
rows = oracle['people'][person]['academics']
|
||||||
|
return [row for row in rows if (title is None or norm(row['title']) == norm(title))
|
||||||
|
and (year is None or row['year'] == year) and (kind is None or row['academic_kind'] == kind)]
|
||||||
|
|
||||||
|
|
||||||
|
def has_tag(oracle: dict, person: str, keyword: str) -> bool:
|
||||||
|
return norm(keyword) in {norm(tag) for tag in oracle['people'][person]['tags']}
|
||||||
|
|
||||||
|
|
||||||
|
def academic_binding(person: str, record: dict, *, title: bool = False, keyword: str | None = None) -> dict:
|
||||||
|
binding = {'person': person, 'academic_kind': record['academic_kind'],
|
||||||
|
'academic_type': record['academic_type'], 'year': record['year']}
|
||||||
|
if title:
|
||||||
|
binding['title'] = record['title']
|
||||||
|
if keyword is not None:
|
||||||
|
binding['keyword'] = keyword
|
||||||
|
return {key: value for key, value in binding.items() if value is not None}
|
||||||
|
|
||||||
|
|
||||||
|
def path_patterns(bindings: list[dict]) -> list[dict]:
|
||||||
|
patterns = []
|
||||||
|
for index, binding in enumerate(bindings):
|
||||||
|
if any(key in binding for key in ['year', 'title', 'academic_kind', 'academic_type']):
|
||||||
|
kind = binding.get('academic_kind', 'Academic')
|
||||||
|
relation = 'AUTHORED' if kind == 'Thesis' else 'HAS_WORK' if kind == 'Work' else 'AUTHORED|HAS_WORK'
|
||||||
|
patterns.append({'binding_index': index, 'node_kinds': ['Person', kind, 'Document'],
|
||||||
|
'relationships': [relation, 'EVIDENCED_BY']})
|
||||||
|
for field, kind, relation in [('keyword', 'Keyword', 'HAS_KEYWORD'),
|
||||||
|
('category', 'Category', 'IN_CATEGORY'),
|
||||||
|
('document_author', 'DocumentAuthor', 'AUTHORED_DOCUMENT')]:
|
||||||
|
if field in binding:
|
||||||
|
patterns.append({'binding_index': index, 'node_kinds': ['Person', 'Document', kind],
|
||||||
|
'relationships': ['HAS_DOCUMENT', relation]})
|
||||||
|
return patterns
|
||||||
|
|
||||||
|
|
||||||
|
def binding_source_evidence(binding: dict, oracle: dict) -> list[dict]:
|
||||||
|
person = oracle['people'][binding['person']]
|
||||||
|
evidence = []
|
||||||
|
for field in ['keyword', 'category', 'document_author']:
|
||||||
|
if field not in binding:
|
||||||
|
continue
|
||||||
|
docs = supporting_documents(oracle, binding['person'], **{field: binding[field]})
|
||||||
|
if binding.get('document_path'):
|
||||||
|
docs = [p for p in docs if p == binding['document_path']]
|
||||||
|
for path in docs:
|
||||||
|
evidence.append({'document_path': path, 'sha256': oracle['documents'][path]['sha256'],
|
||||||
|
'field': {'keyword': 'taxonomy.tag', 'category': 'taxonomy.category',
|
||||||
|
'document_author': 'taxonomy.author'}[field], 'value': binding[field]})
|
||||||
|
if any(key in binding for key in ['year', 'title', 'academic_kind', 'academic_type']):
|
||||||
|
rows = academics(oracle, binding['person'], title=binding.get('title'), year=binding.get('year'),
|
||||||
|
kind=binding.get('academic_kind'))
|
||||||
|
for row in rows:
|
||||||
|
if binding.get('academic_type') and row['academic_type'] != binding['academic_type']:
|
||||||
|
continue
|
||||||
|
evidence.append({'document_path': row['document_path'],
|
||||||
|
'sha256': oracle['documents'][row['document_path']]['sha256'],
|
||||||
|
'field': 'academic_record', 'academic_kind': row['academic_kind'],
|
||||||
|
'academic_type': row['academic_type'], 'title': row['title'], 'year': row['year'],
|
||||||
|
'heading_line': row['heading_line'], 'title_line': row['title_line'],
|
||||||
|
'year_basis': row['year_basis']})
|
||||||
|
if 'start_year' in binding:
|
||||||
|
evidence.append({'document_path': person['profile'], 'sha256': oracle['documents'][person['profile']]['sha256'],
|
||||||
|
'field': 'start_year', 'value': binding['start_year']})
|
||||||
|
return evidence
|
||||||
|
|
||||||
|
|
||||||
|
def make_case(case_id: str, split: str, category: str, question: str, names: list[str], oracle: dict,
|
||||||
|
bindings: list[dict], *, no_answer: bool = False, reason: str | None = None,
|
||||||
|
expected_set: list[str] | None = None, set_field: str | None = None,
|
||||||
|
count: int | None = None, context_documents: list[str] | None = None,
|
||||||
|
negative_constraints: dict | None = None) -> dict:
|
||||||
|
known = [name for name in names if name in oracle['people']]
|
||||||
|
profiles = sorted({oracle['people'][name]['profile'] for name in known})
|
||||||
|
paths = set(context_documents or profiles)
|
||||||
|
evidence = [item for binding in bindings for item in binding_source_evidence(binding, oracle)]
|
||||||
|
# Multiple documents can independently prove the same tag/category. Gold
|
||||||
|
# sources are alternatives for each bound proof, not an obligation to cite
|
||||||
|
# every duplicate occurrence. Context profiles still cover all candidates.
|
||||||
|
evidence_choices = []
|
||||||
|
roles = {'taxonomy.tag': 'keyword_document', 'taxonomy.category': 'category_document',
|
||||||
|
'taxonomy.author': 'author_document', 'academic_record': 'academic_document',
|
||||||
|
'start_year': 'person_document'}
|
||||||
|
if not no_answer:
|
||||||
|
for index, binding in enumerate(bindings):
|
||||||
|
per_role: dict[str, set[str]] = {}
|
||||||
|
for item in binding_source_evidence(binding, oracle):
|
||||||
|
per_role.setdefault(roles[item['field']], set()).add(item['document_path'])
|
||||||
|
for role, alternatives in per_role.items():
|
||||||
|
evidence_choices.append({'binding_index': index, 'role': role, 'any_of': [
|
||||||
|
{'document_path': path, 'source_url': oracle['documents'][path]['source_url']}
|
||||||
|
for path in sorted(alternatives)]})
|
||||||
|
expected_values = []
|
||||||
|
expected_entities = []
|
||||||
|
if not no_answer:
|
||||||
|
for binding in bindings:
|
||||||
|
for field in ['person', 'keyword', 'category', 'document_author', 'title', 'year', 'start_year']:
|
||||||
|
if field in binding:
|
||||||
|
value = str(binding[field])
|
||||||
|
expected_values.append(value)
|
||||||
|
kind = ('thesis_title' if binding.get('academic_kind') == 'Thesis' else 'work_title') if field == 'title' else field
|
||||||
|
expected_entities.append({'type': kind, 'value': value})
|
||||||
|
if count is not None:
|
||||||
|
expected_values.append(str(count))
|
||||||
|
graph = {'schema_version': 3, 'task': category, 'start_entities': [{'type': 'person', 'value': name} for name in names],
|
||||||
|
'expected_bindings': bindings if not no_answer else [],
|
||||||
|
'expected_evidence_documents': evidence_choices,
|
||||||
|
'expected_path_patterns': path_patterns(bindings) if not no_answer else [],
|
||||||
|
'expected_no_answer': no_answer, 'expected_status': 'no_answer' if no_answer else 'ok',
|
||||||
|
'expected_entities': expected_entities, 'expected_relations': [], 'expected_properties': [],
|
||||||
|
'source_profiles': profiles}
|
||||||
|
if no_answer:
|
||||||
|
graph['no_answer_basis'] = reason or 'No source record satisfies every requested condition.'
|
||||||
|
graph['negative_constraints'] = negative_constraints or {}
|
||||||
|
# Closed-world negative: retain all original metadata considered, not a fabricated positive fact.
|
||||||
|
evidence = [{'document_path': path, 'sha256': oracle['documents'][path]['sha256'],
|
||||||
|
'field': 'closed_world_metadata', 'tags': oracle['documents'][path]['tags'],
|
||||||
|
'categories': oracle['documents'][path]['categories']}
|
||||||
|
for name in known for path in oracle['people'][name]['documents']]
|
||||||
|
if expected_set is not None:
|
||||||
|
graph.update(expected_entity_set=sorted(expected_set, key=norm), entity_set_mode='exact', entity_set_field=set_field or 'person')
|
||||||
|
if count is not None:
|
||||||
|
graph['expected_count'] = count
|
||||||
|
graph['partition_group'] = fingerprint({'category': category, 'people': sorted(names, key=norm),
|
||||||
|
'bindings': bindings, 'negative': no_answer,
|
||||||
|
'requested': question if no_answer else None})[:20]
|
||||||
|
return {'id': case_id, 'split': split, 'category': category, 'difficulty': 'hard', 'question': question,
|
||||||
|
'should_answer': not no_answer, 'expected_documents': sorted(paths),
|
||||||
|
'expected_source_urls': sorted(oracle['documents'][path]['source_url'] for path in paths),
|
||||||
|
'expected_answer_contains': list(dict.fromkeys(expected_values)), 'graph': graph,
|
||||||
|
'source_evidence': evidence, 'evidence_basis': ['independent_raw_markdown_oracle_v2']}
|
||||||
|
|
||||||
|
|
||||||
|
def correct_legacy(question: dict, oracle: dict) -> dict:
|
||||||
|
names = people_for(question, oracle); cat = question['category']; old = question['graph']
|
||||||
|
entities = old.get('expected_entities', [])
|
||||||
|
keyword = next((item['value'] for item in entities if item['type'] == 'keyword'), None)
|
||||||
|
years = [int(item['value']) for item in entities if item['type'] == 'year']
|
||||||
|
bindings = []; expected_set = None; set_field = None; count = None; reason = None
|
||||||
|
if cat == 'shared_keyword_pair':
|
||||||
|
if keyword and all(has_tag(oracle, name, keyword) for name in names):
|
||||||
|
bindings = [{'person': name, 'keyword': keyword} for name in names]
|
||||||
|
else:
|
||||||
|
reason = 'Requested shared keyword is absent from the raw frontmatter of at least one named person.'
|
||||||
|
elif cat == 'same_start_year_pair':
|
||||||
|
bindings = [{'person': name, 'start_year': oracle['people'][name]['start_year']} for name in names]
|
||||||
|
elif cat == 'same_academic_year_pair':
|
||||||
|
common = set.intersection(*[{row['year'] for row in academics(oracle, name) if row['year'] is not None} for name in names])
|
||||||
|
bindings = [{'person': name, 'year': year} for year in sorted(common) for name in names]
|
||||||
|
if not common:
|
||||||
|
reason = 'No shared academic year is stated in the original sources.'
|
||||||
|
elif cat in {'person_title_year', 'person_keyword_title'}:
|
||||||
|
titles = [item for item in entities if item['type'] in {'thesis_title', 'work_title'}]
|
||||||
|
for item in titles:
|
||||||
|
kind = 'Thesis' if item['type'] == 'thesis_title' else 'Work'
|
||||||
|
rows = academics(oracle, names[0], title=item['value'], kind=kind)
|
||||||
|
if not rows and norm(item['value']) in norm(oracle['documents'][oracle['people'][names[0]]['profile']]['raw_text']):
|
||||||
|
raise RuntimeError(f"Oracle extraction needs review for supported raw title: {question['id']}")
|
||||||
|
if years:
|
||||||
|
rows = [row for row in rows if row['year'] in years]
|
||||||
|
if cat == 'person_keyword_title' and not has_tag(oracle, names[0], keyword or ''):
|
||||||
|
reason = 'Requested keyword is not a raw frontmatter tag of this person.'
|
||||||
|
break
|
||||||
|
for row in rows:
|
||||||
|
binding = academic_binding(names[0], row, title=True, keyword=keyword if cat == 'person_keyword_title' else None)
|
||||||
|
if cat == 'person_keyword_title' and not years:
|
||||||
|
binding.pop('year', None)
|
||||||
|
bindings.append(binding)
|
||||||
|
if not bindings and not reason:
|
||||||
|
reason = 'Requested title/type/year combination is not independently supported by the source.'
|
||||||
|
elif cat == 'document_author_category_multi_hop':
|
||||||
|
category = next(item['value'] for item in entities if item['type'] == 'category')
|
||||||
|
for path in supporting_documents(oracle, names[0], category=category):
|
||||||
|
author = oracle['documents'][path]['author']
|
||||||
|
if author:
|
||||||
|
bindings.append({'person': names[0], 'category': category, 'document_author': author,
|
||||||
|
'document_path': path, 'same_document': True})
|
||||||
|
if not bindings:
|
||||||
|
reason = 'No same document supports both the category and metadata author.'
|
||||||
|
elif cat == 'person_multiple_categories':
|
||||||
|
expected_set = oracle['people'][names[0]]['categories']; set_field = 'category'
|
||||||
|
bindings = [{'person': names[0], 'category': category} for category in expected_set]
|
||||||
|
elif cat == 'candidate_set_aggregation':
|
||||||
|
query_years = [int(x) for x in re.findall(r'\b20\d{2}\b', question['question'])]
|
||||||
|
year = query_years[-1]
|
||||||
|
matches = [name for name in names if academics(oracle, name, year=year)]
|
||||||
|
bindings = [{'person': name, 'year': year} for name in matches]
|
||||||
|
expected_set = matches; set_field = 'person'; count = len(matches)
|
||||||
|
elif cat == 'conjunctive_disambiguation':
|
||||||
|
year = years[0]
|
||||||
|
matches = [name for name in names if has_tag(oracle, name, keyword) and academics(oracle, name, year=year)]
|
||||||
|
bindings = [{'person': name, 'keyword': keyword, 'year': year} for name in matches]
|
||||||
|
if not matches:
|
||||||
|
reason = 'No named person satisfies both raw frontmatter keyword and academic year.'
|
||||||
|
else:
|
||||||
|
raise ValueError(f'Unsupported legacy category: {cat}')
|
||||||
|
case = make_case(question['id'], 'dev', cat, question['question'], names, oracle, bindings,
|
||||||
|
no_answer=reason is not None, reason=reason, expected_set=expected_set,
|
||||||
|
set_field=set_field, count=count,
|
||||||
|
negative_constraints=({'keyword': keyword, 'require_all_people': True} if cat == 'shared_keyword_pair'
|
||||||
|
else {'keyword': keyword} if cat == 'person_keyword_title'
|
||||||
|
else {'keyword': keyword, 'year': years[0]} if cat == 'conjunctive_disambiguation'
|
||||||
|
else {'shared_academic_year': True} if cat == 'same_academic_year_pair'
|
||||||
|
else {}))
|
||||||
|
case['legacy_split'] = question['split']
|
||||||
|
case['legacy_role'] = 'previously_seen_regression_only'
|
||||||
|
return case
|
||||||
|
|
||||||
|
|
||||||
|
def independent_pool(oracle: dict, names: list[str]) -> dict[str, list[dict]]:
|
||||||
|
pool: dict[str, list[dict]] = {category: [] for category in [
|
||||||
|
'shared_keyword_pair', 'same_academic_year_pair', 'same_start_year_pair', 'person_title_year',
|
||||||
|
'person_keyword_title', 'document_author_category_multi_hop', 'person_multiple_categories',
|
||||||
|
'candidate_set_aggregation', 'conjunctive_disambiguation']}
|
||||||
|
def add(category: str, text: str, people: list[str], bindings: list[dict], **kwargs):
|
||||||
|
pool[category].append(make_case('', 'test', category, text, people, oracle, bindings, **kwargs))
|
||||||
|
for left, right in itertools.combinations(names, 2):
|
||||||
|
common_tags = sorted({norm(tag): tag for tag in oracle['people'][left]['tags']
|
||||||
|
if has_tag(oracle, right, tag)}.values(), key=norm)
|
||||||
|
for tag in common_tags:
|
||||||
|
add('shared_keyword_pair', f'Over spoločné kľúčové slovo {tag} pri osobách {left} a {right}.',
|
||||||
|
[left, right], [{'person': name, 'keyword': tag} for name in [left, right]])
|
||||||
|
shared_years = {row['year'] for row in academics(oracle, left)} & {row['year'] for row in academics(oracle, right)} - {None}
|
||||||
|
# A query for an unspecified shared year expects all supported intersections.
|
||||||
|
if shared_years:
|
||||||
|
add('same_academic_year_pair', f'Aké spoločné roky práce spájajú osoby {left} a {right}?',
|
||||||
|
[left, right], [{'person': name, 'year': year} for year in sorted(shared_years) for name in [left, right]])
|
||||||
|
start_l, start_r = oracle['people'][left]['start_year'], oracle['people'][right]['start_year']
|
||||||
|
if start_l is not None and start_l == start_r:
|
||||||
|
add('same_start_year_pair', f'Porovnaj rovnaký rok začiatku štúdia osôb {left} a {right}.',
|
||||||
|
[left, right], [{'person': name, 'start_year': start_l} for name in [left, right]])
|
||||||
|
for name in names:
|
||||||
|
person = oracle['people'][name]
|
||||||
|
if person['categories']:
|
||||||
|
add('person_multiple_categories', f'Vypíš všetky kategórie dokumentov osoby {name}.', [name],
|
||||||
|
[{'person': name, 'category': cat} for cat in person['categories']],
|
||||||
|
expected_set=person['categories'], set_field='category')
|
||||||
|
for category in person['categories']:
|
||||||
|
for path in supporting_documents(oracle, name, category=category):
|
||||||
|
author = oracle['documents'][path]['author']
|
||||||
|
if author:
|
||||||
|
add('document_author_category_multi_hop',
|
||||||
|
f'Kto je autor dokumentu osoby {name}, ktorý patrí do kategórie {category}?', [name],
|
||||||
|
[{'person': name, 'category': category, 'document_author': author,
|
||||||
|
'document_path': path, 'same_document': True}])
|
||||||
|
# Title-year cases use only explicit, nonconflicting title records.
|
||||||
|
for record in person['academics']:
|
||||||
|
if not record['title'] or record['year'] is None or record in person['year_conflicts']:
|
||||||
|
continue
|
||||||
|
year = record['year']
|
||||||
|
kind_label = 'diplomového projektu' if record['academic_type'] == 'diploma_project' else 'práce'
|
||||||
|
add('person_title_year', f'Aký názov {kind_label} a rok práce sú pri osobe {name} uvedené pre rok {year}?',
|
||||||
|
[name], [academic_binding(name, record, title=True)])
|
||||||
|
for tag in person['tags']:
|
||||||
|
binding = academic_binding(name, record, title=True, keyword=tag)
|
||||||
|
# Pin the academic year in the question as the independent source can contain several titles.
|
||||||
|
add('person_keyword_title', f'Aký názov práce osoby {name} v roku {year} súvisí s kľúčovým slovom {tag}?',
|
||||||
|
[name], [binding])
|
||||||
|
# Candidate groups are source-derived; the query mentions every candidate.
|
||||||
|
for year in sorted({row['year'] for name in names for row in academics(oracle, name) if row['year'] is not None}):
|
||||||
|
matching = [name for name in names if academics(oracle, name, year=year)]
|
||||||
|
other = [name for name in names if name not in matching]
|
||||||
|
for selected in itertools.islice(itertools.combinations(matching, 2), 12):
|
||||||
|
if other:
|
||||||
|
candidates = list(selected) + [other[0]]
|
||||||
|
add('candidate_set_aggregation',
|
||||||
|
f'Z kandidátov {", ".join(candidates)} vyber osoby s prácou v roku {year}. Koľko ich je?',
|
||||||
|
candidates, [{'person': name, 'year': year} for name in selected],
|
||||||
|
expected_set=list(selected), set_field='person', count=len(selected))
|
||||||
|
for name in names:
|
||||||
|
person = oracle['people'][name]
|
||||||
|
for year in sorted({record['year'] for record in person['academics'] if record['year'] is not None}):
|
||||||
|
for tag in person['tags']:
|
||||||
|
distractors = [other for other in names if other != name
|
||||||
|
and (has_tag(oracle, other, tag) != bool(academics(oracle, other, year=year)))]
|
||||||
|
for other in distractors[:2]:
|
||||||
|
candidates = [name, other]
|
||||||
|
add('conjunctive_disambiguation',
|
||||||
|
f'Ktorá z osôb {name} a {other} má kľúčové slovo {tag} a jej práca je z roku {year}?',
|
||||||
|
candidates, [{'person': name, 'keyword': tag, 'year': year}])
|
||||||
|
return pool
|
||||||
|
|
||||||
|
|
||||||
|
def necessary_negatives(oracle: dict, names: list[str], split: str) -> list[dict]:
|
||||||
|
cases = []
|
||||||
|
prefix = 'dev' if split == 'dev' else 'holdout'
|
||||||
|
for i, name in enumerate(names[:4]):
|
||||||
|
tag = next(iter(oracle['people'][name]['tags']), 'nlp')
|
||||||
|
cases.append(make_case(f'{prefix}-negative-year-{i}', split, 'negative_lookup',
|
||||||
|
f'Aký názov práce má osoba {name}, ak jej práca je z roku 2099 a jej dokument obsahuje kľúčové slovo {tag}?',
|
||||||
|
[name], oracle, [], no_answer=True, reason='No source academic record has year 2099.',
|
||||||
|
negative_constraints={'year': 2099, 'keyword': tag}))
|
||||||
|
for i, name in enumerate(names[4:6]):
|
||||||
|
cases.append(make_case(f'{prefix}-negative-tag-{i}', split, 'negative_lookup',
|
||||||
|
f'Aký názov práce má osoba {name}, ak jej dokument obsahuje kľúčové slovo neexistujucitagvzor?',
|
||||||
|
[name], oracle, [], no_answer=True, reason='Requested tag absent from complete raw frontmatter catalog.',
|
||||||
|
negative_constraints={'keyword': 'neexistujucitagvzor'}))
|
||||||
|
for i, unknown in enumerate(['Zuzana Neexistujúca Vzorová', 'Roman Neskutočný Testovací'] if split == 'dev'
|
||||||
|
else ['Tibor Neexistujúci Skúšobný', 'Lenka Neskutočná Vzorová']):
|
||||||
|
cases.append(make_case(f'{prefix}-negative-person-{i}', split, 'negative_lookup',
|
||||||
|
f'Aký názov diplomovej práce má osoba {unknown}?', [unknown], oracle, [],
|
||||||
|
no_answer=True, reason='Explicit full name absent from all raw profile frontmatter titles.',
|
||||||
|
negative_constraints={'unknown_person': unknown}))
|
||||||
|
candidates = names[:3]
|
||||||
|
cases.append(make_case(f'{prefix}-zero-count', split, 'candidate_set_aggregation',
|
||||||
|
f'Z kandidátov {", ".join(candidates)} vyber osoby s prácou v roku 2099. Koľko ich je?',
|
||||||
|
candidates, oracle, [], expected_set=[], set_field='person', count=0))
|
||||||
|
return cases
|
||||||
|
|
||||||
|
|
||||||
|
def validate_case(case: dict, oracle: dict) -> list[str]:
|
||||||
|
issues = []
|
||||||
|
graph = case['graph']
|
||||||
|
names = people_for(case, oracle)
|
||||||
|
if set(graph.get('source_profiles', [])) != {oracle['people'][name]['profile'] for name in names}:
|
||||||
|
issues.append('incorrect_source_profile_partition')
|
||||||
|
for binding in graph.get('expected_bindings', []):
|
||||||
|
person = binding['person']
|
||||||
|
if person not in oracle['people']:
|
||||||
|
issues.append('unknown_bound_person'); continue
|
||||||
|
if 'start_year' in binding and oracle['people'][person]['start_year'] != binding['start_year']:
|
||||||
|
issues.append('wrong_start_year')
|
||||||
|
metadata = {key: binding[key] for key in ['keyword', 'category', 'document_author'] if key in binding}
|
||||||
|
if binding.get('same_document') and not supporting_documents(oracle, person, **metadata):
|
||||||
|
issues.append('metadata_not_connected_in_same_document')
|
||||||
|
for key, value in metadata.items():
|
||||||
|
if not supporting_documents(oracle, person, **{key: value}):
|
||||||
|
issues.append('unsupported_' + key)
|
||||||
|
if any(key in binding for key in ['title', 'year', 'academic_type', 'academic_kind']):
|
||||||
|
records = academics(oracle, person, title=binding.get('title'), year=binding.get('year'), kind=binding.get('academic_kind'))
|
||||||
|
if binding.get('academic_type'):
|
||||||
|
records = [r for r in records if r['academic_type'] == binding['academic_type']]
|
||||||
|
if not records:
|
||||||
|
issues.append('unsupported_academic_binding')
|
||||||
|
if graph.get('expected_no_answer'):
|
||||||
|
if graph.get('expected_bindings') or case.get('expected_answer_contains') or graph.get('expected_entities'):
|
||||||
|
issues.append('negative_contains_positive_expectations')
|
||||||
|
constraints = graph.get('negative_constraints', {})
|
||||||
|
names = people_for(case, oracle)
|
||||||
|
if constraints.get('unknown_person'):
|
||||||
|
if norm(constraints['unknown_person']) in {norm(name) for name in oracle['people']}:
|
||||||
|
issues.append('negative_person_actually_exists')
|
||||||
|
elif constraints.get('shared_academic_year'):
|
||||||
|
year_sets = [{r['year'] for r in academics(oracle, name) if r['year'] is not None} for name in names]
|
||||||
|
if year_sets and set.intersection(*year_sets):
|
||||||
|
issues.append('negative_shared_year_actually_exists')
|
||||||
|
elif constraints.get('require_all_people'):
|
||||||
|
if not names or all(has_tag(oracle, name, constraints.get('keyword', '')) for name in names):
|
||||||
|
issues.append('negative_shared_keyword_actually_exists')
|
||||||
|
elif constraints:
|
||||||
|
matching = []
|
||||||
|
for name in names:
|
||||||
|
valid = not constraints.get('keyword') or has_tag(oracle, name, constraints['keyword'])
|
||||||
|
if any(key in constraints for key in ['year', 'title', 'academic_kind']):
|
||||||
|
valid = valid and bool(academics(oracle, name, year=constraints.get('year'),
|
||||||
|
title=constraints.get('title'), kind=constraints.get('academic_kind')))
|
||||||
|
if valid:
|
||||||
|
matching.append(name)
|
||||||
|
if matching:
|
||||||
|
issues.append('negative_conjunction_actually_satisfied')
|
||||||
|
else:
|
||||||
|
issues.append('negative_without_machine_verifiable_false_premise')
|
||||||
|
if graph.get('expected_entity_set') is not None and graph.get('entity_set_field') == 'category':
|
||||||
|
names = people_for(case, oracle)
|
||||||
|
if names and set(graph['expected_entity_set']) != set(oracle['people'][names[0]]['categories']):
|
||||||
|
issues.append('incomplete_category_set')
|
||||||
|
if graph.get('expected_count') is not None:
|
||||||
|
years = re.findall(r'\b20\d{2}\b', case['question'])
|
||||||
|
if not years:
|
||||||
|
issues.append('count_without_supported_year_constraint')
|
||||||
|
else:
|
||||||
|
matches = {name for name in names if academics(oracle, name, year=int(years[-1]))}
|
||||||
|
if matches != set(graph.get('expected_entity_set', [])) or len(matches) != graph['expected_count']:
|
||||||
|
issues.append('incorrect_candidate_set_or_count')
|
||||||
|
return sorted(set(issues))
|
||||||
|
|
||||||
|
|
||||||
|
def audit_dataset(questions: list[dict], oracle: dict, dataset_path: Path) -> dict:
|
||||||
|
rows = [{'id': question['id'], 'split': question['split'], 'source_consistent': not (issues := validate_case(question, oracle)),
|
||||||
|
'issues': issues, 'category': question['category']} for question in questions]
|
||||||
|
inputs = {name: hashlib.sha256((ROOT / name).read_bytes()).hexdigest() for name in ['data/documents.json', 'data/chunks.json']}
|
||||||
|
return {'method': 'Independent original Markdown frontmatter/heading/title oracle; no graph parser, chunks or retrieval results used for labels.',
|
||||||
|
'dataset_sha256': hashlib.sha256(dataset_path.read_bytes()).hexdigest(),
|
||||||
|
'inputs': inputs, 'source_corpus': oracle['source_corpus'], 'questions': rows,
|
||||||
|
'by_split': {split: {'questions': len(selected), 'source_consistent': sum(row['source_consistent'] for row in selected),
|
||||||
|
'issues': dict(Counter(issue for row in selected for issue in row['issues']))}
|
||||||
|
for split in ['dev', 'test'] for selected in [[row for row in rows if row['split'] == split]]}}
|
||||||
|
|
||||||
|
|
||||||
|
def write_json(path: Path, value: Any) -> None:
|
||||||
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
path.write_text(json.dumps(value, ensure_ascii=False, indent=2) + '\n')
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
|
parser.add_argument('--wiki-root', type=Path, default=DEFAULT_WIKI)
|
||||||
|
parser.add_argument('--legacy', type=Path, default=BASE / 'graphrag_questions.json')
|
||||||
|
parser.add_argument('--output', type=Path, default=BASE / 'graphrag_questions_v2.json')
|
||||||
|
parser.add_argument('--artifacts', type=Path, default=BASE / 'results/v2_preparation')
|
||||||
|
args = parser.parse_args()
|
||||||
|
oracle = load_source_oracle(args.wiki_root)
|
||||||
|
legacy = json.loads(args.legacy.read_text())
|
||||||
|
corrected = [correct_legacy(question, oracle) for question in legacy]
|
||||||
|
legacy_names = {name for question in legacy for name in people_for(question, oracle)}
|
||||||
|
exposed_path = BASE / 'results/final_2026-10-24/holdout_failures.json'
|
||||||
|
previously_exposed = set()
|
||||||
|
if exposed_path.exists():
|
||||||
|
for row in json.loads(exposed_path.read_text()).get('questions', []):
|
||||||
|
previously_exposed.update(set(row.get('actual_documents', [])) - set(row.get('expected_documents', [])))
|
||||||
|
reserved_names = sorted([name for name, person in oracle['people'].items()
|
||||||
|
if name not in legacy_names and person['profile'] not in previously_exposed
|
||||||
|
and person['profile'].startswith('pages/students/')], key=norm)
|
||||||
|
dev_negatives = necessary_negatives(oracle, sorted(legacy_names, key=norm), 'dev')
|
||||||
|
test_pool = independent_pool(oracle, reserved_names)
|
||||||
|
rng = random.Random(SEED)
|
||||||
|
holdout = []
|
||||||
|
for category, cases in test_pool.items():
|
||||||
|
unique = {case['graph']['partition_group']: case for case in cases}
|
||||||
|
candidates = list(unique.values()); rng.shuffle(candidates)
|
||||||
|
if len(candidates) < 8:
|
||||||
|
raise RuntimeError(f'Insufficient independent source cases for {category}: {len(candidates)}')
|
||||||
|
for case in candidates[:8]:
|
||||||
|
case['id'] = f'h{len(holdout)+1:04d}'
|
||||||
|
holdout.append(case)
|
||||||
|
negative_cases = necessary_negatives(oracle, reserved_names, 'test')
|
||||||
|
# A zero-result count is an answerable numeric result, not a no-answer.
|
||||||
|
zero_count = negative_cases.pop()
|
||||||
|
count_index = next(i for i, case in enumerate(holdout) if case['category'] == 'candidate_set_aggregation')
|
||||||
|
zero_count['id'] = holdout[count_index]['id']
|
||||||
|
holdout[count_index] = zero_count
|
||||||
|
holdout.extend(negative_cases)
|
||||||
|
dev = corrected + dev_negatives
|
||||||
|
questions = dev + holdout
|
||||||
|
all_issues = {case['id']: validate_case(case, oracle) for case in questions if validate_case(case, oracle)}
|
||||||
|
if all_issues:
|
||||||
|
raise RuntimeError(f'Source consistency issues: {all_issues}')
|
||||||
|
dev_profiles = {p for case in dev for p in case['graph']['source_profiles']}
|
||||||
|
test_profiles = {p for case in holdout for p in case['graph']['source_profiles']}
|
||||||
|
assert not dev_profiles & test_profiles
|
||||||
|
assert not ({case['graph']['partition_group'] for case in dev} & {case['graph']['partition_group'] for case in holdout})
|
||||||
|
write_json(args.output, questions)
|
||||||
|
corrections = []
|
||||||
|
old_audit_path = BASE / 'results/final_2026-10-24/source_audit.json'
|
||||||
|
old_issues = {row['id']: row['issues'] for row in json.loads(old_audit_path.read_text())['questions'] if row['issues']}
|
||||||
|
for old, new in zip(legacy, corrected):
|
||||||
|
corrections.append({'id': old['id'], 'legacy_split': old['split'], 'new_split': 'dev',
|
||||||
|
'v1_source_audit_issues': old_issues.get(old['id'], []),
|
||||||
|
'old_should_answer': old.get('should_answer', True), 'new_should_answer': new['should_answer'],
|
||||||
|
'old_expected_values': old['expected_answer_contains'], 'new_expected_values': new['expected_answer_contains'],
|
||||||
|
'new_expected_bindings': new['graph']['expected_bindings'],
|
||||||
|
'no_answer_basis': new['graph'].get('no_answer_basis'),
|
||||||
|
'source_evidence': new['source_evidence']})
|
||||||
|
write_json(args.artifacts / 'legacy_corrections.json', {'legacy_count': len(legacy), 'v1_flagged_count': len(old_issues),
|
||||||
|
'resolved_v1_flagged_count': sum(not validate_case(new, oracle) for new in corrected if new['id'] in old_issues),
|
||||||
|
'negative_count': sum(not case['should_answer'] for case in corrected), 'questions': corrections})
|
||||||
|
write_json(args.artifacts / 'source_audit.json', audit_dataset(questions, oracle, args.output))
|
||||||
|
partition = {'seed': SEED, 'strategy': 'All previously seen 500 cases are DEV regression. TEST profiles never appeared in legacy start_entities; all real candidate profiles are disjoint.',
|
||||||
|
'dev_count': len(dev), 'test_count': len(holdout), 'previously_exposed_profiles_excluded_from_test': sorted(previously_exposed),
|
||||||
|
'dev_profiles': sorted(dev_profiles), 'test_profiles': sorted(test_profiles),
|
||||||
|
'dev_groups': sorted({case['graph']['partition_group'] for case in dev}),
|
||||||
|
'test_groups': sorted({case['graph']['partition_group'] for case in holdout}),
|
||||||
|
'dev_categories': dict(Counter(case['category'] for case in dev)),
|
||||||
|
'test_categories': dict(Counter(case['category'] for case in holdout)),
|
||||||
|
'source_corpus': oracle['source_corpus'],
|
||||||
|
'dataset_sha256': hashlib.sha256(args.output.read_bytes()).hexdigest(),
|
||||||
|
'limitations': ['Same source corpus and shared tag/category/author vocabulary.',
|
||||||
|
'Template families are known; TEST persons and their fact groups are withheld.',
|
||||||
|
'Oracle is independent of graph extraction but still rule-based; provenance permits human review.']}
|
||||||
|
write_json(args.artifacts / 'partition.json', partition)
|
||||||
|
print(json.dumps({'dataset': str(args.output), 'dev': len(dev), 'test': len(holdout),
|
||||||
|
'reserved_profile_count': len(test_profiles), 'source_issues': 0,
|
||||||
|
'corrected_legacy_negatives': sum(not q['should_answer'] for q in corrected),
|
||||||
|
'resolved_original_issues': len(old_issues),
|
||||||
|
'test_categories': partition['test_categories']}, ensure_ascii=False, indent=2))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@ -33,7 +33,7 @@ EVALUATION_DIR = Path(
|
|||||||
|
|
||||||
QUESTIONS_PATH = (
|
QUESTIONS_PATH = (
|
||||||
EVALUATION_DIR
|
EVALUATION_DIR
|
||||||
/ "graphrag_questions.json"
|
/ "graphrag_questions_v2.json"
|
||||||
)
|
)
|
||||||
|
|
||||||
RESULTS_DIR = (
|
RESULTS_DIR = (
|
||||||
@ -59,7 +59,7 @@ def parse_args() -> argparse.Namespace:
|
|||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--output-dir",
|
"--output-dir",
|
||||||
type=Path,
|
type=Path,
|
||||||
default=RESULTS_DIR,
|
default=RESULTS_DIR / 'development_v2',
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@ -110,11 +110,15 @@ def parse_args() -> argparse.Namespace:
|
|||||||
parser.add_argument('--audit', type=Path, help='Predeclared source-consistency audit.')
|
parser.add_argument('--audit', type=Path, help='Predeclared source-consistency audit.')
|
||||||
parser.add_argument('--freeze-manifest', type=Path,
|
parser.add_argument('--freeze-manifest', type=Path,
|
||||||
help='Required for TEST/all; verifies code, data, graph and parameters.')
|
help='Required for TEST/all; verifies code, data, graph and parameters.')
|
||||||
|
parser.add_argument('--overwrite', action='store_true',
|
||||||
|
help='Replace a previous DEV output; frozen TEST outputs are immutable.')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
if args.split in {'test', 'all'} and args.freeze_manifest is None:
|
if args.split in {'test', 'all'} and args.freeze_manifest is None:
|
||||||
parser.error('TEST/all requires --freeze-manifest after complete DEV evaluation.')
|
parser.error('TEST/all requires --freeze-manifest after complete DEV evaluation.')
|
||||||
if args.split in {'test', 'all'} and (args.ids or args.max_questions):
|
if args.split in {'test', 'all'} and (args.ids or args.max_questions):
|
||||||
parser.error('Frozen holdout evaluation must cover the complete selected split.')
|
parser.error('Frozen holdout evaluation must cover the complete selected split.')
|
||||||
|
if args.split in {'test', 'all'} and args.overwrite:
|
||||||
|
parser.error('Use a fresh output directory to reproduce a frozen holdout.')
|
||||||
|
|
||||||
if args.limit < 1:
|
if args.limit < 1:
|
||||||
parser.error(
|
parser.error(
|
||||||
@ -171,6 +175,11 @@ def save_csv(
|
|||||||
|
|
||||||
fieldnames = [
|
fieldnames = [
|
||||||
"complete",
|
"complete",
|
||||||
|
"answerability_ok",
|
||||||
|
"bindings_ok",
|
||||||
|
"binding_score",
|
||||||
|
"paths_ok",
|
||||||
|
"path_score",
|
||||||
"count_ok",
|
"count_ok",
|
||||||
"expected_count",
|
"expected_count",
|
||||||
"actual_count",
|
"actual_count",
|
||||||
@ -200,6 +209,8 @@ def save_csv(
|
|||||||
"actual_source_urls",
|
"actual_source_urls",
|
||||||
"fact_types",
|
"fact_types",
|
||||||
"strategies",
|
"strategies",
|
||||||
|
"binding_results",
|
||||||
|
"path_results",
|
||||||
]
|
]
|
||||||
|
|
||||||
with path.open(
|
with path.open(
|
||||||
@ -210,6 +221,7 @@ def save_csv(
|
|||||||
writer = csv.DictWriter(
|
writer = csv.DictWriter(
|
||||||
file,
|
file,
|
||||||
fieldnames=fieldnames,
|
fieldnames=fieldnames,
|
||||||
|
lineterminator='\n',
|
||||||
)
|
)
|
||||||
|
|
||||||
writer.writeheader()
|
writer.writeheader()
|
||||||
@ -337,13 +349,33 @@ def print_summary(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_output_destination(args: argparse.Namespace) -> None:
|
||||||
|
suffix = args.split
|
||||||
|
if args.ids:
|
||||||
|
suffix += '_selected'
|
||||||
|
elif args.max_questions:
|
||||||
|
suffix += f'_first{args.max_questions}'
|
||||||
|
if not args.overwrite:
|
||||||
|
for extension in ('json', 'csv'):
|
||||||
|
path = args.output_dir / f'graphrag_{suffix}.{extension}'
|
||||||
|
if path.exists():
|
||||||
|
raise RuntimeError(f'Results already exist; use a fresh output directory: {path}')
|
||||||
|
elif (any(part.startswith(('final_', 'archive_')) for part in args.output_dir.parts)
|
||||||
|
or any((args.output_dir / name).exists() for name in ('REPORT.md', 'summary.json', 'freeze.json'))):
|
||||||
|
raise RuntimeError('Archived/final results are immutable; choose a fresh DEV directory.')
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
args = parse_args()
|
args = parse_args()
|
||||||
|
validate_output_destination(args)
|
||||||
metadata = run_metadata(args.questions)
|
metadata = run_metadata(args.questions)
|
||||||
audit = json.loads(args.audit.read_text()) if args.audit else None
|
audit = json.loads(args.audit.read_text()) if args.audit else None
|
||||||
if audit and (audit['dataset_sha256'] != metadata['fingerprints']['dataset_sha256']
|
if audit and (audit['dataset_sha256'] != metadata['fingerprints']['dataset_sha256']
|
||||||
or audit['inputs'] != metadata['fingerprints']['inputs']):
|
or audit['inputs'] != metadata['fingerprints']['inputs']):
|
||||||
raise RuntimeError('Source audit does not match current benchmark and inputs.')
|
raise RuntimeError('Source audit does not match current benchmark and inputs.')
|
||||||
|
if audit and audit.get('source_corpus') is not None and (
|
||||||
|
audit['source_corpus'] != metadata['fingerprints']['source_corpus']):
|
||||||
|
raise RuntimeError('Independent source audit does not match original Markdown.')
|
||||||
|
|
||||||
all_questions = load_questions(
|
all_questions = load_questions(
|
||||||
args.questions
|
args.questions
|
||||||
@ -549,7 +581,7 @@ def main() -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
'evaluation_schema_version': 3,
|
'evaluation_schema_version': 4,
|
||||||
'run_metadata': metadata,
|
'run_metadata': metadata,
|
||||||
"configuration": {
|
"configuration": {
|
||||||
"questions_file": str(
|
"questions_file": str(
|
||||||
|
|||||||
370
tools/graphrag/evaluation/evidence_contract.py
Normal file
370
tools/graphrag/evaluation/evidence_contract.py
Normal file
@ -0,0 +1,370 @@
|
|||||||
|
"""Connected, typed evidence checks shared by GraphRAG evaluation versions.
|
||||||
|
|
||||||
|
Facts are structured records emitted by fixed Cypher queries. They are expanded
|
||||||
|
into the very paths those query contracts establish; query text, resolved aliases
|
||||||
|
and context-only documents never create edges. Ordered paths must have compatible
|
||||||
|
endpoint types. Bindings are satisfied by one connected witness, not a bag of
|
||||||
|
independently occurring values.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import itertools
|
||||||
|
import re
|
||||||
|
import unicodedata
|
||||||
|
from collections import defaultdict
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
RELATION_ENDPOINTS = {
|
||||||
|
'AUTHORED': ('Person', 'Thesis'),
|
||||||
|
'HAS_WORK': ('Person', 'Work'),
|
||||||
|
'HAS_DOCUMENT': ('Person', 'Document'),
|
||||||
|
'EVIDENCED_BY': ('Academic', 'Document'),
|
||||||
|
'HAS_KEYWORD': ('Document', 'Keyword'),
|
||||||
|
'IN_CATEGORY': ('Document', 'Category'),
|
||||||
|
'AUTHORED_DOCUMENT': ('DocumentAuthor', 'Document'),
|
||||||
|
'DESCRIBES': ('Document', 'Topic'),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def canonical(value: Any) -> str:
|
||||||
|
raw = unicodedata.normalize('NFKD', str(value if value is not None else ''))
|
||||||
|
return re.sub(r'\s+', ' ', re.sub(r'[^a-z0-9]+', ' ', ''.join(
|
||||||
|
character for character in raw.casefold() if not unicodedata.combining(character)))).strip()
|
||||||
|
|
||||||
|
|
||||||
|
def kind_matches(actual: str, expected: str) -> bool:
|
||||||
|
return actual in {'Thesis', 'Work'} if expected in {'Academic', 'Thesis|Work'} else actual in expected.split('|')
|
||||||
|
|
||||||
|
|
||||||
|
class EvidenceGraph:
|
||||||
|
def __init__(self, result: dict[str, Any]):
|
||||||
|
self.nodes: dict[tuple[str, str], dict] = {}
|
||||||
|
self.conflicts: set[tuple[str, str]] = set()
|
||||||
|
self.adjacency: dict[tuple[str, str], set[tuple[str, tuple[str, str]]]] = defaultdict(set)
|
||||||
|
for path in result.get('paths', []):
|
||||||
|
if not isinstance(path, dict):
|
||||||
|
continue
|
||||||
|
nodes, relationships = path.get('nodes', []), path.get('relationships', [])
|
||||||
|
if not isinstance(nodes, list) or len(relationships) != max(0, len(nodes) - 1):
|
||||||
|
continue
|
||||||
|
keys = [self.node(row.get('kind', ''), row) for row in nodes if isinstance(row, dict)]
|
||||||
|
if len(keys) != len(nodes):
|
||||||
|
continue
|
||||||
|
for left, relation, right in zip(keys, relationships, keys[1:]):
|
||||||
|
self.edge(left, relation, right)
|
||||||
|
for fact in result.get('facts', []):
|
||||||
|
if isinstance(fact, dict):
|
||||||
|
self.add_fact(fact)
|
||||||
|
|
||||||
|
def node(self, kind: str, properties: dict) -> tuple[str, str]:
|
||||||
|
properties = {key: value for key, value in properties.items() if value is not None}
|
||||||
|
if kind == 'Document':
|
||||||
|
identity = properties.get('path') or properties.get('document_path')
|
||||||
|
else:
|
||||||
|
identity = properties.get('element_id') or properties.get('id')
|
||||||
|
if not identity:
|
||||||
|
if kind in {'Thesis', 'Work'}:
|
||||||
|
identity = repr((properties.get('person'), properties.get('title'),
|
||||||
|
properties.get('year'), properties.get('document_path')))
|
||||||
|
else:
|
||||||
|
identity = canonical(properties.get('name'))
|
||||||
|
key = (kind, str(identity))
|
||||||
|
current = self.nodes.setdefault(key, {'kind': kind})
|
||||||
|
for field in {'name', 'title', 'year', 'start_year', 'thesis_type', 'work_type', 'path', 'source_url'}:
|
||||||
|
if field in current and field in properties and canonical(current[field]) != canonical(properties[field]):
|
||||||
|
self.conflicts.add(key)
|
||||||
|
for field, value in properties.items():
|
||||||
|
current.setdefault(field, value)
|
||||||
|
return key
|
||||||
|
|
||||||
|
def edge(self, left: tuple[str, str], relation: str, right: tuple[str, str]) -> None:
|
||||||
|
expected = RELATION_ENDPOINTS.get(relation)
|
||||||
|
if expected is None:
|
||||||
|
return
|
||||||
|
if kind_matches(left[0], expected[0]) and kind_matches(right[0], expected[1]):
|
||||||
|
pass
|
||||||
|
elif kind_matches(right[0], expected[0]) and kind_matches(left[0], expected[1]):
|
||||||
|
left, right = right, left
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
self.adjacency[left].add((relation, right))
|
||||||
|
self.adjacency[right].add((relation, left))
|
||||||
|
|
||||||
|
def neighbors(self, key: tuple[str, str], relation: str, kind: str) -> list[tuple[str, str]]:
|
||||||
|
return [target for edge, target in self.adjacency.get(key, ())
|
||||||
|
if key not in self.conflicts and target not in self.conflicts
|
||||||
|
and edge in relation.split('|') and kind_matches(target[0], kind)]
|
||||||
|
|
||||||
|
def add_fact(self, fact: dict) -> None:
|
||||||
|
kind = fact.get('fact_type')
|
||||||
|
if kind in {'shared_keyword', 'shared_category', 'shared_document_author'}:
|
||||||
|
singular = {'shared_keyword': 'person_keyword', 'shared_category': 'person_category',
|
||||||
|
'shared_document_author': 'person_document_author'}[kind]
|
||||||
|
for side in ('left', 'right'):
|
||||||
|
self.add_fact({**fact, 'fact_type': singular, 'person': fact.get(side + '_person'),
|
||||||
|
'person_element_id': fact.get(side + '_person_element_id'),
|
||||||
|
'document_path': fact.get(side + '_document_path'),
|
||||||
|
'source_url': fact.get(side + '_source_url')})
|
||||||
|
return
|
||||||
|
if kind not in {'person_thesis', 'person_work', 'person_start_year', 'person_keyword',
|
||||||
|
'person_category', 'person_document_author'} or not fact.get('person'):
|
||||||
|
return
|
||||||
|
person = self.node('Person', {'name': fact['person'], 'element_id': fact.get('person_element_id'),
|
||||||
|
'start_year': fact.get('start_year') if kind == 'person_start_year' else None})
|
||||||
|
path = fact.get('document_path')
|
||||||
|
document = self.node('Document', {'path': path, 'source_url': fact.get('source_url')}) if path else None
|
||||||
|
if kind in {'person_thesis', 'person_work'}:
|
||||||
|
academic_kind = 'Thesis' if kind == 'person_thesis' else 'Work'
|
||||||
|
prefix = 'thesis' if academic_kind == 'Thesis' else 'work'
|
||||||
|
academic = self.node(academic_kind, {
|
||||||
|
'element_id': fact.get(prefix + '_element_id'), 'id': fact.get(prefix + '_id'),
|
||||||
|
'person': fact['person'], 'document_path': path, 'title': fact.get('title'),
|
||||||
|
'year': fact.get('year'), prefix + '_type': fact.get(prefix + '_type')})
|
||||||
|
self.edge(person, 'AUTHORED' if academic_kind == 'Thesis' else 'HAS_WORK', academic)
|
||||||
|
if document:
|
||||||
|
self.edge(academic, 'EVIDENCED_BY', document)
|
||||||
|
elif document:
|
||||||
|
self.edge(person, 'HAS_DOCUMENT', document)
|
||||||
|
if kind == 'person_keyword' and fact.get('keyword'):
|
||||||
|
target = self.node('Keyword', {'name': fact['keyword'], 'id': fact.get('keyword_id'),
|
||||||
|
'element_id': fact.get('keyword_element_id')})
|
||||||
|
self.edge(document, 'HAS_KEYWORD', target)
|
||||||
|
elif kind == 'person_category' and fact.get('category'):
|
||||||
|
target = self.node('Category', {'name': fact['category'],
|
||||||
|
'element_id': fact.get('category_element_id')})
|
||||||
|
self.edge(document, 'IN_CATEGORY', target)
|
||||||
|
elif kind == 'person_document_author' and fact.get('document_author'):
|
||||||
|
target = self.node('DocumentAuthor', {'name': fact['document_author'],
|
||||||
|
'id': fact.get('document_author_id'), 'element_id': fact.get('document_author_element_id')})
|
||||||
|
self.edge(target, 'AUTHORED_DOCUMENT', document)
|
||||||
|
if fact.get('category'):
|
||||||
|
category = self.node('Category', {'name': fact['category'],
|
||||||
|
'element_id': fact.get('category_element_id')})
|
||||||
|
self.edge(document, 'IN_CATEGORY', category)
|
||||||
|
|
||||||
|
def metadata_choices(self, person: tuple[str, str], binding: dict, field: str,
|
||||||
|
relation: str, kind: str) -> list[tuple[Any, Any]]:
|
||||||
|
if field not in binding:
|
||||||
|
return [(None, None)]
|
||||||
|
return [(document, node)
|
||||||
|
for document in self.neighbors(person, 'HAS_DOCUMENT', 'Document')
|
||||||
|
for node in self.neighbors(document, relation, kind)
|
||||||
|
if canonical(self.nodes[node].get('name')) == canonical(binding[field])]
|
||||||
|
|
||||||
|
def witnesses(self, binding: dict, *, require_provenance: bool) -> list[dict]:
|
||||||
|
people = [key for key, row in self.nodes.items() if key[0] == 'Person' and key not in self.conflicts
|
||||||
|
and ('person' not in binding or canonical(row.get('name')) == canonical(binding['person']))]
|
||||||
|
academic_required = any(field in binding for field in ['academic_kind', 'academic_type', 'title', 'year'])
|
||||||
|
witnesses = []
|
||||||
|
for person in people:
|
||||||
|
if 'start_year' in binding and canonical(self.nodes[person].get('start_year')) != canonical(binding['start_year']):
|
||||||
|
continue
|
||||||
|
academics = []
|
||||||
|
if academic_required:
|
||||||
|
for relation, kind in [('AUTHORED', 'Thesis'), ('HAS_WORK', 'Work')]:
|
||||||
|
for academic in self.neighbors(person, relation, kind):
|
||||||
|
row = self.nodes[academic]
|
||||||
|
if 'academic_kind' in binding and not kind_matches(kind, binding['academic_kind']):
|
||||||
|
continue
|
||||||
|
if any(canonical(row.get(field)) != canonical(binding[field])
|
||||||
|
for field in ['title', 'year'] if field in binding):
|
||||||
|
continue
|
||||||
|
type_field = 'thesis_type' if kind == 'Thesis' else 'work_type'
|
||||||
|
if 'academic_type' in binding and canonical(row.get(type_field)) != canonical(binding['academic_type']):
|
||||||
|
continue
|
||||||
|
docs = self.neighbors(academic, 'EVIDENCED_BY', 'Document')
|
||||||
|
academics.extend((academic, doc) for doc in docs)
|
||||||
|
if not docs and not require_provenance:
|
||||||
|
academics.append((academic, None))
|
||||||
|
else:
|
||||||
|
academics = [(None, None)]
|
||||||
|
choices = [self.metadata_choices(person, binding, *arguments) for arguments in [
|
||||||
|
('keyword', 'HAS_KEYWORD', 'Keyword'), ('category', 'IN_CATEGORY', 'Category'),
|
||||||
|
('document_author', 'AUTHORED_DOCUMENT', 'DocumentAuthor')]]
|
||||||
|
person_docs = self.neighbors(person, 'HAS_DOCUMENT', 'Document') if (
|
||||||
|
require_provenance and ('start_year' in binding or not academic_required
|
||||||
|
and not any(field in binding for field in ['keyword', 'category', 'document_author']))
|
||||||
|
) else [None]
|
||||||
|
for (academic, academic_document), keyword, category, author, person_document in itertools.product(academics, *choices, person_docs):
|
||||||
|
docs = [doc for doc in [academic_document, keyword[0], category[0], author[0], person_document] if doc]
|
||||||
|
if binding.get('same_document') and len(set(docs)) > 1:
|
||||||
|
continue
|
||||||
|
if category[0] and author[0] and category[0] != author[0]:
|
||||||
|
continue
|
||||||
|
if 'document_path' in binding and any(
|
||||||
|
self.nodes[doc].get('path') != binding['document_path'] for doc in docs
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
witnesses.append({'person': person, 'academic': academic, 'academic_document': academic_document,
|
||||||
|
'person_document': person_document,
|
||||||
|
'keyword': keyword[1], 'keyword_document': keyword[0],
|
||||||
|
'category': category[1], 'category_document': category[0],
|
||||||
|
'document_author': author[1], 'author_document': author[0]})
|
||||||
|
return witnesses
|
||||||
|
|
||||||
|
def pattern_path(self, witness: dict, pattern: dict) -> list[dict] | None:
|
||||||
|
kinds, relations = pattern.get('node_kinds', []), pattern.get('relationships', [])
|
||||||
|
if not kinds or len(relations) != len(kinds) - 1 or not kind_matches('Person', kinds[0]):
|
||||||
|
return None
|
||||||
|
target_roles = {'Keyword': 'keyword', 'Category': 'category', 'DocumentAuthor': 'document_author',
|
||||||
|
'Thesis': 'academic', 'Work': 'academic', 'Academic': 'academic', 'Thesis|Work': 'academic'}
|
||||||
|
allowed = {key for key in witness.values() if key is not None}
|
||||||
|
required_target = witness.get(target_roles.get(kinds[-1], ''))
|
||||||
|
|
||||||
|
def visit(key, index, path):
|
||||||
|
if index == len(relations):
|
||||||
|
return path if required_target is None or key == required_target else None
|
||||||
|
for next_key in self.neighbors(key, relations[index], kinds[index + 1]):
|
||||||
|
if next_key not in allowed:
|
||||||
|
continue
|
||||||
|
result = visit(next_key, index + 1, path + [next_key])
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
return None
|
||||||
|
|
||||||
|
found = visit(witness['person'], 0, [witness['person']])
|
||||||
|
return [self.nodes[key] for key in found] if found else None
|
||||||
|
|
||||||
|
|
||||||
|
def implicit_patterns(binding: dict, index: int) -> list[dict]:
|
||||||
|
patterns = []
|
||||||
|
if 'start_year' in binding or not any(field in binding for field in [
|
||||||
|
'academic_kind', 'academic_type', 'title', 'year', 'keyword', 'category', 'document_author'
|
||||||
|
]):
|
||||||
|
patterns.append({'binding_index': index, 'node_kinds': ['Person', 'Document'],
|
||||||
|
'relationships': ['HAS_DOCUMENT']})
|
||||||
|
if any(field in binding for field in ['academic_kind', 'academic_type', 'title', 'year']):
|
||||||
|
kind = binding.get('academic_kind', 'Academic')
|
||||||
|
relationships = ['AUTHORED'] if kind == 'Thesis' else ['HAS_WORK'] if kind == 'Work' else ['AUTHORED|HAS_WORK']
|
||||||
|
patterns.append({'binding_index': index, 'node_kinds': ['Person', kind, 'Document'],
|
||||||
|
'relationships': relationships + ['EVIDENCED_BY']})
|
||||||
|
for field, kind, relation in [('keyword', 'Keyword', 'HAS_KEYWORD'),
|
||||||
|
('category', 'Category', 'IN_CATEGORY'),
|
||||||
|
('document_author', 'DocumentAuthor', 'AUTHORED_DOCUMENT')]:
|
||||||
|
if field in binding:
|
||||||
|
patterns.append({'binding_index': index, 'node_kinds': ['Person', 'Document', kind],
|
||||||
|
'relationships': ['HAS_DOCUMENT', relation]})
|
||||||
|
return patterns
|
||||||
|
|
||||||
|
|
||||||
|
def legacy_bindings(question: dict) -> list[dict]:
|
||||||
|
"""Best-effort semantic conversion of schema2 annotations, never result data."""
|
||||||
|
graph = question.get('graph', {})
|
||||||
|
entities = defaultdict(list)
|
||||||
|
for row in graph.get('expected_entities', []):
|
||||||
|
entities[row.get('type')].append(row.get('value'))
|
||||||
|
people = entities['person'] or [row['value'] for row in graph.get('start_entities', []) if row['type'] == 'person']
|
||||||
|
people = people or [None]
|
||||||
|
years = entities['year']
|
||||||
|
properties = graph.get('expected_properties', [])
|
||||||
|
start_year = any(prop == 'Person.start_year' for prop in properties)
|
||||||
|
if not years and any('.year' in prop for prop in properties) and not start_year:
|
||||||
|
years = re.findall(r'\b20\d{2}\b', question.get('question', ''))
|
||||||
|
bindings = []
|
||||||
|
for person in people:
|
||||||
|
common = {'person': person} if person else {}
|
||||||
|
if len(years) == 1:
|
||||||
|
common['start_year' if start_year else 'year'] = years[0]
|
||||||
|
for field, entity_type in [('keyword', 'keyword'), ('category', 'category'), ('document_author', 'document_author')]:
|
||||||
|
if len(entities[entity_type]) == 1:
|
||||||
|
common[field] = entities[entity_type][0]
|
||||||
|
titles = [('Thesis', value) for value in entities['thesis_title']] + [('Work', value) for value in entities['work_title']]
|
||||||
|
if titles:
|
||||||
|
bindings.extend({**common, 'academic_kind': kind, 'title': title} for kind, title in titles)
|
||||||
|
elif len(entities['category']) > 1:
|
||||||
|
bindings.extend({**common, 'category': value} for value in entities['category'])
|
||||||
|
elif any(key != 'person' for key in common):
|
||||||
|
bindings.append(common)
|
||||||
|
return bindings
|
||||||
|
|
||||||
|
|
||||||
|
def positive_answer_facts(result: dict) -> list[dict]:
|
||||||
|
facts = []
|
||||||
|
for row in result.get('facts', []):
|
||||||
|
if not isinstance(row, dict):
|
||||||
|
facts.append(row)
|
||||||
|
continue
|
||||||
|
kind = row.get('fact_type', '')
|
||||||
|
if kind == 'academic_year_comparison' and row.get('same_academic_year') is False and not row.get('shared_years'):
|
||||||
|
continue
|
||||||
|
if kind == 'start_year_comparison' and row.get('same_start_year') is False and row.get('shared_start_year') is None:
|
||||||
|
continue
|
||||||
|
facts.append(row)
|
||||||
|
return facts
|
||||||
|
|
||||||
|
|
||||||
|
def evaluate_contract(question: dict, result: dict) -> dict:
|
||||||
|
graph = question.get('graph', {})
|
||||||
|
schema = graph.get('schema_version', 2)
|
||||||
|
negative = bool(graph.get('expected_no_answer') or question.get('should_answer') is False)
|
||||||
|
expected_status = graph.get('expected_status')
|
||||||
|
if negative:
|
||||||
|
status = result.get('status')
|
||||||
|
no_positive = not positive_answer_facts(result) and not result.get('paths')
|
||||||
|
aggregation = result.get('aggregation') or {}
|
||||||
|
if schema >= 3 and expected_status is None:
|
||||||
|
expected_status = 'no_answer'
|
||||||
|
status_ok = status == expected_status if expected_status else status in {'no_answer', 'ambiguous'}
|
||||||
|
reason = result.get('reason')
|
||||||
|
ok = bool(status_ok and isinstance(reason, str) and reason.strip()
|
||||||
|
and no_positive and not aggregation.get('count'))
|
||||||
|
return {'answerability_ok': ok, 'bindings_ok': True, 'binding_score': 1.0,
|
||||||
|
'paths_ok': True, 'path_score': 1.0, 'binding_results': [], 'path_results': [],
|
||||||
|
'expected_no_answer': True, 'actual_status': status}
|
||||||
|
status_ok = (result.get('status') == 'ok' if schema >= 3
|
||||||
|
else result.get('status') not in {'no_answer', 'ambiguous', 'error'})
|
||||||
|
bindings = graph.get('expected_bindings')
|
||||||
|
if bindings is None:
|
||||||
|
bindings = legacy_bindings(question)
|
||||||
|
empty_count_answer = (graph.get('expected_count') == 0 and graph.get('expected_entity_set') == []
|
||||||
|
and (result.get('aggregation') or {}).get('count') == 0
|
||||||
|
and (result.get('aggregation') or {}).get('complete') is True)
|
||||||
|
if schema >= 3 and not bindings and not empty_count_answer:
|
||||||
|
status_ok = False
|
||||||
|
evidence = EvidenceGraph(result)
|
||||||
|
explicit_patterns = graph.get('expected_path_patterns', [])
|
||||||
|
source_choices = graph.get('expected_evidence_documents', [])
|
||||||
|
binding_results, path_results = [], []
|
||||||
|
for index, binding in enumerate(bindings):
|
||||||
|
candidates = evidence.witnesses(binding, require_provenance=schema >= 3)
|
||||||
|
patterns = [p for p in explicit_patterns if p.get('binding_index') == index]
|
||||||
|
if not patterns and schema >= 3:
|
||||||
|
patterns = implicit_patterns(binding, index)
|
||||||
|
winner = None
|
||||||
|
for candidate in candidates:
|
||||||
|
checks = [evidence.pattern_path(candidate, pattern) for pattern in patterns]
|
||||||
|
source_ok = True
|
||||||
|
for choice in source_choices:
|
||||||
|
if choice.get('binding_index') != index:
|
||||||
|
continue
|
||||||
|
document = evidence.nodes.get(candidate.get(choice.get('role')), {})
|
||||||
|
if not any(document.get('path') == option.get('document_path')
|
||||||
|
and document.get('source_url') == option.get('source_url')
|
||||||
|
for option in choice.get('any_of', [])):
|
||||||
|
source_ok = False
|
||||||
|
break
|
||||||
|
if source_ok and all(check is not None for check in checks):
|
||||||
|
winner = checks
|
||||||
|
break
|
||||||
|
binding_results.append({'binding': binding, 'matched': bool(candidates) and winner is not None})
|
||||||
|
for pattern_index, pattern in enumerate(patterns):
|
||||||
|
path_results.append({'pattern': pattern, 'matched': winner is not None,
|
||||||
|
'witness': winner[pattern_index] if winner is not None else []})
|
||||||
|
bindings_ok = all(row['matched'] for row in binding_results)
|
||||||
|
paths_ok = all(row['matched'] for row in path_results)
|
||||||
|
# A malformed pattern referencing a nonexistent binding must not vanish.
|
||||||
|
if any(not isinstance(p.get('binding_index'), int) or p['binding_index'] not in range(len(bindings))
|
||||||
|
for p in explicit_patterns):
|
||||||
|
paths_ok = False
|
||||||
|
if any(not isinstance(p.get('binding_index'), int) or p['binding_index'] not in range(len(bindings))
|
||||||
|
or p.get('role') not in {'academic_document', 'keyword_document', 'category_document',
|
||||||
|
'author_document', 'person_document'} or not p.get('any_of')
|
||||||
|
for p in source_choices):
|
||||||
|
bindings_ok = False
|
||||||
|
return {'answerability_ok': status_ok, 'bindings_ok': bindings_ok,
|
||||||
|
'binding_score': sum(row['matched'] for row in binding_results) / len(binding_results) if binding_results else 1.0,
|
||||||
|
'paths_ok': paths_ok,
|
||||||
|
'path_score': sum(row['matched'] for row in path_results) / len(path_results) if path_results else float(paths_ok),
|
||||||
|
'binding_results': binding_results, 'path_results': path_results,
|
||||||
|
'expected_no_answer': False, 'actual_status': result.get('status', 'ok')}
|
||||||
@ -22,26 +22,47 @@ def make_freeze(dev: dict, questions: list[dict], fingerprints: dict, audit: dic
|
|||||||
raise RuntimeError('Source audit does not match the benchmark and inputs.')
|
raise RuntimeError('Source audit does not match the benchmark and inputs.')
|
||||||
if len(audit['questions']) != len(questions) or {r['id'] for r in audit['questions']} != {q['id'] for q in questions}:
|
if len(audit['questions']) != len(questions) or {r['id'] for r in audit['questions']} != {q['id'] for q in questions}:
|
||||||
raise RuntimeError('Source audit must cover every question exactly once.')
|
raise RuntimeError('Source audit must cover every question exactly once.')
|
||||||
return {'schema_version': 1, 'frozen_at_utc': datetime.now(timezone.utc).isoformat(),
|
schema3 = any(question.get('graph', {}).get('schema_version') == 3 for question in questions)
|
||||||
|
partition = None
|
||||||
|
if schema3:
|
||||||
|
if audit.get('source_corpus') != fingerprints.get('source_corpus'):
|
||||||
|
raise RuntimeError('Independent audit does not match original Markdown sources.')
|
||||||
|
if any(not row.get('source_consistent') for row in audit['questions']):
|
||||||
|
raise RuntimeError('Resolve source-inconsistent annotations before freezing v2.')
|
||||||
|
profiles = {split: {profile for question in questions if question['split'] == split
|
||||||
|
for profile in question.get('graph', {}).get('source_profiles', [])}
|
||||||
|
for split in ('dev', 'test')}
|
||||||
|
if profiles['dev'] & profiles['test']:
|
||||||
|
raise RuntimeError('DEV/TEST source profiles overlap; independent holdout refused.')
|
||||||
|
if not profiles['dev'] or not profiles['test']:
|
||||||
|
raise RuntimeError('Primary v2 freeze requires declared DEV and TEST source profiles.')
|
||||||
|
partition = {'method': 'disjoint source profiles',
|
||||||
|
'dev_profile_count': len(profiles['dev']),
|
||||||
|
'test_profile_count': len(profiles['test']), 'overlap': 0}
|
||||||
|
return {'schema_version': 2 if schema3 else 1,
|
||||||
|
'partition': partition, 'frozen_at_utc': datetime.now(timezone.utc).isoformat(),
|
||||||
'fingerprints': fingerprints, 'graph': dev['run_metadata']['graph'],
|
'fingerprints': fingerprints, 'graph': dev['run_metadata']['graph'],
|
||||||
'parameters': {key: dev['configuration'][key] for key in ['limit', 'max_entities']},
|
'parameters': {key: dev['configuration'][key] for key in ['limit', 'max_entities']},
|
||||||
'dev_summary': dev['summary'], 'source_audit_summary': audit['by_split'],
|
'dev_summary': dev['summary'], 'source_audit_summary': audit['by_split'],
|
||||||
'policy': 'Report all questions. Source-consistent subset is supplementary. No holdout tuning.'}
|
'policy': 'Report all questions including negatives. No exclusions or holdout tuning.'}
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
parser = argparse.ArgumentParser(description=__doc__)
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
parser.add_argument('--dev-results', type=Path, required=True)
|
parser.add_argument('--dev-results', type=Path, required=True)
|
||||||
parser.add_argument('--questions', type=Path, default=Path(__file__).parent / 'graphrag_questions.json')
|
parser.add_argument('--questions', type=Path, default=Path(__file__).parent / 'graphrag_questions_v2.json')
|
||||||
parser.add_argument('--audit', type=Path, required=True)
|
parser.add_argument('--audit', type=Path, required=True)
|
||||||
parser.add_argument('--output', type=Path, required=True)
|
parser.add_argument('--output', type=Path, required=True)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
if args.output.exists():
|
||||||
|
parser.error('Freeze manifest already exists; choose a new version/output path.')
|
||||||
manifest = make_freeze(json.loads(args.dev_results.read_text()), json.loads(args.questions.read_text()),
|
manifest = make_freeze(json.loads(args.dev_results.read_text()), json.loads(args.questions.read_text()),
|
||||||
content_fingerprints(args.questions), json.loads(args.audit.read_text()))
|
content_fingerprints(args.questions), json.loads(args.audit.read_text()))
|
||||||
manifest.update({'dev_results_sha256': sha256_file(args.dev_results),
|
manifest.update({'dev_results_sha256': sha256_file(args.dev_results),
|
||||||
'audit_sha256': sha256_file(args.audit)})
|
'audit_sha256': sha256_file(args.audit)})
|
||||||
args.output.parent.mkdir(parents=True, exist_ok=True)
|
args.output.parent.mkdir(parents=True, exist_ok=True)
|
||||||
args.output.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + '\n')
|
with args.output.open('x', encoding='utf-8') as output:
|
||||||
|
output.write(json.dumps(manifest, ensure_ascii=False, indent=2) + '\n')
|
||||||
print(f'Frozen GraphRAG: {args.output}')
|
print(f'Frozen GraphRAG: {args.output}')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
211
tools/graphrag/evaluation/frozen_v2.json
Normal file
211
tools/graphrag/evaluation/frozen_v2.json
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
{
|
||||||
|
"schema_version": 2,
|
||||||
|
"partition": {
|
||||||
|
"method": "disjoint source profiles",
|
||||||
|
"dev_profile_count": 45,
|
||||||
|
"test_profile_count": 24,
|
||||||
|
"overlap": 0
|
||||||
|
},
|
||||||
|
"frozen_at_utc": "2026-10-25T01:03:09.186759+00:00",
|
||||||
|
"fingerprints": {
|
||||||
|
"implementation": {
|
||||||
|
"tools/graphrag/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||||
|
"tools/graphrag/build_graphrag.py": "81f6e9f5c9e71b588f8bed1968c1e900e29e484ba81d23b6a3a68e7220ad75a5",
|
||||||
|
"tools/graphrag/evaluation/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||||
|
"tools/graphrag/evaluation/audit_benchmark.py": "6619c818a52fc284e87ed6c48a503a54a3c9dd95447463ed78f075b7c58bad80",
|
||||||
|
"tools/graphrag/evaluation/benchmark_v2.py": "3e66d8e20d049758ac6df393355c0b5038f09c6ba97c96acc2087d61cfb4ad26",
|
||||||
|
"tools/graphrag/evaluation/evaluate_graphrag.py": "f9ef7e2fc681033cf1cb164581589f6f01acecf3d28e0cbfaba5c9ba72f24b23",
|
||||||
|
"tools/graphrag/evaluation/evidence_contract.py": "78e24264c176e163e1782fef1634b6c45c7f31bd4692726d02a30ab45a06648e",
|
||||||
|
"tools/graphrag/evaluation/freeze_graphrag.py": "0c330358beae2c5409e2dcd26be718c6b9534d5db9f2340f0390fe3be45cb60c",
|
||||||
|
"tools/graphrag/evaluation/graphrag_evaluator.py": "3afe014e126b6ad90c8e408284d2c1979f54d6cf5dd19fd67f9249708fbed2d3",
|
||||||
|
"tools/graphrag/evaluation/reproducibility.py": "b707d4c410cbf7d6769a6afdadfe79ef3bbd699a0323f0e0d2ab180ef7498680",
|
||||||
|
"tools/graphrag/evaluation/source_oracle.py": "02a44584bf4fa0e8e9faa7e13b85873a1b00671e0abe556abec8a274621d666c",
|
||||||
|
"tools/graphrag/graph_db.py": "a6fce68000065d328139829c5ca894623f6ed5828c74a869663366c2ad7b5ea2",
|
||||||
|
"tools/graphrag/graph_search.py": "d08eaaa8c395e993cf6416f90226b16ea1fcefca4719304be4b64c61a174b98b",
|
||||||
|
"tools/graphrag/graphrag.py": "71a13cb5aeef0e1b8247840d76f845af46b9c58b6bd9ba1b9ef210b468ad6805",
|
||||||
|
"tools/graphrag/neo4j_smoke.py": "fb5244c72c29ef2acf96d1e7f54335ff168eed4119db1692025eb1b99194b7bb",
|
||||||
|
"tools/graphrag/tests/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||||
|
"tools/graphrag/tests/test_evaluation_pipeline_v2.py": "63d1b3e80ae3c7b563374fd7ab4aa5ffad3c614eafbd15142c577abd7f756bf9",
|
||||||
|
"tools/graphrag/tests/test_evaluator_connected_v2.py": "29d7c9838ed1ff37ea3276df6feb1b6142158c43a0525712f490b648181882de",
|
||||||
|
"tools/graphrag/tests/test_graph_search.py": "d5c95b5de2a0962857331929522764aa46a1222e550a3eb1aaca2148f9d58748",
|
||||||
|
"tools/graphrag/tests/test_graph_search_entity_v2.py": "639d9ac307589de6788ef8145a4e7f73d97a1531445294424e0fc8ba83f99a1c",
|
||||||
|
"tools/graphrag/tests/test_graph_search_neo4j.py": "fec2bf72de8f752f17c9164fee5754bdb2e153828855e47efbf0000dbe82cf3b",
|
||||||
|
"tools/graphrag/tests/test_graph_search_regressions.py": "9db7779aeb8ed9e8c0f92c1657011a81080aff3c928649e811358e3009a18c48",
|
||||||
|
"tools/graphrag/tests/test_graphrag.py": "6379335110f05668beca87ca7e486442071b2f666dbd651408d5f3a8d5723f0e",
|
||||||
|
"tools/graphrag/tests/test_graphrag_evaluator.py": "1c6d08aeec9ae56ac4123239a5aed12a0081d66cc3f34b2047d95764579d7298",
|
||||||
|
"tools/graphrag/tests/test_graphrag_freeze.py": "c4b760baf4c7ebf13b16bd4cd3c51874f5512eef3b4c61470dc4d428b0303d9f",
|
||||||
|
"tools/graphrag/tests/test_graphrag_research_v2.py": "19ebf4a6fd622aaebc8f8b7e17c2aeda83ba17e7f04f155ee70817fa3c14fe03",
|
||||||
|
"tools/graphrag/tests/test_graphrag_root_title.py": "085651fe6e6081521a5dde9554abfee93456250108cf15978df25378d886a46c",
|
||||||
|
"tools/graphrag/tests/test_source_oracle_v2.py": "eea11c98f477764fd0826b0c26396d3617a21ffec76ef15809e74ed27e53ff3b",
|
||||||
|
"requirements.txt": "26a6d097727eba03c1b6c71cd02b06373ef01ce03e567dd2bc4357ae330e5a1a"
|
||||||
|
},
|
||||||
|
"dataset_sha256": "fd9835adee93cacf2c45806dfe93463c2e9a58ccedb5f073876ad176039ad734",
|
||||||
|
"inputs": {
|
||||||
|
"data/documents.json": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
|
||||||
|
"data/chunks.json": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9"
|
||||||
|
},
|
||||||
|
"source_corpus": {
|
||||||
|
"sha256": "440da12a7a991824e923f70cada7c616c3fb3b0f12767ec7d75039a6a3231b10",
|
||||||
|
"document_count": 114,
|
||||||
|
"documents": {
|
||||||
|
"pages/interns/bogdan_paul_chis/README.md": "3b4b946eb3c10e9f9a4092e6cffa01c5080e7579aded2f6ed3120c41ed62b647",
|
||||||
|
"pages/interns/cesar_gutierrez/README.md": "b0be60576eed28d4b1920e9acf198684519373dfc13171567247c853b3ed699e",
|
||||||
|
"pages/interns/oliver_pejic/README.md": "0470f3c8465be8f02204b08e4c75ef47f68c7e4ad1038faa5641cdf1811f33d5",
|
||||||
|
"pages/interns/sevval_bulburu/README.md": "ff2a9d66253802f1af0fdfd74832e40fae41b6df23c5e61dc266f6cd0cc16c4d",
|
||||||
|
"pages/interns/yussef_ressaissi/README.md": "f997a65699da0db3222ef7a3c37652d05dfc3419ad4ec74683bafc2c897bb987",
|
||||||
|
"pages/students/2016/darius_lindvai/README.md": "fcaa47bb9708a6439eec5c4b7f7b4ed6c7359e423e1d940e1aed9f44957e6d62",
|
||||||
|
"pages/students/2016/darius_lindvai/dp2021/README.md": "be3d0fea2a6d592b225eecabd9b19445c2fce62b8289c07ab6af93835db12970",
|
||||||
|
"pages/students/2016/darius_lindvai/timovy_projekt/resers/README.md": "352162de1b1e192228fa5d26506c028ac47e567e90df53b1bbaa6ad736ec4766",
|
||||||
|
"pages/students/2016/darius_lindvai/timovy_projekt/tutorial/README.md": "b4a81ff457624b089d618e4479afb1e3d748f6724f72104ef5518e535ae02fe5",
|
||||||
|
"pages/students/2016/dominik_nagy/README.md": "1c4037a158d84c45fa705a0c38e47142a9d46e226f0c138bc2d56d7c38f6d74d",
|
||||||
|
"pages/students/2016/dominik_nagy/timovy_projekt/README.md": "b81a4dab7316f7b846dcf36515f6aa9d44035c86f46f0e07b7a43308bcd31458",
|
||||||
|
"pages/students/2016/ediz_morochovic/README.md": "045e5eb9a3df2b84140808fbca0c3163266ad0efa144bc42d9d5c597881c6ac6",
|
||||||
|
"pages/students/2016/jakub_maruniak/README.md": "6734c41a95b9d0c1e3d226b393ad109ee4a7b82ebfffa73df2d7e0a743fefa14",
|
||||||
|
"pages/students/2016/jakub_maruniak/dp2021/README.md": "9cd884aec70705cdb2aaa0f514b513f16de263c37b749ced7f92916cd2f91c39",
|
||||||
|
"pages/students/2016/jakub_maruniak/dp2021/annotation/README.md": "debae0c50aea1accef0840912b9b1f37b2138f856002bb50e91d7ea2dbbe7963",
|
||||||
|
"pages/students/2016/jakub_maruniak/dp2021/train_experiments/README.md": "01dff38b37043414fa1db204394ddbe7aade00e14d02d495572b65c85d09b194",
|
||||||
|
"pages/students/2016/jakub_maruniak/timovy_projekt/README.md": "04114b1f3d84664aad5bdba5a0b614c5a6f23392be3c31fd9123d63db1be0a35",
|
||||||
|
"pages/students/2016/jan_holp/README.md": "80d6a8492766e5bfa61673a372e5f059d30c8e335de39842866c51485960e4d3",
|
||||||
|
"pages/students/2016/jan_holp/dp2021/README.md": "a62acb74009376766c7e2f9856ee01d21f84593eb9b3ce85cf2e6032aa412476",
|
||||||
|
"pages/students/2016/jan_holp/dp2021/zdrojove_subory/README.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||||
|
"pages/students/2016/jan_holp/timovy_projekt/README.md": "79eebdfd3af7e8d5c279077e285a580731b1cf8cc9b4454f6596796e9915f70c",
|
||||||
|
"pages/students/2016/lukas_pokryvka/README.md": "f279456c5c277ff1ee0dd89a3464ed9f9f67b44bc185a5da9811ef5cfb675002",
|
||||||
|
"pages/students/2016/lukas_pokryvka/dp2021/README.md": "39b61376ce108e4a930f926ab2d6a997207457121bccfcf617129a3b210a15cf",
|
||||||
|
"pages/students/2016/lukas_pokryvka/timovy_projekt/README.md": "4de4b6c8cfed17b6c60090f82df1d55a66be70a79d3013850689b2baebdd801b",
|
||||||
|
"pages/students/2016/mark_feher/README.md": "bec37c0319fe0869a0377d771db23d090dbda93c27328f5697cdaeb3bbccfe9b",
|
||||||
|
"pages/students/2016/maros_harahus/README.md": "0da150e91918632c9e8cd1443f04da403595a372517e254928ce9f76c9d5033d",
|
||||||
|
"pages/students/2016/maros_harahus/timovy_projekt/README.md": "75af19f7c68f4b646fa1dbae75f3f3dfc52633a9f9da1400d21808bb20be0d83",
|
||||||
|
"pages/students/2016/patrik_pavlisin/README.md": "dc1c648d7cd9b0f0e021c57f9b98189e37c100871439e7e304390715913f2763",
|
||||||
|
"pages/students/2016/patrik_pavlisin/dp21/README.md": "ac1eb0fd0360ad34aa21b7c8da5bb010a6edf10be5721f28dedc3986cd1d8c54",
|
||||||
|
"pages/students/2016/patrik_pavlisin/dp22/README.md": "f2a8c619a812b99abab618ae388eb672407950e1f33fb8d7da7a528c4de81d50",
|
||||||
|
"pages/students/2016/patrik_pavlisin/tp20/README.md": "ae9c771f27e7e093bc29c6888c8d0b27ed61fb41519fd0d7e7f4f6cbb4626edc",
|
||||||
|
"pages/students/2016/tomas_kucharik/README.md": "6a1a215433eb1857660177b4cb2ecec03c6a86743d3a04cd6d5c9d9682c9e63b",
|
||||||
|
"pages/students/2017/dmytro_ushatenko/README.md": "65f4ac177d492162b08ca5da3d9eb048bd088a3c117a28a662113b7e4bc3a4ec",
|
||||||
|
"pages/students/2017/martin_jancura/README.md": "6a0a18d5095dcfb12abfdd72c9cfd8025d714fb5e29a7858cd2b285e4cb986b9",
|
||||||
|
"pages/students/2017/stanislav_matsunych/README.md": "90ffa11eff4a4360b0252dbc53a116c3a5777b3d5dd86ce5c89c02bdd2051c73",
|
||||||
|
"pages/students/2017/than_trung_thanh/README.md": "2150519b8580e7337520db4de64d2d1c82d2634380537d019f41c506dbf2979d",
|
||||||
|
"pages/students/2018/NaN1name_buday/README.md": "23c8c58090bdc954347e36f141bea91f43c8d5b1d777e346864a2ebe84c0bcce",
|
||||||
|
"pages/students/2018/adrian_remias/README.md": "e5bfe1d5d4e626beaa636a02d34ec58cf2cff9b0e57833905af35b80bf1465a2",
|
||||||
|
"pages/students/2018/david_ilas/README.md": "96c45ff9c5a821ddcb1a2fc86d487bd8f4729d1b76887914b0f5fbf99af45af0",
|
||||||
|
"pages/students/2018/david_omasta/README.md": "4164051870e1e1cf8949ed18a74196e9ea789dfbe4fee24bdeb736ca42848327",
|
||||||
|
"pages/students/2018/martin_wencel/README.md": "0e6a7a981689f22304f8baa5de97d4315c0695c94c9277de7851943eb012253b",
|
||||||
|
"pages/students/2018/oleh_bilykh/README.md": "4072c62dd8ee753a0c8fa43fdfbbdf566e394c2df13e6a79d08a302e332710b1",
|
||||||
|
"pages/students/2018/ondrej_megela/README.md": "969ff2e1a436b8f957e7168cf5eb678196b99aeda17701c502b016441f644065",
|
||||||
|
"pages/students/2018/samuel_sirotnik/README.md": "cc230ede67b6e8632511c92a5ed6d1e9deb42e70819280222bdfd369ee77fc70",
|
||||||
|
"pages/students/2019/alina_vitko/README.md": "9b071fe2aff470c275ae027be236fe836f741f774cabb9cbbb55304a8d5102cd",
|
||||||
|
"pages/students/2019/artem_yatsenko/README.md": "328b101e46c51c959e792cf7ca226942f81d2ab8fe9648ad6d0ecd07016429e2",
|
||||||
|
"pages/students/2019/david_stromp/README.md": "e46ca8691d5ec894128f6f6f2ed33e2c7bd141f80719bb0449b20f10f30cca09",
|
||||||
|
"pages/students/2019/dmytro_mural/README.md": "e881a47d847c3ef8d680844113fdbfbb87553b28982bf9eef4936f6d30923e93",
|
||||||
|
"pages/students/2019/filip_tomas/README.md": "75a1fe7b921e4bff0fdf9e2a957b4adad4b4a57aa7ebdffbb73dd82c02123f94",
|
||||||
|
"pages/students/2019/kristian_sopkovic/README.md": "3286960fb30f584df35455f9b6dfae81ca4827a1d711d2bcd6e48c3f150c9279",
|
||||||
|
"pages/students/2019/michal_stromko/README.md": "3ae1dd9b6638a6a249a94be3f3846286555666aefa225bb3a2c7288b35900ce7",
|
||||||
|
"pages/students/2019/michal_stromko/vp2021/README.md": "feb2e093fdd6461239e79b1e1f96e65a1c8cd96e8a2b70535ae556a9c198046a",
|
||||||
|
"pages/students/2019/michal_stromko/vp2021/tutorials/README.md": "40e3fa448c7329ef863e705435e23fe6b4788de440710f066fe0eed92d132bad",
|
||||||
|
"pages/students/2019/michal_stromko/vp2021/tutorials/img/README.md": "e8d3ac160b17dfdee2c3e996bf6a03af7a6f16f9140bf5cf7ee343a82dd1865f",
|
||||||
|
"pages/students/2019/patrik_pokrivcak/README.md": "3e3957ad0f7aca59d6eb64c38a3f5e21d8fd953200825d0d0e5cacabfbc35a7d",
|
||||||
|
"pages/students/2019/samuel_horani/README.md": "86e6959ccc612b069687b57996fa3f61660075d6a0d65bfec64f423d39a0a999",
|
||||||
|
"pages/students/2020/david_kostilnik/README.md": "2927524b75da59a64120fc364a0fc374986fa4d364d54e52c36800762c203264",
|
||||||
|
"pages/students/2020/jakub_kristian_lukas/README.md": "f139d9b1ebf5a3f45612f3df5703ecdd935b90701763c27c7c529044c0b0455a",
|
||||||
|
"pages/students/2020/kamil_tomcufcik/README.md": "9d865adf538bc6d7992ee4f4882713447da5c936fca17c43ca0f576072537048",
|
||||||
|
"pages/students/2020/matej_kobylan/README.md": "3d7b289e17b8f25678a07e9ee0e6741688485a0ccb1e50940a6a6acc6312a547",
|
||||||
|
"pages/students/2020/matus_suchanic/README.md": "770ca49538cca22df35f8e7ba736ee97483e4fe5788c221496553592b4e78dc6",
|
||||||
|
"pages/students/2020/pavol_hudak/README.md": "33d06fccc6451e5f19b27b0cad001a34e81635b4ea294a01dec7771c823abc40",
|
||||||
|
"pages/students/2020/vladyslav_krupko/README.md": "4c28e6d38651bb2cafcbf4a18e35210cd369aef2caff6c5b0aa52fac38f0fe7d",
|
||||||
|
"pages/students/2021/artur_hyrenko/README.md": "0568261f4ade4de5472edcfeb1ffed9abae18dc67e4050f4ce2ad088839a2bb3",
|
||||||
|
"pages/students/2021/eduard_matovka/README.md": "de2a7ae38ec87110e347956b37d0605a298ed2847f972961cc9b977da8221d43",
|
||||||
|
"pages/students/2021/manohar_gowdru_shridharu/README.md": "c00ceb620ed7087ead5d9448d476bbb98d273d1d9e7bf1bc4355c367b26c7a6b",
|
||||||
|
"pages/students/2021/martin_sarissky/README.md": "8e97b45a253745faa55f63c844e0b5dfe680aeaf6eb01fb8f9d06ac6e8ee8bcf",
|
||||||
|
"pages/students/2021/matej_novotny/README.md": "b083a7cadde532e3428dc9a57bc61456fcc5905bda91e011b96033d42bf5d9cb",
|
||||||
|
"pages/students/2021/matej_scislak/README.md": "b9a32cce8605e044a4f2828ff2d91a2995a62ef3a841e62f0a225c97221f0cc8",
|
||||||
|
"pages/students/2021/nikita_bodnar/README.md": "2016c0dd923c0f8e561d5cea42ac81da3610fdcc54a4527f56d078e34e53ce90",
|
||||||
|
"pages/students/2021/oleksandr_hryshchenko/README.md": "4b073992b715b6c75b79fd2c8f850a69f940966e3a61a82c625c32c945a93036",
|
||||||
|
"pages/students/2021/vladimir_ferko/README.md": "68e7d311896eda2171e5eec1ec3a8da90d326ed91acaace8058f68664a50d271",
|
||||||
|
"pages/students/2022/andrii_pervashov/README.md": "319dcaa1cc2e29dd7e3a710bab26cb3ac6944ab71b0b97e1de076b1199122334",
|
||||||
|
"pages/students/2022/daniil_huzenko/README.md": "390782fbff6220a9462060ce1a62959f2a2b88f42d06e2c51d1f406b75d73f2c",
|
||||||
|
"pages/students/2022/jakub_schwarc/README.md": "f541a8852c2b0f6f9d7182e01a34c4e3beee9bfa55427a06b331638b11eb8be6",
|
||||||
|
"pages/students/2022/jan_malinovsky/README.md": "8af021bfb131fa005a7aec3e2f2f12fc17fa5dc14e2675311adbbfc445a4bcab",
|
||||||
|
"pages/students/2022/jan_ptak/README.md": "131cf053764fd5423541ebe672c3b4f5da875cfb8e4b821f1335ddb967282282",
|
||||||
|
"pages/students/2022/oleh_poiasnik/README.md": "c2f7dc3f61f8b4a5b43ded1e3ae4c7d3e7f874439ee6b17dd9c8d45dabc25bc8",
|
||||||
|
"pages/students/2022/samuel_vasil/README.md": "67c807049147aacd04f3050f4ff0233a8b3f0a239ab173b430e13dfe113ad0a5",
|
||||||
|
"pages/students/2022/serhii_yemets/README.md": "ffbeac893947acafe855d576322a8826f9d4f87ac344cb31f8ceeefa244b9133",
|
||||||
|
"pages/students/2022/tetiana_mohorian/README.md": "c9efdc632bf1ca89a0bfde0dc00be7aaac8a85da3d92e2ce8506236c73e93cfb",
|
||||||
|
"pages/students/2022/valerii_kutsenko/README.md": "dc764c609ad3c1df59cfea997d4db82a591b1b1e0764453e319d841115507e4f",
|
||||||
|
"pages/students/2022/vladyslav_yanchenko/README.md": "4d1ce216e3b526ee437ddbc658e51d7bb83530087e43628c096a569a3854a47f",
|
||||||
|
"pages/students/2022/yevhenii_leonov/README.md": "b90e41db0cec2451027020a9102d32a24d777e8a38b604ccca87b36cd6b3a292",
|
||||||
|
"pages/students/2023/denis_le_thanh/README.md": "2cb83f942d86a02712b0c58778e46dc2211346d1a6eba606471dfa832245db61",
|
||||||
|
"pages/students/2023/maksym_zatirka/README.md": "7a7d2cbe276c352dacfbc6ba6de5f15303d30ecf34845ff8da8d085f3d67c3dd",
|
||||||
|
"pages/students/2023/oleksandr_dorybohov/README.md": "c24d6f941de0dafb4459cea8259cf147821cafc86ba65be5b528f419f734bc18",
|
||||||
|
"pages/students/2023/ronald_zalacko/README.md": "724b0f8e6e641236dba9bddbd77f4546e09514076c7dfb151807aaf4b882c96f",
|
||||||
|
"pages/students/2023/rostyslav_rodzhuk/README.md": "de356dd7427c8a0716c165a0f88ae47b691a86ee7a388f60e2d2e9306298415c",
|
||||||
|
"pages/students/2023/samuel_dzurina/README.md": "4818191d044b91219c796a35010c95da5cf2093e050d494f30b219b91e13fa0e",
|
||||||
|
"pages/students/2023/simona_bobrovcanova/README.md": "e473a1911dae10ab40e2cf6696a8be616a58c22aaf09af5953fbac475791a35e",
|
||||||
|
"pages/students/2023/yevhenii_medushivskyi/README.md": "5710ebf91c893a12fe6d19f5372311938d1e7c7bbdf203f2dc8ed2fe7c4f5a24",
|
||||||
|
"pages/topics/akopisat/README.md": "c7245e1fbfa4160618502c0baf8cc6bc47cd9a82b8a85bc1c645314829a7b76a",
|
||||||
|
"pages/topics/bert/README.md": "35e507f7ec2ad1d3526e2a15f94ea085ee25f680a02daf6df62fd429bd9c25c9",
|
||||||
|
"pages/topics/chatbot/README.md": "6f2f83ffb80109be47f9750cca9d3036ec3645abef9f2b590bd6825780c7c48a",
|
||||||
|
"pages/topics/faq/README.md": "15cfbd9c2a1649c80a7a58922e2b66dadab5c86a5ef33ef16c82bebd4d2dbf06",
|
||||||
|
"pages/topics/hatespeech/README.md": "364df94e70dd740c63544e2586ba7b957780f714fc0c941d1b04b02233e6cbc5",
|
||||||
|
"pages/topics/legal/README.md": "003bb9bfe1e0ca21652091c2d11496312eb04e0689fe459e14c2d5a738e8eeea",
|
||||||
|
"pages/topics/morphology/README.md": "e242cc5ff1a4cc98e227566c0ead999bbc95937b7c20be62cb2afb773d0d35c0",
|
||||||
|
"pages/topics/named-entity/README.md": "66b2e25f70211d432d596e377d552b3b8f0c525b14c31e3bc9c956c3aeadca84",
|
||||||
|
"pages/topics/named-entity/navod/README.md": "1ff87079a98411de0414754c60241e08d2214ddcd63ddf974e4340cce2ce5b02",
|
||||||
|
"pages/topics/nlp/README.md": "6f90abf9dc3f0ff33475283c13b4a08561abf631425ec2daacb076155a9e02c2",
|
||||||
|
"pages/topics/otvorene/README.md": "cd5544925553fe3840c0ea6f8ef60ab756e26ab6757bf810025c948d8d4f98fc",
|
||||||
|
"pages/topics/prodigy/README.md": "5e4f691f2754c2ec4afbaab2f41e6db77feb5b322dd9344465eb40c35f116499",
|
||||||
|
"pages/topics/python/README.md": "2ef073adba672142c39e9a59fa2e00a98ab52bda54233d46fbe6940ee23f9fcc",
|
||||||
|
"pages/topics/question/README.md": "408078a2a67cea2699e12359e85ab641136231e6104c2afdf874a705879525df",
|
||||||
|
"pages/topics/question/navod/README.md": "061e737c69184b2bd244316ca7ba841f7186fe01ee80ee993742a733dcad3ecd",
|
||||||
|
"pages/topics/question/nezodpovedatelne/README.md": "b6703d9690f4599b973efb27595ce157773ae0fc0d55cf2c0a09d9f50e8e4c92",
|
||||||
|
"pages/topics/question/validacie/README.md": "3216a7127abdfc6da50ed116f44ff2d6785e7da4af70d23aceda774e745ad562",
|
||||||
|
"pages/topics/resources/README.md": "09405397387f00cbcc5680f7d655f2d861e4d92e5df792a62d9dfd04f3534f48",
|
||||||
|
"pages/topics/seq2seq/README.md": "969d15c03a63a3f8d5edc9017fe5a0fb7311fdf4de4a3473a08266241f92c1e2",
|
||||||
|
"pages/topics/spacy/README.md": "f504e5db77cb8694f08a57fb8636e522d59a0e669216f4bc8273bc3c5f375f87",
|
||||||
|
"pages/topics/steel/README.md": "b4068cef2ed197711467ac47630d5b2064fdc8828f898f7af99664e94d833330",
|
||||||
|
"pages/topics/translation/README.md": "a7d4289e72199b307dc5ad8fc69cda39c1a33c27a6c7447af70aa9c3cc6b8635"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"graph": {
|
||||||
|
"sha256": "a7b95c647eb9a4eff6060f6e7e8be2b74a8246095f3c8c98d4611f4be545f51a",
|
||||||
|
"nodes": 429,
|
||||||
|
"relationships": 843
|
||||||
|
},
|
||||||
|
"parameters": {
|
||||||
|
"limit": 40,
|
||||||
|
"max_entities": 8
|
||||||
|
},
|
||||||
|
"dev_summary": {
|
||||||
|
"questions": 509,
|
||||||
|
"strict_count": 509,
|
||||||
|
"strict_accuracy": 1.0,
|
||||||
|
"error_count": 0,
|
||||||
|
"value_score": 1.0,
|
||||||
|
"entity_score": 1.0,
|
||||||
|
"relation_score": 1.0,
|
||||||
|
"property_score": 1.0,
|
||||||
|
"relation_choice_score": 1.0,
|
||||||
|
"document_recall": 1.0,
|
||||||
|
"source_recall": 1.0,
|
||||||
|
"binding_score": 1.0,
|
||||||
|
"path_score": 1.0,
|
||||||
|
"answerability_accuracy": 1.0,
|
||||||
|
"latency_mean_seconds": 0.042799,
|
||||||
|
"latency_median_seconds": 0.040359,
|
||||||
|
"latency_p95_seconds": 0.061584
|
||||||
|
},
|
||||||
|
"source_audit_summary": {
|
||||||
|
"dev": {
|
||||||
|
"questions": 509,
|
||||||
|
"source_consistent": 509,
|
||||||
|
"issues": {}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"questions": 80,
|
||||||
|
"source_consistent": 80,
|
||||||
|
"issues": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"policy": "Report all questions including negatives. No exclusions or holdout tuning.",
|
||||||
|
"dev_results_sha256": "3bcb4bed1370975c47de2d34ea00f80c87d4832eee395cfde0d69130d5716be6",
|
||||||
|
"audit_sha256": "6000c6a14cedaa31dd8c1b35b7f95c142a4233cd8508542f84235bceaf6c6cdf"
|
||||||
|
}
|
||||||
@ -9,6 +9,8 @@ from collections import defaultdict
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
from .evidence_contract import evaluate_contract
|
||||||
|
|
||||||
|
|
||||||
VALID_SPLITS = (
|
VALID_SPLITS = (
|
||||||
"dev",
|
"dev",
|
||||||
@ -181,14 +183,33 @@ def load_questions(
|
|||||||
f"{question_id}: chýba graph."
|
f"{question_id}: chýba graph."
|
||||||
)
|
)
|
||||||
|
|
||||||
if graph.get(
|
if graph.get("schema_version") not in {2, 3}:
|
||||||
"schema_version"
|
|
||||||
) != 2:
|
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"{question_id}: benchmark nie je "
|
f"{question_id}: benchmark nie je "
|
||||||
"schema_version=2."
|
"schema_version=2 alebo 3."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if graph.get('schema_version') == 3:
|
||||||
|
bindings = graph.get('expected_bindings')
|
||||||
|
if not isinstance(bindings, list) or any(not isinstance(row, dict) for row in bindings):
|
||||||
|
raise ValueError(f'{question_id}: schema3 requires expected_bindings as a list of objects.')
|
||||||
|
negative = graph.get('expected_no_answer') or item.get('should_answer') is False
|
||||||
|
if negative and bindings:
|
||||||
|
raise ValueError(f'{question_id}: no-answer cases cannot require positive bindings.')
|
||||||
|
if not negative and not bindings and graph.get('expected_count') != 0:
|
||||||
|
raise ValueError(f'{question_id}: a positive case needs bindings or an explicit zero count.')
|
||||||
|
patterns = graph.get('expected_path_patterns', [])
|
||||||
|
if not isinstance(patterns, list) or any(not isinstance(row, dict) for row in patterns):
|
||||||
|
raise ValueError(f'{question_id}: expected_path_patterns must be a list of objects.')
|
||||||
|
for pattern in patterns:
|
||||||
|
index = pattern.get('binding_index')
|
||||||
|
nodes, relations = pattern.get('node_kinds'), pattern.get('relationships')
|
||||||
|
if (not isinstance(index, int) or index not in range(len(bindings))
|
||||||
|
or not isinstance(nodes, list) or not nodes
|
||||||
|
or not isinstance(relations, list) or len(relations) != len(nodes) - 1
|
||||||
|
or any(not isinstance(value, str) for value in nodes + relations)):
|
||||||
|
raise ValueError(f'{question_id}: invalid connected path pattern.')
|
||||||
|
|
||||||
questions.append(
|
questions.append(
|
||||||
item
|
item
|
||||||
)
|
)
|
||||||
@ -296,7 +317,8 @@ def ratio(
|
|||||||
return matched / expected
|
return matched / expected
|
||||||
|
|
||||||
|
|
||||||
def entity_value_is_present(entity_type: str, value: str, result: dict[str, Any]) -> bool:
|
def entity_value_is_present(entity_type: str, value: str, result: dict[str, Any],
|
||||||
|
question: dict[str, Any] | None = None) -> bool:
|
||||||
"""Score typed answer evidence, never aliases copied from the question."""
|
"""Score typed answer evidence, never aliases copied from the question."""
|
||||||
rows = list(result.get("facts", []))
|
rows = list(result.get("facts", []))
|
||||||
rows.extend(node for path in result.get("paths", []) for node in path.get("nodes", []))
|
rows.extend(node for path in result.get("paths", []) for node in path.get("nodes", []))
|
||||||
@ -305,7 +327,7 @@ def entity_value_is_present(entity_type: str, value: str, result: dict[str, Any]
|
|||||||
"keyword": ("keyword",),
|
"keyword": ("keyword",),
|
||||||
"category": ("category",),
|
"category": ("category",),
|
||||||
"document_author": ("document_author",),
|
"document_author": ("document_author",),
|
||||||
"year": ("year", "start_year", "shared_start_year", "shared_years"),
|
"year": ("year",),
|
||||||
"start_year": ("start_year", "shared_start_year"),
|
"start_year": ("start_year", "shared_start_year"),
|
||||||
"thesis_title": ("title",),
|
"thesis_title": ("title",),
|
||||||
"work_title": ("title",),
|
"work_title": ("title",),
|
||||||
@ -313,7 +335,17 @@ def entity_value_is_present(entity_type: str, value: str, result: dict[str, Any]
|
|||||||
node_kinds = {"person": "Person", "keyword": "Keyword", "category": "Category",
|
node_kinds = {"person": "Person", "keyword": "Keyword", "category": "Category",
|
||||||
"document_author": "DocumentAuthor"}
|
"document_author": "DocumentAuthor"}
|
||||||
expected = normalize_text(value)
|
expected = normalize_text(value)
|
||||||
|
start_year_context = bool(question and question.get('graph', {}).get('expected_properties')
|
||||||
|
and all(p == 'Person.start_year' for p in question['graph']['expected_properties']))
|
||||||
|
if entity_type == 'year' and start_year_context:
|
||||||
|
fields = ('start_year', 'shared_start_year')
|
||||||
for row in rows:
|
for row in rows:
|
||||||
|
if entity_type == 'year' and not start_year_context and not (
|
||||||
|
row.get('kind') in {'Thesis', 'Work'}
|
||||||
|
or row.get('fact_type') in {'person_thesis', 'person_work'}
|
||||||
|
or row.get('thesis_type') is not None or row.get('work_type') is not None
|
||||||
|
):
|
||||||
|
continue
|
||||||
if entity_type == "thesis_title" and not (row.get("kind") == "Thesis" or row.get("thesis_type")):
|
if entity_type == "thesis_title" and not (row.get("kind") == "Thesis" or row.get("thesis_type")):
|
||||||
continue
|
continue
|
||||||
if entity_type == "work_title" and not (row.get("kind") == "Work" or row.get("work_type")):
|
if entity_type == "work_title" and not (row.get("kind") == "Work" or row.get("work_type")):
|
||||||
@ -687,7 +719,8 @@ def actual_entity_set(
|
|||||||
|
|
||||||
values: set[str] = set()
|
values: set[str] = set()
|
||||||
|
|
||||||
if category == "person_multiple_categories":
|
field = question.get('graph', {}).get('entity_set_field')
|
||||||
|
if category == "person_multiple_categories" or field == 'category':
|
||||||
for fact in result.get(
|
for fact in result.get(
|
||||||
"facts",
|
"facts",
|
||||||
[],
|
[],
|
||||||
@ -715,7 +748,7 @@ def actual_entity_set(
|
|||||||
|
|
||||||
return values
|
return values
|
||||||
|
|
||||||
if category == "candidate_set_aggregation":
|
if category == "candidate_set_aggregation" or field == 'person':
|
||||||
for fact in result.get(
|
for fact in result.get(
|
||||||
"facts",
|
"facts",
|
||||||
[],
|
[],
|
||||||
@ -744,6 +777,11 @@ def actual_entity_set(
|
|||||||
|
|
||||||
return values
|
return values
|
||||||
|
|
||||||
|
if field == 'keyword':
|
||||||
|
return {str(fact['keyword']) for fact in result.get('facts', [])
|
||||||
|
if isinstance(fact, dict) and fact.get('fact_type') in {'person_keyword', 'shared_keyword'}
|
||||||
|
and fact.get('keyword')}
|
||||||
|
|
||||||
return values
|
return values
|
||||||
|
|
||||||
|
|
||||||
@ -866,6 +904,7 @@ def evaluate_result(
|
|||||||
entity_type,
|
entity_type,
|
||||||
value,
|
value,
|
||||||
result,
|
result,
|
||||||
|
question,
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1034,14 +1073,28 @@ def evaluate_result(
|
|||||||
|
|
||||||
expected_count = graph.get("expected_count")
|
expected_count = graph.get("expected_count")
|
||||||
aggregation = result.get("aggregation") or {}
|
aggregation = result.get("aggregation") or {}
|
||||||
count_ok = expected_count is None or (
|
count_ok = True
|
||||||
aggregation.get("complete") is True
|
if expected_count is not None:
|
||||||
and aggregation.get("count") == expected_count
|
actual_count = aggregation.get('count')
|
||||||
)
|
actual_values = normalized_set(actual_entity_set(question, result))
|
||||||
|
declared_values = aggregation.get('people')
|
||||||
|
count_ok = bool(
|
||||||
|
aggregation.get('complete') is True
|
||||||
|
and isinstance(actual_count, int) and not isinstance(actual_count, bool)
|
||||||
|
and actual_count == expected_count
|
||||||
|
and len(actual_values) == actual_count
|
||||||
|
and isinstance(declared_values, list)
|
||||||
|
and normalized_set(declared_values) == actual_values
|
||||||
|
and len(declared_values) == actual_count
|
||||||
|
)
|
||||||
complete = not result.get("truncated", False)
|
complete = not result.get("truncated", False)
|
||||||
|
contract = evaluate_contract(question, result)
|
||||||
strict = all(
|
strict = all(
|
||||||
(
|
(
|
||||||
error is None,
|
error is None,
|
||||||
|
contract['answerability_ok'],
|
||||||
|
contract['bindings_ok'],
|
||||||
|
contract['paths_ok'],
|
||||||
complete,
|
complete,
|
||||||
count_ok,
|
count_ok,
|
||||||
value_score == 1.0,
|
value_score == 1.0,
|
||||||
@ -1061,6 +1114,7 @@ def evaluate_result(
|
|||||||
)
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
**contract,
|
||||||
"count_ok": count_ok,
|
"count_ok": count_ok,
|
||||||
"expected_count": expected_count,
|
"expected_count": expected_count,
|
||||||
"actual_count": aggregation.get("count"),
|
"actual_count": aggregation.get("count"),
|
||||||
@ -1261,6 +1315,9 @@ def aggregate_rows(
|
|||||||
"relation_choice_score": 0.0,
|
"relation_choice_score": 0.0,
|
||||||
"document_recall": 0.0,
|
"document_recall": 0.0,
|
||||||
"source_recall": 0.0,
|
"source_recall": 0.0,
|
||||||
|
"binding_score": 0.0,
|
||||||
|
"path_score": 0.0,
|
||||||
|
"answerability_accuracy": 0.0,
|
||||||
"latency_mean_seconds": 0.0,
|
"latency_mean_seconds": 0.0,
|
||||||
"latency_median_seconds": 0.0,
|
"latency_median_seconds": 0.0,
|
||||||
"latency_p95_seconds": 0.0,
|
"latency_p95_seconds": 0.0,
|
||||||
@ -1338,6 +1395,9 @@ def aggregate_rows(
|
|||||||
"source_recall": mean(
|
"source_recall": mean(
|
||||||
"source_recall"
|
"source_recall"
|
||||||
),
|
),
|
||||||
|
"binding_score": round(statistics.fmean(float(row.get('binding_score', 1.0)) for row in rows), 6),
|
||||||
|
"path_score": round(statistics.fmean(float(row.get('path_score', 1.0)) for row in rows), 6),
|
||||||
|
"answerability_accuracy": round(statistics.fmean(bool(row.get('answerability_ok', True)) for row in rows), 6),
|
||||||
"latency_mean_seconds": round(
|
"latency_mean_seconds": round(
|
||||||
statistics.fmean(
|
statistics.fmean(
|
||||||
latencies
|
latencies
|
||||||
|
|||||||
71956
tools/graphrag/evaluation/graphrag_questions_v2.json
Normal file
71956
tools/graphrag/evaluation/graphrag_questions_v2.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -3,6 +3,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
import platform
|
import platform
|
||||||
import subprocess
|
import subprocess
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
@ -16,6 +17,19 @@ def sha256_file(path: Path) -> str:
|
|||||||
return hashlib.sha256(path.read_bytes()).hexdigest()
|
return hashlib.sha256(path.read_bytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def source_corpus_fingerprint(root: Path = ROOT) -> dict[str, Any]:
|
||||||
|
"""Bind independent expectations to the original Markdown, not graph output."""
|
||||||
|
wiki = Path(os.getenv('ZPWIKI_ROOT', str(root.parent / 'zpwiki')))
|
||||||
|
pages = wiki / 'pages'
|
||||||
|
if not pages.is_dir():
|
||||||
|
raise RuntimeError(f'Original ZP Wiki Markdown directory is missing: {pages}')
|
||||||
|
documents = {str(path.relative_to(wiki)): sha256_file(path)
|
||||||
|
for path in sorted(pages.rglob('README.md')) if path.is_file()}
|
||||||
|
serialized = json.dumps(documents, sort_keys=True, separators=(',', ':')).encode()
|
||||||
|
return {'sha256': hashlib.sha256(serialized).hexdigest(),
|
||||||
|
'document_count': len(documents), 'documents': documents}
|
||||||
|
|
||||||
|
|
||||||
def content_fingerprints(questions: Path, root: Path = ROOT) -> dict[str, Any]:
|
def content_fingerprints(questions: Path, root: Path = ROOT) -> dict[str, Any]:
|
||||||
files = sorted((root / 'tools/graphrag').rglob('*.py'))
|
files = sorted((root / 'tools/graphrag').rglob('*.py'))
|
||||||
# requirements.txt and tools/ are present both in the checkout and image.
|
# requirements.txt and tools/ are present both in the checkout and image.
|
||||||
@ -24,6 +38,7 @@ def content_fingerprints(questions: Path, root: Path = ROOT) -> dict[str, Any]:
|
|||||||
'implementation': {str(path.relative_to(root)): sha256_file(path) for path in files},
|
'implementation': {str(path.relative_to(root)): sha256_file(path) for path in files},
|
||||||
'dataset_sha256': sha256_file(questions),
|
'dataset_sha256': sha256_file(questions),
|
||||||
'inputs': {name: sha256_file(root / name) for name in ['data/documents.json', 'data/chunks.json']},
|
'inputs': {name: sha256_file(root / name) for name in ['data/documents.json', 'data/chunks.json']},
|
||||||
|
'source_corpus': source_corpus_fingerprint(root),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -52,7 +67,7 @@ def run_metadata(questions: Path) -> dict[str, Any]:
|
|||||||
return result.stdout.strip() if result.returncode == 0 else None
|
return result.stdout.strip() if result.returncode == 0 else None
|
||||||
return {'started_at_utc': datetime.now(timezone.utc).isoformat(),
|
return {'started_at_utc': datetime.now(timezone.utc).isoformat(),
|
||||||
'python': platform.python_version(), 'git_head': revision(ROOT),
|
'python': platform.python_version(), 'git_head': revision(ROOT),
|
||||||
'wiki_git_head': revision(ROOT.parent / 'zpwiki'),
|
'wiki_git_head': revision(Path(os.getenv('ZPWIKI_ROOT', str(ROOT.parent / 'zpwiki')))),
|
||||||
'fingerprints': content_fingerprints(questions)}
|
'fingerprints': content_fingerprints(questions)}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
# Historický GraphRAG DEV beh
|
||||||
|
|
||||||
|
Pôvodný celý DEV beh pred dokončením evaluácie v1. Zachovaný pre históriu vývoja a analýzu chýb. Nemá obsahové odtlačky ani totožné anotačné pravidlá s novšími verziami, preto jeho skóre nemožno bez ďalšieho vydávať za priamo porovnateľný finálny benchmark. Autoritatívne merania sú v adresároch `final_*`.
|
||||||
@ -0,0 +1,287 @@
|
|||||||
|
id,split,category,difficulty,strict,value_score,entity_score,relation_score,property_score,relation_choice_score,document_recall,source_recall,entity_set_ok,latency_seconds,error,question,expected_values,matched_values,expected_relations,actual_relations,expected_documents,actual_documents,fact_types,strategies
|
||||||
|
g0001,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.063046,,Sú osoby Maroš Harahus a Jakub Maruniak v ZP Wiki prepojené cez kľúčové slovo Spacy? Uveď spoločné kľúčové slovo.,"[""Maroš Harahus"", ""Jakub Maruniak"", ""Spacy""]","[""Maroš Harahus"", ""Jakub Maruniak"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0002,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.036015,,Over prepojenie osôb Maroš Harahus a Jakub Maruniak cez kľúčové slovo Spacy a pomenuj spoločné kľúčové slovo.,"[""Maroš Harahus"", ""Jakub Maruniak"", ""Spacy""]","[""Maroš Harahus"", ""Jakub Maruniak"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0003,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.036391,,Sú osoby Maroš Harahus a Kristián Sopkovič v ZP Wiki prepojené cez kľúčové slovo Spacy? Uveď spoločné kľúčové slovo.,"[""Maroš Harahus"", ""Kristián Sopkovič"", ""Spacy""]","[""Maroš Harahus"", ""Kristián Sopkovič"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0004,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035624,,Over prepojenie osôb Maroš Harahus a Kristián Sopkovič cez kľúčové slovo Spacy a pomenuj spoločné kľúčové slovo.,"[""Maroš Harahus"", ""Kristián Sopkovič"", ""Spacy""]","[""Maroš Harahus"", ""Kristián Sopkovič"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0005,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037143,,Sú osoby Maroš Harahus a Artem Yatsenko v ZP Wiki prepojené cez kľúčové slovo Spacy? Uveď spoločné kľúčové slovo.,"[""Maroš Harahus"", ""Artem Yatsenko"", ""Spacy""]","[""Maroš Harahus"", ""Artem Yatsenko"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0006,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035419,,Over prepojenie osôb Maroš Harahus a Artem Yatsenko cez kľúčové slovo Spacy a pomenuj spoločné kľúčové slovo.,"[""Maroš Harahus"", ""Artem Yatsenko"", ""Spacy""]","[""Maroš Harahus"", ""Artem Yatsenko"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0007,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.031962,,Sú osoby Jakub Maruniak a Kristián Sopkovič v ZP Wiki prepojené cez kľúčové slovo Spacy? Uveď spoločné kľúčové slovo.,"[""Jakub Maruniak"", ""Kristián Sopkovič"", ""Spacy""]","[""Jakub Maruniak"", ""Kristián Sopkovič"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0008,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.034931,,Over prepojenie osôb Jakub Maruniak a Kristián Sopkovič cez kľúčové slovo Spacy a pomenuj spoločné kľúčové slovo.,"[""Jakub Maruniak"", ""Kristián Sopkovič"", ""Spacy""]","[""Jakub Maruniak"", ""Kristián Sopkovič"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0009,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035871,,Sú osoby Jakub Maruniak a Artem Yatsenko v ZP Wiki prepojené cez kľúčové slovo Spacy? Uveď spoločné kľúčové slovo.,"[""Jakub Maruniak"", ""Artem Yatsenko"", ""Spacy""]","[""Jakub Maruniak"", ""Artem Yatsenko"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0010,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.039036,,Over prepojenie osôb Jakub Maruniak a Artem Yatsenko cez kľúčové slovo Spacy a pomenuj spoločné kľúčové slovo.,"[""Jakub Maruniak"", ""Artem Yatsenko"", ""Spacy""]","[""Jakub Maruniak"", ""Artem Yatsenko"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0011,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.036217,,Sú osoby Kristián Sopkovič a Artem Yatsenko v ZP Wiki prepojené cez kľúčové slovo Spacy? Uveď spoločné kľúčové slovo.,"[""Kristián Sopkovič"", ""Artem Yatsenko"", ""Spacy""]","[""Kristián Sopkovič"", ""Artem Yatsenko"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0012,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.032562,,Over prepojenie osôb Kristián Sopkovič a Artem Yatsenko cez kľúčové slovo Spacy a pomenuj spoločné kľúčové slovo.,"[""Kristián Sopkovič"", ""Artem Yatsenko"", ""Spacy""]","[""Kristián Sopkovič"", ""Artem Yatsenko"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0013,dev,shared_keyword_pair,hard,False,1.0,1.0,0.0,1.0,1.0,1.0,0.0,True,0.033693,,Sú osoby Tomáš Kuchárik a Dávid Omasta v ZP Wiki prepojené cez kľúčové slovo Question Answering? Uveď spoločné kľúčové slovo.,"[""Tomáš Kuchárik"", ""Dávid Omasta"", ""Question Answering""]","[""Tomáš Kuchárik"", ""Dávid Omasta"", ""Question Answering""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]",[],"[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2018/david_omasta/README.md""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2018/david_omasta/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0014,dev,shared_keyword_pair,hard,False,1.0,1.0,0.0,1.0,1.0,1.0,0.0,True,0.033675,,Over prepojenie osôb Tomáš Kuchárik a Dávid Omasta cez kľúčové slovo Question Answering a pomenuj spoločné kľúčové slovo.,"[""Tomáš Kuchárik"", ""Dávid Omasta"", ""Question Answering""]","[""Tomáš Kuchárik"", ""Dávid Omasta"", ""Question Answering""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]",[],"[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2018/david_omasta/README.md""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2018/david_omasta/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0015,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035715,,Sú osoby Tomáš Kuchárik a Dominik Nagy v ZP Wiki prepojené cez kľúčové slovo strojový preklad? Uveď spoločné kľúčové slovo.,"[""Tomáš Kuchárik"", ""Dominik Nagy"", ""strojový preklad""]","[""Tomáš Kuchárik"", ""Dominik Nagy"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0016,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.032819,,Over prepojenie osôb Tomáš Kuchárik a Dominik Nagy cez kľúčové slovo strojový preklad a pomenuj spoločné kľúčové slovo.,"[""Tomáš Kuchárik"", ""Dominik Nagy"", ""strojový preklad""]","[""Tomáš Kuchárik"", ""Dominik Nagy"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0017,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030312,,Sú osoby Tomáš Kuchárik a Patrik Pavlišin v ZP Wiki prepojené cez kľúčové slovo strojový preklad? Uveď spoločné kľúčové slovo.,"[""Tomáš Kuchárik"", ""Patrik Pavlišin"", ""strojový preklad""]","[""Tomáš Kuchárik"", ""Patrik Pavlišin"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0018,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.029774,,Over prepojenie osôb Tomáš Kuchárik a Patrik Pavlišin cez kľúčové slovo strojový preklad a pomenuj spoločné kľúčové slovo.,"[""Tomáš Kuchárik"", ""Patrik Pavlišin"", ""strojový preklad""]","[""Tomáš Kuchárik"", ""Patrik Pavlišin"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0019,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030291,,Sú osoby Dominik Nagy a Patrik Pavlišin v ZP Wiki prepojené cez kľúčové slovo strojový preklad? Uveď spoločné kľúčové slovo.,"[""Dominik Nagy"", ""Patrik Pavlišin"", ""strojový preklad""]","[""Dominik Nagy"", ""Patrik Pavlišin"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/patrik_pavlisin/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0020,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.031971,,Over prepojenie osôb Dominik Nagy a Patrik Pavlišin cez kľúčové slovo strojový preklad a pomenuj spoločné kľúčové slovo.,"[""Dominik Nagy"", ""Patrik Pavlišin"", ""strojový preklad""]","[""Dominik Nagy"", ""Patrik Pavlišin"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/patrik_pavlisin/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0021,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.031225,,Sú osoby Jakub Maruniak a Artem Yatsenko v ZP Wiki prepojené cez kľúčové slovo pomenované entity? Uveď spoločné kľúčové slovo.,"[""Jakub Maruniak"", ""Artem Yatsenko"", ""pomenované entity""]","[""Jakub Maruniak"", ""Artem Yatsenko"", ""pomenované entity""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0022,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030097,,Over prepojenie osôb Jakub Maruniak a Artem Yatsenko cez kľúčové slovo pomenované entity a pomenuj spoločné kľúčové slovo.,"[""Jakub Maruniak"", ""Artem Yatsenko"", ""pomenované entity""]","[""Jakub Maruniak"", ""Artem Yatsenko"", ""pomenované entity""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0023,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.029967,,Sú osoby Ondrej Megela a Matej Novotný v ZP Wiki prepojené cez kľúčové slovo jazykové modelovanie? Uveď spoločné kľúčové slovo.,"[""Ondrej Megela"", ""Matej Novotný"", ""jazykové modelovanie""]","[""Ondrej Megela"", ""Matej Novotný""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2021/matej_novotny/README.md""]","[""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2021/matej_novotny/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0024,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.029622,,Over prepojenie osôb Ondrej Megela a Matej Novotný cez kľúčové slovo jazykové modelovanie a pomenuj spoločné kľúčové slovo.,"[""Ondrej Megela"", ""Matej Novotný"", ""jazykové modelovanie""]","[""Ondrej Megela"", ""Matej Novotný""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2021/matej_novotny/README.md""]","[""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2021/matej_novotny/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0025,dev,shared_keyword_pair,hard,False,0.666667,0.0,0.0,1.0,1.0,1.0,0.0,True,0.029428,,Sú osoby Dávid Omasta a Kristián Sopkovič v ZP Wiki prepojené cez kľúčové slovo slovenčina? Uveď spoločné kľúčové slovo.,"[""Dávid Omasta"", ""Kristián Sopkovič"", ""slovenčina""]","[""Dávid Omasta"", ""Kristián Sopkovič""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]",[],"[""pages/students/2018/david_omasta/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0026,dev,shared_keyword_pair,hard,False,0.666667,0.0,0.0,1.0,1.0,1.0,0.0,True,0.028187,,Over prepojenie osôb Dávid Omasta a Kristián Sopkovič cez kľúčové slovo slovenčina a pomenuj spoločné kľúčové slovo.,"[""Dávid Omasta"", ""Kristián Sopkovič"", ""slovenčina""]","[""Dávid Omasta"", ""Kristián Sopkovič""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]",[],"[""pages/students/2018/david_omasta/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0027,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.029022,,Sú osoby Michal Stromko a Matej Ščišľak v ZP Wiki prepojené cez kľúčové slovo FAISS? Uveď spoločné kľúčové slovo.,"[""Michal Stromko"", ""Matej Ščišľak"", ""FAISS""]","[""Michal Stromko"", ""Matej Ščišľak""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/michal_stromko/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2019/michal_stromko/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0028,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.029569,,Over prepojenie osôb Michal Stromko a Matej Ščišľak cez kľúčové slovo FAISS a pomenuj spoločné kľúčové slovo.,"[""Michal Stromko"", ""Matej Ščišľak"", ""FAISS""]","[""Michal Stromko"", ""Matej Ščišľak""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/michal_stromko/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2019/michal_stromko/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0031,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.029093,,Sú osoby Artem Yatsenko a Vladimír Ferko v ZP Wiki prepojené cez kľúčové slovo anotácia? Uveď spoločné kľúčové slovo.,"[""Artem Yatsenko"", ""Vladimír Ferko"", ""anotácia""]","[""Artem Yatsenko"", ""Vladimír Ferko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0032,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.030074,,Over prepojenie osôb Artem Yatsenko a Vladimír Ferko cez kľúčové slovo anotácia a pomenuj spoločné kľúčové slovo.,"[""Artem Yatsenko"", ""Vladimír Ferko"", ""anotácia""]","[""Artem Yatsenko"", ""Vladimír Ferko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0035,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.03039,,Sú osoby Matej Ščišľak a Valerii Kutsenko v ZP Wiki prepojené cez kľúčové slovo GraphRAG? Uveď spoločné kľúčové slovo.,"[""Matej Ščišľak"", ""Valerii Kutsenko"", ""GraphRAG""]","[""Matej Ščišľak"", ""Valerii Kutsenko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0036,dev,shared_keyword_pair,hard,False,0.666667,0.0,1.0,1.0,1.0,1.0,1.0,True,0.028497,,Over prepojenie osôb Matej Ščišľak a Valerii Kutsenko cez kľúčové slovo GraphRAG a pomenuj spoločné kľúčové slovo.,"[""Matej Ščišľak"", ""Valerii Kutsenko"", ""GraphRAG""]","[""Matej Ščišľak"", ""Valerii Kutsenko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0037,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.028966,,Sú osoby Vladimír Ferko a Tetiana Mohorian v ZP Wiki prepojené cez kľúčové slovo hate speech? Uveď spoločné kľúčové slovo.,"[""Vladimír Ferko"", ""Tetiana Mohorian"", ""hate speech""]","[""Vladimír Ferko"", ""Tetiana Mohorian"", ""hate speech""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/vladimir_ferko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2021/vladimir_ferko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0038,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.029405,,Over prepojenie osôb Vladimír Ferko a Tetiana Mohorian cez kľúčové slovo hate speech a pomenuj spoločné kľúčové slovo.,"[""Vladimír Ferko"", ""Tetiana Mohorian"", ""hate speech""]","[""Vladimír Ferko"", ""Tetiana Mohorian"", ""hate speech""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/vladimir_ferko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2021/vladimir_ferko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0041,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030224,,Sú osoby Valerii Kutsenko a Ján Pták v ZP Wiki prepojené cez kľúčové slovo RAG? Uveď spoločné kľúčové slovo.,"[""Valerii Kutsenko"", ""Ján Pták"", ""RAG""]","[""Valerii Kutsenko"", ""Ján Pták"", ""RAG""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0042,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030849,,Over prepojenie osôb Valerii Kutsenko a Ján Pták cez kľúčové slovo RAG a pomenuj spoločné kľúčové slovo.,"[""Valerii Kutsenko"", ""Ján Pták"", ""RAG""]","[""Valerii Kutsenko"", ""Ján Pták"", ""RAG""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0049,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030437,,Sú osoby Tetiana Mohorian a Rostyslav Rodzhuk v ZP Wiki prepojené cez kľúčové slovo LLM? Uveď spoločné kľúčové slovo.,"[""Tetiana Mohorian"", ""Rostyslav Rodzhuk"", ""LLM""]","[""Tetiana Mohorian"", ""Rostyslav Rodzhuk"", ""LLM""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0050,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.031021,,Over prepojenie osôb Tetiana Mohorian a Rostyslav Rodzhuk cez kľúčové slovo LLM a pomenuj spoločné kľúčové slovo.,"[""Tetiana Mohorian"", ""Rostyslav Rodzhuk"", ""LLM""]","[""Tetiana Mohorian"", ""Rostyslav Rodzhuk"", ""LLM""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0053,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.032008,,Sú osoby Rostyslav Rodzhuk a Samuel Džurina v ZP Wiki prepojené cez kľúčové slovo agent? Uveď spoločné kľúčové slovo.,"[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""agent""]","[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""agent""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0054,dev,shared_keyword_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.032767,,Over prepojenie osôb Rostyslav Rodzhuk a Samuel Džurina cez kľúčové slovo agent a pomenuj spoločné kľúčové slovo.,"[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""agent""]","[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""agent""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""shared_keyword""]","[""entity_resolution"", ""shared_keyword_constraints""]"
|
||||||
|
g0058,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.326215,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ján Pták a Samuel Džurina?,"[""Ján Pták"", ""Samuel Džurina"", ""2026""]","[""Ján Pták"", ""Samuel Džurina""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/samuel_dzurina/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0060,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.045514,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ján Pták a Matej Novotný?,"[""Ján Pták"", ""Matej Novotný"", ""2026""]","[""Ján Pták"", ""Matej Novotný""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2022/jan_ptak/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0063,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.047759,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Rostyslav Rodzhuk a Samuel Džurina?,"[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2026""]","[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2026""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0064,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.03498,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Novotný a Samuel Džurina?,"[""Matej Novotný"", ""Samuel Džurina"", ""2026""]","[""Matej Novotný"", ""Samuel Džurina""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/samuel_dzurina/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0066,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.037241,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Ščišľak a Samuel Džurina?,"[""Matej Ščišľak"", ""Samuel Džurina"", ""2026""]","[""Matej Ščišľak"", ""Samuel Džurina""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/samuel_dzurina/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0068,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.037597,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Artem Yatsenko a Kristián Sopkovič?,"[""Artem Yatsenko"", ""Kristián Sopkovič"", ""2022""]","[""Artem Yatsenko"", ""Kristián Sopkovič"", ""2022""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0071,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.038063,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Samuel Džurina a Simona Bobrovčanová?,"[""Samuel Džurina"", ""Simona Bobrovčanová"", ""2026""]","[""Samuel Džurina"", ""Simona Bobrovčanová"", ""2026""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0072,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.033881,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ján Pták a Rostyslav Rodzhuk?,"[""Ján Pták"", ""Rostyslav Rodzhuk"", ""2026""]","[""Ján Pták"", ""Rostyslav Rodzhuk""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0074,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.03506,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ján Holp a Maroš Harahus?,"[""Ján Holp"", ""Maroš Harahus"", ""2021""]","[""Ján Holp"", ""Maroš Harahus"", ""2021""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/jan_holp/timovy_projekt/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2016/maros_harahus/timovy_projekt/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0075,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.036204,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Artem Yatsenko a Tomáš Kuchárik?,"[""Artem Yatsenko"", ""Tomáš Kuchárik"", ""2022""]","[""Artem Yatsenko"", ""Tomáš Kuchárik""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0076,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.043746,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Dávid Omasta a Vladimír Ferko?,"[""Dávid Omasta"", ""Vladimír Ferko"", ""2024""]","[""Dávid Omasta"", ""Vladimír Ferko""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2021/vladimir_ferko/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0078,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.03638,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Kristián Sopkovič a Michal Stromko?,"[""Kristián Sopkovič"", ""Michal Stromko"", ""2022""]","[""Kristián Sopkovič"", ""Michal Stromko"", ""2022""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2019/michal_stromko/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0079,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.042447,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Artem Yatsenko a Michal Stromko?,"[""Artem Yatsenko"", ""Michal Stromko"", ""2022""]","[""Artem Yatsenko"", ""Michal Stromko"", ""2022""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0081,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.039379,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ján Pták a Yevhenii Medushivskyi?,"[""Ján Pták"", ""Yevhenii Medushivskyi"", ""2026""]","[""Ján Pták"", ""Yevhenii Medushivskyi""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0084,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.039061,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Ščišľak a Yevhenii Medushivskyi?,"[""Matej Ščišľak"", ""Yevhenii Medushivskyi"", ""2026""]","[""Matej Ščišľak"", ""Yevhenii Medushivskyi""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0086,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.038478,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ondrej Megela a Patrik Pavlišin?,"[""Ondrej Megela"", ""Patrik Pavlišin"", ""2020""]","[""Ondrej Megela"", ""Patrik Pavlišin""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2018/ondrej_megela/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0087,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.042367,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Jakub Maruniak a Maroš Harahus?,"[""Jakub Maruniak"", ""Maroš Harahus"", ""2021""]","[""Jakub Maruniak"", ""Maroš Harahus"", ""2021""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jakub_maruniak/timovy_projekt/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2016/maros_harahus/timovy_projekt/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0088,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.035924,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Novotný a Simona Bobrovčanová?,"[""Matej Novotný"", ""Simona Bobrovčanová"", ""2026""]","[""Matej Novotný"", ""Simona Bobrovčanová""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0089,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.036101,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Dominik Nagy a Kristián Sopkovič?,"[""Dominik Nagy"", ""Kristián Sopkovič"", ""2022""]","[""Dominik Nagy"", ""Kristián Sopkovič""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md"", ""pages/students/2019/kristian_sopkovic/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0091,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.039618,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Rostyslav Rodzhuk a Simona Bobrovčanová?,"[""Rostyslav Rodzhuk"", ""Simona Bobrovčanová"", ""2026""]","[""Rostyslav Rodzhuk"", ""Simona Bobrovčanová"", ""2026""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0092,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.034234,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Simona Bobrovčanová a Yevhenii Medushivskyi?,"[""Simona Bobrovčanová"", ""Yevhenii Medushivskyi"", ""2026""]","[""Simona Bobrovčanová"", ""Yevhenii Medushivskyi"", ""2026""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0093,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.035771,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Kristián Sopkovič a Tomáš Kuchárik?,"[""Kristián Sopkovič"", ""Tomáš Kuchárik"", ""2022""]","[""Kristián Sopkovič"", ""Tomáš Kuchárik""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/kristian_sopkovic/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0095,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.039008,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Dominik Nagy a Michal Stromko?,"[""Dominik Nagy"", ""Michal Stromko"", ""2022""]","[""Dominik Nagy"", ""Michal Stromko""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md"", ""pages/students/2019/michal_stromko/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0097,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.035442,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Artem Yatsenko a Dominik Nagy?,"[""Artem Yatsenko"", ""Dominik Nagy"", ""2022""]","[""Artem Yatsenko"", ""Dominik Nagy""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0098,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.035625,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Michal Stromko a Tomáš Kuchárik?,"[""Michal Stromko"", ""Tomáš Kuchárik"", ""2022""]","[""Michal Stromko"", ""Tomáš Kuchárik""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/michal_stromko/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0099,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.035747,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Ščišľak a Rostyslav Rodzhuk?,"[""Matej Ščišľak"", ""Rostyslav Rodzhuk"", ""2026""]","[""Matej Ščišľak"", ""Rostyslav Rodzhuk""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0100,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.037048,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Rostyslav Rodzhuk a Yevhenii Medushivskyi?,"[""Rostyslav Rodzhuk"", ""Yevhenii Medushivskyi"", ""2026""]","[""Rostyslav Rodzhuk"", ""Yevhenii Medushivskyi"", ""2026""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0104,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.037044,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ján Pták a Matej Ščišľak?,"[""Ján Pták"", ""Matej Ščišľak"", ""2026""]","[""Ján Pták"", ""Matej Ščišľak""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/jan_ptak/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0105,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.04225,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Dominik Nagy a Tomáš Kuchárik?,"[""Dominik Nagy"", ""Tomáš Kuchárik"", ""2022""]","[""Dominik Nagy"", ""Tomáš Kuchárik"", ""2022""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md"", ""pages/students/2016/tomas_kucharik/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0107,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.034766,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Novotný a Yevhenii Medushivskyi?,"[""Matej Novotný"", ""Yevhenii Medushivskyi"", ""2026""]","[""Matej Novotný"", ""Yevhenii Medushivskyi""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0108,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.03365,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Ján Pták a Simona Bobrovčanová?,"[""Ján Pták"", ""Simona Bobrovčanová"", ""2026""]","[""Ján Pták"", ""Simona Bobrovčanová""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0110,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.033225,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Novotný a Matej Ščišľak?,"[""Matej Novotný"", ""Matej Ščišľak"", ""2026""]","[""Matej Novotný"", ""Matej Ščišľak"", ""2026""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0111,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.035255,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Jakub Maruniak a Ján Holp?,"[""Jakub Maruniak"", ""Ján Holp"", ""2021""]","[""Jakub Maruniak"", ""Ján Holp"", ""2021""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jakub_maruniak/timovy_projekt/README.md"", ""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/jan_holp/timovy_projekt/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0114,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.034397,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Ščišľak a Simona Bobrovčanová?,"[""Matej Ščišľak"", ""Simona Bobrovčanová"", ""2026""]","[""Matej Ščišľak"", ""Simona Bobrovčanová""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0115,dev,same_academic_year_pair,hard,False,0.666667,0.0,1.0,0.0,0.0,1.0,1.0,True,0.035404,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Matej Novotný a Rostyslav Rodzhuk?,"[""Matej Novotný"", ""Rostyslav Rodzhuk"", ""2026""]","[""Matej Novotný"", ""Rostyslav Rodzhuk""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0116,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.036028,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Daniil Huzenko a Tetiana Mohorian?,"[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2025""]","[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2025""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0118,dev,same_academic_year_pair,hard,False,1.0,1.0,1.0,0.0,0.0,1.0,1.0,True,0.034085,,V ktorom rovnakom roku je v ZP Wiki uvedená práca pri osobách Samuel Džurina a Yevhenii Medushivskyi?,"[""Samuel Džurina"", ""Yevhenii Medushivskyi"", ""2026""]","[""Samuel Džurina"", ""Yevhenii Medushivskyi"", ""2026""]",[],"[""AUTHORED_DOCUMENT"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md"", ""pages/topics/akopisat/README.md"", ""pages/topics/faq/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0122,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.314119,,Aký rok práce spája osoby Ján Pták a Samuel Džurina?,"[""Ján Pták"", ""Samuel Džurina"", ""2026""]","[""Ján Pták"", ""Samuel Džurina"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0124,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.042532,,Aký rok práce spája osoby Ján Pták a Matej Novotný?,"[""Ján Pták"", ""Matej Novotný"", ""2026""]","[""Ján Pták"", ""Matej Novotný"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2022/jan_ptak/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0127,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.043993,,Aký rok práce spája osoby Rostyslav Rodzhuk a Samuel Džurina?,"[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2026""]","[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0128,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.041612,,Aký rok práce spája osoby Matej Novotný a Samuel Džurina?,"[""Matej Novotný"", ""Samuel Džurina"", ""2026""]","[""Matej Novotný"", ""Samuel Džurina"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0130,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.038918,,Aký rok práce spája osoby Matej Ščišľak a Samuel Džurina?,"[""Matej Ščišľak"", ""Samuel Džurina"", ""2026""]","[""Matej Ščišľak"", ""Samuel Džurina"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0132,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.044022,,Aký rok práce spája osoby Artem Yatsenko a Kristián Sopkovič?,"[""Artem Yatsenko"", ""Kristián Sopkovič"", ""2022""]","[""Artem Yatsenko"", ""Kristián Sopkovič"", ""2022""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0135,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.043537,,Aký rok práce spája osoby Samuel Džurina a Simona Bobrovčanová?,"[""Samuel Džurina"", ""Simona Bobrovčanová"", ""2026""]","[""Samuel Džurina"", ""Simona Bobrovčanová"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0136,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037103,,Aký rok práce spája osoby Ján Pták a Rostyslav Rodzhuk?,"[""Ján Pták"", ""Rostyslav Rodzhuk"", ""2026""]","[""Ján Pták"", ""Rostyslav Rodzhuk"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/rostyslav_rodzhuk/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0138,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.039548,,Aký rok práce spája osoby Ján Holp a Maroš Harahus?,"[""Ján Holp"", ""Maroš Harahus"", ""2021""]","[""Ján Holp"", ""Maroš Harahus"", ""2021""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/jan_holp/dp2021/README.md"", ""pages/students/2016/jan_holp/dp2021/zdrojove_subory/README.md"", ""pages/students/2016/jan_holp/timovy_projekt/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2016/maros_harahus/timovy_projekt/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0139,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.038119,,Aký rok práce spája osoby Artem Yatsenko a Tomáš Kuchárik?,"[""Artem Yatsenko"", ""Tomáš Kuchárik"", ""2022""]","[""Artem Yatsenko"", ""Tomáš Kuchárik"", ""2022""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/tomas_kucharik/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0140,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.052175,,Aký rok práce spája osoby Dávid Omasta a Vladimír Ferko?,"[""Dávid Omasta"", ""Vladimír Ferko"", ""2024""]","[""Dávid Omasta"", ""Vladimír Ferko"", ""2024""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0142,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037983,,Aký rok práce spája osoby Kristián Sopkovič a Michal Stromko?,"[""Kristián Sopkovič"", ""Michal Stromko"", ""2022""]","[""Kristián Sopkovič"", ""Michal Stromko"", ""2022""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2019/michal_stromko/README.md"", ""pages/students/2019/michal_stromko/vp2021/README.md"", ""pages/students/2019/michal_stromko/vp2021/tutorials/README.md"", ""pages/students/2019/michal_stromko/vp2021/tutorials/img/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0143,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.03978,,Aký rok práce spája osoby Artem Yatsenko a Michal Stromko?,"[""Artem Yatsenko"", ""Michal Stromko"", ""2022""]","[""Artem Yatsenko"", ""Michal Stromko"", ""2022""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md"", ""pages/students/2019/michal_stromko/vp2021/README.md"", ""pages/students/2019/michal_stromko/vp2021/tutorials/README.md"", ""pages/students/2019/michal_stromko/vp2021/tutorials/img/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0145,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.033649,,Aký rok práce spája osoby Ján Pták a Yevhenii Medushivskyi?,"[""Ján Pták"", ""Yevhenii Medushivskyi"", ""2026""]","[""Ján Pták"", ""Yevhenii Medushivskyi"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0148,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035866,,Aký rok práce spája osoby Matej Ščišľak a Yevhenii Medushivskyi?,"[""Matej Ščišľak"", ""Yevhenii Medushivskyi"", ""2026""]","[""Matej Ščišľak"", ""Yevhenii Medushivskyi"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0150,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037791,,Aký rok práce spája osoby Ondrej Megela a Patrik Pavlišin?,"[""Ondrej Megela"", ""Patrik Pavlišin"", ""2020""]","[""Ondrej Megela"", ""Patrik Pavlišin"", ""2020""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2016/patrik_pavlisin/dp21/README.md"", ""pages/students/2016/patrik_pavlisin/dp22/README.md"", ""pages/students/2016/patrik_pavlisin/tp20/README.md"", ""pages/students/2018/ondrej_megela/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0151,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037581,,Aký rok práce spája osoby Jakub Maruniak a Maroš Harahus?,"[""Jakub Maruniak"", ""Maroš Harahus"", ""2021""]","[""Jakub Maruniak"", ""Maroš Harahus"", ""2021""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jakub_maruniak/dp2021/README.md"", ""pages/students/2016/jakub_maruniak/dp2021/annotation/README.md"", ""pages/students/2016/jakub_maruniak/dp2021/train_experiments/README.md"", ""pages/students/2016/jakub_maruniak/timovy_projekt/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2016/maros_harahus/timovy_projekt/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0152,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.033323,,Aký rok práce spája osoby Matej Novotný a Simona Bobrovčanová?,"[""Matej Novotný"", ""Simona Bobrovčanová"", ""2026""]","[""Matej Novotný"", ""Simona Bobrovčanová"", ""2026""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""IN_CATEGORY""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0153,dev,same_academic_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.036312,,Aký rok práce spája osoby Dominik Nagy a Kristián Sopkovič?,"[""Dominik Nagy"", ""Kristián Sopkovič"", ""2022""]","[""Dominik Nagy"", ""Kristián Sopkovič"", ""2022""]",[],"[""AUTHORED"", ""AUTHORED_DOCUMENT"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK"", ""IN_CATEGORY""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0155,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.156704,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Tetiana Mohorian a Valerii Kutsenko?,"[""Tetiana Mohorian"", ""Valerii Kutsenko"", ""2022""]","[""Tetiana Mohorian"", ""Valerii Kutsenko"", ""2022""]",[],[],"[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0156,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.031287,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Ján Pták a Tetiana Mohorian?,"[""Ján Pták"", ""Tetiana Mohorian"", ""2022""]","[""Ján Pták"", ""Tetiana Mohorian"", ""2022""]",[],[],"[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0160,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.029445,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Samuel Džurina a Yevhenii Medushivskyi?,"[""Samuel Džurina"", ""Yevhenii Medushivskyi"", ""2023""]","[""Samuel Džurina"", ""Yevhenii Medushivskyi"", ""2023""]",[],[],"[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0162,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.029386,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Ján Pták a Valerii Kutsenko?,"[""Ján Pták"", ""Valerii Kutsenko"", ""2022""]","[""Ján Pták"", ""Valerii Kutsenko"", ""2022""]",[],[],"[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0163,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.029811,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Rostyslav Rodzhuk a Simona Bobrovčanová?,"[""Rostyslav Rodzhuk"", ""Simona Bobrovčanová"", ""2023""]","[""Rostyslav Rodzhuk"", ""Simona Bobrovčanová"", ""2023""]",[],[],"[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0164,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.031109,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Simona Bobrovčanová a Yevhenii Medushivskyi?,"[""Simona Bobrovčanová"", ""Yevhenii Medushivskyi"", ""2023""]","[""Simona Bobrovčanová"", ""Yevhenii Medushivskyi"", ""2023""]",[],[],"[""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0165,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030314,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Matej Novotný a Matej Ščišľak?,"[""Matej Novotný"", ""Matej Ščišľak"", ""2021""]","[""Matej Novotný"", ""Matej Ščišľak"", ""2021""]",[],[],"[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0167,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.028205,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Rostyslav Rodzhuk a Yevhenii Medushivskyi?,"[""Rostyslav Rodzhuk"", ""Yevhenii Medushivskyi"", ""2023""]","[""Rostyslav Rodzhuk"", ""Yevhenii Medushivskyi"", ""2023""]",[],[],"[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0168,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027895,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Jakub Maruniak a Ján Holp?,"[""Jakub Maruniak"", ""Ján Holp"", ""2016""]","[""Jakub Maruniak"", ""Ján Holp"", ""2016""]",[],[],"[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0172,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.030614,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Rostyslav Rodzhuk a Samuel Džurina?,"[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2023""]","[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2023""]",[],[],"[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0174,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037061,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Daniil Huzenko a Tetiana Mohorian?,"[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2022""]","[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2022""]",[],[],"[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0177,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.029442,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Daniil Huzenko a Ján Pták?,"[""Daniil Huzenko"", ""Ján Pták"", ""2022""]","[""Daniil Huzenko"", ""Ján Pták"", ""2022""]",[],[],"[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0182,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.028835,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Daniil Huzenko a Valerii Kutsenko?,"[""Daniil Huzenko"", ""Valerii Kutsenko"", ""2022""]","[""Daniil Huzenko"", ""Valerii Kutsenko"", ""2022""]",[],[],"[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0185,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.028201,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Matej Novotný a Vladimír Ferko?,"[""Matej Novotný"", ""Vladimír Ferko"", ""2021""]","[""Matej Novotný"", ""Vladimír Ferko"", ""2021""]",[],[],"[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0186,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.026734,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Samuel Džurina a Simona Bobrovčanová?,"[""Samuel Džurina"", ""Simona Bobrovčanová"", ""2023""]","[""Samuel Džurina"", ""Simona Bobrovčanová"", ""2023""]",[],[],"[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0188,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.028172,,Aký spoločný rok začiatku štúdia majú podľa ZP Wiki osoby Matej Ščišľak a Vladimír Ferko?,"[""Matej Ščišľak"", ""Vladimír Ferko"", ""2021""]","[""Matej Ščišľak"", ""Vladimír Ferko"", ""2021""]",[],[],"[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/matej_scislak/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""person_start_year"", ""start_year_comparison""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0189,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027563,,Cez ktorý rok začiatku štúdia sú prepojené osoby Tetiana Mohorian a Valerii Kutsenko?,"[""Tetiana Mohorian"", ""Valerii Kutsenko"", ""2022""]","[""Tetiana Mohorian"", ""Valerii Kutsenko"", ""2022""]",[],[],"[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0190,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.02763,,Cez ktorý rok začiatku štúdia sú prepojené osoby Ján Pták a Tetiana Mohorian?,"[""Ján Pták"", ""Tetiana Mohorian"", ""2022""]","[""Ján Pták"", ""Tetiana Mohorian"", ""2022""]",[],[],"[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0194,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027621,,Cez ktorý rok začiatku štúdia sú prepojené osoby Samuel Džurina a Yevhenii Medushivskyi?,"[""Samuel Džurina"", ""Yevhenii Medushivskyi"", ""2023""]","[""Samuel Džurina"", ""Yevhenii Medushivskyi"", ""2023""]",[],[],"[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/samuel_dzurina/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0196,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027581,,Cez ktorý rok začiatku štúdia sú prepojené osoby Ján Pták a Valerii Kutsenko?,"[""Ján Pták"", ""Valerii Kutsenko"", ""2022""]","[""Ján Pták"", ""Valerii Kutsenko"", ""2022""]",[],[],"[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2022/valerii_kutsenko/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0197,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027399,,Cez ktorý rok začiatku štúdia sú prepojené osoby Rostyslav Rodzhuk a Simona Bobrovčanová?,"[""Rostyslav Rodzhuk"", ""Simona Bobrovčanová"", ""2023""]","[""Rostyslav Rodzhuk"", ""Simona Bobrovčanová"", ""2023""]",[],[],"[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0198,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.028125,,Cez ktorý rok začiatku štúdia sú prepojené osoby Simona Bobrovčanová a Yevhenii Medushivskyi?,"[""Simona Bobrovčanová"", ""Yevhenii Medushivskyi"", ""2023""]","[""Simona Bobrovčanová"", ""Yevhenii Medushivskyi"", ""2023""]",[],[],"[""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0199,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027786,,Cez ktorý rok začiatku štúdia sú prepojené osoby Matej Novotný a Matej Ščišľak?,"[""Matej Novotný"", ""Matej Ščišľak"", ""2021""]","[""Matej Novotný"", ""Matej Ščišľak"", ""2021""]",[],[],"[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0201,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027179,,Cez ktorý rok začiatku štúdia sú prepojené osoby Rostyslav Rodzhuk a Yevhenii Medushivskyi?,"[""Rostyslav Rodzhuk"", ""Yevhenii Medushivskyi"", ""2023""]","[""Rostyslav Rodzhuk"", ""Yevhenii Medushivskyi"", ""2023""]",[],[],"[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0202,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.031599,,Cez ktorý rok začiatku štúdia sú prepojené osoby Jakub Maruniak a Ján Holp?,"[""Jakub Maruniak"", ""Ján Holp"", ""2016""]","[""Jakub Maruniak"", ""Ján Holp"", ""2016""]",[],[],"[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0206,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.028117,,Cez ktorý rok začiatku štúdia sú prepojené osoby Rostyslav Rodzhuk a Samuel Džurina?,"[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2023""]","[""Rostyslav Rodzhuk"", ""Samuel Džurina"", ""2023""]",[],[],"[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md"", ""pages/students/2023/samuel_dzurina/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0208,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027458,,Cez ktorý rok začiatku štúdia sú prepojené osoby Daniil Huzenko a Tetiana Mohorian?,"[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2022""]","[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2022""]",[],[],"[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0211,dev,same_start_year_pair,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.027008,,Cez ktorý rok začiatku štúdia sú prepojené osoby Daniil Huzenko a Ján Pták?,"[""Daniil Huzenko"", ""Ján Pták"", ""2022""]","[""Daniil Huzenko"", ""Ján Pták"", ""2022""]",[],[],"[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""person_start_year""]","[""entity_resolution"", ""start_year_constraints""]"
|
||||||
|
g0219,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.738815,,Aký názov práce a aký rok práce sú uvedené pri osobe Artem Yatsenko?,"[""Artem Yatsenko"", ""Rozpoznávanie pomenovaných entít v slovenskom jazyku"", ""2022""]","[""Artem Yatsenko"", ""Rozpoznávanie pomenovaných entít v slovenskom jazyku"", ""2022""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0220,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.160803,,"Prepoj osobu Artem Yatsenko s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Artem Yatsenko"", ""Rozpoznávanie pomenovaných entít v slovenskom jazyku"", ""2022""]","[""Artem Yatsenko""]","[""AUTHORED""]",[],"[""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0221,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035894,,Aký názov práce a aký rok práce sú uvedené pri osobe Daniil Huzenko?,"[""Daniil Huzenko"", ""Testovanie hybridného klaudu s využiťím kombinácie verejného a privátneho riešenia"", ""2025""]","[""Daniil Huzenko"", ""Testovanie hybridného klaudu s využiťím kombinácie verejného a privátneho riešenia"", ""2025""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0222,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027485,,"Prepoj osobu Daniil Huzenko s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Daniil Huzenko"", ""Testovanie hybridného klaudu s využiťím kombinácie verejného a privátneho riešenia"", ""2025""]","[""Daniil Huzenko""]","[""AUTHORED""]",[],"[""pages/students/2022/daniil_huzenko/README.md""]","[""pages/students/2022/daniil_huzenko/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0227,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037204,,Aký názov práce a aký rok práce sú uvedené pri osobe Dominik Nagy?,"[""Dominik Nagy"", ""Neurónový strojový preklad pomocou knižnice Fairseq"", ""2022""]","[""Dominik Nagy"", ""Neurónový strojový preklad pomocou knižnice Fairseq"", ""2022""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2016/dominik_nagy/README.md""]","[""pages/students/2016/dominik_nagy/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0228,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.029531,,"Prepoj osobu Dominik Nagy s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Dominik Nagy"", ""Neurónový strojový preklad pomocou knižnice Fairseq"", ""2022""]","[""Dominik Nagy""]","[""AUTHORED""]",[],"[""pages/students/2016/dominik_nagy/README.md""]","[""pages/students/2016/dominik_nagy/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0231,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.03794,,Aký názov práce a aký rok práce sú uvedené pri osobe Dávid Omasta?,"[""Dávid Omasta"", ""Generatívne modely pre automatické odpovede na otázky v slovenskom jazyku"", ""2024""]","[""Dávid Omasta"", ""Generatívne modely pre automatické odpovede na otázky v slovenskom jazyku"", ""2024""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2018/david_omasta/README.md""]","[""pages/students/2018/david_omasta/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0232,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027993,,"Prepoj osobu Dávid Omasta s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Dávid Omasta"", ""Generatívne modely pre automatické odpovede na otázky v slovenskom jazyku"", ""2024""]","[""Dávid Omasta""]","[""AUTHORED""]",[],"[""pages/students/2018/david_omasta/README.md""]","[""pages/students/2018/david_omasta/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0237,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037383,,Aký názov práce a aký rok práce sú uvedené pri osobe Jakub Maruniak?,"[""Jakub Maruniak"", ""Anotácia a rozpoznávanie pomenovaných entít v slovenskom jazyku"", ""2021""]","[""Jakub Maruniak"", ""Anotácia a rozpoznávanie pomenovaných entít v slovenskom jazyku"", ""2021""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2016/jakub_maruniak/README.md""]","[""pages/students/2016/jakub_maruniak/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0238,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.028729,,"Prepoj osobu Jakub Maruniak s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Jakub Maruniak"", ""Anotácia a rozpoznávanie pomenovaných entít v slovenskom jazyku"", ""2021""]","[""Jakub Maruniak""]","[""AUTHORED""]",[],"[""pages/students/2016/jakub_maruniak/README.md""]","[""pages/students/2016/jakub_maruniak/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0239,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.036596,,Aký názov práce a aký rok práce sú uvedené pri osobe Ján Holp?,"[""Ján Holp"", ""Systém získavania informácií v slovenskom jazyku"", ""2021""]","[""Ján Holp"", ""Systém získavania informácií v slovenskom jazyku"", ""2021""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0240,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027055,,"Prepoj osobu Ján Holp s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Ján Holp"", ""Systém získavania informácií v slovenskom jazyku"", ""2021""]","[""Ján Holp""]","[""AUTHORED""]",[],"[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0243,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.034115,,Aký názov práce a aký rok práce sú uvedené pri osobe Ján Pták?,"[""Ján Pták"", ""Agent pre manažment záverečných prác"", ""2026""]","[""Ján Pták"", ""Agent pre manažment záverečných prác"", ""2026""]","[""HAS_WORK""]","[""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2022/jan_ptak/README.md""]","[""person_work""]","[""entity_resolution"", ""graph_traversal"", ""work_constraints""]"
|
||||||
|
g0244,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.02687,,"Prepoj osobu Ján Pták s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Ján Pták"", ""Agent pre manažment záverečných prác"", ""2026""]","[""Ján Pták""]","[""HAS_WORK""]",[],"[""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2022/jan_ptak/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0245,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037103,,Aký názov práce a aký rok práce sú uvedené pri osobe Kristián Sopkovič?,"[""Kristián Sopkovič"", ""Model Spacy pre spracovanie prirodzeného jazyka v slovenčine"", ""2022""]","[""Kristián Sopkovič"", ""Model Spacy pre spracovanie prirodzeného jazyka v slovenčine"", ""2022""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0246,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.028026,,"Prepoj osobu Kristián Sopkovič s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Kristián Sopkovič"", ""Model Spacy pre spracovanie prirodzeného jazyka v slovenčine"", ""2022""]","[""Kristián Sopkovič""]","[""AUTHORED""]",[],"[""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0251,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.038041,,Aký názov práce a aký rok práce sú uvedené pri osobe Maroš Harahus?,"[""Maroš Harahus"", ""Neurónová morfologická anotácia slovenského jazyka"", ""2021""]","[""Maroš Harahus"", ""Neurónová morfologická anotácia slovenského jazyka"", ""2021""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0252,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027095,,"Prepoj osobu Maroš Harahus s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Maroš Harahus"", ""Neurónová morfologická anotácia slovenského jazyka"", ""2021""]","[""Maroš Harahus""]","[""AUTHORED""]",[],"[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0257,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.03388,,Aký názov práce a aký rok práce sú uvedené pri osobe Matej Novotný?,"[""Matej Novotný"", ""Klasifikácia webových dát pre lepšie jazykové modelovanie"", ""2026""]","[""Matej Novotný"", ""Klasifikácia webových dát pre lepšie jazykové modelovanie"", ""2026""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2021/matej_novotny/README.md""]","[""pages/students/2021/matej_novotny/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0258,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027635,,"Prepoj osobu Matej Novotný s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Matej Novotný"", ""Klasifikácia webových dát pre lepšie jazykové modelovanie"", ""2026""]","[""Matej Novotný""]","[""AUTHORED""]",[],"[""pages/students/2021/matej_novotny/README.md""]","[""pages/students/2021/matej_novotny/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0259,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.062665,,Aký názov práce a aký rok práce sú uvedené pri osobe Matej Ščišľak?,"[""Matej Ščišľak"", ""Znalostné grafy pre zlepšenie vyhľadávania právnych informácií"", ""2026""]","[""Matej Ščišľak"", ""Znalostné grafy pre zlepšenie vyhľadávania právnych informácií"", ""2026""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_scislak/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0260,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.04293,,"Prepoj osobu Matej Ščišľak s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Matej Ščišľak"", ""Znalostné grafy pre zlepšenie vyhľadávania právnych informácií"", ""2026""]","[""Matej Ščišľak""]","[""AUTHORED""]",[],"[""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_scislak/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0261,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.036226,,Aký názov práce a aký rok práce sú uvedené pri osobe Michal Stromko?,"[""Michal Stromko"", ""Indexovanie slovenského textu pomocou Elasticsearch"", ""2022""]","[""Michal Stromko"", ""Indexovanie slovenského textu pomocou Elasticsearch"", ""2022""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0262,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.026963,,"Prepoj osobu Michal Stromko s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Michal Stromko"", ""Indexovanie slovenského textu pomocou Elasticsearch"", ""2022""]","[""Michal Stromko""]","[""AUTHORED""]",[],"[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0269,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035653,,Aký názov práce a aký rok práce sú uvedené pri osobe Ondrej Megela?,"[""Ondrej Megela"", ""Neurónové jazykové modelovanie typu BERT"", ""2020""]","[""Ondrej Megela"", ""Neurónové jazykové modelovanie typu BERT"", ""2020""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0270,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.026788,,"Prepoj osobu Ondrej Megela s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Ondrej Megela"", ""Neurónové jazykové modelovanie typu BERT"", ""2020""]","[""Ondrej Megela""]","[""AUTHORED""]",[],"[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0271,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.035479,,Aký názov práce a aký rok práce sú uvedené pri osobe Patrik Pavlišin?,"[""Patrik Pavlišin"", ""Metódy automatického prekladu"", ""2020""]","[""Patrik Pavlišin"", ""Metódy automatického prekladu"", ""2020""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0272,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027238,,"Prepoj osobu Patrik Pavlišin s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Patrik Pavlišin"", ""Metódy automatického prekladu"", ""2020""]","[""Patrik Pavlišin""]","[""AUTHORED""]",[],"[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0275,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.033405,,Aký názov práce a aký rok práce sú uvedené pri osobe Rostyslav Rodzhuk?,"[""Rostyslav Rodzhuk"", ""Inteligentný agent pre podporu práce špeciálneho pedagóga"", ""2026""]","[""Rostyslav Rodzhuk"", ""Inteligentný agent pre podporu práce špeciálneho pedagóga"", ""2026""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0276,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027071,,"Prepoj osobu Rostyslav Rodzhuk s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Rostyslav Rodzhuk"", ""Inteligentný agent pre podporu práce špeciálneho pedagóga"", ""2026""]","[""Rostyslav Rodzhuk""]","[""AUTHORED""]",[],"[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0277,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.034401,,Aký názov práce a aký rok práce sú uvedené pri osobe Samuel Džurina?,"[""Samuel Džurina"", ""Dialógový systém pre podporu firemných procesov"", ""2026""]","[""Samuel Džurina"", ""Dialógový systém pre podporu firemných procesov"", ""2026""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/samuel_dzurina/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0278,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027647,,"Prepoj osobu Samuel Džurina s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Samuel Džurina"", ""Dialógový systém pre podporu firemných procesov"", ""2026""]","[""Samuel Džurina""]","[""AUTHORED""]",[],"[""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/samuel_dzurina/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0281,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.034291,,Aký názov práce a aký rok práce sú uvedené pri osobe Simona Bobrovčanová?,"[""Simona Bobrovčanová"", ""Automatická sumarizácia slovenského textu"", ""2026""]","[""Simona Bobrovčanová"", ""Automatická sumarizácia slovenského textu"", ""2026""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0282,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.02729,,"Prepoj osobu Simona Bobrovčanová s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Simona Bobrovčanová"", ""Automatická sumarizácia slovenského textu"", ""2026""]","[""Simona Bobrovčanová""]","[""AUTHORED""]",[],"[""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0283,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.034086,,Aký názov práce a aký rok práce sú uvedené pri osobe Tetiana Mohorian?,"[""Tetiana Mohorian"", ""Rozpoznávanie nenávistnej reči pomocou veľkých jazykových modelov"", ""2025""]","[""Tetiana Mohorian"", ""Rozpoznávanie nenávistnej reči pomocou veľkých jazykových modelov"", ""2025""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0284,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027715,,"Prepoj osobu Tetiana Mohorian s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Tetiana Mohorian"", ""Rozpoznávanie nenávistnej reči pomocou veľkých jazykových modelov"", ""2025""]","[""Tetiana Mohorian""]","[""AUTHORED""]",[],"[""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0285,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037974,,Aký názov práce a aký rok práce sú uvedené pri osobe Tomáš Kuchárik?,"[""Tomáš Kuchárik"", ""Tvorba korpusu otázok a odpovedí v slovenskom jazyku pomocou strojového prekladu"", ""2022""]","[""Tomáš Kuchárik"", ""Tvorba korpusu otázok a odpovedí v slovenskom jazyku pomocou strojového prekladu"", ""2022""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0286,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027182,,"Prepoj osobu Tomáš Kuchárik s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Tomáš Kuchárik"", ""Tvorba korpusu otázok a odpovedí v slovenskom jazyku pomocou strojového prekladu"", ""2022""]","[""Tomáš Kuchárik""]","[""AUTHORED""]",[],"[""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/tomas_kucharik/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0287,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.036198,,Aký názov práce a aký rok práce sú uvedené pri osobe Valerii Kutsenko?,"[""Valerii Kutsenko"", ""Zlepšenie vyhľadávania pomocou znalostných grafov"", ""2027""]","[""Valerii Kutsenko"", ""Zlepšenie vyhľadávania pomocou znalostných grafov"", ""2027""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0288,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027675,,"Prepoj osobu Valerii Kutsenko s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Valerii Kutsenko"", ""Zlepšenie vyhľadávania pomocou znalostných grafov"", ""2027""]","[""Valerii Kutsenko""]","[""AUTHORED""]",[],"[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0289,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.037566,,Aký názov práce a aký rok práce sú uvedené pri osobe Vladimír Ferko?,"[""Vladimír Ferko"", ""Anotácia a vyhodnotenie slovenskej databázy nenávistnej reči"", ""2024""]","[""Vladimír Ferko"", ""Anotácia a vyhodnotenie slovenskej databázy nenávistnej reči"", ""2024""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0290,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.02733,,"Prepoj osobu Vladimír Ferko s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Vladimír Ferko"", ""Anotácia a vyhodnotenie slovenskej databázy nenávistnej reči"", ""2024""]","[""Vladimír Ferko""]","[""AUTHORED""]",[],"[""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/vladimir_ferko/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0293,dev,person_title_year,medium,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.033531,,Aký názov práce a aký rok práce sú uvedené pri osobe Yevhenii Medushivskyi?,"[""Yevhenii Medushivskyi"", ""Získavanie textu z webových stránok"", ""2026""]","[""Yevhenii Medushivskyi"", ""Získavanie textu z webových stránok"", ""2026""]","[""AUTHORED""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0294,dev,person_title_year,medium,False,0.333333,0.0,0.0,0.0,1.0,1.0,0.0,True,0.027276,,"Prepoj osobu Yevhenii Medushivskyi s názvom jej práce a rokom, v ktorom je táto práca v ZP Wiki uvedená.","[""Yevhenii Medushivskyi"", ""Získavanie textu z webových stránok"", ""2026""]","[""Yevhenii Medushivskyi""]","[""AUTHORED""]",[],"[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0296,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.174414,,"Aká je téma práce osoby Simona Bobrovčanová, ak jej dokument zároveň obsahuje kľúčové slovo slovenský text?","[""Simona Bobrovčanová"", ""slovenský text"", ""Automatická sumarizácia slovenského textu""]","[""Simona Bobrovčanová""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0297,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.039665,,"Aká je téma práce osoby Kristián Sopkovič, ak jej dokument zároveň obsahuje kľúčové slovo transformery?","[""Kristián Sopkovič"", ""transformery"", ""Model Spacy pre spracovanie prirodzeného jazyka v slovenčine""]","[""Kristián Sopkovič""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0298,dev,person_keyword_title,hard,False,0.666667,0.5,0.0,0.0,1.0,1.0,0.0,True,0.027131,,"Aká je téma práce osoby Tetiana Mohorian, ak jej dokument zároveň obsahuje kľúčové slovo hate speech?","[""Tetiana Mohorian"", ""hate speech"", ""Rozpoznávanie nenávistnej reči pomocou veľkých jazykových modelov""]","[""Tetiana Mohorian"", ""hate speech""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]",[],"[""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0299,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028946,,"Aká je téma práce osoby Matej Ščišľak, ak jej dokument zároveň obsahuje kľúčové slovo FAISS?","[""Matej Ščišľak"", ""FAISS"", ""Znalostné grafy pre zlepšenie vyhľadávania právnych informácií""]","[""Matej Ščišľak""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_scislak/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0300,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029375,,"Aká je téma práce osoby Ján Pták, ak jej dokument zároveň obsahuje kľúčové slovo OpenWebUI?","[""Ján Pták"", ""OpenWebUI"", ""Agent pre manažment záverečných prác""]","[""Ján Pták""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2022/jan_ptak/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0301,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.030051,,"Aká je téma práce osoby Matej Ščišľak, ak jej dokument zároveň obsahuje kľúčové slovo Neo4J?","[""Matej Ščišľak"", ""Neo4J"", ""Znalostné grafy pre zlepšenie vyhľadávania právnych informácií""]","[""Matej Ščišľak""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_scislak/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0302,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029151,,"Aká je téma práce osoby Tetiana Mohorian, ak jej dokument zároveň obsahuje kľúčové slovo prompting?","[""Tetiana Mohorian"", ""prompting"", ""Rozpoznávanie nenávistnej reči pomocou veľkých jazykových modelov""]","[""Tetiana Mohorian""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0303,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028988,,"Aká je téma práce osoby Maroš Harahus, ak jej dokument zároveň obsahuje kľúčové slovo morfologická anotácia?","[""Maroš Harahus"", ""morfologická anotácia"", ""Neurónová morfologická anotácia slovenského jazyka""]","[""Maroš Harahus""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0304,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.02986,,"Aká je téma práce osoby Tomáš Kuchárik, ak jej dokument zároveň obsahuje kľúčové slovo SQuAD?","[""Tomáš Kuchárik"", ""SQuAD"", ""Tvorba korpusu otázok a odpovedí v slovenskom jazyku pomocou strojového prekladu""]","[""Tomáš Kuchárik""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0305,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029205,,"Aká je téma práce osoby Ján Pták, ak jej dokument zároveň obsahuje kľúčové slovo Docker?","[""Ján Pták"", ""Docker"", ""Agent pre manažment záverečných prác""]","[""Ján Pták""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2022/jan_ptak/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0309,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029096,,"Aká je téma práce osoby Patrik Pavlišin, ak jej dokument zároveň obsahuje kľúčové slovo automatický preklad?","[""Patrik Pavlišin"", ""automatický preklad"", ""Metódy automatického prekladu""]","[""Patrik Pavlišin""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0314,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.144461,,"Aká je téma práce osoby Samuel Džurina, ak jej dokument zároveň obsahuje kľúčové slovo zásielková spoločnosť?","[""Samuel Džurina"", ""zásielková spoločnosť"", ""Dialógový systém pre podporu firemných procesov""]","[""Samuel Džurina""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/samuel_dzurina/README.md""]",[],"[""entity_resolution"", ""graph_traversal""]"
|
||||||
|
g0316,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.036669,,"Aká je téma práce osoby Valerii Kutsenko, ak jej dokument zároveň obsahuje kľúčové slovo znalostný graf?","[""Valerii Kutsenko"", ""znalostný graf"", ""Zlepšenie vyhľadávania pomocou znalostných grafov""]","[""Valerii Kutsenko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0319,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028833,,"Aká je téma práce osoby Maroš Harahus, ak jej dokument zároveň obsahuje kľúčové slovo grafové neurónové siete?","[""Maroš Harahus"", ""grafové neurónové siete"", ""Neurónová morfologická anotácia slovenského jazyka""]","[""Maroš Harahus""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0322,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028991,,"Aká je téma práce osoby Artem Yatsenko, ak jej dokument zároveň obsahuje kľúčové slovo anotácia?","[""Artem Yatsenko"", ""anotácia"", ""Rozpoznávanie pomenovaných entít v slovenskom jazyku""]","[""Artem Yatsenko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0323,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028623,,"Aká je téma práce osoby Simona Bobrovčanová, ak jej dokument zároveň obsahuje kľúčové slovo sumarizácia?","[""Simona Bobrovčanová"", ""sumarizácia"", ""Automatická sumarizácia slovenského textu""]","[""Simona Bobrovčanová""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0324,dev,person_keyword_title,hard,False,0.666667,0.5,0.666667,0.0,1.0,1.0,1.0,True,0.029455,,"Aká je téma práce osoby Patrik Pavlišin, ak jej dokument zároveň obsahuje kľúčové slovo strojový preklad?","[""Patrik Pavlišin"", ""strojový preklad"", ""Metódy automatického prekladu""]","[""Patrik Pavlišin"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0327,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029086,,"Aká je téma práce osoby Ján Holp, ak jej dokument zároveň obsahuje kľúčové slovo získavanie informácií?","[""Ján Holp"", ""získavanie informácií"", ""Systém získavania informácií v slovenskom jazyku""]","[""Ján Holp""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0328,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029132,,"Aká je téma práce osoby Rostyslav Rodzhuk, ak jej dokument zároveň obsahuje kľúčové slovo špeciálny pedagóg?","[""Rostyslav Rodzhuk"", ""špeciálny pedagóg"", ""Inteligentný agent pre podporu práce špeciálneho pedagóga""]","[""Rostyslav Rodzhuk""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0329,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029413,,"Aká je téma práce osoby Valerii Kutsenko, ak jej dokument zároveň obsahuje kľúčové slovo GraphRAG?","[""Valerii Kutsenko"", ""GraphRAG"", ""Zlepšenie vyhľadávania pomocou znalostných grafov""]","[""Valerii Kutsenko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0330,dev,person_keyword_title,hard,False,0.666667,0.5,0.0,0.0,1.0,1.0,0.0,True,0.027409,,"Aká je téma práce osoby Tetiana Mohorian, ak jej dokument zároveň obsahuje kľúčové slovo LLM?","[""Tetiana Mohorian"", ""LLM"", ""Rozpoznávanie nenávistnej reči pomocou veľkých jazykových modelov""]","[""Tetiana Mohorian"", ""LLM""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]",[],"[""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/tetiana_mohorian/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0331,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028483,,"Aká je téma práce osoby Yevhenii Medushivskyi, ak jej dokument zároveň obsahuje kľúčové slovo deduplikácia?","[""Yevhenii Medushivskyi"", ""deduplikácia"", ""Získavanie textu z webových stránok""]","[""Yevhenii Medushivskyi""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0333,dev,person_keyword_title,hard,False,0.666667,0.5,0.0,0.0,1.0,1.0,0.0,True,0.028027,,"Aká je téma práce osoby Rostyslav Rodzhuk, ak jej dokument zároveň obsahuje kľúčové slovo LLM?","[""Rostyslav Rodzhuk"", ""LLM"", ""Inteligentný agent pre podporu práce špeciálneho pedagóga""]","[""Rostyslav Rodzhuk"", ""LLM""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]",[],"[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0336,dev,person_keyword_title,hard,False,0.666667,0.5,0.666667,0.0,1.0,1.0,1.0,True,0.029159,,"Aká je téma práce osoby Artem Yatsenko, ak jej dokument zároveň obsahuje kľúčové slovo pomenované entity?","[""Artem Yatsenko"", ""pomenované entity"", ""Rozpoznávanie pomenovaných entít v slovenskom jazyku""]","[""Artem Yatsenko"", ""pomenované entity""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0337,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029656,,"Aká je téma práce osoby Ján Holp, ak jej dokument zároveň obsahuje kľúčové slovo slovenský internet?","[""Ján Holp"", ""slovenský internet"", ""Systém získavania informácií v slovenskom jazyku""]","[""Ján Holp""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0340,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.030095,,"Aká je téma práce osoby Matej Ščišľak, ak jej dokument zároveň obsahuje kľúčové slovo GraphRAG?","[""Matej Ščišľak"", ""GraphRAG"", ""Znalostné grafy pre zlepšenie vyhľadávania právnych informácií""]","[""Matej Ščišľak""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_scislak/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0341,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029634,,"Aká je téma práce osoby Michal Stromko, ak jej dokument zároveň obsahuje kľúčové slovo Elasticsearch?","[""Michal Stromko"", ""Elasticsearch"", ""Indexovanie slovenského textu pomocou Elasticsearch""]","[""Michal Stromko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0343,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028785,,"Aká je téma práce osoby Yevhenii Medushivskyi, ak jej dokument zároveň obsahuje kľúčové slovo crawler?","[""Yevhenii Medushivskyi"", ""crawler"", ""Získavanie textu z webových stránok""]","[""Yevhenii Medushivskyi""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0344,dev,person_keyword_title,hard,False,0.666667,0.5,0.0,0.0,1.0,1.0,0.0,True,0.028391,,"Aká je téma práce osoby Vladimír Ferko, ak jej dokument zároveň obsahuje kľúčové slovo hate speech?","[""Vladimír Ferko"", ""hate speech"", ""Anotácia a vyhodnotenie slovenskej databázy nenávistnej reči""]","[""Vladimír Ferko"", ""hate speech""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]",[],"[""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/vladimir_ferko/README.md""]",[],"[""entity_resolution""]"
|
||||||
|
g0345,dev,person_keyword_title,hard,False,0.666667,0.5,0.666667,0.0,1.0,1.0,1.0,True,0.027662,,"Aká je téma práce osoby Maroš Harahus, ak jej dokument zároveň obsahuje kľúčové slovo Spacy?","[""Maroš Harahus"", ""Spacy"", ""Neurónová morfologická anotácia slovenského jazyka""]","[""Maroš Harahus"", ""Spacy""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0346,dev,person_keyword_title,hard,False,0.666667,0.5,0.666667,0.0,1.0,1.0,1.0,True,0.027414,,"Aká je téma práce osoby Valerii Kutsenko, ak jej dokument zároveň obsahuje kľúčové slovo RAG?","[""Valerii Kutsenko"", ""RAG"", ""Zlepšenie vyhľadávania pomocou znalostných grafov""]","[""Valerii Kutsenko"", ""RAG""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0347,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028609,,"Aká je téma práce osoby Patrik Pavlišin, ak jej dokument zároveň obsahuje kľúčové slovo paralelný korpus?","[""Patrik Pavlišin"", ""paralelný korpus"", ""Metódy automatického prekladu""]","[""Patrik Pavlišin""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0348,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.02798,,"Aká je téma práce osoby Vladimír Ferko, ak jej dokument zároveň obsahuje kľúčové slovo SlovakBERT?","[""Vladimír Ferko"", ""SlovakBERT"", ""Anotácia a vyhodnotenie slovenskej databázy nenávistnej reči""]","[""Vladimír Ferko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0349,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029793,,"Aká je téma práce osoby Vladimír Ferko, ak jej dokument zároveň obsahuje kľúčové slovo anotácia?","[""Vladimír Ferko"", ""anotácia"", ""Anotácia a vyhodnotenie slovenskej databázy nenávistnej reči""]","[""Vladimír Ferko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0353,dev,person_keyword_title,hard,False,0.666667,0.5,0.666667,0.0,1.0,1.0,1.0,True,0.031294,,"Aká je téma práce osoby Dominik Nagy, ak jej dokument zároveň obsahuje kľúčové slovo strojový preklad?","[""Dominik Nagy"", ""strojový preklad"", ""Neurónový strojový preklad pomocou knižnice Fairseq""]","[""Dominik Nagy"", ""strojový preklad""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0354,dev,person_keyword_title,hard,False,0.666667,0.5,0.666667,0.0,1.0,1.0,1.0,True,0.028929,,"Aká je téma práce osoby Ondrej Megela, ak jej dokument zároveň obsahuje kľúčové slovo BERT?","[""Ondrej Megela"", ""BERT"", ""Neurónové jazykové modelovanie typu BERT""]","[""Ondrej Megela"", ""BERT""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0355,dev,person_keyword_title,hard,False,0.666667,0.5,0.666667,0.0,1.0,1.0,1.0,True,0.028717,,"Aká je téma práce osoby Ján Holp, ak jej dokument zároveň obsahuje kľúčové slovo PageRank?","[""Ján Holp"", ""PageRank"", ""Systém získavania informácií v slovenskom jazyku""]","[""Ján Holp"", ""PageRank""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0359,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028991,,"Aká je téma práce osoby Simona Bobrovčanová, ak jej dokument zároveň obsahuje kľúčové slovo právne dokumenty?","[""Simona Bobrovčanová"", ""právne dokumenty"", ""Automatická sumarizácia slovenského textu""]","[""Simona Bobrovčanová""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0361,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028392,,"Aká je téma práce osoby Michal Stromko, ak jej dokument zároveň obsahuje kľúčové slovo FAISS?","[""Michal Stromko"", ""FAISS"", ""Indexovanie slovenského textu pomocou Elasticsearch""]","[""Michal Stromko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0364,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.029142,,"Aká je téma práce osoby Daniil Huzenko, ak jej dokument zároveň obsahuje kľúčové slovo Kubernetes?","[""Daniil Huzenko"", ""Kubernetes"", ""Testovanie hybridného klaudu s využiťím kombinácie verejného a privátneho riešenia""]","[""Daniil Huzenko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0366,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028938,,"Aká je téma práce osoby Ondrej Megela, ak jej dokument zároveň obsahuje kľúčové slovo jazykové modelovanie?","[""Ondrej Megela"", ""jazykové modelovanie"", ""Neurónové jazykové modelovanie typu BERT""]","[""Ondrej Megela""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0368,dev,person_keyword_title,hard,False,0.333333,0.0,0.666667,0.0,1.0,1.0,1.0,True,0.028228,,"Aká je téma práce osoby Daniil Huzenko, ak jej dokument zároveň obsahuje kľúčové slovo Raspberry Pi?","[""Daniil Huzenko"", ""Raspberry Pi"", ""Testovanie hybridného klaudu s využiťím kombinácie verejného a privátneho riešenia""]","[""Daniil Huzenko""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""AUTHORED""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""person_keyword""]","[""entity_resolution"", ""person_keyword_constraints""]"
|
||||||
|
g0375,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.153796,,Ktorý autor dokumentu je pri osobe Michal Stromko spojený s kategóriou bp2022?,"[""Daniel Hladek"", ""bp2022"", ""Michal Stromko""]","[""bp2022"", ""Michal Stromko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0376,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028261,,Ktorý autor dokumentu je pri osobe Yevhenii Medushivskyi spojený s kategóriou bp2026?,"[""Daniel Hladek"", ""bp2026"", ""Yevhenii Medushivskyi""]","[""bp2026"", ""Yevhenii Medushivskyi""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0379,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027673,,Ktorý autor dokumentu je pri osobe Kristián Sopkovič spojený s kategóriou bp2022?,"[""Daniel Hladek"", ""bp2022"", ""Kristián Sopkovič""]","[""bp2022"", ""Kristián Sopkovič""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0380,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028244,,Ktorý autor dokumentu je pri osobe Michal Stromko spojený s kategóriou dp2024?,"[""Daniel Hladek"", ""dp2024"", ""Michal Stromko""]","[""dp2024"", ""Michal Stromko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0381,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027295,,Ktorý autor dokumentu je pri osobe Dominik Nagy spojený s kategóriou bp2019?,"[""Daniel Hladek"", ""bp2019"", ""Dominik Nagy""]","[""bp2019"", ""Dominik Nagy""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/dominik_nagy/README.md""]","[""pages/students/2016/dominik_nagy/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0382,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028747,,Ktorý autor dokumentu je pri osobe Rostyslav Rodzhuk spojený s kategóriou vp2025?,"[""Daniel Hladek"", ""vp2025"", ""Rostyslav Rodzhuk""]","[""vp2025"", ""Rostyslav Rodzhuk""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0385,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027602,,Ktorý autor dokumentu je pri osobe Oliver Pejic spojený s kategóriou iaeste?,"[""Daniel Hladek"", ""iaeste"", ""Oliver Pejic""]","[""iaeste"", ""Oliver Pejic""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/interns/oliver_pejic/README.md""]","[""pages/interns/oliver_pejic/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0386,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028223,,Ktorý autor dokumentu je pri osobe Vladimír Ferko spojený s kategóriou bp2024?,"[""Daniel Hladek"", ""bp2024"", ""Vladimír Ferko""]","[""bp2024"", ""Vladimír Ferko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2021/vladimir_ferko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0387,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028469,,Ktorý autor dokumentu je pri osobe Jakub Maruniak spojený s kategóriou bp2019?,"[""Daniel Hladek"", ""bp2019"", ""Jakub Maruniak""]","[""bp2019"", ""Jakub Maruniak""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/jakub_maruniak/README.md""]","[""pages/students/2016/jakub_maruniak/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0388,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027666,,Ktorý autor dokumentu je pri osobe Ondrej Megela spojený s kategóriou dp2023?,"[""Daniel Hladek"", ""dp2023"", ""Ondrej Megela""]","[""dp2023"", ""Ondrej Megela""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0389,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.036295,,Ktorý autor dokumentu je pri osobe Dávid Omasta spojený s kategóriou dp2024?,"[""Daniel Hladek"", ""dp2024"", ""Dávid Omasta""]","[""dp2024"", ""Dávid Omasta""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2018/david_omasta/README.md""]","[""pages/students/2018/david_omasta/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0390,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027595,,Ktorý autor dokumentu je pri osobe Tomáš Kuchárik spojený s kategóriou dp2021?,"[""Daniel Hladek"", ""dp2021"", ""Tomáš Kuchárik""]","[""dp2021"", ""Tomáš Kuchárik""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0392,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028893,,Ktorý autor dokumentu je pri osobe Dominik Nagy spojený s kategóriou dp2022?,"[""Daniel Hladek"", ""dp2022"", ""Dominik Nagy""]","[""dp2022"", ""Dominik Nagy""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/dominik_nagy/README.md""]","[""pages/students/2016/dominik_nagy/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0393,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027134,,Ktorý autor dokumentu je pri osobe Matej Novotný spojený s kategóriou dp2026?,"[""Daniel Hladek"", ""dp2026"", ""Matej Novotný""]","[""dp2026"", ""Matej Novotný""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2021/matej_novotny/README.md""]","[""pages/students/2021/matej_novotny/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0394,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028299,,Ktorý autor dokumentu je pri osobe Simona Bobrovčanová spojený s kategóriou bp2026?,"[""Daniel Hladek"", ""bp2026"", ""Simona Bobrovčanová""]","[""bp2026"", ""Simona Bobrovčanová""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0396,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027544,,Ktorý autor dokumentu je pri osobe Maroš Harahus spojený s kategóriou bp2019?,"[""Daniel Hladek"", ""bp2019"", ""Maroš Harahus""]","[""bp2019"", ""Maroš Harahus""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0397,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027524,,Ktorý autor dokumentu je pri osobe Valerii Kutsenko spojený s kategóriou bp2025?,"[""Daniel Hladek"", ""bp2025"", ""Valerii Kutsenko""]","[""bp2025"", ""Valerii Kutsenko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0398,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027538,,Ktorý autor dokumentu je pri osobe Patrik Pavlišin spojený s kategóriou bp2020?,"[""Daniel Hladek"", ""bp2020"", ""Patrik Pavlišin""]","[""bp2020"", ""Patrik Pavlišin""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0400,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.026552,,Ktorý autor dokumentu je pri osobe Ján Holp spojený s kategóriou bp2019?,"[""Daniel Hladek"", ""bp2019"", ""Ján Holp""]","[""bp2019"", ""Ján Holp""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0405,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027752,,Ktorý autor dokumentu je pri osobe Matej Ščišľak spojený s kategóriou bp2024?,"[""Daniel Hladek"", ""bp2024"", ""Matej Ščišľak""]","[""bp2024"", ""Matej Ščišľak""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_scislak/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0407,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027891,,Ktorý autor dokumentu je pri osobe Samuel Džurina spojený s kategóriou bp2026?,"[""Daniel Hladek"", ""bp2026"", ""Samuel Džurina""]","[""bp2026"", ""Samuel Džurina""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2023/samuel_dzurina/README.md""]","[""pages/students/2023/samuel_dzurina/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0408,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028494,,Ktorý autor dokumentu je pri osobe Patrik Pavlišin spojený s kategóriou dp2022?,"[""Daniel Hladek"", ""dp2022"", ""Patrik Pavlišin""]","[""dp2022"", ""Patrik Pavlišin""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0410,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028488,,Ktorý autor dokumentu je pri osobe Bogdan Paul Chiș spojený s kategóriou erasmus?,"[""Daniel Hladek"", ""erasmus"", ""Bogdan Paul Chiș""]","[""erasmus"", ""Bogdan Paul Chiș""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/interns/bogdan_paul_chis/README.md""]","[""pages/interns/bogdan_paul_chis/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0411,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.031137,,Ktorý autor dokumentu je pri osobe Ján Holp spojený s kategóriou dp2021?,"[""Daniel Hladek"", ""dp2021"", ""Ján Holp""]","[""dp2021"", ""Ján Holp""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0412,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027863,,Ktorý autor dokumentu je pri osobe Ján Pták spojený s kategóriou dp2027?,"[""Daniel Hladek"", ""dp2027"", ""Ján Pták""]","[""dp2027"", ""Ján Pták""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2022/jan_ptak/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0415,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.027939,,Ktorý autor dokumentu je pri osobe Cesar Abascal Gutierrez spojený s kategóriou iaeste?,"[""Daniel Hladek"", ""iaeste"", ""Cesar Abascal Gutierrez""]","[""iaeste"", ""Cesar Abascal Gutierrez""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/interns/cesar_gutierrez/README.md""]","[""pages/interns/cesar_gutierrez/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0416,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028572,,Ktorý autor dokumentu je pri osobe Ondrej Megela spojený s kategóriou bp2021?,"[""Daniel Hladek"", ""bp2021"", ""Ondrej Megela""]","[""bp2021"", ""Ondrej Megela""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0417,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.029142,,Ktorý autor dokumentu je pri osobe Tomáš Kuchárik spojený s kategóriou dp2022?,"[""Daniel Hladek"", ""dp2022"", ""Tomáš Kuchárik""]","[""dp2022"", ""Tomáš Kuchárik""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0420,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.029065,,Ktorý autor dokumentu je pri osobe Michal Stromko spojený s kategóriou vp2021?,"[""Daniel Hladek"", ""vp2021"", ""Michal Stromko""]","[""vp2021"", ""Michal Stromko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0422,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028352,,Ktorý autor dokumentu je pri osobe Rostyslav Rodzhuk spojený s kategóriou bp2026?,"[""Daniel Hladek"", ""bp2026"", ""Rostyslav Rodzhuk""]","[""bp2026"", ""Rostyslav Rodzhuk""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0424,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028834,,Ktorý autor dokumentu je pri osobe Valerii Kutsenko spojený s kategóriou vp2024?,"[""Daniel Hladek"", ""vp2024"", ""Valerii Kutsenko""]","[""vp2024"", ""Valerii Kutsenko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0425,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.028966,,Ktorý autor dokumentu je pri osobe Kristián Sopkovič spojený s kategóriou dp2024?,"[""Daniel Hladek"", ""dp2024"", ""Kristián Sopkovič""]","[""dp2024"", ""Kristián Sopkovič""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0426,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.029325,,Ktorý autor dokumentu je pri osobe Artem Yatsenko spojený s kategóriou bp2022?,"[""Daniel Hladek"", ""bp2022"", ""Artem Yatsenko""]","[""bp2022"", ""Artem Yatsenko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0427,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.029179,,Ktorý autor dokumentu je pri osobe Maroš Harahus spojený s kategóriou dp2021?,"[""Daniel Hladek"", ""dp2021"", ""Maroš Harahus""]","[""dp2021"", ""Maroš Harahus""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0433,dev,document_author_category_multi_hop,hard,False,0.666667,0.5,0.666667,1.0,1.0,1.0,1.0,True,0.029357,,Ktorý autor dokumentu je pri osobe Daniil Huzenko spojený s kategóriou bp2025?,"[""Daniel Hladek"", ""bp2025"", ""Daniil Huzenko""]","[""bp2025"", ""Daniil Huzenko""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""pages/students/2022/daniil_huzenko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0435,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.184065,,V ktorých kategóriách sa nachádzajú dokumenty osoby Dávid Omasta?,"[""Dávid Omasta"", ""dp2023"", ""dp2024"", ""Daniel Hladek""]","[""Dávid Omasta"", ""dp2023"", ""dp2024""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2018/david_omasta/README.md""]","[""pages/students/2018/david_omasta/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0436,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.031751,,V ktorých kategóriách sa nachádzajú dokumenty osoby Ondrej Megela?,"[""Ondrej Megela"", ""bp2021"", ""dp2023"", ""Daniel Hladek""]","[""Ondrej Megela"", ""bp2021"", ""dp2023""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0438,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,False,0.03025,,V ktorých kategóriách sa nachádzajú dokumenty osoby Dominik Nagy?,"[""Dominik Nagy"", ""bp2019"", ""dp2022"", ""Daniel Hladek""]","[""Dominik Nagy"", ""bp2019"", ""dp2022""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/dominik_nagy/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0439,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,False,0.03103,,V ktorých kategóriách sa nachádzajú dokumenty osoby Maroš Harahus?,"[""Maroš Harahus"", ""bp2019"", ""dp2021"", ""Daniel Hladek""]","[""Maroš Harahus"", ""bp2019"", ""dp2021""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2016/maros_harahus/timovy_projekt/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0440,dev,person_multiple_categories,hard,False,0.8,0.75,0.666667,1.0,1.0,1.0,1.0,True,0.028708,,V ktorých kategóriách sa nachádzajú dokumenty osoby Valerii Kutsenko?,"[""Valerii Kutsenko"", ""bp2025"", ""dp2027"", ""vp2024"", ""Daniel Hladek""]","[""Valerii Kutsenko"", ""bp2025"", ""dp2027"", ""vp2024""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0442,dev,person_multiple_categories,hard,False,0.8,0.75,0.666667,1.0,1.0,1.0,1.0,True,0.029985,,V ktorých kategóriách sa nachádzajú dokumenty osoby Patrik Pavlišin?,"[""Patrik Pavlišin"", ""bp2020"", ""dp2022"", ""tp2021"", ""Daniel Hladek""]","[""Patrik Pavlišin"", ""bp2020"", ""dp2022"", ""tp2021""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0443,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.029173,,V ktorých kategóriách sa nachádzajú dokumenty osoby Kristián Sopkovič?,"[""Kristián Sopkovič"", ""bp2022"", ""dp2024"", ""Daniel Hladek""]","[""Kristián Sopkovič"", ""bp2022"", ""dp2024""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0445,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.029604,,V ktorých kategóriách sa nachádzajú dokumenty osoby Tomáš Kuchárik?,"[""Tomáš Kuchárik"", ""dp2021"", ""dp2022"", ""Daniel Hladek""]","[""Tomáš Kuchárik"", ""dp2021"", ""dp2022""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0447,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,False,0.02739,,V ktorých kategóriách sa nachádzajú dokumenty osoby Ján Holp?,"[""Ján Holp"", ""bp2019"", ""dp2021"", ""Daniel Hladek""]","[""Ján Holp"", ""bp2019"", ""dp2021""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/jan_holp/timovy_projekt/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0449,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,False,0.028133,,V ktorých kategóriách sa nachádzajú dokumenty osoby Jakub Maruniak?,"[""Jakub Maruniak"", ""bp2019"", ""dp2021"", ""Daniel Hladek""]","[""Jakub Maruniak"", ""bp2019"", ""dp2021""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/jakub_maruniak/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jakub_maruniak/timovy_projekt/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0450,dev,person_multiple_categories,hard,False,0.8,0.75,0.666667,1.0,1.0,1.0,1.0,True,0.035036,,V ktorých kategóriách sa nachádzajú dokumenty osoby Michal Stromko?,"[""Michal Stromko"", ""bp2022"", ""dp2024"", ""vp2021"", ""Daniel Hladek""]","[""Michal Stromko"", ""bp2022"", ""dp2024"", ""vp2021""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/michal_stromko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0452,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.02772,,V ktorých kategóriách sa nachádzajú dokumenty osoby Matej Ščišľak?,"[""Matej Ščišľak"", ""bp2024"", ""dp2026"", ""Daniel Hladek""]","[""Matej Ščišľak"", ""bp2024"", ""dp2026""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2021/matej_scislak/README.md""]","[""pages/students/2021/matej_scislak/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0453,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.030173,,V ktorých kategóriách sa nachádzajú dokumenty osoby Rostyslav Rodzhuk?,"[""Rostyslav Rodzhuk"", ""bp2026"", ""vp2025"", ""Daniel Hladek""]","[""Rostyslav Rodzhuk"", ""bp2026"", ""vp2025""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""pages/students/2023/rostyslav_rodzhuk/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0454,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.028498,,V ktorých kategóriách sa nachádzajú dokumenty osoby Dávid Omasta?,"[""Dávid Omasta"", ""dp2023"", ""dp2024"", ""Daniel Hladek""]","[""Dávid Omasta"", ""dp2023"", ""dp2024""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2018/david_omasta/README.md""]","[""pages/students/2018/david_omasta/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0455,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.028798,,V ktorých kategóriách sa nachádzajú dokumenty osoby Ondrej Megela?,"[""Ondrej Megela"", ""bp2021"", ""dp2023"", ""Daniel Hladek""]","[""Ondrej Megela"", ""bp2021"", ""dp2023""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2018/ondrej_megela/README.md""]","[""pages/students/2018/ondrej_megela/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0457,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,False,0.028697,,V ktorých kategóriách sa nachádzajú dokumenty osoby Dominik Nagy?,"[""Dominik Nagy"", ""bp2019"", ""dp2022"", ""Daniel Hladek""]","[""Dominik Nagy"", ""bp2019"", ""dp2022""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/dominik_nagy/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2016/dominik_nagy/timovy_projekt/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0458,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,False,0.028939,,V ktorých kategóriách sa nachádzajú dokumenty osoby Maroš Harahus?,"[""Maroš Harahus"", ""bp2019"", ""dp2021"", ""Daniel Hladek""]","[""Maroš Harahus"", ""bp2019"", ""dp2021""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/maros_harahus/README.md""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2016/maros_harahus/timovy_projekt/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0459,dev,person_multiple_categories,hard,False,0.8,0.75,0.666667,1.0,1.0,1.0,1.0,True,0.028236,,V ktorých kategóriách sa nachádzajú dokumenty osoby Valerii Kutsenko?,"[""Valerii Kutsenko"", ""bp2025"", ""dp2027"", ""vp2024"", ""Daniel Hladek""]","[""Valerii Kutsenko"", ""bp2025"", ""dp2027"", ""vp2024""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""pages/students/2022/valerii_kutsenko/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0461,dev,person_multiple_categories,hard,False,0.8,0.75,0.666667,1.0,1.0,1.0,1.0,True,0.028675,,V ktorých kategóriách sa nachádzajú dokumenty osoby Patrik Pavlišin?,"[""Patrik Pavlišin"", ""bp2020"", ""dp2022"", ""tp2021"", ""Daniel Hladek""]","[""Patrik Pavlišin"", ""bp2020"", ""dp2022"", ""tp2021""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0462,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.029873,,V ktorých kategóriách sa nachádzajú dokumenty osoby Kristián Sopkovič?,"[""Kristián Sopkovič"", ""bp2022"", ""dp2024"", ""Daniel Hladek""]","[""Kristián Sopkovič"", ""bp2022"", ""dp2024""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/kristian_sopkovic/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0464,dev,person_multiple_categories,hard,False,0.75,0.666667,0.666667,1.0,1.0,1.0,1.0,True,0.028317,,V ktorých kategóriách sa nachádzajú dokumenty osoby Tomáš Kuchárik?,"[""Tomáš Kuchárik"", ""dp2021"", ""dp2022"", ""Daniel Hladek""]","[""Tomáš Kuchárik"", ""dp2021"", ""dp2022""]","[""HAS_DOCUMENT"", ""IN_CATEGORY"", ""AUTHORED_DOCUMENT""]","[""HAS_DOCUMENT"", ""IN_CATEGORY""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""pages/students/2016/tomas_kucharik/README.md""]","[""person_category""]","[""entity_resolution"", ""person_category_constraints""]"
|
||||||
|
g0465,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.75,True,0.545304,,"Z kandidátov Jakub Maruniak, Ján Holp, Maroš Harahus, Artem Yatsenko vyber všetky osoby, pri ktorých je práca uvedená v roku 2021. Koľko ich je?","[""Jakub Maruniak"", ""Ján Holp"", ""Maroš Harahus"", ""3"", ""2021""]","[""Jakub Maruniak"", ""Ján Holp"", ""Maroš Harahus"", ""3"", ""2021""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0466,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.75,True,0.036384,,"Z kandidátov Artem Yatsenko, Dominik Nagy, Kristián Sopkovič, Daniil Huzenko vyber všetky osoby, pri ktorých je práca uvedená v roku 2022. Koľko ich je?","[""Artem Yatsenko"", ""Dominik Nagy"", ""Kristián Sopkovič"", ""3"", ""2022""]","[""Artem Yatsenko"", ""Dominik Nagy"", ""Kristián Sopkovič"", ""3"", ""2022""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2022/daniil_huzenko/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2022/daniil_huzenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0469,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.666667,True,0.038695,,"Z kandidátov Ondrej Megela, Patrik Pavlišin, Artem Yatsenko vyber všetky osoby, pri ktorých je práca uvedená v roku 2020. Koľko ich je?","[""Ondrej Megela"", ""Patrik Pavlišin"", ""2"", ""2020""]","[""Ondrej Megela"", ""Patrik Pavlišin"", ""2"", ""2020""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0471,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.666667,True,0.036198,,"Z kandidátov Dávid Omasta, Vladimír Ferko, Artem Yatsenko vyber všetky osoby, pri ktorých je práca uvedená v roku 2024. Koľko ich je?","[""Dávid Omasta"", ""Vladimír Ferko"", ""2"", ""2024""]","[""Dávid Omasta"", ""Vladimír Ferko"", ""2"", ""2024""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""pages/students/2018/david_omasta/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/vladimir_ferko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0473,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.75,True,0.036599,,"Z kandidátov Ján Pták, Matej Novotný, Matej Ščišľak, Artem Yatsenko vyber všetky osoby, pri ktorých je práca uvedená v roku 2026. Koľko ich je?","[""Ján Pták"", ""Matej Novotný"", ""Matej Ščišľak"", ""3"", ""2026""]","[""Ján Pták"", ""Matej Novotný"", ""Matej Ščišľak"", ""3"", ""2026""]",[],"[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_WORK""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2021/matej_novotny/README.md"", ""pages/students/2021/matej_scislak/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints""]"
|
||||||
|
g0475,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.666667,True,0.035993,,"Z kandidátov Daniil Huzenko, Tetiana Mohorian, Artem Yatsenko vyber všetky osoby, pri ktorých je práca uvedená v roku 2025. Koľko ich je?","[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2"", ""2025""]","[""Daniil Huzenko"", ""Tetiana Mohorian"", ""2"", ""2025""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0476,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.75,True,0.036956,,"Ktoré osoby zo zoznamu Jakub Maruniak, Ján Holp, Maroš Harahus, Artem Yatsenko zdieľajú rok práce 2021? Uveď aj ich počet.","[""Jakub Maruniak"", ""Ján Holp"", ""Maroš Harahus"", ""3"", ""2021""]","[""Jakub Maruniak"", ""Ján Holp"", ""Maroš Harahus"", ""3"", ""2021""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md"", ""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0477,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.75,True,0.03636,,"Ktoré osoby zo zoznamu Artem Yatsenko, Dominik Nagy, Kristián Sopkovič, Daniil Huzenko zdieľajú rok práce 2022? Uveď aj ich počet.","[""Artem Yatsenko"", ""Dominik Nagy"", ""Kristián Sopkovič"", ""3"", ""2022""]","[""Artem Yatsenko"", ""Dominik Nagy"", ""Kristián Sopkovič"", ""3"", ""2022""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2022/daniil_huzenko/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md"", ""pages/students/2022/daniil_huzenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0480,dev,candidate_set_aggregation,hard,False,1.0,1.0,1.0,1.0,1.0,1.0,0.666667,True,0.035403,,"Ktoré osoby zo zoznamu Ondrej Megela, Patrik Pavlišin, Artem Yatsenko zdieľajú rok práce 2020? Uveď aj ich počet.","[""Ondrej Megela"", ""Patrik Pavlišin"", ""2"", ""2020""]","[""Ondrej Megela"", ""Patrik Pavlišin"", ""2"", ""2020""]",[],"[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/patrik_pavlisin/README.md"", ""pages/students/2018/ondrej_megela/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0484,dev,conjunctive_disambiguation,hard,False,0.666667,0.666667,1.0,1.0,1.0,1.0,1.0,True,0.13348,,Ktorá z osôb Ján Pták a Matej Novotný spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo OpenWebUI a jej práca je uvedená v roku 2026?,"[""Ján Pták"", ""OpenWebUI"", ""2026""]","[""Ján Pták"", ""2026""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""pages/students/2021/matej_novotny/README.md"", ""pages/students/2022/jan_ptak/README.md""]","[""person_keyword"", ""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0485,dev,conjunctive_disambiguation,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.082219,,Ktorá z osôb Michal Stromko a Artem Yatsenko spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo Elasticsearch a jej práca je uvedená v roku 2022?,"[""Michal Stromko"", ""Elasticsearch"", ""2022""]","[""Michal Stromko"", ""Elasticsearch"", ""2022""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""person_keyword"", ""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0486,dev,conjunctive_disambiguation,hard,False,1.0,1.0,0.0,1.0,1.0,1.0,1.0,True,0.144909,,Ktorá z osôb Tetiana Mohorian a Daniil Huzenko spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo LLM a jej práca je uvedená v roku 2025?,"[""Tetiana Mohorian"", ""LLM"", ""2025""]","[""Tetiana Mohorian"", ""LLM"", ""2025""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints""]"
|
||||||
|
g0488,dev,conjunctive_disambiguation,hard,False,0.666667,0.666667,1.0,1.0,1.0,1.0,1.0,True,0.037351,,Ktorá z osôb Michal Stromko a Artem Yatsenko spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo FAISS a jej práca je uvedená v roku 2022?,"[""Michal Stromko"", ""FAISS"", ""2022""]","[""Michal Stromko"", ""2022""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/michal_stromko/README.md""]","[""person_keyword"", ""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0490,dev,conjunctive_disambiguation,hard,False,0.666667,0.666667,1.0,1.0,1.0,1.0,1.0,True,0.049448,,Ktorá z osôb Tetiana Mohorian a Daniil Huzenko spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo prompting a jej práca je uvedená v roku 2025?,"[""Tetiana Mohorian"", ""prompting"", ""2025""]","[""Tetiana Mohorian"", ""2025""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""pages/students/2022/daniil_huzenko/README.md"", ""pages/students/2022/tetiana_mohorian/README.md""]","[""person_keyword"", ""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0492,dev,conjunctive_disambiguation,hard,False,0.666667,0.666667,1.0,1.0,1.0,1.0,1.0,True,0.036791,,Ktorá z osôb Yevhenii Medushivskyi a Ján Pták spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo webový korpus a jej práca je uvedená v roku 2026?,"[""Yevhenii Medushivskyi"", ""webový korpus"", ""2026""]","[""Yevhenii Medushivskyi"", ""2026""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/yevhenii_medushivskyi/README.md""]","[""person_keyword"", ""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0493,dev,conjunctive_disambiguation,hard,False,0.666667,0.666667,1.0,1.0,1.0,1.0,1.0,True,0.038163,,Ktorá z osôb Simona Bobrovčanová a Ján Pták spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo právne dokumenty a jej práca je uvedená v roku 2026?,"[""Simona Bobrovčanová"", ""právne dokumenty"", ""2026""]","[""Simona Bobrovčanová"", ""2026""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD"", ""HAS_WORK""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""pages/students/2022/jan_ptak/README.md"", ""pages/students/2023/simona_bobrovcanova/README.md""]","[""person_keyword"", ""person_thesis"", ""person_work""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""work_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0495,dev,conjunctive_disambiguation,hard,False,0.666667,0.666667,1.0,1.0,1.0,1.0,1.0,True,0.039789,,Ktorá z osôb Kristián Sopkovič a Artem Yatsenko spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo slovenčina a jej práca je uvedená v roku 2022?,"[""Kristián Sopkovič"", ""slovenčina"", ""2022""]","[""Kristián Sopkovič"", ""2022""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2019/artem_yatsenko/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""person_keyword"", ""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0498,dev,conjunctive_disambiguation,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.038549,,Ktorá z osôb Maroš Harahus a Artem Yatsenko spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo Spacy a jej práca je uvedená v roku 2021?,"[""Maroš Harahus"", ""Spacy"", ""2021""]","[""Maroš Harahus"", ""Spacy"", ""2021""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""pages/students/2016/maros_harahus/README.md"", ""pages/students/2019/artem_yatsenko/README.md""]","[""person_keyword"", ""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0499,dev,conjunctive_disambiguation,hard,False,0.666667,0.666667,1.0,1.0,1.0,1.0,1.0,True,0.037694,,Ktorá z osôb Ján Holp a Jakub Maruniak spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo slovenský internet a jej práca je uvedená v roku 2021?,"[""Ján Holp"", ""slovenský internet"", ""2021""]","[""Ján Holp"", ""2021""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md""]","[""pages/students/2016/jakub_maruniak/README.md"", ""pages/students/2016/jan_holp/README.md""]","[""person_keyword"", ""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""person_keyword_constraints""]"
|
||||||
|
g0500,dev,conjunctive_disambiguation,hard,True,1.0,1.0,1.0,1.0,1.0,1.0,1.0,True,0.039232,,Ktorá z osôb Kristián Sopkovič a Dominik Nagy spĺňa obe podmienky: jej dokument obsahuje kľúčové slovo Spacy a jej práca je uvedená v roku 2022?,"[""Kristián Sopkovič"", ""Spacy"", ""2022""]","[""Kristián Sopkovič"", ""Spacy"", ""2022""]","[""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""AUTHORED"", ""EVIDENCED_BY"", ""HAS_DOCUMENT"", ""HAS_KEYWORD""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""pages/students/2016/dominik_nagy/README.md"", ""pages/students/2019/kristian_sopkovic/README.md""]","[""person_keyword"", ""person_thesis""]","[""entity_resolution"", ""graph_traversal"", ""thesis_constraints"", ""person_keyword_constraints""]"
|
||||||
|
26938
tools/graphrag/evaluation/results/archive_pre_v1/graphrag_dev.json
Normal file
26938
tools/graphrag/evaluation/results/archive_pre_v1/graphrag_dev.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,11 @@
|
|||||||
|
# GraphRAG v2 — zmrazené meranie 25. 10. 2026
|
||||||
|
|
||||||
|
- DEV: **509/509 (100 %)**, TEST: **67/80 (83,75 %)**, runtime chyby: 0.
|
||||||
|
- Celá testovacia sada: 426 passed, 4 skipped; vrátane 10 skutočných Neo4j rollback testov.
|
||||||
|
- Pôvodných 500 otázok je odteraz iba DEV/regresia. 128 chybných predpokladov o tagoch má overenú no-answer anotáciu a 9 otázok má opravené úplné kategórie.
|
||||||
|
- Nový TEST má 80 prípadov z 24 profilov bez prekryvu s DEV. Tagy, autori, korpus a rodiny šablón sú spoločné; nejde o dôkaz všeobecnej presnosti.
|
||||||
|
- Všetky zdroje boli anotované nezávislým parserom pôvodného Markdownu. Fakty sa hodnotia ako prepojené typované dôkazy vrátane správneho významu roku a platných alternatív zdrojov.
|
||||||
|
- 13 TEST zlyhaní je zachovaných v `holdout_failures.json`: formulácia tagu pred osobami a meno s číslicou. Verzia v2 sa po meraní neupravuje. Ak sa podľa zistení ďalej vyvíja, tieto otázky prechádzajú do DEV a nová verzia potrebuje nový holdout.
|
||||||
|
- Latencia je iba čas grafového vyhľadávania, bez LLM/OpenWebUI. Podrobné metriky a odtlačky obsahujú JSON/CSV a `../../frozen_v2.json`.
|
||||||
|
|
||||||
|
Historické v1 (152/214) a v2 (67/80) majú rozdielne datasety/evaluatory; samotný rozdiel percent nemožno vydávať za kontrolovaný experiment zlepšenia.
|
||||||
File diff suppressed because one or more lines are too long
88795
tools/graphrag/evaluation/results/final_v2_2026-10-25/graphrag_dev.json
Normal file
88795
tools/graphrag/evaluation/results/final_v2_2026-10-25/graphrag_dev.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
15105
tools/graphrag/evaluation/results/final_v2_2026-10-25/graphrag_test.json
Normal file
15105
tools/graphrag/evaluation/results/final_v2_2026-10-25/graphrag_test.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"dev": {
|
||||||
|
"questions": 509,
|
||||||
|
"strict_count": 509,
|
||||||
|
"strict_accuracy": 1.0,
|
||||||
|
"error_count": 0,
|
||||||
|
"value_score": 1.0,
|
||||||
|
"entity_score": 1.0,
|
||||||
|
"relation_score": 1.0,
|
||||||
|
"property_score": 1.0,
|
||||||
|
"relation_choice_score": 1.0,
|
||||||
|
"document_recall": 1.0,
|
||||||
|
"source_recall": 1.0,
|
||||||
|
"binding_score": 1.0,
|
||||||
|
"path_score": 1.0,
|
||||||
|
"answerability_accuracy": 1.0,
|
||||||
|
"latency_mean_seconds": 0.042799,
|
||||||
|
"latency_median_seconds": 0.040359,
|
||||||
|
"latency_p95_seconds": 0.061584
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"questions": 80,
|
||||||
|
"strict_count": 67,
|
||||||
|
"strict_accuracy": 0.8375,
|
||||||
|
"error_count": 0,
|
||||||
|
"value_score": 0.845833,
|
||||||
|
"entity_score": 0.84375,
|
||||||
|
"relation_score": 1.0,
|
||||||
|
"property_score": 1.0,
|
||||||
|
"relation_choice_score": 1.0,
|
||||||
|
"document_recall": 1.0,
|
||||||
|
"source_recall": 1.0,
|
||||||
|
"binding_score": 0.8375,
|
||||||
|
"path_score": 0.8375,
|
||||||
|
"answerability_accuracy": 0.8375,
|
||||||
|
"latency_mean_seconds": 0.046289,
|
||||||
|
"latency_median_seconds": 0.037556,
|
||||||
|
"latency_p95_seconds": 0.054178
|
||||||
|
},
|
||||||
|
"unit_tests": {
|
||||||
|
"passed": 426,
|
||||||
|
"skipped": 4
|
||||||
|
},
|
||||||
|
"freeze_sha256": "233ce6fe63749b921d4c9947a55279ba5912fce0ff819153bfd6aaaf80910a46",
|
||||||
|
"limitations": "13 unseen-subject failures preserved; next version must use a new holdout."
|
||||||
|
}
|
||||||
24305
tools/graphrag/evaluation/results/v2_preparation/legacy_corrections.json
Normal file
24305
tools/graphrag/evaluation/results/v2_preparation/legacy_corrections.json
Normal file
File diff suppressed because it is too large
Load Diff
699
tools/graphrag/evaluation/results/v2_preparation/partition.json
Normal file
699
tools/graphrag/evaluation/results/v2_preparation/partition.json
Normal file
@ -0,0 +1,699 @@
|
|||||||
|
{
|
||||||
|
"seed": 20261024,
|
||||||
|
"strategy": "All previously seen 500 cases are DEV regression. TEST profiles never appeared in legacy start_entities; all real candidate profiles are disjoint.",
|
||||||
|
"dev_count": 509,
|
||||||
|
"test_count": 80,
|
||||||
|
"previously_exposed_profiles_excluded_from_test": [
|
||||||
|
"pages/students/2017/martin_jancura/README.md"
|
||||||
|
],
|
||||||
|
"dev_profiles": [
|
||||||
|
"pages/interns/bogdan_paul_chis/README.md",
|
||||||
|
"pages/interns/cesar_gutierrez/README.md",
|
||||||
|
"pages/interns/oliver_pejic/README.md",
|
||||||
|
"pages/interns/sevval_bulburu/README.md",
|
||||||
|
"pages/interns/yussef_ressaissi/README.md",
|
||||||
|
"pages/students/2016/darius_lindvai/README.md",
|
||||||
|
"pages/students/2016/dominik_nagy/README.md",
|
||||||
|
"pages/students/2016/jakub_maruniak/README.md",
|
||||||
|
"pages/students/2016/jan_holp/README.md",
|
||||||
|
"pages/students/2016/lukas_pokryvka/README.md",
|
||||||
|
"pages/students/2016/mark_feher/README.md",
|
||||||
|
"pages/students/2016/maros_harahus/README.md",
|
||||||
|
"pages/students/2016/patrik_pavlisin/README.md",
|
||||||
|
"pages/students/2016/tomas_kucharik/README.md",
|
||||||
|
"pages/students/2017/dmytro_ushatenko/README.md",
|
||||||
|
"pages/students/2018/david_omasta/README.md",
|
||||||
|
"pages/students/2018/martin_wencel/README.md",
|
||||||
|
"pages/students/2018/ondrej_megela/README.md",
|
||||||
|
"pages/students/2019/alina_vitko/README.md",
|
||||||
|
"pages/students/2019/artem_yatsenko/README.md",
|
||||||
|
"pages/students/2019/filip_tomas/README.md",
|
||||||
|
"pages/students/2019/kristian_sopkovic/README.md",
|
||||||
|
"pages/students/2019/michal_stromko/README.md",
|
||||||
|
"pages/students/2021/eduard_matovka/README.md",
|
||||||
|
"pages/students/2021/martin_sarissky/README.md",
|
||||||
|
"pages/students/2021/matej_novotny/README.md",
|
||||||
|
"pages/students/2021/matej_scislak/README.md",
|
||||||
|
"pages/students/2021/vladimir_ferko/README.md",
|
||||||
|
"pages/students/2022/andrii_pervashov/README.md",
|
||||||
|
"pages/students/2022/daniil_huzenko/README.md",
|
||||||
|
"pages/students/2022/jan_malinovsky/README.md",
|
||||||
|
"pages/students/2022/jan_ptak/README.md",
|
||||||
|
"pages/students/2022/oleh_poiasnik/README.md",
|
||||||
|
"pages/students/2022/samuel_vasil/README.md",
|
||||||
|
"pages/students/2022/tetiana_mohorian/README.md",
|
||||||
|
"pages/students/2022/valerii_kutsenko/README.md",
|
||||||
|
"pages/students/2022/vladyslav_yanchenko/README.md",
|
||||||
|
"pages/students/2023/denis_le_thanh/README.md",
|
||||||
|
"pages/students/2023/maksym_zatirka/README.md",
|
||||||
|
"pages/students/2023/oleksandr_dorybohov/README.md",
|
||||||
|
"pages/students/2023/ronald_zalacko/README.md",
|
||||||
|
"pages/students/2023/rostyslav_rodzhuk/README.md",
|
||||||
|
"pages/students/2023/samuel_dzurina/README.md",
|
||||||
|
"pages/students/2023/simona_bobrovcanova/README.md",
|
||||||
|
"pages/students/2023/yevhenii_medushivskyi/README.md"
|
||||||
|
],
|
||||||
|
"test_profiles": [
|
||||||
|
"pages/students/2016/ediz_morochovic/README.md",
|
||||||
|
"pages/students/2017/than_trung_thanh/README.md",
|
||||||
|
"pages/students/2018/NaN1name_buday/README.md",
|
||||||
|
"pages/students/2018/adrian_remias/README.md",
|
||||||
|
"pages/students/2018/david_ilas/README.md",
|
||||||
|
"pages/students/2018/oleh_bilykh/README.md",
|
||||||
|
"pages/students/2019/david_stromp/README.md",
|
||||||
|
"pages/students/2019/dmytro_mural/README.md",
|
||||||
|
"pages/students/2019/patrik_pokrivcak/README.md",
|
||||||
|
"pages/students/2019/samuel_horani/README.md",
|
||||||
|
"pages/students/2020/david_kostilnik/README.md",
|
||||||
|
"pages/students/2020/jakub_kristian_lukas/README.md",
|
||||||
|
"pages/students/2020/kamil_tomcufcik/README.md",
|
||||||
|
"pages/students/2020/matej_kobylan/README.md",
|
||||||
|
"pages/students/2020/matus_suchanic/README.md",
|
||||||
|
"pages/students/2020/pavol_hudak/README.md",
|
||||||
|
"pages/students/2020/vladyslav_krupko/README.md",
|
||||||
|
"pages/students/2021/artur_hyrenko/README.md",
|
||||||
|
"pages/students/2021/manohar_gowdru_shridharu/README.md",
|
||||||
|
"pages/students/2021/nikita_bodnar/README.md",
|
||||||
|
"pages/students/2021/oleksandr_hryshchenko/README.md",
|
||||||
|
"pages/students/2022/jakub_schwarc/README.md",
|
||||||
|
"pages/students/2022/serhii_yemets/README.md",
|
||||||
|
"pages/students/2022/yevhenii_leonov/README.md"
|
||||||
|
],
|
||||||
|
"dev_groups": [
|
||||||
|
"0050788a45bda43b1222",
|
||||||
|
"0103c15c3c9ba190aeb1",
|
||||||
|
"01fed40ab461e11ee093",
|
||||||
|
"041717b1d52a156b689d",
|
||||||
|
"042ad854987276b5fae7",
|
||||||
|
"051dd2b6d93c1ffd36dd",
|
||||||
|
"060ae15b2cc1ee67e042",
|
||||||
|
"06d333d39be40bfe3201",
|
||||||
|
"06d6e3cffb2176fd7f09",
|
||||||
|
"081950bac679dd5b8f2e",
|
||||||
|
"085915f393eb4a22f1b7",
|
||||||
|
"09abe45ab0019d2dc551",
|
||||||
|
"0a066435e6cc72efaece",
|
||||||
|
"0af90706211c204d9650",
|
||||||
|
"0b9404236ea0ff763cc7",
|
||||||
|
"0bb33c9fb545db6c7efd",
|
||||||
|
"0c018d0b1cbb0e237e9f",
|
||||||
|
"0c5aeb5d8296bc04d986",
|
||||||
|
"0ca664c5db081b2938ab",
|
||||||
|
"0ce6fb00116d00c3eb06",
|
||||||
|
"0d143d9ce8a23195a0c4",
|
||||||
|
"0d5c14ded54417c1bc5c",
|
||||||
|
"0e1cc7c92bda3356abcf",
|
||||||
|
"102c9752f792adabbe31",
|
||||||
|
"105adad4f3450df644b6",
|
||||||
|
"10c7c006019ae33b33f8",
|
||||||
|
"10fccdd7e670913abcf7",
|
||||||
|
"12189f45a9da9e287973",
|
||||||
|
"124dd5427db95b98b3dd",
|
||||||
|
"1332df3ed3789f7b036a",
|
||||||
|
"138ca699884b739f8e5c",
|
||||||
|
"13e4b7c269ad106ade3f",
|
||||||
|
"15aa69ef6dd8c01eea92",
|
||||||
|
"15e3f4152da21f13ba68",
|
||||||
|
"16c0e3be8ec9aff14109",
|
||||||
|
"178cfc213ab65750f963",
|
||||||
|
"17e04ec2656e870a65a6",
|
||||||
|
"18d5030f4fb216cf88bf",
|
||||||
|
"196584dd3a1c0be311c3",
|
||||||
|
"19975879efc9a3c0543e",
|
||||||
|
"19babc3459ab79ae9fbd",
|
||||||
|
"19fc794342b4529bdfb5",
|
||||||
|
"1c0829bc6ca8aec135ab",
|
||||||
|
"1c1ceae7ee00396bff0b",
|
||||||
|
"1d7a0440b3b7b23db8de",
|
||||||
|
"1f02638485671cd575af",
|
||||||
|
"1f1f3c76bf2356a03483",
|
||||||
|
"1f25d5fa12d8e0f927d0",
|
||||||
|
"1f5dc8574d879b802e9f",
|
||||||
|
"1fdb66ab8b7e50782215",
|
||||||
|
"201073002e2a3d9c114d",
|
||||||
|
"225ac2fab461d48837a1",
|
||||||
|
"238ce6b27deaa8850727",
|
||||||
|
"23accd0aac8edfa97641",
|
||||||
|
"276d583995a85ffc618f",
|
||||||
|
"27d4a0adbb9a1395d9e9",
|
||||||
|
"289b4d9aa835de0b5149",
|
||||||
|
"2992c61b66c504901bc2",
|
||||||
|
"2a392ebdea4f8995dbd8",
|
||||||
|
"2a39b124ed7c0db522e0",
|
||||||
|
"2a4658e0300657ac688d",
|
||||||
|
"2b16dd4e680a11ee7e32",
|
||||||
|
"2b54f27c9bb9e504078d",
|
||||||
|
"2c224d36ca4ae00f031e",
|
||||||
|
"2ca41afe293c025f7461",
|
||||||
|
"2cb7f465749b32572c55",
|
||||||
|
"2f81c228e7d4a7245950",
|
||||||
|
"2fb459ca2ecd45f9d636",
|
||||||
|
"2fc6aa95207f6095f9e7",
|
||||||
|
"32590bb3587e2545696f",
|
||||||
|
"32833974157304b75daa",
|
||||||
|
"336175547c48b728d871",
|
||||||
|
"3386127f93618557bb4c",
|
||||||
|
"33895a11fe99d4d8bfb9",
|
||||||
|
"35b103279cc7418ed880",
|
||||||
|
"3601e0886defba5b6e13",
|
||||||
|
"364c79ac377300bbeeb1",
|
||||||
|
"367607d5cead76acf875",
|
||||||
|
"36c17e69e16911c9e274",
|
||||||
|
"37472fdae47e5d35685a",
|
||||||
|
"374b61b37bb743011e59",
|
||||||
|
"380b64507274cec79e0d",
|
||||||
|
"38f40820889b9aeddbc1",
|
||||||
|
"396c842186fb13eda105",
|
||||||
|
"3ad244967ea15c0c83c5",
|
||||||
|
"3b3b6a2a8310ac233010",
|
||||||
|
"3b7e8c83e9cb48e2b3bf",
|
||||||
|
"3bb485022d56f4bb2515",
|
||||||
|
"3c13b559998508b83661",
|
||||||
|
"3c478754fd4ba3d25481",
|
||||||
|
"3c598b13d843def522fc",
|
||||||
|
"3c8224f893e71b535c4b",
|
||||||
|
"3d8163d06a1cbe755054",
|
||||||
|
"3e1010231db22ec0e1ee",
|
||||||
|
"3ea37b5f45f74ef5b575",
|
||||||
|
"3fac44cbc69c99bffe66",
|
||||||
|
"3ff85696eb212d231b57",
|
||||||
|
"4048165233ddb8c0a954",
|
||||||
|
"4051ce34a0447dccf398",
|
||||||
|
"408f182f5a81c0d0ebc3",
|
||||||
|
"409ac6e943a39dd2b7c4",
|
||||||
|
"41f700f58bbc8944ba56",
|
||||||
|
"423404addbc90daef335",
|
||||||
|
"423e26f480f005312e5c",
|
||||||
|
"431a00760487658f1033",
|
||||||
|
"43ac22f0906b7123b613",
|
||||||
|
"453a2b0bedf37bee63c1",
|
||||||
|
"45b9043079a704a753db",
|
||||||
|
"45fc60f4258c9809fad6",
|
||||||
|
"4614a9f8b635de0a8586",
|
||||||
|
"4616dbf3fbfe1b6340a4",
|
||||||
|
"46195c2692d2cb45d6a8",
|
||||||
|
"46c5299ff9202545c1db",
|
||||||
|
"477d6c4333dc132e401f",
|
||||||
|
"4843247cb2b934f0932a",
|
||||||
|
"4856784451591eda36b4",
|
||||||
|
"49c72dec79d95697dde8",
|
||||||
|
"4aa086b434f63f4e585a",
|
||||||
|
"4ba8f4d0878c22b27324",
|
||||||
|
"4c70ab578a254939f857",
|
||||||
|
"4e015f66967c98096fbc",
|
||||||
|
"4f5c657eb68f8a5d6043",
|
||||||
|
"4fa90c676836f148bc17",
|
||||||
|
"51977c3d8bd8617204d2",
|
||||||
|
"52e27e4f815aeb6b38ec",
|
||||||
|
"535e783ec079dea758ab",
|
||||||
|
"5370750473d7cd063755",
|
||||||
|
"542379845fa17d2ead90",
|
||||||
|
"54fceb5f1cd421f84829",
|
||||||
|
"556668355bc92d4e9433",
|
||||||
|
"57efdd43cc46f3761067",
|
||||||
|
"584e6360a5cbb1963fdd",
|
||||||
|
"58688526f38c1aec0947",
|
||||||
|
"5abc77af26e190437d1e",
|
||||||
|
"5ba577c5e9e18b4c7bac",
|
||||||
|
"5e56d28509eff32fd51c",
|
||||||
|
"5e6531d3875f47da5f89",
|
||||||
|
"5f44364d7cb1ce29f96b",
|
||||||
|
"5febb302d3bb1fbbb336",
|
||||||
|
"60137ba211d54af0b4f8",
|
||||||
|
"60eb85dae74e6a0d086b",
|
||||||
|
"623001edaea9bcc97d6f",
|
||||||
|
"62688a89431171a11a6e",
|
||||||
|
"62979bc36f4c969209eb",
|
||||||
|
"632cd49828d3710fe941",
|
||||||
|
"63687ef941e71d333267",
|
||||||
|
"63d5bf0c55b43eed6714",
|
||||||
|
"641a91ff5c4d8ed7f600",
|
||||||
|
"645ed6af8971e4717cc6",
|
||||||
|
"6490884e27bffcdf92ff",
|
||||||
|
"64959234464bb137392f",
|
||||||
|
"64ee1de58f1a508800a6",
|
||||||
|
"658bd279d4e0a439cc33",
|
||||||
|
"65b694ad9e7d1b5136c5",
|
||||||
|
"6740ef929d76f6dbeeee",
|
||||||
|
"67abf5daf51f59a6d650",
|
||||||
|
"687b177138f1f07a0c83",
|
||||||
|
"69ed7f36bae73f5f53cb",
|
||||||
|
"6b6ad897a76ae96eb97c",
|
||||||
|
"6bfdc1d535ca5943e177",
|
||||||
|
"6c51ba0a6448218c2b39",
|
||||||
|
"6cd7ba42a817705d5932",
|
||||||
|
"6d3b56a1c80d3295e291",
|
||||||
|
"6dc400b3dde53718bc7d",
|
||||||
|
"6dc6004e2db1d64175cf",
|
||||||
|
"6e82cbab59095f5c670d",
|
||||||
|
"6fd75ded68d480abbb3d",
|
||||||
|
"6fed450855b681b2c801",
|
||||||
|
"6feddf139106d31f6caa",
|
||||||
|
"709574d70ec4defbbcaf",
|
||||||
|
"719bd8001e924f64791f",
|
||||||
|
"7220fd134a2c4a9096ca",
|
||||||
|
"736f8ecc77f7a50a9d5a",
|
||||||
|
"737f28e7a259ee0429fa",
|
||||||
|
"74af0519e06229ff082e",
|
||||||
|
"74c35222dde8b0a2d835",
|
||||||
|
"751e1e06eb132442b38b",
|
||||||
|
"758aa49ff3e27cddbb86",
|
||||||
|
"75906931a0f9bd7220dc",
|
||||||
|
"75a6e93658bb32d4057e",
|
||||||
|
"75bce5742bdfb3969395",
|
||||||
|
"764715a32a1c5ba119c6",
|
||||||
|
"76ede2bc69434eed9593",
|
||||||
|
"7a39c6d9f1e5631fc2ce",
|
||||||
|
"7cb3572e158598dce28d",
|
||||||
|
"7d0f840d086c77a11be3",
|
||||||
|
"7d71e7dfb9c89e45d369",
|
||||||
|
"7da2820b2c042ed98403",
|
||||||
|
"7dd86ca1645c358c5473",
|
||||||
|
"7fefbde7eef0cb32860d",
|
||||||
|
"807411fec08f8d1bbb06",
|
||||||
|
"81127b0145e9373bc19b",
|
||||||
|
"8422a2b96fc68dc18bbd",
|
||||||
|
"84e4399e33d17437af05",
|
||||||
|
"852a84515cf2b87c7d8f",
|
||||||
|
"85c17f4431325a1eeb55",
|
||||||
|
"867856494bf46cb5731d",
|
||||||
|
"868c4f1149a07d14c29f",
|
||||||
|
"8787f884222e99c1117f",
|
||||||
|
"882db423c9009170c8ad",
|
||||||
|
"8941b66976efed07788f",
|
||||||
|
"895120c64299707314a3",
|
||||||
|
"8985ba93a5b0b2642e32",
|
||||||
|
"89b45ade5c76cddbe7ab",
|
||||||
|
"8afe1209d73bc7577baa",
|
||||||
|
"8c046b35358b44d32ed9",
|
||||||
|
"8c0675b66e058bba2ab2",
|
||||||
|
"8c334c4afb3afa6f08fa",
|
||||||
|
"8e295cd61eeeba98b60c",
|
||||||
|
"8e3dd865223c7aa5cf01",
|
||||||
|
"9195c18ad401ff5040f3",
|
||||||
|
"930dfac062948cafb8d4",
|
||||||
|
"9379a5cd15fc744b56b5",
|
||||||
|
"93dfe8f51b730118f8f3",
|
||||||
|
"93fbe31a61d591cca954",
|
||||||
|
"942cba00e39bc8c24b2a",
|
||||||
|
"953f09f9614cde47fc53",
|
||||||
|
"966eac1ed01626932631",
|
||||||
|
"96aadeb2f040c4da84a5",
|
||||||
|
"9833d7e826de1aee001e",
|
||||||
|
"990a98d22137308f662f",
|
||||||
|
"99c1119c6641b3cadb66",
|
||||||
|
"9a11978626ae77cf1e01",
|
||||||
|
"9b2f4a7313c52cf4b46a",
|
||||||
|
"9b9d4e8385b2177e050d",
|
||||||
|
"9bf50c84ab955b6faeb4",
|
||||||
|
"9c246763f9970db6c83d",
|
||||||
|
"9c8544050df636fda891",
|
||||||
|
"9c8afe03cc731ab22e52",
|
||||||
|
"9cbb7d33f915ddaa0cd4",
|
||||||
|
"9cbee8d3975d3f17bada",
|
||||||
|
"9e4ac177b0bce3e54dc3",
|
||||||
|
"9ea9662feacaf707e0d7",
|
||||||
|
"9eeba7ff8c656ccc5ff9",
|
||||||
|
"9f16b3457234f292e591",
|
||||||
|
"9f6855ff14faa668092b",
|
||||||
|
"9fff698f76ce390deee3",
|
||||||
|
"a09fbd795797d4780581",
|
||||||
|
"a0a93c51abe86c769b6c",
|
||||||
|
"a0dc9f574fefd6cfed34",
|
||||||
|
"a1bfe2bd52099e730fa4",
|
||||||
|
"a23357c241527dc9d73b",
|
||||||
|
"a3008a4c1ea8d5a7f471",
|
||||||
|
"a342fdb80e25ba33f41f",
|
||||||
|
"a370b3bb81c8fae07d78",
|
||||||
|
"a4441f4caf752a253853",
|
||||||
|
"a6734c40dc2e4f6f3abd",
|
||||||
|
"a71a559255d1a1cc1e0c",
|
||||||
|
"a7238df243a1e1d054ca",
|
||||||
|
"a82fcf639a7b5d9ccc80",
|
||||||
|
"a877b2b3782cbf03119c",
|
||||||
|
"a8a18d7b1f77a81cac4d",
|
||||||
|
"aab26c519689f94d8299",
|
||||||
|
"abd63ecc4c46d0c117f9",
|
||||||
|
"ac5669e28951bec3c836",
|
||||||
|
"ad8893021f6349eb0d0a",
|
||||||
|
"ae231bfdf6967d751421",
|
||||||
|
"ae3ee9f3e6c85a276f80",
|
||||||
|
"af46119c2615d493f7eb",
|
||||||
|
"af57c989b0371b75e631",
|
||||||
|
"b133d6391917293a077e",
|
||||||
|
"b1e89b1d28d31e5d3b5a",
|
||||||
|
"b20cee06c392baa507d5",
|
||||||
|
"b23b49af390e9c76e731",
|
||||||
|
"b242585085bd74d8dd6a",
|
||||||
|
"b39f89ce3757399e823b",
|
||||||
|
"b44a3b6ebc87e4420487",
|
||||||
|
"b44f2d90b67ab1dc6e8a",
|
||||||
|
"b4aa7863cbb63ce67cf0",
|
||||||
|
"b4d7638f023e3c2c516e",
|
||||||
|
"b59667f6f77f70ca1f12",
|
||||||
|
"b6a1f2c6292acaea994e",
|
||||||
|
"b77d91262bfebb8c0cdc",
|
||||||
|
"b98e551fdcf55e35b201",
|
||||||
|
"ba3e6cf1673462680a41",
|
||||||
|
"ba5bd4a7545d48476288",
|
||||||
|
"bb0345f6796e3502d174",
|
||||||
|
"bbeb9bc03c91bbc9b973",
|
||||||
|
"bc0c9e8530a9037af0a4",
|
||||||
|
"bd9e1a68ea30451c4236",
|
||||||
|
"bdffe2d073d6ebc98eeb",
|
||||||
|
"be75e5829e3577dcde6c",
|
||||||
|
"be77bdd82204294636ab",
|
||||||
|
"bea65225dda02b7e5ddd",
|
||||||
|
"beaedae396c5f2ec5422",
|
||||||
|
"befb0b1ab8abf6c8110b",
|
||||||
|
"c080889b7118496f130c",
|
||||||
|
"c0ea0b73203e76e55bd4",
|
||||||
|
"c120aac4897920301ed5",
|
||||||
|
"c313a88cc1c06aaa0fa3",
|
||||||
|
"c32ac0bd619204a09d9f",
|
||||||
|
"c3686003909f0401deee",
|
||||||
|
"c511c6bd4399cffe0a4e",
|
||||||
|
"c5230fe149db87e6413b",
|
||||||
|
"c5ba14ef7174efc532aa",
|
||||||
|
"c6284dee8d6bebef3e88",
|
||||||
|
"c6772224160aaa809213",
|
||||||
|
"c6e9971fb818cf66e0ca",
|
||||||
|
"c82a40dc7058bf4ff976",
|
||||||
|
"c835bb9e23d16b1672b6",
|
||||||
|
"c853a5ec612fa5f83baf",
|
||||||
|
"c860941bbc3ae42da1ec",
|
||||||
|
"c899f159f360c5a00aa5",
|
||||||
|
"c8cf8763ddf08da54a46",
|
||||||
|
"c91cc2251ebfc3fd42e6",
|
||||||
|
"c94abdaf37e7aa2a8259",
|
||||||
|
"ca5560087a7b6ec2338e",
|
||||||
|
"cb041b0d7cc0a5da97a6",
|
||||||
|
"cc91a3783e24ee935844",
|
||||||
|
"cd798efbb9849ed300ff",
|
||||||
|
"cdfd6e7d9f395f0a3cf4",
|
||||||
|
"d04138266fa695e9e3aa",
|
||||||
|
"d05e1263c6b63cadacdb",
|
||||||
|
"d2eb414d42d2b84679ad",
|
||||||
|
"d31690e85154dc9b3a32",
|
||||||
|
"d35ac8a452dc9f5c6c59",
|
||||||
|
"d4b4f8e418c0d285d183",
|
||||||
|
"d4bbdec8794ff9413cfb",
|
||||||
|
"d4c7e8e5244070cc85de",
|
||||||
|
"d5bb22435f95ee1c8144",
|
||||||
|
"d82e2b2c2968aed34dd4",
|
||||||
|
"d911a3843513c372c6bd",
|
||||||
|
"d99fa482032cbad9c8b2",
|
||||||
|
"d9ff12437fc4222b3c4e",
|
||||||
|
"da5bb8ee47f63796dc9d",
|
||||||
|
"da8e200bbb734c40c55c",
|
||||||
|
"dc5c897a86c84a75de30",
|
||||||
|
"dd6d9af68630cd49f592",
|
||||||
|
"dd910d1c5977fe92650d",
|
||||||
|
"de779be8cad2cb14d914",
|
||||||
|
"dea4a508f86cf619fe1b",
|
||||||
|
"e0845c6e01cb394a145e",
|
||||||
|
"e0c1e7df1d3452ac4b6d",
|
||||||
|
"e14273246247adacfbd9",
|
||||||
|
"e1c9b4bc0161cc93429d",
|
||||||
|
"e21e0258a09928903618",
|
||||||
|
"e235c90076eaebd255b3",
|
||||||
|
"e257afa56297a69f6599",
|
||||||
|
"e472fcba1eb459cc5351",
|
||||||
|
"e4c98931ba062d22c029",
|
||||||
|
"e5cf4190af5d183f674d",
|
||||||
|
"e6a2b801fc241b640bd9",
|
||||||
|
"e7679554205a27d14489",
|
||||||
|
"e79a9d05cd96563a6354",
|
||||||
|
"e79e64af963d3ca9ac57",
|
||||||
|
"e8e81129766bb46d639b",
|
||||||
|
"e9222cc7da300b3ce4a9",
|
||||||
|
"e98f74be79d2d9c85971",
|
||||||
|
"e9e9b6333c9c5586f71c",
|
||||||
|
"ea7138f5586005eb2e7b",
|
||||||
|
"eb50d59ca55b462b92b1",
|
||||||
|
"ec8bde81bb0646897006",
|
||||||
|
"ed3aee5ebbe3c07d7d8e",
|
||||||
|
"ededaf9e1df407272889",
|
||||||
|
"ee651b48b4637a398b26",
|
||||||
|
"ee84942b54d13d5f97dd",
|
||||||
|
"f055c459151e4eecc273",
|
||||||
|
"f1abac88648a8c306137",
|
||||||
|
"f25aef2d27019282846d",
|
||||||
|
"f2796295d90b79439260",
|
||||||
|
"f2b3737696d5e4254ec4",
|
||||||
|
"f3049037157bc616c2cb",
|
||||||
|
"f32ddefe51f6da76bb8d",
|
||||||
|
"f388d64b5afe17546204",
|
||||||
|
"f3909778ebc319ef0365",
|
||||||
|
"f3bb2f8fb5b4d7c37e1b",
|
||||||
|
"f3f457e60eef9dd0fbea",
|
||||||
|
"f415ae4fe5260c645b35",
|
||||||
|
"f5257bfb4aadb4833bd2",
|
||||||
|
"f66c09eac101ffde4a7f",
|
||||||
|
"f6bde12166ac4da9c73c",
|
||||||
|
"f6c38df87c100c00df2f",
|
||||||
|
"f6e126c1a7dc0257f6b9",
|
||||||
|
"f79f47ed01c427fe11ef",
|
||||||
|
"f84c3e859d0eb837cc1d",
|
||||||
|
"f85790e6f03955ae360e",
|
||||||
|
"f89b6f425bc8c8a23d83",
|
||||||
|
"f8facff9b4b09d7fae10",
|
||||||
|
"f979763651703649948a",
|
||||||
|
"fafb2c704342e41d5eda",
|
||||||
|
"fbc493629d5c604405d3",
|
||||||
|
"fc2a1d88a2a13bdf9d54",
|
||||||
|
"fde716a39603319e5e26"
|
||||||
|
],
|
||||||
|
"test_groups": [
|
||||||
|
"02000ebc391e13d1271b",
|
||||||
|
"03bed078c311eb856a1c",
|
||||||
|
"09ada7352b9dd8da8d42",
|
||||||
|
"09d50f740e87a02d6064",
|
||||||
|
"0bb712996aafa57f73c8",
|
||||||
|
"0ff833d8df034171bf46",
|
||||||
|
"10ac190aa42f43236baa",
|
||||||
|
"123aa244852830a141e7",
|
||||||
|
"1262098b15284562d361",
|
||||||
|
"14265c25d8e4404230da",
|
||||||
|
"16adda3d2b1ed0fd96a8",
|
||||||
|
"22314171964b13dbaf90",
|
||||||
|
"2405b208a39a2e87f92e",
|
||||||
|
"241b99b929249c77d920",
|
||||||
|
"260437dd491aa76c032a",
|
||||||
|
"26e43e80ffdb1c09a21a",
|
||||||
|
"28e4f0e13d2e0ff787be",
|
||||||
|
"2c75592e2250e088910b",
|
||||||
|
"2e8fb5205eaeb219e6ce",
|
||||||
|
"31d055e471ce655b24b1",
|
||||||
|
"34d5e08d5a667b637e35",
|
||||||
|
"39c80c93a9a02e632bc3",
|
||||||
|
"3be5310dddccc87e67cc",
|
||||||
|
"443d77a109bd929cb972",
|
||||||
|
"445f92f319941bc4b4b4",
|
||||||
|
"4674934e2a49c964df66",
|
||||||
|
"46cbc6f845226ac03420",
|
||||||
|
"470408a5fa9cabc43cb2",
|
||||||
|
"4aee26cad873f2ac3d7b",
|
||||||
|
"4fae42756d54cdf68230",
|
||||||
|
"510e31a611ebc1cdbc4f",
|
||||||
|
"588b7ee24a1ee3b3e93c",
|
||||||
|
"5bda104302dfc48459e0",
|
||||||
|
"66741543ff5e2bd233f7",
|
||||||
|
"6cc1c47acdf9f50ae7ea",
|
||||||
|
"6d8a4d5318e161cdffca",
|
||||||
|
"7ae9b481c8c70c9e0b4f",
|
||||||
|
"7d45acf96d837daf531d",
|
||||||
|
"801ee03a5d42e9430a67",
|
||||||
|
"81f1ccd804b817368af3",
|
||||||
|
"824378cc0619ae3ec6de",
|
||||||
|
"84920da57298060b8405",
|
||||||
|
"8569ad366a2034813ea6",
|
||||||
|
"88a6c1da308911c5b504",
|
||||||
|
"8a6285cb2fb15918b68e",
|
||||||
|
"8adeba074ad9666f61ab",
|
||||||
|
"8f46e5f47719e3eaca18",
|
||||||
|
"8ffbb1e251c2216ea87e",
|
||||||
|
"92676eb5a0be5c242eb8",
|
||||||
|
"93ea88c675008cd30187",
|
||||||
|
"9b84a2255330d4d8b229",
|
||||||
|
"9ee03df5bc8ce612b603",
|
||||||
|
"a3e2e1666a806e03456c",
|
||||||
|
"a73776fb55c3e03b6eed",
|
||||||
|
"a7bb4b2aa87eff88420c",
|
||||||
|
"ad225dd89d15c5cd1a67",
|
||||||
|
"add9ac9b0d9359f1fe79",
|
||||||
|
"b78c3a2827aff0d6b7aa",
|
||||||
|
"bd808fa49a2a441a8075",
|
||||||
|
"bf9f25c0d26f225506dc",
|
||||||
|
"c02e40993bcde239ae42",
|
||||||
|
"c231e43f1d4a8abc3f21",
|
||||||
|
"c2941ab6da65037eb5a2",
|
||||||
|
"c2e24af3eb4caae1ad96",
|
||||||
|
"cd018c970c3b9f11ce07",
|
||||||
|
"d7800334d22cb605cdb2",
|
||||||
|
"e19472c88f088e8fb85f",
|
||||||
|
"e491cd8b2ace998a455e",
|
||||||
|
"e752937f044f1e8a558a",
|
||||||
|
"e89bcf2966b89bfe1279",
|
||||||
|
"e9efbd24c8ca844688d5",
|
||||||
|
"ea8980864419ad5e24fb",
|
||||||
|
"edd78621b3a9fbd06687",
|
||||||
|
"efb4bfa512a47cfc9384",
|
||||||
|
"f07c1fddb4e712f86400",
|
||||||
|
"f1091f36d3f7c8eb10ec",
|
||||||
|
"f986770a1e1958595390",
|
||||||
|
"fc5129a02a76b4cf190d",
|
||||||
|
"ff1d0a969ad37a2e8d25",
|
||||||
|
"ff3f38f452813f3e0f5e"
|
||||||
|
],
|
||||||
|
"dev_categories": {
|
||||||
|
"shared_keyword_pair": 54,
|
||||||
|
"same_academic_year_pair": 100,
|
||||||
|
"same_start_year_pair": 60,
|
||||||
|
"person_title_year": 80,
|
||||||
|
"person_keyword_title": 80,
|
||||||
|
"document_author_category_multi_hop": 60,
|
||||||
|
"person_multiple_categories": 30,
|
||||||
|
"candidate_set_aggregation": 17,
|
||||||
|
"conjunctive_disambiguation": 20,
|
||||||
|
"negative_lookup": 8
|
||||||
|
},
|
||||||
|
"test_categories": {
|
||||||
|
"shared_keyword_pair": 8,
|
||||||
|
"same_academic_year_pair": 8,
|
||||||
|
"same_start_year_pair": 8,
|
||||||
|
"person_title_year": 8,
|
||||||
|
"person_keyword_title": 8,
|
||||||
|
"document_author_category_multi_hop": 8,
|
||||||
|
"person_multiple_categories": 8,
|
||||||
|
"candidate_set_aggregation": 8,
|
||||||
|
"conjunctive_disambiguation": 8,
|
||||||
|
"negative_lookup": 8
|
||||||
|
},
|
||||||
|
"source_corpus": {
|
||||||
|
"sha256": "440da12a7a991824e923f70cada7c616c3fb3b0f12767ec7d75039a6a3231b10",
|
||||||
|
"document_count": 114,
|
||||||
|
"documents": {
|
||||||
|
"pages/interns/bogdan_paul_chis/README.md": "3b4b946eb3c10e9f9a4092e6cffa01c5080e7579aded2f6ed3120c41ed62b647",
|
||||||
|
"pages/interns/cesar_gutierrez/README.md": "b0be60576eed28d4b1920e9acf198684519373dfc13171567247c853b3ed699e",
|
||||||
|
"pages/interns/oliver_pejic/README.md": "0470f3c8465be8f02204b08e4c75ef47f68c7e4ad1038faa5641cdf1811f33d5",
|
||||||
|
"pages/interns/sevval_bulburu/README.md": "ff2a9d66253802f1af0fdfd74832e40fae41b6df23c5e61dc266f6cd0cc16c4d",
|
||||||
|
"pages/interns/yussef_ressaissi/README.md": "f997a65699da0db3222ef7a3c37652d05dfc3419ad4ec74683bafc2c897bb987",
|
||||||
|
"pages/students/2016/darius_lindvai/README.md": "fcaa47bb9708a6439eec5c4b7f7b4ed6c7359e423e1d940e1aed9f44957e6d62",
|
||||||
|
"pages/students/2016/darius_lindvai/dp2021/README.md": "be3d0fea2a6d592b225eecabd9b19445c2fce62b8289c07ab6af93835db12970",
|
||||||
|
"pages/students/2016/darius_lindvai/timovy_projekt/resers/README.md": "352162de1b1e192228fa5d26506c028ac47e567e90df53b1bbaa6ad736ec4766",
|
||||||
|
"pages/students/2016/darius_lindvai/timovy_projekt/tutorial/README.md": "b4a81ff457624b089d618e4479afb1e3d748f6724f72104ef5518e535ae02fe5",
|
||||||
|
"pages/students/2016/dominik_nagy/README.md": "1c4037a158d84c45fa705a0c38e47142a9d46e226f0c138bc2d56d7c38f6d74d",
|
||||||
|
"pages/students/2016/dominik_nagy/timovy_projekt/README.md": "b81a4dab7316f7b846dcf36515f6aa9d44035c86f46f0e07b7a43308bcd31458",
|
||||||
|
"pages/students/2016/ediz_morochovic/README.md": "045e5eb9a3df2b84140808fbca0c3163266ad0efa144bc42d9d5c597881c6ac6",
|
||||||
|
"pages/students/2016/jakub_maruniak/README.md": "6734c41a95b9d0c1e3d226b393ad109ee4a7b82ebfffa73df2d7e0a743fefa14",
|
||||||
|
"pages/students/2016/jakub_maruniak/dp2021/README.md": "9cd884aec70705cdb2aaa0f514b513f16de263c37b749ced7f92916cd2f91c39",
|
||||||
|
"pages/students/2016/jakub_maruniak/dp2021/annotation/README.md": "debae0c50aea1accef0840912b9b1f37b2138f856002bb50e91d7ea2dbbe7963",
|
||||||
|
"pages/students/2016/jakub_maruniak/dp2021/train_experiments/README.md": "01dff38b37043414fa1db204394ddbe7aade00e14d02d495572b65c85d09b194",
|
||||||
|
"pages/students/2016/jakub_maruniak/timovy_projekt/README.md": "04114b1f3d84664aad5bdba5a0b614c5a6f23392be3c31fd9123d63db1be0a35",
|
||||||
|
"pages/students/2016/jan_holp/README.md": "80d6a8492766e5bfa61673a372e5f059d30c8e335de39842866c51485960e4d3",
|
||||||
|
"pages/students/2016/jan_holp/dp2021/README.md": "a62acb74009376766c7e2f9856ee01d21f84593eb9b3ce85cf2e6032aa412476",
|
||||||
|
"pages/students/2016/jan_holp/dp2021/zdrojove_subory/README.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||||
|
"pages/students/2016/jan_holp/timovy_projekt/README.md": "79eebdfd3af7e8d5c279077e285a580731b1cf8cc9b4454f6596796e9915f70c",
|
||||||
|
"pages/students/2016/lukas_pokryvka/README.md": "f279456c5c277ff1ee0dd89a3464ed9f9f67b44bc185a5da9811ef5cfb675002",
|
||||||
|
"pages/students/2016/lukas_pokryvka/dp2021/README.md": "39b61376ce108e4a930f926ab2d6a997207457121bccfcf617129a3b210a15cf",
|
||||||
|
"pages/students/2016/lukas_pokryvka/timovy_projekt/README.md": "4de4b6c8cfed17b6c60090f82df1d55a66be70a79d3013850689b2baebdd801b",
|
||||||
|
"pages/students/2016/mark_feher/README.md": "bec37c0319fe0869a0377d771db23d090dbda93c27328f5697cdaeb3bbccfe9b",
|
||||||
|
"pages/students/2016/maros_harahus/README.md": "0da150e91918632c9e8cd1443f04da403595a372517e254928ce9f76c9d5033d",
|
||||||
|
"pages/students/2016/maros_harahus/timovy_projekt/README.md": "75af19f7c68f4b646fa1dbae75f3f3dfc52633a9f9da1400d21808bb20be0d83",
|
||||||
|
"pages/students/2016/patrik_pavlisin/README.md": "dc1c648d7cd9b0f0e021c57f9b98189e37c100871439e7e304390715913f2763",
|
||||||
|
"pages/students/2016/patrik_pavlisin/dp21/README.md": "ac1eb0fd0360ad34aa21b7c8da5bb010a6edf10be5721f28dedc3986cd1d8c54",
|
||||||
|
"pages/students/2016/patrik_pavlisin/dp22/README.md": "f2a8c619a812b99abab618ae388eb672407950e1f33fb8d7da7a528c4de81d50",
|
||||||
|
"pages/students/2016/patrik_pavlisin/tp20/README.md": "ae9c771f27e7e093bc29c6888c8d0b27ed61fb41519fd0d7e7f4f6cbb4626edc",
|
||||||
|
"pages/students/2016/tomas_kucharik/README.md": "6a1a215433eb1857660177b4cb2ecec03c6a86743d3a04cd6d5c9d9682c9e63b",
|
||||||
|
"pages/students/2017/dmytro_ushatenko/README.md": "65f4ac177d492162b08ca5da3d9eb048bd088a3c117a28a662113b7e4bc3a4ec",
|
||||||
|
"pages/students/2017/martin_jancura/README.md": "6a0a18d5095dcfb12abfdd72c9cfd8025d714fb5e29a7858cd2b285e4cb986b9",
|
||||||
|
"pages/students/2017/stanislav_matsunych/README.md": "90ffa11eff4a4360b0252dbc53a116c3a5777b3d5dd86ce5c89c02bdd2051c73",
|
||||||
|
"pages/students/2017/than_trung_thanh/README.md": "2150519b8580e7337520db4de64d2d1c82d2634380537d019f41c506dbf2979d",
|
||||||
|
"pages/students/2018/NaN1name_buday/README.md": "23c8c58090bdc954347e36f141bea91f43c8d5b1d777e346864a2ebe84c0bcce",
|
||||||
|
"pages/students/2018/adrian_remias/README.md": "e5bfe1d5d4e626beaa636a02d34ec58cf2cff9b0e57833905af35b80bf1465a2",
|
||||||
|
"pages/students/2018/david_ilas/README.md": "96c45ff9c5a821ddcb1a2fc86d487bd8f4729d1b76887914b0f5fbf99af45af0",
|
||||||
|
"pages/students/2018/david_omasta/README.md": "4164051870e1e1cf8949ed18a74196e9ea789dfbe4fee24bdeb736ca42848327",
|
||||||
|
"pages/students/2018/martin_wencel/README.md": "0e6a7a981689f22304f8baa5de97d4315c0695c94c9277de7851943eb012253b",
|
||||||
|
"pages/students/2018/oleh_bilykh/README.md": "4072c62dd8ee753a0c8fa43fdfbbdf566e394c2df13e6a79d08a302e332710b1",
|
||||||
|
"pages/students/2018/ondrej_megela/README.md": "969ff2e1a436b8f957e7168cf5eb678196b99aeda17701c502b016441f644065",
|
||||||
|
"pages/students/2018/samuel_sirotnik/README.md": "cc230ede67b6e8632511c92a5ed6d1e9deb42e70819280222bdfd369ee77fc70",
|
||||||
|
"pages/students/2019/alina_vitko/README.md": "9b071fe2aff470c275ae027be236fe836f741f774cabb9cbbb55304a8d5102cd",
|
||||||
|
"pages/students/2019/artem_yatsenko/README.md": "328b101e46c51c959e792cf7ca226942f81d2ab8fe9648ad6d0ecd07016429e2",
|
||||||
|
"pages/students/2019/david_stromp/README.md": "e46ca8691d5ec894128f6f6f2ed33e2c7bd141f80719bb0449b20f10f30cca09",
|
||||||
|
"pages/students/2019/dmytro_mural/README.md": "e881a47d847c3ef8d680844113fdbfbb87553b28982bf9eef4936f6d30923e93",
|
||||||
|
"pages/students/2019/filip_tomas/README.md": "75a1fe7b921e4bff0fdf9e2a957b4adad4b4a57aa7ebdffbb73dd82c02123f94",
|
||||||
|
"pages/students/2019/kristian_sopkovic/README.md": "3286960fb30f584df35455f9b6dfae81ca4827a1d711d2bcd6e48c3f150c9279",
|
||||||
|
"pages/students/2019/michal_stromko/README.md": "3ae1dd9b6638a6a249a94be3f3846286555666aefa225bb3a2c7288b35900ce7",
|
||||||
|
"pages/students/2019/michal_stromko/vp2021/README.md": "feb2e093fdd6461239e79b1e1f96e65a1c8cd96e8a2b70535ae556a9c198046a",
|
||||||
|
"pages/students/2019/michal_stromko/vp2021/tutorials/README.md": "40e3fa448c7329ef863e705435e23fe6b4788de440710f066fe0eed92d132bad",
|
||||||
|
"pages/students/2019/michal_stromko/vp2021/tutorials/img/README.md": "e8d3ac160b17dfdee2c3e996bf6a03af7a6f16f9140bf5cf7ee343a82dd1865f",
|
||||||
|
"pages/students/2019/patrik_pokrivcak/README.md": "3e3957ad0f7aca59d6eb64c38a3f5e21d8fd953200825d0d0e5cacabfbc35a7d",
|
||||||
|
"pages/students/2019/samuel_horani/README.md": "86e6959ccc612b069687b57996fa3f61660075d6a0d65bfec64f423d39a0a999",
|
||||||
|
"pages/students/2020/david_kostilnik/README.md": "2927524b75da59a64120fc364a0fc374986fa4d364d54e52c36800762c203264",
|
||||||
|
"pages/students/2020/jakub_kristian_lukas/README.md": "f139d9b1ebf5a3f45612f3df5703ecdd935b90701763c27c7c529044c0b0455a",
|
||||||
|
"pages/students/2020/kamil_tomcufcik/README.md": "9d865adf538bc6d7992ee4f4882713447da5c936fca17c43ca0f576072537048",
|
||||||
|
"pages/students/2020/matej_kobylan/README.md": "3d7b289e17b8f25678a07e9ee0e6741688485a0ccb1e50940a6a6acc6312a547",
|
||||||
|
"pages/students/2020/matus_suchanic/README.md": "770ca49538cca22df35f8e7ba736ee97483e4fe5788c221496553592b4e78dc6",
|
||||||
|
"pages/students/2020/pavol_hudak/README.md": "33d06fccc6451e5f19b27b0cad001a34e81635b4ea294a01dec7771c823abc40",
|
||||||
|
"pages/students/2020/vladyslav_krupko/README.md": "4c28e6d38651bb2cafcbf4a18e35210cd369aef2caff6c5b0aa52fac38f0fe7d",
|
||||||
|
"pages/students/2021/artur_hyrenko/README.md": "0568261f4ade4de5472edcfeb1ffed9abae18dc67e4050f4ce2ad088839a2bb3",
|
||||||
|
"pages/students/2021/eduard_matovka/README.md": "de2a7ae38ec87110e347956b37d0605a298ed2847f972961cc9b977da8221d43",
|
||||||
|
"pages/students/2021/manohar_gowdru_shridharu/README.md": "c00ceb620ed7087ead5d9448d476bbb98d273d1d9e7bf1bc4355c367b26c7a6b",
|
||||||
|
"pages/students/2021/martin_sarissky/README.md": "8e97b45a253745faa55f63c844e0b5dfe680aeaf6eb01fb8f9d06ac6e8ee8bcf",
|
||||||
|
"pages/students/2021/matej_novotny/README.md": "b083a7cadde532e3428dc9a57bc61456fcc5905bda91e011b96033d42bf5d9cb",
|
||||||
|
"pages/students/2021/matej_scislak/README.md": "b9a32cce8605e044a4f2828ff2d91a2995a62ef3a841e62f0a225c97221f0cc8",
|
||||||
|
"pages/students/2021/nikita_bodnar/README.md": "2016c0dd923c0f8e561d5cea42ac81da3610fdcc54a4527f56d078e34e53ce90",
|
||||||
|
"pages/students/2021/oleksandr_hryshchenko/README.md": "4b073992b715b6c75b79fd2c8f850a69f940966e3a61a82c625c32c945a93036",
|
||||||
|
"pages/students/2021/vladimir_ferko/README.md": "68e7d311896eda2171e5eec1ec3a8da90d326ed91acaace8058f68664a50d271",
|
||||||
|
"pages/students/2022/andrii_pervashov/README.md": "319dcaa1cc2e29dd7e3a710bab26cb3ac6944ab71b0b97e1de076b1199122334",
|
||||||
|
"pages/students/2022/daniil_huzenko/README.md": "390782fbff6220a9462060ce1a62959f2a2b88f42d06e2c51d1f406b75d73f2c",
|
||||||
|
"pages/students/2022/jakub_schwarc/README.md": "f541a8852c2b0f6f9d7182e01a34c4e3beee9bfa55427a06b331638b11eb8be6",
|
||||||
|
"pages/students/2022/jan_malinovsky/README.md": "8af021bfb131fa005a7aec3e2f2f12fc17fa5dc14e2675311adbbfc445a4bcab",
|
||||||
|
"pages/students/2022/jan_ptak/README.md": "131cf053764fd5423541ebe672c3b4f5da875cfb8e4b821f1335ddb967282282",
|
||||||
|
"pages/students/2022/oleh_poiasnik/README.md": "c2f7dc3f61f8b4a5b43ded1e3ae4c7d3e7f874439ee6b17dd9c8d45dabc25bc8",
|
||||||
|
"pages/students/2022/samuel_vasil/README.md": "67c807049147aacd04f3050f4ff0233a8b3f0a239ab173b430e13dfe113ad0a5",
|
||||||
|
"pages/students/2022/serhii_yemets/README.md": "ffbeac893947acafe855d576322a8826f9d4f87ac344cb31f8ceeefa244b9133",
|
||||||
|
"pages/students/2022/tetiana_mohorian/README.md": "c9efdc632bf1ca89a0bfde0dc00be7aaac8a85da3d92e2ce8506236c73e93cfb",
|
||||||
|
"pages/students/2022/valerii_kutsenko/README.md": "dc764c609ad3c1df59cfea997d4db82a591b1b1e0764453e319d841115507e4f",
|
||||||
|
"pages/students/2022/vladyslav_yanchenko/README.md": "4d1ce216e3b526ee437ddbc658e51d7bb83530087e43628c096a569a3854a47f",
|
||||||
|
"pages/students/2022/yevhenii_leonov/README.md": "b90e41db0cec2451027020a9102d32a24d777e8a38b604ccca87b36cd6b3a292",
|
||||||
|
"pages/students/2023/denis_le_thanh/README.md": "2cb83f942d86a02712b0c58778e46dc2211346d1a6eba606471dfa832245db61",
|
||||||
|
"pages/students/2023/maksym_zatirka/README.md": "7a7d2cbe276c352dacfbc6ba6de5f15303d30ecf34845ff8da8d085f3d67c3dd",
|
||||||
|
"pages/students/2023/oleksandr_dorybohov/README.md": "c24d6f941de0dafb4459cea8259cf147821cafc86ba65be5b528f419f734bc18",
|
||||||
|
"pages/students/2023/ronald_zalacko/README.md": "724b0f8e6e641236dba9bddbd77f4546e09514076c7dfb151807aaf4b882c96f",
|
||||||
|
"pages/students/2023/rostyslav_rodzhuk/README.md": "de356dd7427c8a0716c165a0f88ae47b691a86ee7a388f60e2d2e9306298415c",
|
||||||
|
"pages/students/2023/samuel_dzurina/README.md": "4818191d044b91219c796a35010c95da5cf2093e050d494f30b219b91e13fa0e",
|
||||||
|
"pages/students/2023/simona_bobrovcanova/README.md": "e473a1911dae10ab40e2cf6696a8be616a58c22aaf09af5953fbac475791a35e",
|
||||||
|
"pages/students/2023/yevhenii_medushivskyi/README.md": "5710ebf91c893a12fe6d19f5372311938d1e7c7bbdf203f2dc8ed2fe7c4f5a24",
|
||||||
|
"pages/topics/akopisat/README.md": "c7245e1fbfa4160618502c0baf8cc6bc47cd9a82b8a85bc1c645314829a7b76a",
|
||||||
|
"pages/topics/bert/README.md": "35e507f7ec2ad1d3526e2a15f94ea085ee25f680a02daf6df62fd429bd9c25c9",
|
||||||
|
"pages/topics/chatbot/README.md": "6f2f83ffb80109be47f9750cca9d3036ec3645abef9f2b590bd6825780c7c48a",
|
||||||
|
"pages/topics/faq/README.md": "15cfbd9c2a1649c80a7a58922e2b66dadab5c86a5ef33ef16c82bebd4d2dbf06",
|
||||||
|
"pages/topics/hatespeech/README.md": "364df94e70dd740c63544e2586ba7b957780f714fc0c941d1b04b02233e6cbc5",
|
||||||
|
"pages/topics/legal/README.md": "003bb9bfe1e0ca21652091c2d11496312eb04e0689fe459e14c2d5a738e8eeea",
|
||||||
|
"pages/topics/morphology/README.md": "e242cc5ff1a4cc98e227566c0ead999bbc95937b7c20be62cb2afb773d0d35c0",
|
||||||
|
"pages/topics/named-entity/README.md": "66b2e25f70211d432d596e377d552b3b8f0c525b14c31e3bc9c956c3aeadca84",
|
||||||
|
"pages/topics/named-entity/navod/README.md": "1ff87079a98411de0414754c60241e08d2214ddcd63ddf974e4340cce2ce5b02",
|
||||||
|
"pages/topics/nlp/README.md": "6f90abf9dc3f0ff33475283c13b4a08561abf631425ec2daacb076155a9e02c2",
|
||||||
|
"pages/topics/otvorene/README.md": "cd5544925553fe3840c0ea6f8ef60ab756e26ab6757bf810025c948d8d4f98fc",
|
||||||
|
"pages/topics/prodigy/README.md": "5e4f691f2754c2ec4afbaab2f41e6db77feb5b322dd9344465eb40c35f116499",
|
||||||
|
"pages/topics/python/README.md": "2ef073adba672142c39e9a59fa2e00a98ab52bda54233d46fbe6940ee23f9fcc",
|
||||||
|
"pages/topics/question/README.md": "408078a2a67cea2699e12359e85ab641136231e6104c2afdf874a705879525df",
|
||||||
|
"pages/topics/question/navod/README.md": "061e737c69184b2bd244316ca7ba841f7186fe01ee80ee993742a733dcad3ecd",
|
||||||
|
"pages/topics/question/nezodpovedatelne/README.md": "b6703d9690f4599b973efb27595ce157773ae0fc0d55cf2c0a09d9f50e8e4c92",
|
||||||
|
"pages/topics/question/validacie/README.md": "3216a7127abdfc6da50ed116f44ff2d6785e7da4af70d23aceda774e745ad562",
|
||||||
|
"pages/topics/resources/README.md": "09405397387f00cbcc5680f7d655f2d861e4d92e5df792a62d9dfd04f3534f48",
|
||||||
|
"pages/topics/seq2seq/README.md": "969d15c03a63a3f8d5edc9017fe5a0fb7311fdf4de4a3473a08266241f92c1e2",
|
||||||
|
"pages/topics/spacy/README.md": "f504e5db77cb8694f08a57fb8636e522d59a0e669216f4bc8273bc3c5f375f87",
|
||||||
|
"pages/topics/steel/README.md": "b4068cef2ed197711467ac47630d5b2064fdc8828f898f7af99664e94d833330",
|
||||||
|
"pages/topics/translation/README.md": "a7d4289e72199b307dc5ad8fc69cda39c1a33c27a6c7447af70aa9c3cc6b8635"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dataset_sha256": "fd9835adee93cacf2c45806dfe93463c2e9a58ccedb5f073876ad176039ad734",
|
||||||
|
"limitations": [
|
||||||
|
"Same source corpus and shared tag/category/author vocabulary.",
|
||||||
|
"Template families are known; TEST persons and their fact groups are withheld.",
|
||||||
|
"Oracle is independent of graph extraction but still rule-based; provenance permits human review."
|
||||||
|
]
|
||||||
|
}
|
||||||
4265
tools/graphrag/evaluation/results/v2_preparation/source_audit.json
Normal file
4265
tools/graphrag/evaluation/results/v2_preparation/source_audit.json
Normal file
File diff suppressed because it is too large
Load Diff
247
tools/graphrag/evaluation/source_oracle.py
Normal file
247
tools/graphrag/evaluation/source_oracle.py
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
"""Independent benchmark oracle over original Markdown, not the GraphRAG parser.
|
||||||
|
|
||||||
|
Frontmatter defines tags/categories/document authors. Academic year comes from an
|
||||||
|
explicit academic heading, with a matching category used only as a fallback.
|
||||||
|
Every extracted value records the original file and source lines. No graph
|
||||||
|
payload, chunk JSON or retrieval result is used to construct this oracle.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
import unicodedata
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import frontmatter
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[3]
|
||||||
|
DEFAULT_WIKI = ROOT.parent / 'zpwiki'
|
||||||
|
|
||||||
|
|
||||||
|
def norm(value: Any) -> str:
|
||||||
|
value = unicodedata.normalize('NFKD', str(value or ''))
|
||||||
|
value = ''.join(c for c in value if not unicodedata.combining(c))
|
||||||
|
return ' '.join(re.findall(r'[a-z0-9]+', value.casefold()))
|
||||||
|
|
||||||
|
|
||||||
|
def clean(value: str) -> str:
|
||||||
|
value = re.sub(r'\[([^\]]+)\]\([^)]*\)', r'\1', value)
|
||||||
|
return re.sub(r'[*_`#]', '', value).strip()
|
||||||
|
|
||||||
|
|
||||||
|
def values(value: Any) -> list[str]:
|
||||||
|
if value is None:
|
||||||
|
return []
|
||||||
|
if isinstance(value, str):
|
||||||
|
return [value.strip()] if value.strip() else []
|
||||||
|
return [str(item).strip() for item in value if str(item).strip()]
|
||||||
|
|
||||||
|
|
||||||
|
def profile_path(path: str) -> str | None:
|
||||||
|
match = re.match(r'^(pages/students/\d{4}/[^/]+|pages/interns/[^/]+)/', path)
|
||||||
|
return match.group(1) + '/README.md' if match else None
|
||||||
|
|
||||||
|
|
||||||
|
def source_url(path: str) -> str:
|
||||||
|
return 'https://zp.kemt.fei.tuke.sk/' + path.removeprefix('pages/').removesuffix('/README.md')
|
||||||
|
|
||||||
|
|
||||||
|
def category_type(category: str) -> tuple[str | None, int | None]:
|
||||||
|
match = re.fullmatch(r'(bp|dp|phd|tp|vp)(20\d{2})', norm(category).replace(' ', ''))
|
||||||
|
if not match:
|
||||||
|
return None, None
|
||||||
|
return {'bp': 'bachelor_thesis', 'dp': 'diploma_thesis', 'phd': 'doctoral_thesis',
|
||||||
|
'tp': 'team_project', 'vp': 'research_project'}[match[1]], int(match[2])
|
||||||
|
|
||||||
|
|
||||||
|
def academic_type(heading: str) -> str | None:
|
||||||
|
text = norm(heading)
|
||||||
|
for prefix, kind in [('bakalarska praca', 'bachelor_thesis'),
|
||||||
|
('diplomova praca', 'diploma_thesis'),
|
||||||
|
('dizertacna praca', 'doctoral_thesis'),
|
||||||
|
('diplomovy projekt', 'diploma_project'),
|
||||||
|
('timovy projekt', 'team_project'),
|
||||||
|
('vyskumny projekt', 'research_project'),
|
||||||
|
('vedecky projekt', 'research_project')]:
|
||||||
|
if text.startswith(prefix):
|
||||||
|
return kind
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def acceptable_title(value: str) -> bool:
|
||||||
|
text = norm(value)
|
||||||
|
if not (len(value) >= 10 and len(value) <= 350 and len(text.split()) >= 2):
|
||||||
|
return False
|
||||||
|
if value.endswith(':') or re.match(r'^(?:https?://|[-*+] |\d+[.)] )', value):
|
||||||
|
return False
|
||||||
|
return not any(text.startswith(prefix) for prefix in [
|
||||||
|
'stretnutie', 'stav', 'ciel', 'ulohy', 'uloha', 'zadanie', 'navrh na zadanie',
|
||||||
|
'navrh na zadamie', 'poznamka', 'praca uspesne', 'projekt uspesne', 'projekt zakoncen',
|
||||||
|
'bakalarska praca na crzp', 'git repozitar', 'zdrojove texty', 'praca na crzp',
|
||||||
|
'rok zaciatku', 'zaciatok studia', 'meno veduceho', 'veduci', 'crzp',
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def title_candidates(lines: list[str], offset: int = 0) -> list[dict]:
|
||||||
|
found = []
|
||||||
|
for index, raw in enumerate(lines):
|
||||||
|
line = clean(raw)
|
||||||
|
if ':' not in line:
|
||||||
|
continue
|
||||||
|
label, inline = line.split(':', 1)
|
||||||
|
key = norm(label)
|
||||||
|
if not (key in {'nazov', 'nazov prace', 'nazov bakalarskej prace', 'nazov diplomovej prace',
|
||||||
|
'predbezny nazov', 'tema', 'navrh na temu'} or key.startswith('navrh na nazov')):
|
||||||
|
continue
|
||||||
|
value = inline.strip()
|
||||||
|
value_index = index
|
||||||
|
if not value:
|
||||||
|
for next_index in range(index + 1, min(index + 7, len(lines))):
|
||||||
|
if lines[next_index].strip():
|
||||||
|
value = clean(lines[next_index]); value_index = next_index; break
|
||||||
|
if acceptable_title(value):
|
||||||
|
found.append({'title': value, 'line': offset + value_index + 1,
|
||||||
|
'label': key, 'label_line': offset + index + 1,
|
||||||
|
'priority': 0 if key.startswith('nazov') else 1 if key.startswith('navrh na nazov') else 2})
|
||||||
|
return sorted(found, key=lambda row: (row['priority'], row['line']))
|
||||||
|
|
||||||
|
|
||||||
|
def extract_academics(document: dict) -> list[dict]:
|
||||||
|
lines = document['body_lines']; offset = document['body_offset']
|
||||||
|
headings = []
|
||||||
|
for index, line in enumerate(lines):
|
||||||
|
if re.match(r'^\s*#{1,6}\s+', line):
|
||||||
|
kind = academic_type(clean(line))
|
||||||
|
if kind:
|
||||||
|
headings.append((index, kind, clean(line)))
|
||||||
|
records = []
|
||||||
|
root_end = headings[0][0] if headings else len(lines)
|
||||||
|
root_candidates = title_candidates(lines[:root_end], offset)
|
||||||
|
cat_years: dict[str, set[int]] = {}
|
||||||
|
for cat in document['categories']:
|
||||||
|
kind, year = category_type(cat)
|
||||||
|
if kind and year:
|
||||||
|
cat_years.setdefault(kind, set()).add(year)
|
||||||
|
for pos, (index, kind, heading) in enumerate(headings):
|
||||||
|
end = headings[pos + 1][0] if pos + 1 < len(headings) else len(lines)
|
||||||
|
section = lines[index + 1:end]
|
||||||
|
# Academic headings can contain a range, e.g. 2023/24. Prefer the
|
||||||
|
# matching category year within that range; otherwise use its end.
|
||||||
|
heading_years = [int(value) for value in re.findall(r'\b20\d{2}\b', heading)]
|
||||||
|
for match in re.finditer(r'\b(20\d{2})\s*[/–-]\s*(\d{2})(?!\d)', heading):
|
||||||
|
heading_years.append(int(match[1]) // 100 * 100 + int(match[2]))
|
||||||
|
matching_years = set(heading_years) & cat_years.get(kind, set())
|
||||||
|
year = (max(matching_years) if matching_years else max(heading_years)) if heading_years else (
|
||||||
|
next(iter(cat_years[kind])) if len(cat_years.get(kind, [])) == 1 else None)
|
||||||
|
candidates = title_candidates(section, offset + index + 1)
|
||||||
|
chosen = candidates[0] if candidates else None
|
||||||
|
# A root title explicitly marked BP/DP belongs to the matching thesis.
|
||||||
|
if not chosen:
|
||||||
|
matching_root = [row for row in root_candidates
|
||||||
|
if (' dp' in row['label'] or 'diplom' in row['label']) and kind == 'diploma_thesis'
|
||||||
|
or (' bp' in row['label'] or 'bakalar' in row['label']) and kind == 'bachelor_thesis']
|
||||||
|
if matching_root:
|
||||||
|
chosen = matching_root[0]
|
||||||
|
if not chosen:
|
||||||
|
# A short leading plain paragraph before assignment lists is a title;
|
||||||
|
# task/status labels, links and prose after a task boundary are not.
|
||||||
|
for n, raw in enumerate(section[:15]):
|
||||||
|
text = clean(raw)
|
||||||
|
if not text:
|
||||||
|
continue
|
||||||
|
if re.match(r'^\s*#{1,6}\s+', raw) or re.match(r'^\s*\d+[.)]\s+', raw):
|
||||||
|
break
|
||||||
|
if re.match(r'^\s*[-*+]\s+', raw):
|
||||||
|
if '](' in raw:
|
||||||
|
continue
|
||||||
|
break
|
||||||
|
if any(norm(text).startswith(word) for word in ['zadanie', 'ciel', 'ulohy', 'navrh na zadanie', 'navrh na zadamie', 'stretnutie']):
|
||||||
|
break
|
||||||
|
if raw.strip().startswith(('http', '[')) or not acceptable_title(text):
|
||||||
|
continue
|
||||||
|
chosen = {'title': text, 'line': offset + index + n + 2, 'label': 'leading_title'}
|
||||||
|
break
|
||||||
|
records.append({'academic_kind': 'Thesis' if kind.endswith('_thesis') else 'Work',
|
||||||
|
'academic_type': kind, 'year': year, 'title': chosen['title'] if chosen else None,
|
||||||
|
'document_path': document['path'], 'heading': heading,
|
||||||
|
'heading_line': offset + index + 1,
|
||||||
|
'title_line': chosen['line'] if chosen else None,
|
||||||
|
'year_basis': 'heading' if heading_years else 'frontmatter_category'})
|
||||||
|
# Standalone root titles occur in profiles without an academic heading.
|
||||||
|
# Use an explicit type label, or one unambiguous latest thesis category.
|
||||||
|
if root_candidates:
|
||||||
|
latest = sorted((year, kind) for kind, years in cat_years.items()
|
||||||
|
if kind.endswith('_thesis') for year in years)
|
||||||
|
if latest:
|
||||||
|
year, kind = latest[-1]
|
||||||
|
candidates = [row for row in root_candidates
|
||||||
|
if (' dp' not in row['label'] and 'diplom' not in row['label'] or kind == 'diploma_thesis')
|
||||||
|
and (' bp' not in row['label'] and 'bakalar' not in row['label'] or kind == 'bachelor_thesis')]
|
||||||
|
if candidates:
|
||||||
|
existing = next((r for r in records if r['academic_type'] == kind and r['year'] == year), None)
|
||||||
|
chosen = candidates[0]
|
||||||
|
if existing and not existing['title']:
|
||||||
|
existing.update(title=chosen['title'], title_line=chosen['line'])
|
||||||
|
elif existing is None:
|
||||||
|
records.append({'academic_kind': 'Thesis', 'academic_type': kind, 'year': year,
|
||||||
|
'title': chosen['title'], 'document_path': document['path'],
|
||||||
|
'heading': None, 'heading_line': None, 'title_line': chosen['line'],
|
||||||
|
'year_basis': 'frontmatter_category'})
|
||||||
|
return records
|
||||||
|
|
||||||
|
|
||||||
|
def load_source_oracle(wiki_root: Path = DEFAULT_WIKI) -> dict:
|
||||||
|
documents = {}
|
||||||
|
corpus_hashes = {}
|
||||||
|
for file in sorted((wiki_root / 'pages').rglob('README.md')):
|
||||||
|
raw = file.read_text(encoding='utf-8'); path = file.relative_to(wiki_root).as_posix()
|
||||||
|
corpus_hashes[path] = hashlib.sha256(file.read_bytes()).hexdigest()
|
||||||
|
page = frontmatter.loads(raw); taxonomy = page.get('taxonomy') or {}
|
||||||
|
raw_lines = raw.splitlines(); body_offset = 0
|
||||||
|
if raw_lines and raw_lines[0].strip() == '---':
|
||||||
|
body_offset = next((index + 1 for index in range(1, len(raw_lines)) if raw_lines[index].strip() == '---'), 0)
|
||||||
|
documents[path] = {'path': path, 'title': str(page.get('title') or '').strip(),
|
||||||
|
'tags': values(taxonomy.get('tag')), 'categories': values(taxonomy.get('category')),
|
||||||
|
'author': str(taxonomy.get('author') or page.get('author') or '').strip() or None,
|
||||||
|
'body_lines': raw_lines[body_offset:], 'body_offset': body_offset,
|
||||||
|
'sha256': corpus_hashes[path], 'source_url': source_url(path),
|
||||||
|
'raw_text': raw}
|
||||||
|
people = {}
|
||||||
|
for path, document in documents.items():
|
||||||
|
if profile_path(path) != path or not document['title']:
|
||||||
|
continue
|
||||||
|
family = [doc for child, doc in documents.items() if profile_path(child) == path]
|
||||||
|
start = re.search(r'(?:rok\s+)?zaciat\w*\s+studi\w*\s*:?\s*(20\d{2})', norm('\n'.join(document['body_lines'])))
|
||||||
|
if not start:
|
||||||
|
start = re.search(r'beginning of the study\s*(20\d{2})', norm('\n'.join(document['body_lines'])))
|
||||||
|
people[document['title']] = {'person': document['title'], 'profile': path, 'documents': [d['path'] for d in family],
|
||||||
|
'tags': sorted({tag for d in family for tag in d['tags']}, key=norm),
|
||||||
|
'categories': sorted({cat for d in family for cat in d['categories']}, key=norm),
|
||||||
|
'start_year': int(start[1]) if start else int(path.split('/')[2]) if path.startswith('pages/students/') else None,
|
||||||
|
'academics': extract_academics(document),
|
||||||
|
'year_conflicts': [r for r in extract_academics(document)
|
||||||
|
if r['year_basis'] == 'heading' and any(category_type(cat)[0] == r['academic_type']
|
||||||
|
and category_type(cat)[1] != r['year'] for cat in document['categories'])]}
|
||||||
|
canonical = json.dumps(corpus_hashes, sort_keys=True, separators=(',', ':'))
|
||||||
|
return {'wiki_root': str(wiki_root.resolve()), 'people': people, 'documents': documents,
|
||||||
|
'source_corpus': {'sha256': hashlib.sha256(canonical.encode()).hexdigest(),
|
||||||
|
'document_count': len(corpus_hashes), 'documents': corpus_hashes}}
|
||||||
|
|
||||||
|
|
||||||
|
def supporting_documents(oracle: dict, person: str, **constraints: Any) -> list[str]:
|
||||||
|
profile = oracle['people'].get(person)
|
||||||
|
if not profile:
|
||||||
|
return []
|
||||||
|
result = []
|
||||||
|
for path in profile['documents']:
|
||||||
|
doc = oracle['documents'][path]
|
||||||
|
if constraints.get('keyword') and norm(constraints['keyword']) not in {norm(tag) for tag in doc['tags']}:
|
||||||
|
continue
|
||||||
|
if constraints.get('category') and constraints['category'] not in doc['categories']:
|
||||||
|
continue
|
||||||
|
if constraints.get('document_author') and norm(doc['author']) != norm(constraints['document_author']):
|
||||||
|
continue
|
||||||
|
result.append(path)
|
||||||
|
return result
|
||||||
@ -729,7 +729,7 @@ def explicit_keyword_phrase(query: str) -> str | None:
|
|||||||
if not match:
|
if not match:
|
||||||
return None
|
return None
|
||||||
phrase = re.split(
|
phrase = re.split(
|
||||||
r"\s+(?:a\s+(?:jej|jeho|ich|rok)|ak\s+|uved\w*\s+|"
|
r"\s+(?:a\s+(?:jej|jeho|ich|rok|pomenuj|uved\w*)|ak\s+|uved\w*\s+|"
|
||||||
r"pomenuj\s+|maju\s+|ma\s+)",
|
r"pomenuj\s+|maju\s+|ma\s+)",
|
||||||
match.group(1),
|
match.group(1),
|
||||||
maxsplit=1,
|
maxsplit=1,
|
||||||
@ -1177,6 +1177,109 @@ def entity_aliases(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def name_token_variants(token: str) -> set[str]:
|
||||||
|
"""Conservative Slovak case endings; never accept arbitrary short prefixes."""
|
||||||
|
variants = {token}
|
||||||
|
if len(token) < 3:
|
||||||
|
return variants
|
||||||
|
if token.endswith('ova'):
|
||||||
|
variants.update(token[:-1] + suffix for suffix in ('ej', 'u', 'ou'))
|
||||||
|
elif token.endswith('y'):
|
||||||
|
variants.update(token[:-1] + suffix for suffix in ('eho', 'emu', 'ym', 'ych'))
|
||||||
|
elif token.endswith('a'):
|
||||||
|
variants.update(token[:-1] + suffix for suffix in ('y', 'e', 'u', 'ou', 'ovi', 'om'))
|
||||||
|
elif token.endswith('o'):
|
||||||
|
variants.update(token[:-1] + suffix for suffix in ('a', 'ovi', 'om'))
|
||||||
|
else:
|
||||||
|
variants.update(token + suffix for suffix in ('a', 'ovi', 'om'))
|
||||||
|
return variants
|
||||||
|
|
||||||
|
|
||||||
|
def person_name_match(query: str, alias: str) -> tuple[float, tuple[int, int] | None]:
|
||||||
|
"""Match the complete name in one contiguous window, preserving token order."""
|
||||||
|
words, name = normalize_for_match(query).split(), normalize_for_match(alias).split()
|
||||||
|
if len(name) < 2:
|
||||||
|
return 0.0, None
|
||||||
|
best = (0.0, None)
|
||||||
|
for start in range(len(words) - len(name) + 1):
|
||||||
|
window = words[start:start + len(name)]
|
||||||
|
if window == name:
|
||||||
|
return 200.0 + len(name), (start, start + len(name))
|
||||||
|
if all(observed in name_token_variants(canonical) for canonical, observed in zip(name, window)):
|
||||||
|
best = (180.0 + len(name), (start, start + len(name)))
|
||||||
|
return best
|
||||||
|
|
||||||
|
|
||||||
|
def requested_name_phrases(query: str) -> list[str]:
|
||||||
|
"""Recognise explicitly requested names, including unknown lower-case names.
|
||||||
|
|
||||||
|
This guard is separate from catalog resolution: an unresolved subject must
|
||||||
|
not turn the empty person filter into an unrestricted global listing.
|
||||||
|
"""
|
||||||
|
normalized = normalize_for_match(query.replace(',', ' separator '))
|
||||||
|
candidates = []
|
||||||
|
role = re.search(
|
||||||
|
r'\b(?:osob(?:a|y|u|e|ach|ami|am|ou)?|student(?:a|ovi|om|i|ov|ka|ky|ke|ku)?|kandidat(?:ov|i|a))\s+(.+)',
|
||||||
|
normalized,
|
||||||
|
)
|
||||||
|
if role:
|
||||||
|
tail = re.split(
|
||||||
|
r'\s+(?:s(?:o)?\s+(?:nazv\w*|nazov\w*|rok\w*)|splna\w*|ma|maju|mal|mali|je|su|'
|
||||||
|
r'ktory\w*|ktora\w*|pri\s+ktorych|v\s+roku|uved\w*|prepojen\w*|spojen\w*|'
|
||||||
|
r'vyber|najdi|zisti|cez|pomenuj|uved\w*|vypis|ak)\b', role.group(1), maxsplit=1,
|
||||||
|
)[0]
|
||||||
|
candidates.extend(re.split(r'\s+(?:a|separator)\s+', tail))
|
||||||
|
verb = re.search(r'\b(?:ma|mal|robil|riesil|venuje|venoval)\s+(.+)', normalized)
|
||||||
|
if verb:
|
||||||
|
candidates.append(re.split(r'\s+(?:v|s|so|a|ak|ktory\w*)\b', verb.group(1), maxsplit=1)[0])
|
||||||
|
# Capitalised full names also cover genitive phrases such as 'práce X Y'.
|
||||||
|
upper = 'A-ZÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽ'
|
||||||
|
for match in re.finditer(rf'\b([{upper}][^\W\d_]*(?:\s+[{upper}][^\W\d_]*){{1,3}})\b', query):
|
||||||
|
words = match.group(1).split()
|
||||||
|
if all(not word.isupper() for word in words):
|
||||||
|
candidates.append(normalize_for_match(match.group(1)))
|
||||||
|
generic = {'ktore', 'ktori', 'ktora', 'ktory', 'vsetci', 'vsetky', 'vsetkych', 'maju', 'ma',
|
||||||
|
'praca', 'prace', 'pracu', 'projekt', 'projekty', 'dokument', 'dokumenty', 'rok', 'roku',
|
||||||
|
'klucove', 'klucovy', 'klucovym', 'tag', 'tagy', 'nazov', 'nazvy', 'temu',
|
||||||
|
'kategoriu', 'kategorie', 'uvedenu', 'uvedeny', 'priradeny', 'priradene',
|
||||||
|
'je', 'su', 'sa', 's', 'pri', 'pre', 'z', 'na', 'v', 'ake', 'aky', 'kto', 'kolko'}
|
||||||
|
return list(dict.fromkeys(
|
||||||
|
candidate.strip() for candidate in candidates
|
||||||
|
if 1 <= len(candidate.split()) <= 5 and candidate.split()[0] not in generic
|
||||||
|
))
|
||||||
|
|
||||||
|
|
||||||
|
def named_author_phrases(query: str) -> list[str]:
|
||||||
|
normalized = normalize_for_match(query.replace(',', ' separator '))
|
||||||
|
match = re.search(r'\bautor(?:a|om)?(?:\s+dokument(?:u|ov))?\s+(.+)', normalized)
|
||||||
|
if not match:
|
||||||
|
return []
|
||||||
|
name = re.split(r'\s+(?:v|s|so|a|ak|ktory\w*|pri|spojen\w*)\b', match.group(1), maxsplit=1)[0]
|
||||||
|
return [name] if 2 <= len(name.split()) <= 4 and name.split()[0] not in {
|
||||||
|
'dokumentu', 'dokumentov', 'je', 'sa', 'pri', 'osoby', 'osobe', 'osobu', 'osob',
|
||||||
|
'ktory', 'ktora', 'ktoreho', 'studentov', 'studenta',
|
||||||
|
} else []
|
||||||
|
|
||||||
|
|
||||||
|
def explicit_keyword_entities(phrase: str, catalog: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
||||||
|
"""Resolve a requested tag as a complete leading phrase, not unrelated words."""
|
||||||
|
normalized = normalize_for_match(phrase)
|
||||||
|
matches = []
|
||||||
|
for entity in catalog:
|
||||||
|
if entity.get('kind') != 'Keyword':
|
||||||
|
continue
|
||||||
|
aliases = entity_aliases(entity)
|
||||||
|
matching = [alias for alias in aliases if normalized == alias]
|
||||||
|
if matching:
|
||||||
|
best = max(matching, key=len)
|
||||||
|
matches.append({**entity, 'matched_alias': best, 'match_score': 200.0 + len(best)})
|
||||||
|
if not matches:
|
||||||
|
return []
|
||||||
|
# Prefer the longest full tag when one tag is a prefix of another.
|
||||||
|
longest = max(len(row['matched_alias']) for row in matches)
|
||||||
|
return [row for row in matches if len(row['matched_alias']) == longest]
|
||||||
|
|
||||||
|
|
||||||
def tokens_match(
|
def tokens_match(
|
||||||
left: str,
|
left: str,
|
||||||
right: str,
|
right: str,
|
||||||
@ -1429,13 +1532,15 @@ def resolve_entities(
|
|||||||
for alias in entity_aliases(
|
for alias in entity_aliases(
|
||||||
entity
|
entity
|
||||||
):
|
):
|
||||||
score = (
|
name_span = None
|
||||||
alias_match_score(
|
if entity.get("kind") in {"Person", "DocumentAuthor"}:
|
||||||
|
score, name_span = person_name_match(normalized_query, alias)
|
||||||
|
else:
|
||||||
|
score = alias_match_score(
|
||||||
normalized_query,
|
normalized_query,
|
||||||
query_tokens,
|
query_tokens,
|
||||||
alias,
|
alias,
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
score > 0
|
score > 0
|
||||||
@ -1449,6 +1554,7 @@ def resolve_entities(
|
|||||||
if score > best_score:
|
if score > best_score:
|
||||||
best_score = score
|
best_score = score
|
||||||
best_alias = alias
|
best_alias = alias
|
||||||
|
best_name_span = name_span
|
||||||
|
|
||||||
if best_score <= 0.0:
|
if best_score <= 0.0:
|
||||||
continue
|
continue
|
||||||
@ -1460,6 +1566,8 @@ def resolve_entities(
|
|||||||
item[
|
item[
|
||||||
"matched_alias"
|
"matched_alias"
|
||||||
] = best_alias
|
] = best_alias
|
||||||
|
if entity.get("kind") in {"Person", "DocumentAuthor"}:
|
||||||
|
item["matched_name_span"] = best_name_span
|
||||||
|
|
||||||
item[
|
item[
|
||||||
"match_score"
|
"match_score"
|
||||||
@ -1472,6 +1580,17 @@ def resolve_entities(
|
|||||||
item
|
item
|
||||||
)
|
)
|
||||||
|
|
||||||
|
exact_name_spans = {
|
||||||
|
tuple(item["matched_name_span"])
|
||||||
|
for item in matches
|
||||||
|
if item.get("matched_name_span") is not None and item["match_score"] >= 200
|
||||||
|
}
|
||||||
|
matches = [item for item in matches if not (
|
||||||
|
item.get("matched_name_span") is not None
|
||||||
|
and tuple(item["matched_name_span"]) in exact_name_spans
|
||||||
|
and item["match_score"] < 200
|
||||||
|
)]
|
||||||
|
|
||||||
person_aliases = {
|
person_aliases = {
|
||||||
str(
|
str(
|
||||||
item.get(
|
item.get(
|
||||||
@ -2145,12 +2264,13 @@ WHERE person.graph_scope = $scope AND document.graph_scope = $scope
|
|||||||
AND author.graph_scope = $scope
|
AND author.graph_scope = $scope
|
||||||
AND (size($person_ids) = 0 OR elementId(person) IN $person_ids)
|
AND (size($person_ids) = 0 OR elementId(person) IN $person_ids)
|
||||||
AND (size($author_ids) = 0 OR elementId(author) IN $author_ids)
|
AND (size($author_ids) = 0 OR elementId(author) IN $author_ids)
|
||||||
AND (size($category_ids) = 0 OR EXISTS {
|
OPTIONAL MATCH (document)-[:IN_CATEGORY]->(category:Category)
|
||||||
MATCH (document)-[:IN_CATEGORY]->(category:Category)
|
WHERE category.graph_scope = $scope
|
||||||
WHERE category.graph_scope = $scope AND elementId(category) IN $category_ids
|
WITH person, document, author, category
|
||||||
})
|
WHERE size($category_ids) = 0 OR elementId(category) IN $category_ids
|
||||||
RETURN DISTINCT elementId(person) AS person_element_id, person.name AS person,
|
RETURN DISTINCT elementId(person) AS person_element_id, person.name AS person,
|
||||||
elementId(author) AS document_author_element_id, author.name AS document_author,
|
elementId(author) AS document_author_element_id, author.name AS document_author,
|
||||||
|
elementId(category) AS category_element_id, category.name AS category,
|
||||||
document.path AS document_path, document.source_url AS source_url
|
document.path AS document_path, document.source_url AS source_url
|
||||||
ORDER BY person, document_author, document_path
|
ORDER BY person, document_author, document_path
|
||||||
LIMIT $limit
|
LIMIT $limit
|
||||||
@ -2189,14 +2309,64 @@ def search_graph_with_session(
|
|||||||
preferred_kinds=constraints["target_kinds"],
|
preferred_kinds=constraints["target_kinds"],
|
||||||
)
|
)
|
||||||
if phrase:
|
if phrase:
|
||||||
keywords = resolve_entities(
|
keywords = explicit_keyword_entities(phrase, catalog)
|
||||||
phrase, [row for row in catalog if row.get("kind") == "Keyword"],
|
|
||||||
max_entities=max_entities,
|
|
||||||
)
|
|
||||||
entities = [row for row in entities if row.get("kind") != "Keyword"] + keywords
|
entities = [row for row in entities if row.get("kind") != "Keyword"] + keywords
|
||||||
constraints["unresolved_keyword"] = not bool(keywords)
|
constraints["unresolved_keyword"] = not bool(keywords)
|
||||||
else:
|
else:
|
||||||
constraints["unresolved_keyword"] = False
|
constraints["unresolved_keyword"] = False
|
||||||
|
if constraints["mentions_keyword"]:
|
||||||
|
entities = [row for row in entities if row.get("kind") != "Keyword"]
|
||||||
|
elif "zp wiki" in normalize_for_match(clean_query):
|
||||||
|
entities = [row for row in entities if not (
|
||||||
|
row.get("kind") == "Keyword" and row.get("matched_alias") == "zp"
|
||||||
|
)]
|
||||||
|
|
||||||
|
author_mentions = named_author_phrases(clean_query) if constraints["mentions_document_author"] else []
|
||||||
|
requested_authors = [
|
||||||
|
{**row, "matched_alias": normalize_for_match(row.get("name", "")), "match_score": score}
|
||||||
|
for row in catalog if row.get("kind") == "DocumentAuthor"
|
||||||
|
for requested in author_mentions
|
||||||
|
for score, _ in [person_name_match(requested, row.get("name", ""))]
|
||||||
|
if score > 0
|
||||||
|
]
|
||||||
|
if author_mentions:
|
||||||
|
author_names = {row["matched_alias"] for row in requested_authors}
|
||||||
|
entities = [row for row in entities if row.get("kind") != "DocumentAuthor" and not (
|
||||||
|
row.get("kind") == "Person" and row.get("matched_alias") in author_names
|
||||||
|
)] + requested_authors
|
||||||
|
|
||||||
|
requested_names = requested_name_phrases(clean_query)
|
||||||
|
unknown_names = []
|
||||||
|
for requested in requested_names:
|
||||||
|
if phrase and normalize_for_match(requested) in normalize_for_match(phrase):
|
||||||
|
continue
|
||||||
|
personal = [row for row in catalog if row.get("kind") in {"Person", "DocumentAuthor"}]
|
||||||
|
known_person = any(person_name_match(requested, row.get("name", ""))[0] > 0 for row in personal)
|
||||||
|
known_title = any(
|
||||||
|
normalize_for_match(requested) in alias
|
||||||
|
for row in catalog if row.get("kind") not in {"Person", "DocumentAuthor"}
|
||||||
|
for alias in entity_aliases(row)
|
||||||
|
)
|
||||||
|
if len(requested.split()) == 1:
|
||||||
|
# A verb can precede the first inflected word of a fully resolved
|
||||||
|
# thesis title. That is a title anchor, not an unknown person.
|
||||||
|
known_title = known_title or any(
|
||||||
|
tokens_match(normalize_for_match(requested), word)
|
||||||
|
for row in entities if row.get('kind') in {'Thesis', 'Work'}
|
||||||
|
for alias in entity_aliases(row) for word in alias.split()
|
||||||
|
)
|
||||||
|
if not known_person and not known_title:
|
||||||
|
unknown_names.append(requested)
|
||||||
|
constraints["requested_person_names"] = requested_names
|
||||||
|
constraints["unresolved_person_names"] = unknown_names
|
||||||
|
constraints["unresolved_document_author"] = bool(author_mentions and not requested_authors)
|
||||||
|
aliases_to_ids: dict[tuple[str, str], set[str]] = {}
|
||||||
|
for row in entities:
|
||||||
|
if row.get("kind") in {"Person", "DocumentAuthor"}:
|
||||||
|
key = (row["kind"], row["matched_alias"])
|
||||||
|
aliases_to_ids.setdefault(key, set()).add(str(row["element_id"]))
|
||||||
|
ambiguous_names = [name for (_, name), matches in aliases_to_ids.items() if len(matches) > 1]
|
||||||
|
constraints["ambiguous_person_names"] = sorted(set(ambiguous_names))
|
||||||
|
|
||||||
# Preserve explicitly mentioned people when a longer topic/title also matches.
|
# Preserve explicitly mentioned people when a longer topic/title also matches.
|
||||||
entities.sort(key=lambda row: (row.get("kind") != "Person", -row["match_score"]))
|
entities.sort(key=lambda row: (row.get("kind") != "Person", -row["match_score"]))
|
||||||
@ -2253,12 +2423,23 @@ def search_graph_with_session(
|
|||||||
# relational lookups use a conservative bound covering the managed graph.
|
# relational lookups use a conservative bound covering the managed graph.
|
||||||
fetch_limit = max(limit, len(catalog) ** 2)
|
fetch_limit = max(limit, len(catalog) ** 2)
|
||||||
common = {"scope": GRAPH_SCOPE, "person_ids": person_ids, "limit": fetch_limit}
|
common = {"scope": GRAPH_SCOPE, "person_ids": person_ids, "limit": fetch_limit}
|
||||||
blocked = constraints["unresolved_keyword"]
|
blocked_reasons = []
|
||||||
|
if constraints["unresolved_keyword"]:
|
||||||
|
blocked_reasons.append("unknown_keyword")
|
||||||
|
if unknown_names:
|
||||||
|
blocked_reasons.append("unknown_person")
|
||||||
|
if constraints["unresolved_document_author"]:
|
||||||
|
blocked_reasons.append("unknown_document_author")
|
||||||
|
if ambiguous_names:
|
||||||
|
blocked_reasons.append("ambiguous_person")
|
||||||
|
if constraints["mentions_count"] and not (thesis_specific or work_specific):
|
||||||
|
blocked_reasons.append("unsupported_count_domain")
|
||||||
# A quoted unknown work title is a failed exact lookup, not a global listing.
|
# A quoted unknown work title is a failed exact lookup, not a global listing.
|
||||||
quoted_titles = re.findall(r'[„“"«]([^„“”"»]+)[“”"»]', clean_query)
|
quoted_titles = re.findall(r'[„“"«]([^„“”"»]+)[“”"»]', clean_query)
|
||||||
if quoted_titles and (thesis_specific or work_specific) and not thesis_ids and not work_ids:
|
if quoted_titles and (thesis_specific or work_specific) and not thesis_ids and not work_ids:
|
||||||
blocked = True
|
blocked_reasons.append("unknown_title")
|
||||||
constraints["unresolved_title"] = True
|
constraints["unresolved_title"] = True
|
||||||
|
blocked = bool(blocked_reasons)
|
||||||
|
|
||||||
def fetch(enabled: bool, cypher: str, **params: Any) -> list[dict[str, Any]]:
|
def fetch(enabled: bool, cypher: str, **params: Any) -> list[dict[str, Any]]:
|
||||||
return run_rows(session, cypher, **common, **params) if enabled and not blocked else []
|
return run_rows(session, cypher, **common, **params) if enabled and not blocked else []
|
||||||
@ -2294,7 +2475,7 @@ def search_graph_with_session(
|
|||||||
keyword_rows = [row for row in keyword_rows if row.get("person_element_id") in academic_people]
|
keyword_rows = [row for row in keyword_rows if row.get("person_element_id") in academic_people]
|
||||||
|
|
||||||
shared_years: list[int] | None = None
|
shared_years: list[int] | None = None
|
||||||
if (constraints["mentions_academic_year"] and constraints["mentions_shared"]
|
if (not blocked and constraints["mentions_academic_year"] and constraints["mentions_shared"]
|
||||||
and len(person_ids) >= 2 and not (shared_keyword or shared_category or shared_author)):
|
and len(person_ids) >= 2 and not (shared_keyword or shared_category or shared_author)):
|
||||||
years_by_person = {
|
years_by_person = {
|
||||||
person: {row["year"] for row in thesis_rows + work_rows
|
person: {row["year"] for row in thesis_rows + work_rows
|
||||||
@ -2334,13 +2515,21 @@ def search_graph_with_session(
|
|||||||
)
|
)
|
||||||
for row in author_rows:
|
for row in author_rows:
|
||||||
facts.append({**row, "fact_type": "person_document_author"})
|
facts.append({**row, "fact_type": "person_document_author"})
|
||||||
|
if row.get("category") and not any(
|
||||||
|
fact.get("fact_type") == "person_category"
|
||||||
|
and fact.get("person_element_id") == row.get("person_element_id")
|
||||||
|
and fact.get("document_path") == row.get("document_path")
|
||||||
|
and fact.get("category") == row.get("category")
|
||||||
|
for fact in facts
|
||||||
|
):
|
||||||
|
facts.append({**row, "fact_type": "person_category"})
|
||||||
if shared_years is not None:
|
if shared_years is not None:
|
||||||
facts.append({"fact_type": "academic_year_comparison", "shared_years": shared_years,
|
facts.append({"fact_type": "academic_year_comparison", "shared_years": shared_years,
|
||||||
"same_academic_year": bool(shared_years),
|
"same_academic_year": bool(shared_years),
|
||||||
"people": [row["name"] for row in resolved_entities if row.get("kind") == "Person"]})
|
"people": [row["name"] for row in resolved_entities if row.get("kind") == "Person"]})
|
||||||
|
|
||||||
aggregation = None
|
aggregation = None
|
||||||
if constraints["mentions_count"]:
|
if constraints["mentions_count"] and not blocked:
|
||||||
matching = sorted({str(row["person"]) for row in thesis_rows + work_rows})
|
matching = sorted({str(row["person"]) for row in thesis_rows + work_rows})
|
||||||
aggregation = {"count": len(matching), "people": matching,
|
aggregation = {"count": len(matching), "people": matching,
|
||||||
"candidate_count": len(person_ids), "complete": not entity_limit_reached}
|
"candidate_count": len(person_ids), "complete": not entity_limit_reached}
|
||||||
@ -2366,10 +2555,24 @@ def search_graph_with_session(
|
|||||||
):
|
):
|
||||||
if active:
|
if active:
|
||||||
strategies.append(name)
|
strategies.append(name)
|
||||||
|
positive_facts = [row for row in facts if row.get("fact_type") not in {
|
||||||
|
"academic_year_comparison", "start_year_comparison"
|
||||||
|
}]
|
||||||
|
status = "ambiguous" if ambiguous_names else (
|
||||||
|
"no_answer" if blocked or not (positive_facts or paths or aggregation is not None) else "ok"
|
||||||
|
)
|
||||||
|
reason = blocked_reasons[0] if blocked_reasons else (
|
||||||
|
"no_matching_facts" if status == "no_answer" else None
|
||||||
|
)
|
||||||
return {
|
return {
|
||||||
|
"status": status, "reason": reason, "reasons": blocked_reasons,
|
||||||
"query": clean_query, "strategies": strategies, "constraints": constraints,
|
"query": clean_query, "strategies": strategies, "constraints": constraints,
|
||||||
"resolved_entities": resolved_entities, "paths": paths[:limit], "facts": facts[:limit],
|
"resolved_entities": resolved_entities, "paths": paths[:limit], "facts": facts[:limit],
|
||||||
"documents": documents, "aggregation": aggregation,
|
"documents": documents, "aggregation": aggregation,
|
||||||
|
"checked_entities": resolved_entities,
|
||||||
|
"rejection_evidence": [row for row in facts if row.get("fact_type") in {
|
||||||
|
"academic_year_comparison", "start_year_comparison"
|
||||||
|
} and not positive_facts],
|
||||||
"truncated": entity_limit_reached or len(facts) > limit or len(paths) > limit,
|
"truncated": entity_limit_reached or len(facts) > limit or len(paths) > limit,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,6 +30,7 @@ WORK_HEADING_PATTERNS = (
|
|||||||
("diploma_project", "diplomovy projekt", None),
|
("diploma_project", "diplomovy projekt", None),
|
||||||
("team_project", "timovy projekt", "tp"),
|
("team_project", "timovy projekt", "tp"),
|
||||||
("research_project", "vyskumny projekt", "vp"),
|
("research_project", "vyskumny projekt", "vp"),
|
||||||
|
("research_project", "vedecky projekt", "vp"),
|
||||||
("doctoral_thesis", "dizertacna praca", "phd"),
|
("doctoral_thesis", "dizertacna praca", "phd"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
98
tools/graphrag/tests/test_evaluation_pipeline_v2.py
Normal file
98
tools/graphrag/tests/test_evaluation_pipeline_v2.py
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import copy
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from tools.graphrag.evaluation.freeze_graphrag import make_freeze
|
||||||
|
from tools.graphrag.evaluation.reproducibility import source_corpus_fingerprint
|
||||||
|
|
||||||
|
|
||||||
|
def freeze_inputs():
|
||||||
|
questions = [
|
||||||
|
{'id': 'dev-a', 'split': 'dev', 'graph': {'schema_version': 3, 'source_profiles': ['pages/students/a/README.md']}},
|
||||||
|
{'id': 'test-b', 'split': 'test', 'graph': {'schema_version': 3, 'source_profiles': ['pages/students/b/README.md']}},
|
||||||
|
]
|
||||||
|
fingerprints = {'implementation': {}, 'dataset_sha256': 'dataset', 'inputs': {},
|
||||||
|
'source_corpus': {'sha256': 'raw-corpus'}}
|
||||||
|
audit = {'dataset_sha256': 'dataset', 'inputs': {}, 'source_corpus': {'sha256': 'raw-corpus'},
|
||||||
|
'questions': [{'id': q['id'], 'source_consistent': True} for q in questions], 'by_split': {}}
|
||||||
|
dev = {'configuration': {'split': 'dev', 'limit': 40, 'max_entities': 8},
|
||||||
|
'questions': [{'id': 'dev-a', 'error': None}], 'summary': {'error_count': 0},
|
||||||
|
'run_metadata': {'fingerprints': fingerprints, 'graph': {'sha256': 'graph'}}}
|
||||||
|
return dev, questions, fingerprints, audit
|
||||||
|
|
||||||
|
|
||||||
|
def test_primary_freeze_verifies_disjoint_profiles():
|
||||||
|
args = freeze_inputs()
|
||||||
|
manifest = make_freeze(*args)
|
||||||
|
assert manifest['partition']['overlap'] == 0
|
||||||
|
assert manifest['partition']['test_profile_count'] == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_primary_freeze_rejects_same_profile_across_splits():
|
||||||
|
dev, questions, fingerprints, audit = freeze_inputs()
|
||||||
|
questions[1]['graph']['source_profiles'] = questions[0]['graph']['source_profiles']
|
||||||
|
with pytest.raises(RuntimeError, match='profiles overlap'):
|
||||||
|
make_freeze(dev, questions, fingerprints, audit)
|
||||||
|
|
||||||
|
|
||||||
|
def test_primary_freeze_rejects_unvalidated_source_expectation():
|
||||||
|
dev, questions, fingerprints, audit = freeze_inputs()
|
||||||
|
audit['questions'][1]['source_consistent'] = False
|
||||||
|
with pytest.raises(RuntimeError, match='source-inconsistent'):
|
||||||
|
make_freeze(dev, questions, fingerprints, audit)
|
||||||
|
|
||||||
|
|
||||||
|
def test_primary_freeze_rejects_stale_raw_markdown_audit():
|
||||||
|
dev, questions, fingerprints, audit = freeze_inputs()
|
||||||
|
audit['source_corpus'] = {'sha256': 'stale'}
|
||||||
|
with pytest.raises(RuntimeError, match='original Markdown'):
|
||||||
|
make_freeze(dev, questions, fingerprints, audit)
|
||||||
|
|
||||||
|
|
||||||
|
def test_raw_source_fingerprint_detects_unindexed_change(tmp_path: Path, monkeypatch):
|
||||||
|
wiki = tmp_path / 'wiki'
|
||||||
|
doc = wiki / 'pages/students/example/README.md'
|
||||||
|
doc.parent.mkdir(parents=True)
|
||||||
|
doc.write_text('---\ntitle: Example\n---\nOriginal source\n')
|
||||||
|
monkeypatch.setenv('ZPWIKI_ROOT', str(wiki))
|
||||||
|
original = source_corpus_fingerprint()
|
||||||
|
doc.write_text('---\ntitle: Example\n---\nChanged source\n')
|
||||||
|
assert original['sha256'] != source_corpus_fingerprint()['sha256']
|
||||||
|
|
||||||
|
|
||||||
|
def test_freeze_cli_does_not_overwrite_previous_manifest(tmp_path, monkeypatch):
|
||||||
|
from tools.graphrag.evaluation.freeze_graphrag import main
|
||||||
|
previous = tmp_path / 'frozen_v1.json'
|
||||||
|
previous.write_text('historical manifest')
|
||||||
|
monkeypatch.setattr('sys.argv', ['freeze', '--dev-results', 'unused', '--audit', 'unused',
|
||||||
|
'--output', str(previous)])
|
||||||
|
with pytest.raises(SystemExit):
|
||||||
|
main()
|
||||||
|
assert previous.read_text() == 'historical manifest'
|
||||||
|
|
||||||
|
|
||||||
|
def test_dev_overwrite_cannot_replace_archived_results(tmp_path):
|
||||||
|
from argparse import Namespace
|
||||||
|
from tools.graphrag.evaluation.evaluate_graphrag import validate_output_destination
|
||||||
|
directory = tmp_path / 'final_v1'
|
||||||
|
directory.mkdir()
|
||||||
|
previous = directory / 'graphrag_dev.json'
|
||||||
|
previous.write_text('archived DEV')
|
||||||
|
args = Namespace(split='dev', ids='', max_questions=None, overwrite=True, output_dir=directory)
|
||||||
|
with pytest.raises(RuntimeError, match='immutable'):
|
||||||
|
validate_output_destination(args)
|
||||||
|
assert previous.read_text() == 'archived DEV'
|
||||||
|
|
||||||
|
|
||||||
|
def test_reproduction_requires_fresh_results_directory(tmp_path):
|
||||||
|
from argparse import Namespace
|
||||||
|
from tools.graphrag.evaluation.evaluate_graphrag import validate_output_destination
|
||||||
|
previous = tmp_path / 'graphrag_test.json'
|
||||||
|
previous.write_text('archived TEST')
|
||||||
|
args = Namespace(split='test', ids='', max_questions=None, overwrite=False, output_dir=tmp_path)
|
||||||
|
with pytest.raises(RuntimeError, match='already exist'):
|
||||||
|
validate_output_destination(args)
|
||||||
|
assert previous.read_text() == 'archived TEST'
|
||||||
226
tools/graphrag/tests/test_evaluator_connected_v2.py
Normal file
226
tools/graphrag/tests/test_evaluator_connected_v2.py
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from tools.graphrag.evaluation.graphrag_evaluator import evaluate_result, load_questions
|
||||||
|
|
||||||
|
|
||||||
|
def academic(person='Alena Nová', year=2024, title='Práca A', identifier='thesis-a', document='a.md', **extra):
|
||||||
|
return {'fact_type': 'person_thesis', 'person': person,
|
||||||
|
'thesis_id': identifier, 'thesis_type': 'bachelor_thesis',
|
||||||
|
'title': title, 'year': year, 'document_path': document,
|
||||||
|
'source_url': 'https://example.test/' + document, **extra}
|
||||||
|
|
||||||
|
|
||||||
|
def keyword(person='Alena Nová', value='RAG', document='a.md'):
|
||||||
|
return {'fact_type': 'person_keyword', 'person': person, 'keyword': value,
|
||||||
|
'document_path': document, 'source_url': 'https://example.test/' + document}
|
||||||
|
|
||||||
|
|
||||||
|
def question(bindings, **graph):
|
||||||
|
return {'id': 'synthetic-connected', 'split': 'dev', 'question': 'Overenie dôkazu.',
|
||||||
|
'graph': {'schema_version': 3, 'expected_bindings': bindings, **graph}}
|
||||||
|
|
||||||
|
|
||||||
|
def score(q, facts=(), **result):
|
||||||
|
result.setdefault('status', 'ok')
|
||||||
|
return evaluate_result(q, {'facts': list(facts), **result}, latency_seconds=0)
|
||||||
|
|
||||||
|
|
||||||
|
def test_same_person_keyword_and_academic_year_have_connected_proofs():
|
||||||
|
q = question([{'person': 'Alena Nová', 'academic_kind': 'Thesis', 'year': 2024, 'keyword': 'RAG'}])
|
||||||
|
row = score(q, [academic(), keyword()], status='ok')
|
||||||
|
assert row['strict'] and row['bindings_ok'] and row['paths_ok']
|
||||||
|
assert len(row['path_results']) == 2
|
||||||
|
assert all(path['witness'] for path in row['path_results'])
|
||||||
|
|
||||||
|
|
||||||
|
def test_disconnected_persons_cannot_satisfy_conjunction():
|
||||||
|
q = question([{'person': 'Alena Nová', 'year': 2024, 'keyword': 'RAG'}])
|
||||||
|
row = score(q, [academic(), keyword(person='Boris Iný')])
|
||||||
|
assert not row['strict'] and not row['bindings_ok']
|
||||||
|
|
||||||
|
|
||||||
|
def test_legacy_annotations_also_reject_disconnected_persons():
|
||||||
|
q = {'graph': {'schema_version': 2, 'expected_entities': [
|
||||||
|
{'type': 'person', 'value': 'Alena Nová'}, {'type': 'keyword', 'value': 'RAG'},
|
||||||
|
{'type': 'year', 'value': 2024}], 'expected_properties': ['Thesis.year'],
|
||||||
|
'expected_relations': ['AUTHORED', 'HAS_DOCUMENT', 'HAS_KEYWORD']}}
|
||||||
|
assert not score(q, [academic(), keyword(person='Boris Iný')])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_start_year_does_not_satisfy_academic_year():
|
||||||
|
q = question([{'person': 'Alena Nová', 'year': 2024}])
|
||||||
|
row = score(q, [academic(year=2025, start_year=2024)])
|
||||||
|
assert not row['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_legacy_academic_year_entity_is_not_start_year():
|
||||||
|
q = {'expected_answer_contains': ['2024'], 'graph': {'expected_entities': [
|
||||||
|
{'type': 'year', 'value': '2024'}], 'expected_properties': ['Thesis.year']}}
|
||||||
|
row = score(q, [academic(year=2025, start_year=2024)])
|
||||||
|
assert not row['strict'] and row['entity_score'] == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_title_and_year_must_belong_to_the_same_work():
|
||||||
|
q = question([{'person': 'Alena Nová', 'title': 'Práca A', 'year': 2025}])
|
||||||
|
assert not score(q, [academic(), academic(year=2025, title='Práca B', identifier='thesis-b')])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_conflicting_same_node_properties_do_not_create_synthetic_work():
|
||||||
|
q = question([{'person': 'Alena Nová', 'title': 'Práca A', 'year': 2025}])
|
||||||
|
conflicting = academic(year=2025)
|
||||||
|
conflicting.pop('title')
|
||||||
|
assert not score(q, [academic(), conflicting])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_thesis_and_project_types_are_not_interchangeable():
|
||||||
|
q = question([{'person': 'Alena Nová', 'academic_kind': 'Work', 'year': 2024}])
|
||||||
|
assert not score(q, [academic()])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_project_proof_uses_has_work_not_authored():
|
||||||
|
q = question([{'person': 'Alena Nová', 'academic_kind': 'Work', 'academic_type': 'diploma_project', 'year': 2024}])
|
||||||
|
fact = academic()
|
||||||
|
fact.update(fact_type='person_work', work_id='project-a', work_type='diploma_project')
|
||||||
|
fact.pop('thesis_id'); fact.pop('thesis_type')
|
||||||
|
assert score(q, [fact])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_implicit_academic_proof_accepts_either_real_kind():
|
||||||
|
assert score(question([{'person': 'Alena Nová', 'year': 2024}]), [academic()])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_metadata_can_come_from_same_person_family_when_not_same_document_required():
|
||||||
|
q = question([{'person': 'Alena Nová', 'year': 2024, 'keyword': 'RAG'}])
|
||||||
|
assert score(q, [academic(), keyword(document='child.md')])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_same_document_constraint_rejects_family_only_join():
|
||||||
|
q = question([{'person': 'Alena Nová', 'year': 2024, 'keyword': 'RAG', 'same_document': True}])
|
||||||
|
assert not score(q, [academic(), keyword(document='child.md')])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_author_and_category_must_share_actual_document():
|
||||||
|
q = question([{'person': 'Alena Nová', 'category': 'bp2024', 'document_author': 'Autor Správny'}])
|
||||||
|
category = {'fact_type': 'person_category', 'person': 'Alena Nová', 'category': 'bp2024', 'document_path': 'a.md'}
|
||||||
|
author = {'fact_type': 'person_document_author', 'person': 'Alena Nová',
|
||||||
|
'document_author': 'Autor Správny', 'document_path': 'other.md'}
|
||||||
|
assert not score(q, [category, author])['strict']
|
||||||
|
author['document_path'] = 'a.md'
|
||||||
|
assert score(q, [category, author])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_author_category_query_fact_can_carry_same_document_category_proof():
|
||||||
|
q = question([{'person': 'Alena Nová', 'category': 'bp2024', 'document_author': 'Autor Správny'}])
|
||||||
|
author = {'fact_type': 'person_document_author', 'person': 'Alena Nová', 'category': 'bp2024',
|
||||||
|
'document_author': 'Autor Správny', 'document_path': 'a.md'}
|
||||||
|
assert score(q, [author])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_start_year_needs_direct_person_source_proof():
|
||||||
|
q = question([{'person': 'Alena Nová', 'start_year': 2020}])
|
||||||
|
assert not score(q, [academic(start_year=2020)])['strict']
|
||||||
|
direct = {'fact_type': 'person_start_year', 'person': 'Alena Nová', 'start_year': 2020, 'document_path': 'a.md'}
|
||||||
|
assert score(q, [direct])['strict']
|
||||||
|
direct.pop('document_path')
|
||||||
|
assert not score(q, [direct])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_conflicting_person_start_year_fails_closed():
|
||||||
|
q = question([{'person': 'Alena Nová', 'start_year': 2020}])
|
||||||
|
first = {'fact_type': 'person_start_year', 'person': 'Alena Nová', 'start_year': 2020, 'document_path': 'a.md'}
|
||||||
|
assert not score(q, [first, {**first, 'start_year': 2021}])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_explicit_path_pattern_is_bound_to_expected_subject():
|
||||||
|
q = question([{'person': 'Alena Nová', 'keyword': 'RAG'}], expected_path_patterns=[{
|
||||||
|
'binding_index': 0, 'node_kinds': ['Person', 'Document', 'Keyword'],
|
||||||
|
'relationships': ['HAS_DOCUMENT', 'HAS_KEYWORD']}])
|
||||||
|
assert not score(q, [keyword(person='Boris Iný')])['strict']
|
||||||
|
assert score(q, [keyword()])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_incompatible_ordered_path_does_not_forge_relationship():
|
||||||
|
q = question([{'person': 'Alena Nová', 'academic_kind': 'Work', 'year': 2024}])
|
||||||
|
path = {'nodes': [{'kind': 'Person', 'name': 'Alena Nová'},
|
||||||
|
{'kind': 'Work', 'id': 'work', 'year': 2024},
|
||||||
|
{'kind': 'Document', 'path': 'a.md'}],
|
||||||
|
'relationships': ['AUTHORED', 'EVIDENCED_BY']}
|
||||||
|
assert not score(q, paths=[path])['strict']
|
||||||
|
path['relationships'][0] = 'HAS_WORK'
|
||||||
|
assert score(q, paths=[path])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_unrecognized_query_entities_are_never_proof():
|
||||||
|
q = question([{'person': 'Alena Nová', 'year': 2024}])
|
||||||
|
assert not score(q, resolved_entities=[{'kind': 'Person', 'name': 'Alena Nová', 'year': 2024}])['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_no_answer_is_a_success_only_when_no_positive_evidence_returned():
|
||||||
|
q = question([], expected_no_answer=True)
|
||||||
|
q['should_answer'] = False
|
||||||
|
assert score(q, status='no_answer', reason='unknown_person')['strict']
|
||||||
|
assert not score(q, [academic()], status='no_answer', reason='unknown_person')['strict']
|
||||||
|
assert not score(q, status='no_answer')['strict']
|
||||||
|
assert not score(q, status='ok', reason='unknown_person')['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_no_answer_requires_expected_ambiguity_when_specified():
|
||||||
|
q = question([], expected_no_answer=True, expected_status='ambiguous')
|
||||||
|
assert score(q, status='ambiguous', reason='multiple_people')['strict']
|
||||||
|
assert not score(q, status='no_answer', reason='unknown_person')['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_false_comparison_can_be_no_answer_evidence_without_positive_claim():
|
||||||
|
q = question([], expected_no_answer=True)
|
||||||
|
fact = {'fact_type': 'academic_year_comparison', 'shared_years': [], 'same_academic_year': False}
|
||||||
|
assert score(q, [fact], status='no_answer', reason='no_shared_year')['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_empty_positive_contract_does_not_pass_vacuously():
|
||||||
|
assert not score(question([]), status='ok')['strict']
|
||||||
|
assert not score(question([{}]), status='ok')['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_zero_count_is_a_grounded_answer_not_a_no_answer():
|
||||||
|
q = question([], expected_count=0, expected_entity_set=[], entity_set_mode='exact', entity_set_field='person')
|
||||||
|
result = {'aggregation': {'count': 0, 'people': [], 'complete': True}}
|
||||||
|
assert score(q, status='ok', **result)['strict']
|
||||||
|
assert not score(q, status='no_answer', reason='no_rows', **result)['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_schema3_loader_rejects_unbound_path_pattern(tmp_path):
|
||||||
|
q = question([{'person': 'Alena Nová', 'keyword': 'RAG'}], expected_path_patterns=[{
|
||||||
|
'binding_index': 2, 'node_kinds': ['Person', 'Document'], 'relationships': ['HAS_DOCUMENT']}])
|
||||||
|
path = tmp_path / 'questions.json'; path.write_text(json.dumps([q]))
|
||||||
|
with pytest.raises(ValueError, match='invalid connected path pattern'):
|
||||||
|
load_questions(path)
|
||||||
|
|
||||||
|
|
||||||
|
def test_declared_count_and_people_must_match_actual_answer_evidence():
|
||||||
|
q = question([{'person': 'Alena Nová', 'year': 2024}], expected_count=1,
|
||||||
|
expected_entity_set=['Alena Nová'], entity_set_mode='exact', entity_set_field='person')
|
||||||
|
assert score(q, [academic()], aggregation={'count': 1, 'people': ['Alena Nová'], 'complete': True})['strict']
|
||||||
|
assert not score(q, [academic()], aggregation={'count': 1, 'people': ['Boris Iný'], 'complete': True})['strict']
|
||||||
|
assert not score(q, [academic()], aggregation={'count': True, 'people': ['Alena Nová'], 'complete': True})['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_no_answer_cannot_hide_a_positive_comparison_claim():
|
||||||
|
q = question([], expected_no_answer=True)
|
||||||
|
fact = {'fact_type': 'academic_year_comparison', 'shared_years': [], 'same_academic_year': True}
|
||||||
|
assert not score(q, [fact], status='no_answer', reason='no_shared_year')['strict']
|
||||||
|
|
||||||
|
|
||||||
|
def test_evidence_accepts_one_of_valid_source_alternatives_not_every_duplicate():
|
||||||
|
q = question([{'person': 'Alena Nová', 'keyword': 'RAG'}], expected_evidence_documents=[{
|
||||||
|
'binding_index': 0, 'role': 'keyword_document', 'any_of': [
|
||||||
|
{'document_path': 'a.md', 'source_url': 'https://example.test/a.md'},
|
||||||
|
{'document_path': 'child.md', 'source_url': 'https://example.test/child.md'}]}])
|
||||||
|
assert score(q, [keyword(document='a.md')])['strict']
|
||||||
|
assert score(q, [keyword(document='child.md')])['strict']
|
||||||
|
assert not score(q, [keyword(document='unrelated.md')])['strict']
|
||||||
|
fact = keyword(document='a.md'); fact['source_url'] = 'https://wrong.test/'
|
||||||
|
assert not score(q, [fact])['strict']
|
||||||
159
tools/graphrag/tests/test_graph_search_entity_v2.py
Normal file
159
tools/graphrag/tests/test_graph_search_entity_v2.py
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from tools.graphrag import graph_search as gs
|
||||||
|
from .test_graph_search import FakeSession
|
||||||
|
|
||||||
|
|
||||||
|
def catalog():
|
||||||
|
return [
|
||||||
|
{'kind': 'Person', 'element_id': 'alice', 'id': 'person:alice', 'name': 'Alena Nová',
|
||||||
|
'source_document': 'alice.md'},
|
||||||
|
{'kind': 'Person', 'element_id': 'boris', 'id': 'person:boris', 'name': 'Boris Malý',
|
||||||
|
'source_document': 'boris.md'},
|
||||||
|
{'kind': 'Person', 'element_id': 'cross', 'id': 'person:cross', 'name': 'Boris Novák',
|
||||||
|
'source_document': 'cross.md'},
|
||||||
|
{'kind': 'Keyword', 'element_id': 'rag', 'id': 'rag', 'name': 'RAG'},
|
||||||
|
{'kind': 'Keyword', 'element_id': 'zp', 'id': 'zp', 'name': 'zp'},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def thesis():
|
||||||
|
return {'person_element_id': 'alice', 'person': 'Alena Nová', 'thesis_element_id': 'thesis-a',
|
||||||
|
'thesis_type': 'bachelor_thesis', 'year': 2024, 'title': 'Ukážkový výskum',
|
||||||
|
'document_path': 'alice.md', 'source_url': 'https://example.test/alice'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_complete_names_cannot_be_assembled_from_different_people():
|
||||||
|
data = catalog() + [{'kind': 'Person', 'element_id': 'mixed', 'id': 'person:mixed', 'name': 'Boris Nová'}]
|
||||||
|
result = gs.resolve_entities('Porovnaj osoby Alena Nová a Boris Malý.', data)
|
||||||
|
assert {row['element_id'] for row in result if row['kind'] == 'Person'} == {'alice', 'boris'}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('query', [
|
||||||
|
'Akú prácu robila Alena Nová?',
|
||||||
|
'Aký je názov práce Aleny Novej?',
|
||||||
|
'Vyhľadaj prácu Borisa Malého.',
|
||||||
|
])
|
||||||
|
def test_controlled_name_inflections_still_resolve(query):
|
||||||
|
resolved = gs.resolve_entities(query, catalog())
|
||||||
|
assert any(row['kind'] == 'Person' for row in resolved)
|
||||||
|
|
||||||
|
|
||||||
|
def test_exact_full_name_wins_over_inflection_of_another_name():
|
||||||
|
data = [{'kind': 'Person', 'element_id': 'jan', 'id': 'jan', 'name': 'Ján Novák'},
|
||||||
|
{'kind': 'Person', 'element_id': 'jana', 'id': 'jana', 'name': 'Jana Novák'}]
|
||||||
|
assert [row['element_id'] for row in gs.resolve_entities('Čomu sa venuje Jana Novák?', data)] == ['jana']
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('query', [
|
||||||
|
'Aký názov diplomovej práce má Zuzana Neexistujúca?',
|
||||||
|
'Aký názov diplomovej práce má zuzana neexistujuca?',
|
||||||
|
'Akú prácu robil Neznámy Študent?',
|
||||||
|
'Čomu sa venuje neznama osoba?',
|
||||||
|
'Aký je názov práce osoby neznama osoba?',
|
||||||
|
'Z kandidátov Alena Nová, neznama osoba, Boris Malý vyber osoby s prácou v roku 2024. Koľko ich je?',
|
||||||
|
])
|
||||||
|
def test_explicit_unknown_person_never_becomes_global_search(query):
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog(), gs.THESIS_FACTS_QUERY: [thesis()]})
|
||||||
|
result = gs.search_graph_with_session(session, query)
|
||||||
|
assert result['status'] == 'no_answer'
|
||||||
|
assert result['reason'] == 'unknown_person'
|
||||||
|
assert result['facts'] == [] and result['paths'] == []
|
||||||
|
assert result['aggregation'] is None
|
||||||
|
assert gs.THESIS_FACTS_QUERY not in {statement for statement, _ in session.calls}
|
||||||
|
|
||||||
|
|
||||||
|
def test_legitimate_global_listing_keeps_unrestricted_query():
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog(), gs.THESIS_FACTS_QUERY: [thesis()]})
|
||||||
|
result = gs.search_graph_with_session(session, 'Aké bakalárske práce sú uvedené v roku 2024?')
|
||||||
|
assert result['status'] == 'ok'
|
||||||
|
assert result['facts'][0]['title'] == 'Ukážkový výskum'
|
||||||
|
assert next(params for statement, params in session.calls if statement == gs.THESIS_FACTS_QUERY)['person_ids'] == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_duplicate_full_name_is_explicitly_ambiguous():
|
||||||
|
data = catalog() + [{'kind': 'Person', 'element_id': 'duplicate', 'id': 'person:duplicate',
|
||||||
|
'name': 'Alena Nová', 'source_document': 'duplicate.md'}]
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: data, gs.THESIS_FACTS_QUERY: [thesis()]})
|
||||||
|
result = gs.search_graph_with_session(session, 'Aký názov práce má Alena Nová?')
|
||||||
|
assert result['status'] == 'ambiguous'
|
||||||
|
assert result['reason'] == 'ambiguous_person'
|
||||||
|
assert result['facts'] == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_explicit_document_author_role_is_not_replaced_by_same_named_student():
|
||||||
|
data = catalog() + [{'kind': 'DocumentAuthor', 'element_id': 'author', 'id': 'author:alice', 'name': 'Alena Nová'}]
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: data})
|
||||||
|
result = gs.search_graph_with_session(session, 'Ktoré dokumenty napísal autor Alena Nová?')
|
||||||
|
params = next(params for statement, params in session.calls if statement == gs.PERSON_DOCUMENT_AUTHOR_FACTS_QUERY)
|
||||||
|
assert params['person_ids'] == []
|
||||||
|
assert params['author_ids'] == ['author']
|
||||||
|
assert not any(row['kind'] == 'Person' for row in result['resolved_entities'])
|
||||||
|
|
||||||
|
|
||||||
|
def test_unknown_document_author_does_not_list_every_document():
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog()})
|
||||||
|
result = gs.search_graph_with_session(session, 'Ktoré dokumenty napísal autor Neznámy Autor?')
|
||||||
|
assert result['status'] == 'no_answer'
|
||||||
|
assert gs.PERSON_DOCUMENT_AUTHOR_FACTS_QUERY not in {statement for statement, _ in session.calls}
|
||||||
|
|
||||||
|
|
||||||
|
def test_unknown_multiword_tag_is_not_truncated_to_known_prefix():
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog(), gs.THESIS_FACTS_QUERY: [thesis()]})
|
||||||
|
result = gs.search_graph_with_session(session,
|
||||||
|
'Aký názov práce má Alena Nová, ak má kľúčové slovo RAG neexistujuci?')
|
||||||
|
assert result['status'] == 'no_answer'
|
||||||
|
assert result['reason'] == 'unknown_keyword'
|
||||||
|
assert result['facts'] == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_plural_tag_listing_does_not_filter_by_zp_from_zp_wiki():
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog()})
|
||||||
|
gs.search_graph_with_session(session, 'Aké kľúčové slová má Alena Nová v ZP Wiki?')
|
||||||
|
params = next(params for statement, params in session.calls if statement == gs.PERSON_KEYWORD_FACTS_QUERY)
|
||||||
|
assert params['keyword_ids'] == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_unsupported_count_domain_does_not_claim_zero():
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog()})
|
||||||
|
result = gs.search_graph_with_session(session, 'Koľko kategórií má Alena Nová?')
|
||||||
|
assert result['status'] == 'no_answer'
|
||||||
|
assert result['reason'] == 'unsupported_count_domain'
|
||||||
|
assert result['aggregation'] is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_zero_matching_candidates_is_answerable_count_zero():
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog()})
|
||||||
|
result = gs.search_graph_with_session(session,
|
||||||
|
'Z kandidátov Alena Nová a Boris Malý vyber osoby s prácou v roku 2099. Koľko ich je?')
|
||||||
|
assert result['status'] == 'ok'
|
||||||
|
assert result['aggregation']['count'] == 0
|
||||||
|
assert result['aggregation']['complete']
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('query', [
|
||||||
|
'Aký názov diplomovej práce má Zuzana?',
|
||||||
|
'Aký názov práce má osoba Zuzana?',
|
||||||
|
'Čomu sa venuje Zuzana?',
|
||||||
|
])
|
||||||
|
def test_single_token_unknown_subject_never_becomes_global_lookup(query):
|
||||||
|
session = FakeSession({gs.CATALOG_QUERY: catalog(), gs.THESIS_FACTS_QUERY: [thesis()]})
|
||||||
|
result = gs.search_graph_with_session(session, query)
|
||||||
|
assert result['status'] == 'no_answer'
|
||||||
|
assert 'unknown_person' in result['reason']
|
||||||
|
assert result['facts'] == []
|
||||||
|
assert all(cypher != gs.THESIS_FACTS_QUERY for cypher, _ in session.calls)
|
||||||
|
|
||||||
|
|
||||||
|
def test_trailing_instruction_is_not_an_unknown_candidate_name():
|
||||||
|
query = 'Over prepojenie osôb Alena Nová a Boris Malý cez kľúčové slovo RAG a pomenuj spoločné kľúčové slovo.'
|
||||||
|
assert gs.requested_name_phrases(query) == ['alena nova', 'boris maly']
|
||||||
|
|
||||||
|
|
||||||
|
def test_document_subject_is_not_misread_as_the_named_document_author():
|
||||||
|
query = 'Kto je autor dokumentu osoby Alena Nová, ktorý patrí do kategórie bp2024?'
|
||||||
|
assert gs.named_author_phrases(query) == []
|
||||||
|
result = gs.search_graph_with_session(FakeSession({gs.CATALOG_QUERY: catalog()}), query)
|
||||||
|
assert not result['constraints']['unresolved_document_author']
|
||||||
11
tools/graphrag/tests/test_graphrag_research_v2.py
Normal file
11
tools/graphrag/tests/test_graphrag_research_v2.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from tools.graphrag.graphrag import extract_works
|
||||||
|
from .test_graphrag import make_document, make_chunk
|
||||||
|
|
||||||
|
|
||||||
|
def test_scientific_project_heading_has_research_project_semantics():
|
||||||
|
works = extract_works(make_document(categories=['vp2024']), [make_chunk(
|
||||||
|
0, ['Vedecký projekt 2024'],
|
||||||
|
'Sekcia: Vedecký projekt 2024\nNázov: Overovanie jazykových modelov\n')])
|
||||||
|
assert len(works) == 1
|
||||||
|
assert works[0]['work_type'] == 'research_project'
|
||||||
|
assert works[0]['year'] == 2024
|
||||||
95
tools/graphrag/tests/test_source_oracle_v2.py
Normal file
95
tools/graphrag/tests/test_source_oracle_v2.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from tools.graphrag.evaluation.source_oracle import load_source_oracle, supporting_documents
|
||||||
|
from tools.graphrag.evaluation.benchmark_v2 import make_case, validate_case
|
||||||
|
|
||||||
|
|
||||||
|
def source_fixture(tmp_path: Path):
|
||||||
|
root = tmp_path / 'wiki'
|
||||||
|
profile = 'pages/students/2020/eva_nova/README.md'
|
||||||
|
path = root / profile
|
||||||
|
path.parent.mkdir(parents=True)
|
||||||
|
path.write_text('''---
|
||||||
|
title: Eva Nová
|
||||||
|
taxonomy:
|
||||||
|
category: [bp2025]
|
||||||
|
tag: [rag]
|
||||||
|
author: Autor Správny
|
||||||
|
---
|
||||||
|
Rok začiatku štúdia: 2020
|
||||||
|
# Diplomový projekt 2024
|
||||||
|
Téma: Výskum jazyka pomocou modelov
|
||||||
|
## Bakalárska práca 2025
|
||||||
|
Názov: Overovanie jazykových modelov
|
||||||
|
''')
|
||||||
|
child = root / 'pages/students/2020/eva_nova/projekt/README.md'
|
||||||
|
child.parent.mkdir(parents=True)
|
||||||
|
child.write_text('''---
|
||||||
|
title: Pomocný projekt
|
||||||
|
taxonomy:
|
||||||
|
category: [tp2023]
|
||||||
|
tag: [python]
|
||||||
|
author: Autor Iný
|
||||||
|
---
|
||||||
|
Pomocný dokument projektu.
|
||||||
|
''')
|
||||||
|
return load_source_oracle(root), profile
|
||||||
|
|
||||||
|
|
||||||
|
def test_raw_oracle_distinguishes_year_roles_and_academic_types(tmp_path):
|
||||||
|
oracle, _ = source_fixture(tmp_path)
|
||||||
|
person = oracle['people']['Eva Nová']
|
||||||
|
assert person['start_year'] == 2020
|
||||||
|
assert {(row['academic_kind'], row['academic_type'], row['year']) for row in person['academics']} == {
|
||||||
|
('Work', 'diploma_project', 2024), ('Thesis', 'bachelor_thesis', 2025)}
|
||||||
|
for row in person['academics']:
|
||||||
|
lines = oracle['documents'][row['document_path']]['raw_text'].splitlines()
|
||||||
|
assert row['title'] in lines[row['title_line'] - 1]
|
||||||
|
assert str(row['year']) in lines[row['heading_line'] - 1]
|
||||||
|
|
||||||
|
|
||||||
|
def test_categories_include_child_documents_without_becoming_work_keywords(tmp_path):
|
||||||
|
oracle, profile = source_fixture(tmp_path)
|
||||||
|
assert oracle['people']['Eva Nová']['categories'] == ['bp2025', 'tp2023']
|
||||||
|
assert set(oracle['people']['Eva Nová']['tags']) == {'rag', 'python'}
|
||||||
|
assert not supporting_documents(oracle, 'Eva Nová', keyword='jazykové modely')
|
||||||
|
assert supporting_documents(oracle, 'Eva Nová', category='bp2025', document_author='Autor Správny') == [profile]
|
||||||
|
assert not supporting_documents(oracle, 'Eva Nová', category='bp2025', document_author='Autor Iný')
|
||||||
|
|
||||||
|
|
||||||
|
def test_source_audit_rejects_falsely_negative_existing_tag(tmp_path):
|
||||||
|
oracle, _ = source_fixture(tmp_path)
|
||||||
|
case = make_case('example', 'dev', 'negative_lookup', 'Má Eva Nová kľúčové slovo rag?',
|
||||||
|
['Eva Nová'], oracle, [], no_answer=True,
|
||||||
|
negative_constraints={'keyword': 'rag'})
|
||||||
|
assert 'negative_conjunction_actually_satisfied' in validate_case(case, oracle)
|
||||||
|
case['graph']['negative_constraints']['keyword'] = 'neexistujucitag'
|
||||||
|
assert validate_case(case, oracle) == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_source_audit_rejects_wrong_count(tmp_path):
|
||||||
|
oracle, _ = source_fixture(tmp_path)
|
||||||
|
case = make_case('count', 'dev', 'candidate_set_aggregation',
|
||||||
|
'Z kandidátov Eva Nová vyber osoby s prácou v roku 2025. Koľko ich je?',
|
||||||
|
['Eva Nová'], oracle, [], expected_set=[], set_field='person', count=0)
|
||||||
|
assert 'incorrect_candidate_set_or_count' in validate_case(case, oracle)
|
||||||
|
|
||||||
|
|
||||||
|
def test_source_audit_rejects_faked_partition_profiles(tmp_path):
|
||||||
|
oracle, _ = source_fixture(tmp_path)
|
||||||
|
case = make_case('example', 'dev', 'person_title_year', 'Aká práca?', ['Eva Nová'], oracle,
|
||||||
|
[{'person': 'Eva Nová', 'year': 2025}])
|
||||||
|
case['graph']['source_profiles'] = ['pages/students/fake/README.md']
|
||||||
|
assert 'incorrect_source_profile_partition' in validate_case(case, oracle)
|
||||||
|
|
||||||
|
|
||||||
|
def test_academic_range_uses_supported_category_end_year(tmp_path):
|
||||||
|
oracle, profile = source_fixture(tmp_path)
|
||||||
|
path = Path(oracle['wiki_root']) / profile
|
||||||
|
path.write_text(path.read_text().replace('bp2025', 'bp2026').replace(
|
||||||
|
'Bakalárska práca 2025', 'Bakalárska práca 2025/26'))
|
||||||
|
person = load_source_oracle(Path(oracle['wiki_root']))['people']['Eva Nová']
|
||||||
|
thesis = next(row for row in person['academics'] if row['academic_kind'] == 'Thesis')
|
||||||
|
assert thesis['year'] == 2026
|
||||||
Loading…
Reference in New Issue
Block a user