First working attempt in merging and validating arc2 with spacy and exxeta.
parent
3f71189f66
commit
5945122fb0
|
|
@ -0,0 +1,3 @@
|
||||||
|
EXXETA_API_KEY = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbiI6IjIzYzA0NGEzOWY5OWIxMjdmODA5ODA0YmMxZTczN2UyIn0.uOD9GhvFl1hqd2B3dyb0IOJ4x_o1IPcMckeQxh2KNj0"
|
||||||
|
EXXETA_BASE_URL = "https://ai.exxeta.com/api/v2/azure/openai"
|
||||||
|
MODEL_ID = "gpt-35-turbo"
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
from config import EXXETA_API_KEY, EXXETA_BASE_URL
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
|
MODEL = "gpt-35-turbo"
|
||||||
|
|
||||||
|
def extract_risikoprofil_from_exxeta(pages_json):
|
||||||
|
results = []
|
||||||
|
skipped_pages = []
|
||||||
|
|
||||||
|
for page_data in pages_json:
|
||||||
|
page_num = page_data.get("page")
|
||||||
|
text = page_data.get("text", "").strip()
|
||||||
|
|
||||||
|
prompt = (
|
||||||
|
f"Bitte extrahiere alle Vorkommen von Risikoprofilen wie \"Core\", \"Core+\", "
|
||||||
|
f"\"Core/Core+\", \"Value-added\" oder \"Opportunistisch\" "
|
||||||
|
f"auf **Seite {page_num}** im folgenden Text.\n\n"
|
||||||
|
f"Liefere das Ergebnis NUR als valides JSON-Array:\n"
|
||||||
|
f"[{{\"label\": \"RISIKOPROFIL\", \"entity\": \"Core\", \"page\": {page_num}}}]\n\n"
|
||||||
|
f"Falls keine Risikoprofile vorhanden sind, gib ein leeres Array zurück: []\n\n"
|
||||||
|
f"Keine ESG-Profile oder Carbon-Ziele. Nur Risikoprofilierungen. Keine Kommentare oder Text außerhalb des JSON.\n\n"
|
||||||
|
f"TEXT:\n{text}"
|
||||||
|
)
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Authorization": f"Bearer {EXXETA_API_KEY}"
|
||||||
|
}
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"model": MODEL,
|
||||||
|
"messages": [
|
||||||
|
{"role": "system", "content": "Du bist ein Finanzanalyst, der Fondsprofile auswertet. Antworte nur mit validen JSON-Arrays."},
|
||||||
|
{"role": "user", "content": prompt}
|
||||||
|
],
|
||||||
|
"temperature": 0.0
|
||||||
|
}
|
||||||
|
|
||||||
|
url = f"{EXXETA_BASE_URL}/deployments/{MODEL}/chat/completions"
|
||||||
|
|
||||||
|
for attempt in range(2):
|
||||||
|
try:
|
||||||
|
response = requests.post(url, headers=headers, json=payload)
|
||||||
|
response.raise_for_status()
|
||||||
|
|
||||||
|
content = response.json()["choices"][0]["message"]["content"]
|
||||||
|
content = content.strip()
|
||||||
|
|
||||||
|
if content.startswith("```json"):
|
||||||
|
content = content.split("```json")[1]
|
||||||
|
if content.endswith("```"):
|
||||||
|
content = content.split("```")[0]
|
||||||
|
content = content.strip()
|
||||||
|
|
||||||
|
page_results = json.loads(content)
|
||||||
|
|
||||||
|
if page_results:
|
||||||
|
results.extend(page_results)
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ Failed on page {page_num} (attempt {attempt+1}): {e}")
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
@ -0,0 +1,202 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core/Core+",
|
||||||
|
"page": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 12
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core/core+",
|
||||||
|
"page": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core/core+",
|
||||||
|
"page": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 24
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 24
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 24
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 26
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 26
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 26
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 27
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 27
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Opportunistisch",
|
||||||
|
"page": 27
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 34
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 34
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 35
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 35
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 36
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 37
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 37
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 38
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 38
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
def normalize_entity(entity_str):
|
||||||
|
if not entity_str:
|
||||||
|
return ""
|
||||||
|
normalized = entity_str.replace('\n', ' ')
|
||||||
|
normalized = ''.join(normalized.lower().split())
|
||||||
|
return normalized
|
||||||
|
|
||||||
|
def merge_and_validate_entities(spacy_data, exxeta_data):
|
||||||
|
merged = []
|
||||||
|
seen = set()
|
||||||
|
|
||||||
|
# Process SpaCy entities first
|
||||||
|
for s in spacy_data:
|
||||||
|
s_entity_norm = normalize_entity(s["entity"])
|
||||||
|
s_page = s["page"]
|
||||||
|
|
||||||
|
# Look for matching Exxeta entities
|
||||||
|
found = False
|
||||||
|
for e in exxeta_data:
|
||||||
|
e_entity_norm = normalize_entity(e["entity"])
|
||||||
|
e_page = e["page"]
|
||||||
|
|
||||||
|
# Match if normalized entity and page match
|
||||||
|
if (s["label"] == e["label"] and
|
||||||
|
s_entity_norm == e_entity_norm and
|
||||||
|
s_page == e_page):
|
||||||
|
|
||||||
|
merged.append({
|
||||||
|
"label": s["label"],
|
||||||
|
"entity": s["entity"],
|
||||||
|
"page": s_page,
|
||||||
|
"status": "validated"
|
||||||
|
})
|
||||||
|
seen.add((e["entity"], e_page))
|
||||||
|
found = True
|
||||||
|
break
|
||||||
|
|
||||||
|
# If no match found, add as single-source
|
||||||
|
if not found:
|
||||||
|
merged.append({
|
||||||
|
"label": s["label"],
|
||||||
|
"entity": s["entity"],
|
||||||
|
"page": s_page,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
})
|
||||||
|
|
||||||
|
# Add remaining Exxeta entities not already processed
|
||||||
|
for e in exxeta_data:
|
||||||
|
if (e["entity"], e["page"]) not in seen:
|
||||||
|
merged.append({
|
||||||
|
"label": e["label"],
|
||||||
|
"entity": e["entity"],
|
||||||
|
"page": e["page"],
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
})
|
||||||
|
|
||||||
|
return merged
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
from pathlib import Path
|
||||||
|
import json
|
||||||
|
from spacy_extract import load_spacy_entities
|
||||||
|
from exxeta_api import extract_risikoprofil_from_exxeta
|
||||||
|
from merge_logic import merge_and_validate_entities
|
||||||
|
|
||||||
|
SPACY_PATH = "../fine_tuning_spaCy/entities_output.json"
|
||||||
|
PITCHBOOK_PATH = "../ocr/output/Pitchbook 1-OCR.json"
|
||||||
|
|
||||||
|
def load_pitchbook_pages():
|
||||||
|
path = Path(PITCHBOOK_PATH)
|
||||||
|
with open(path, "r", encoding="utf-8") as f:
|
||||||
|
return json.load(f)
|
||||||
|
|
||||||
|
def save_json(data, filename):
|
||||||
|
with open(filename, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
def sort_by_page_number(entities):
|
||||||
|
return sorted(entities, key=lambda x: x.get("page", 0))
|
||||||
|
|
||||||
|
def run():
|
||||||
|
spacy_entities = load_spacy_entities(SPACY_PATH)
|
||||||
|
pitchbook_pages = load_pitchbook_pages()
|
||||||
|
exxeta_entities = extract_risikoprofil_from_exxeta(pitchbook_pages)
|
||||||
|
save_json(exxeta_entities, "exxeta_result.json")
|
||||||
|
merged = merge_and_validate_entities(spacy_entities, exxeta_entities)
|
||||||
|
merged_sorted = sort_by_page_number(merged)
|
||||||
|
save_json(merged_sorted, "merged_result.json")
|
||||||
|
|
||||||
|
print("\n✅ All done! Files written:")
|
||||||
|
print("- exxeta_result.json")
|
||||||
|
print("- merged_result.json")
|
||||||
|
print(f"- Total entities in merged result: {len(merged_sorted)}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
run()
|
||||||
|
|
@ -0,0 +1,430 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 1,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 2,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core and Core+",
|
||||||
|
"page": 4,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 4,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core, core+, value-added",
|
||||||
|
"page": 7,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 7,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 7,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 7,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core/Core+",
|
||||||
|
"page": 10,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core/core+",
|
||||||
|
"page": 10,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core/Core+",
|
||||||
|
"page": 10,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "UK, DE, BE, NL, LU,",
|
||||||
|
"page": 10,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 11,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 11,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 11,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core / Core +",
|
||||||
|
"page": 12,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core\n/ core+",
|
||||||
|
"page": 12,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core",
|
||||||
|
"page": 12,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Term / core+",
|
||||||
|
"page": 12,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core/core+",
|
||||||
|
"page": 12,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "6,4 6,4",
|
||||||
|
"page": 13,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Country /",
|
||||||
|
"page": 14,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core\nCore\nCore\nCore\nCore\nCore\nCore\nCore",
|
||||||
|
"page": 14,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 14,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Country /",
|
||||||
|
"page": 15,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core\nCore\nCore\nCore\nCore\nCore",
|
||||||
|
"page": 15,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 15,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "countries, giving",
|
||||||
|
"page": 18,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core/core+",
|
||||||
|
"page": 20,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core/core+",
|
||||||
|
"page": 20,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "D, and",
|
||||||
|
"page": 21,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 24,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 24,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 24,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "UK, DE, BE, NL, LU,",
|
||||||
|
"page": 26,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 26,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core+",
|
||||||
|
"page": 26,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Value-added",
|
||||||
|
"page": 26,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "core or",
|
||||||
|
"page": 27,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core +",
|
||||||
|
"page": 27,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 27,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Opportunistisch",
|
||||||
|
"page": 27,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "kgCO,e",
|
||||||
|
"page": 30,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "C,",
|
||||||
|
"page": 32,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 34,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 34,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "KfW, Dwp",
|
||||||
|
"page": 35,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Bank,",
|
||||||
|
"page": 35,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "spacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 35,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 35,
|
||||||
|
"status": "single-source",
|
||||||
|
"source": "exxeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 36,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 36,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 37,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 37,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 38,
|
||||||
|
"status": "validated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "RISIKOPROFIL",
|
||||||
|
"entity": "Core",
|
||||||
|
"page": 38,
|
||||||
|
"status": "validated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def load_spacy_entities(path):
|
||||||
|
path = Path(path)
|
||||||
|
with open(path, "r", encoding="utf-8") as f:
|
||||||
|
return json.load(f)
|
||||||
Loading…
Reference in New Issue