Skip to content

Instantly share code, notes, and snippets.

@pebbie
Last active February 1, 2022 19:29
Show Gist options
  • Save pebbie/1c19721b824892b47743aa470396942a to your computer and use it in GitHub Desktop.
Save pebbie/1c19721b824892b47743aa470396942a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# KnowGraphs Winter School 2022 Data Challenge\n",
"**Group 2** : \n",
"+ Efstratios Koulierakis\n",
"+ Pere-Lluis Huguet Cabot\n",
"+ Yang Lu\n",
"+ Peb Ruswono Aryan\n",
"+ Bo Xiong"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from rdflib import Graph, Namespace, RDF, OWL, RDFS, XSD"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import os, glob"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import json"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.metrics import f1_score"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.preprocessing import MultiLabelBinarizer"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from IPython.display import display"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"NIF = Namespace('http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"ITS = Namespace('http://www.w3.org/2005/11/its/rdf#')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Helper functions"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def load_dataset(filename):\n",
" \"\"\"\n",
" load dataset reads NIF document in RDF format\n",
" \"\"\"\n",
" g = Graph().parse(filename)\n",
" ctx = sorted(list(g.subjects(RDF.type, NIF.Context)))\n",
" sents = []\n",
" for c in ctx:\n",
" s = {}\n",
" s['uri'] = c\n",
" s['text'] = list(g.objects(c, NIF.isString))[0].toPython()\n",
"\n",
" chunks = []\n",
" for item in g.subjects(NIF.referenceContext, c):\n",
"\n",
" # mention URI\n",
" chunk = {'uri':item}\n",
" \n",
" # doc URI\n",
" chunk['ctxUri'] = c\n",
"\n",
" # span (begin & end)\n",
" beginIndex = list(g.objects(item, NIF.beginIndex))[0]\n",
" endIndex = list(g.objects(item, NIF.endIndex))[0]\n",
" chunk['begin'] = beginIndex\n",
" chunk['end'] = endIndex\n",
" \n",
" # anchor\n",
" anchors = list(g.objects(item, NIF.anchorOf))\n",
" chunk['anchor'] = anchors[0]\n",
" # identRef\n",
" idRef = list(g.objects(item, ITS.taIdentRef))\n",
" chunk['identRef'] = idRef if len(idRef)>0 else []\n",
"\n",
" # classRef\n",
" clsRef = list(g.objects(item, ITS.taClassRef))\n",
" chunk['classRef'] = clsRef if len(clsRef)>0 else []\n",
" \n",
" # confidence\n",
" conf = list(g.objects(item, ITS.taConfidence))\n",
" chunk['confidence'] = float(conf[0].toPython()) if len(conf)>0 else 1.\n",
"\n",
" chunks.append(chunk)\n",
" \n",
" chunks = sorted(chunks, key=lambda x:x['begin'])\n",
" s['mentions'] = chunks\n",
" sents.append(s)\n",
" return sents"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def intersection(lst1, lst2):\n",
" \"\"\"\n",
" return intersection between two list\n",
" \"\"\"\n",
" return list(set(lst1) & set(lst2))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def me_strong_entity_matching(mention1, mention2):\n",
" \"\"\"\n",
" return 1 if there is an intersection on the uris 0 otherwise\n",
" \"\"\"\n",
" return 1 if len(intersection(mention1['identRef'], mention2['identRef']))>0 else 0"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def ma_strong_annotation_matching(mention1, mention2):\n",
" \"\"\"\n",
" returns 1 if the span exactly the same and entity uri intersects\n",
" \"\"\"\n",
" begin_cond = mention1['begin'] == mention2['begin']\n",
" end_cond = mention1['end'] == mention2['end']\n",
" entity_cond = len(intersection(mention1['identRef'], mention2['identRef']))>0\n",
" return 1 if begin_cond and end_cond and entity_cond else 0"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def is_mention_overlap(m1, m2):\n",
" \"\"\"\n",
" check if span in mention m1 and m2 overlaps\n",
" \"\"\"\n",
" return max(m1['begin'], m2['begin'])<=min(m1['end'],m2['end'])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"def mw_weak_annotation_matching(mention1, mention2):\n",
" \"\"\"\n",
" returns 1 if span overlaps and entity uris intersects\n",
" \"\"\"\n",
" annot_cond = is_mention_overlap(mention1, mention2)\n",
" entity_cond = len(intersection(mention1['identRef'], mention2['identRef']))>0\n",
" return 1 if annot_cond and entity_cond else 0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Load Dataset\n",
"\n",
"please run the notebook in the `data-challenge` folder"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['datasets/MSNBC.ttl',\n",
" 'datasets/KORE50.ttl',\n",
" 'datasets/IITB.ttl',\n",
" 'datasets/OKE_2015_Task_1_example_set.ttl']"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dslist = glob.glob('datasets/*.*')\n",
"dslist"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"select one of the gold standard datasets"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"dataset = dslist[-1]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"text\": \"Florence May Harding studied at a school in Sydney, and with Douglas Robert Dundas , but in effect had no formal training in either botany or art.\",\n",
" \"mentions\": [\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,20\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"begin\": \"0\",\n",
" \"end\": \"20\",\n",
" \"anchor\": \"Florence May Harding\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Florence_May_Harding\",\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Florence_May_Harding\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Person\",\n",
" \"http://www.w3.org/2002/07/owl#Individual\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=34,40\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"begin\": \"34\",\n",
" \"end\": \"40\",\n",
" \"anchor\": \"school\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/National_Art_School\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=44,50\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"begin\": \"44\",\n",
" \"end\": \"50\",\n",
" \"anchor\": \"Sydney\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Sydney\",\n",
" \"http://dbpedia.org/resource/Sydney\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://ontologydesignpatterns.org/ont/wikipedia/d0.owl#Location\",\n",
" \"http://www.w3.org/2002/07/owl#Individual\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=61,82\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"begin\": \"61\",\n",
" \"end\": \"82\",\n",
" \"anchor\": \"Douglas Robert Dundas\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Douglas_Robert_Dundas\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Person\",\n",
" \"http://www.w3.org/2002/07/owl#Individual\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" }\n",
" ]\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"text\": \"Such notables include James Carville, who was the senior political adviser to Bill Clinton, and Donna Brazile, the campaign manager of the 2000 presidential campaign of Vice-President Al Gore.\",\n",
" \"mentions\": [\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=22,36\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"22\",\n",
" \"end\": \"36\",\n",
" \"anchor\": \"James Carville\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/James_Carville\",\n",
" \"http://dbpedia.org/resource/James_Carville\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.w3.org/2002/07/owl#Individual\",\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Person\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=57,74\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"57\",\n",
" \"end\": \"74\",\n",
" \"anchor\": \"political adviser\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Political_consulting\",\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Political_adviser\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Role\",\n",
" \"http://www.w3.org/2002/07/owl#Individual\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=78,90\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"78\",\n",
" \"end\": \"90\",\n",
" \"anchor\": \"Bill Clinton\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Bill_Clinton\",\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Bill_Clinton\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.w3.org/2002/07/owl#Individual\",\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Person\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=96,109\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"96\",\n",
" \"end\": \"109\",\n",
" \"anchor\": \"Donna Brazile\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Donna_Brazile\",\n",
" \"http://dbpedia.org/resource/Donna_Brazile\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.w3.org/2002/07/owl#Individual\",\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Person\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=115,131\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"115\",\n",
" \"end\": \"131\",\n",
" \"anchor\": \"campaign manager\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Campaign_manager\",\n",
" \"http://dbpedia.org/resource/Campaign_manager\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Role\",\n",
" \"http://www.w3.org/2002/07/owl#Individual\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=184,191\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"184\",\n",
" \"end\": \"191\",\n",
" \"anchor\": \"Al Gore\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Al_Gore\",\n",
" \"http://dbpedia.org/resource/Al_Gore\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Person\",\n",
" \"http://www.w3.org/2002/07/owl#Individual\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" }\n",
" ]\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=0,69\",\n",
" \"text\": \"The senator received a Bachelor of Laws from the Columbia University.\",\n",
" \"mentions\": [\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=4,11\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=0,69\",\n",
" \"begin\": \"4\",\n",
" \"end\": \"11\",\n",
" \"anchor\": \"senator\",\n",
" \"identRef\": [\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Senator_1\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.w3.org/2002/07/owl#Individual\",\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Person\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=49,68\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=0,69\",\n",
" \"begin\": \"49\",\n",
" \"end\": \"68\",\n",
" \"anchor\": \"Columbia University\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Columbia_University\",\n",
" \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/Columbia_University\"\n",
" ],\n",
" \"classRef\": [\n",
" \"http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#Organization\",\n",
" \"http://www.w3.org/2002/07/owl#Individual\"\n",
" ],\n",
" \"confidence\": 1.0\n",
" }\n",
" ]\n",
" }\n",
"]\n"
]
}
],
"source": [
"gold = load_dataset(dataset)\n",
"print(json.dumps(gold, indent=2))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'OKE_2015_Task_1_example_set'"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"datasetname = os.path.basename(dataset)\n",
"datasetname, _ = os.path.splitext(datasetname)\n",
"datasetname"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"List the system outputs"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['OKE_2015_Task_1_example_set/Babelfy.ttl',\n",
" 'OKE_2015_Task_1_example_set/DBpedia_Spotlight.ttl',\n",
" 'OKE_2015_Task_1_example_set/WAT.ttl']"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"samples = sorted(glob.glob(datasetname+'/*.*'))\n",
"samples"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"text\": \"Florence May Harding studied at a school in Sydney, and with Douglas Robert Dundas , but in effect had no formal training in either botany or art.\",\n",
" \"mentions\": [\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,20\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"begin\": \"0\",\n",
" \"end\": \"20\",\n",
" \"anchor\": \"Florence May Harding\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Florence_May_Harding\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=34,40\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"begin\": \"34\",\n",
" \"end\": \"40\",\n",
" \"anchor\": \"school\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/University\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 0.7177966101694915\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=44,50\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-1#char=0,146\",\n",
" \"begin\": \"44\",\n",
" \"end\": \"50\",\n",
" \"anchor\": \"Sydney\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Australia\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 0.7792207792207793\n",
" }\n",
" ]\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"text\": \"Such notables include James Carville, who was the senior political adviser to Bill Clinton, and Donna Brazile, the campaign manager of the 2000 presidential campaign of Vice-President Al Gore.\",\n",
" \"mentions\": [\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=22,36\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"22\",\n",
" \"end\": \"36\",\n",
" \"anchor\": \"James Carville\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/James_Carville\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=57,74\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"57\",\n",
" \"end\": \"74\",\n",
" \"anchor\": \"political adviser\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Political_consulting\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 0.9238578680203046\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=78,90\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"78\",\n",
" \"end\": \"90\",\n",
" \"anchor\": \"Bill Clinton\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Bill_Clinton\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 0.5225653206650831\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=96,109\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"96\",\n",
" \"end\": \"109\",\n",
" \"anchor\": \"Donna Brazile\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Donna_Brazile\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=115,131\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"115\",\n",
" \"end\": \"131\",\n",
" \"anchor\": \"campaign manager\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Campaign_manager\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 1.0\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=184,191\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-2#char=0,192\",\n",
" \"begin\": \"184\",\n",
" \"end\": \"191\",\n",
" \"anchor\": \"Al Gore\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Al_Gore\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 1.0\n",
" }\n",
" ]\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=0,69\",\n",
" \"text\": \"The senator received a Bachelor of Laws from the Columbia University.\",\n",
" \"mentions\": [\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=4,11\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=0,69\",\n",
" \"begin\": \"4\",\n",
" \"end\": \"11\",\n",
" \"anchor\": \"senator\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Senator_of_the_College_of_Justice\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 0.004651162790697674\n",
" },\n",
" {\n",
" \"uri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=49,68\",\n",
" \"ctxUri\": \"http://www.ontologydesignpatterns.org/data/oke-challenge/task-1/sentence-3#char=0,69\",\n",
" \"begin\": \"49\",\n",
" \"end\": \"68\",\n",
" \"anchor\": \"Columbia University\",\n",
" \"identRef\": [\n",
" \"http://dbpedia.org/resource/Columbia_University\"\n",
" ],\n",
" \"classRef\": [],\n",
" \"confidence\": 0.423728813559322\n",
" }\n",
" ]\n",
" }\n",
"]\n"
]
}
],
"source": [
"sample = load_dataset(samples[0])\n",
"print(json.dumps(sample, indent=2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evaluate"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"accuracy\": 0.6666666666666666,\n",
" \"error\": 0.3333333333333333,\n",
" \"Macro-F1\": 0.6888888888888888,\n",
" \"Macro-Recall\": 0.8333333333333334,\n",
" \"Macro-Precision\": 0.611111111111111,\n",
" \"Micro-F1\": 0.7999999999999999,\n",
" \"Micro-Recall\": 0.8888888888888888,\n",
" \"Micro-Precision\": 0.7272727272727273,\n",
" \"Macro-F1-conf\": 0.8130936014542468,\n",
" \"Macro-Recall-conf\": 0.8333333333333334,\n",
" \"Macro-Precision-conf\": 0.7965400747434342,\n",
" \"Micro-F1-conf\": 0.8459750782454338,\n",
" \"Micro-Recall-conf\": 0.8729376510498422,\n",
" \"Micro-Precision-conf\": 0.8206281964097848,\n",
" \"Micro-F1-sklearn\": 0.8421052631578948,\n",
" \"Macro-F1-sklearn\": 0.7272727272727273\n",
"}\n"
]
}
],
"source": [
"def evaluate_dataset(gold_ds, system_ds):\n",
" result = {}\n",
" logs = []\n",
" \n",
" y_pred = []\n",
" y_true = []\n",
" mctr = 1\n",
"\n",
" true_pos = []\n",
" false_pos = []\n",
" false_neg = []\n",
" num_fp = [] # detected span overlap but wrong entity URI\n",
" num_fn = [] # entity not detected\n",
" num_tp = [] # correct prediction (strong matching)\n",
" num_ent = 0\n",
"\n",
" sample_uris = [s['uri'] for s in sample]\n",
"\n",
"# print(len(gold), len(sample))\n",
" for sent_id, gold_sent in enumerate(gold):\n",
"# print(gold_sent['uri'])\n",
" if gold_sent['uri'] not in sample_uris:\n",
" # system did not handle the sentence\n",
" logs.append('missing prediction : ' + gold_sent['uri'])\n",
" # num_ent += sum([m['confidence'] for m in gold_sent['mentions']])\n",
" num_ent += len(gold_sent['mentions'])\n",
" continue\n",
"\n",
" # sentence exists on the system\n",
" sample_sent = [s for s in sample if s['uri']==gold_sent['uri']][0]\n",
"\n",
" logs.append(\"detected %d out of %d mention(s)\" % (len(sample_sent['mentions']), len(gold_sent['mentions'])))\n",
" yp = []\n",
" yt = []\n",
" num_ent_s = 0\n",
" num_tp_s = 0\n",
" num_fp_s = 0\n",
" num_fn_s = 0\n",
" tp_s = 0\n",
" fp_s = 0\n",
" fn_s = 0\n",
" for gold_mention in gold_sent['mentions']:\n",
" num_ent_s += 1\n",
" # find mention in sample\n",
" sample_mention = None\n",
" for mention in sample_sent['mentions']:\n",
" if is_mention_overlap(mention, gold_mention):\n",
" sample_mention = mention\n",
" break\n",
"\n",
" if sample_mention is None:\n",
" # entity not detected\n",
" logs.append('mention not detected : ' + repr(gold_mention['anchor'].toPython()))\n",
" num_fn_s += 1\n",
" fn_s += gold_mention['confidence']\n",
" continue\n",
"\n",
" logs.append('begin : ' + repr( sample_mention['begin'] ) + ' ' + repr( gold_mention['begin'] ))\n",
" logs.append('begin : ' + repr( sample_mention['end'] ) + ' ' + repr( gold_mention['end'] ))\n",
" logs.append('anchor : ' + repr(sample_mention['anchor'].toPython()) + ' ' + repr(gold_mention['anchor'].toPython()))\n",
" logs.append('identRef sample : ' + repr( sample_mention['identRef'] ))\n",
" logs.append('identRef gold : ' + repr( gold_mention['identRef'] ))\n",
" \n",
" # strong match\n",
" logs.append('match score (ma): ' + repr( ma_strong_annotation_matching(sample_mention, gold_mention) ))\n",
" logs.append('confidence: ' + repr( sample_mention['confidence'] ))\n",
" \n",
" yt.append(mctr)\n",
" \n",
" if ma_strong_annotation_matching(sample_mention, gold_mention)==1:\n",
" yp.append(mctr)\n",
" num_tp_s += 1\n",
" tp_s += sample_mention['confidence']\n",
" else:\n",
" # false match\n",
" num_fp_s += 1\n",
" fp_s += sample_mention['confidence']\n",
" mctr += 1\n",
"\n",
" num_ent += num_ent_s\n",
" num_tp.append(num_tp_s)\n",
" num_fp.append(num_fp_s)\n",
" num_fn.append(num_fn_s)\n",
" #\n",
" true_pos.append(tp_s)\n",
" false_pos.append(fp_s)\n",
" false_neg.append(fn_s)\n",
"\n",
" y_true.append(yt)\n",
" y_pred.append(yp)\n",
" logs.append('--')\n",
"\n",
" \n",
" result['accuracy'] = sum(num_tp)/num_ent\n",
" result['error'] = (sum(num_fp)+sum(num_fn))/num_ent\n",
" \n",
" # unweighted by confidence\n",
" \n",
" F1_scores = []\n",
" pres_scores = []\n",
" recall_scores = []\n",
"\n",
" for tp, fp, fn in zip(num_tp, num_fp, num_fn):\n",
" pres = tp / (tp + fp) if (tp+fp)>0 else 0.\n",
" recall = tp / (tp + fn) if (tp+fn)>0 else 0.\n",
" pres_scores.append(pres)\n",
" recall_scores.append(recall)\n",
" f1 = (2 * pres * recall) / (pres + recall) if pres+recall>0 else 0.\n",
" F1_scores.append(f1)\n",
"\n",
" result['Macro-F1'] = sum(F1_scores)/len(F1_scores)\n",
" result['Macro-Recall'] = sum(recall_scores)/len(recall_scores)\n",
" result['Macro-Precision'] = sum(pres_scores)/len(pres_scores)\n",
" \n",
" precision = sum(num_tp) / (sum(num_tp)+sum(num_fp))\n",
" recall = sum(num_tp) / (sum(num_tp)+sum(num_fn))\n",
" F1 = (2 * precision * recall) / (precision + recall)\n",
"\n",
" result['Micro-F1'] = F1\n",
" result['Micro-Recall'] = recall\n",
" result['Micro-Precision'] = precision\n",
" \n",
" # weighted with confidence\n",
"\n",
" F1_scores = []\n",
" pres_scores = []\n",
" recall_scores = []\n",
"\n",
" for tp, fp, fn in zip(true_pos, false_pos, false_neg):\n",
" pres = tp / (tp + fp) if (tp+fp)>0 else 0.\n",
" recall = tp / (tp + fn) if (tp+fn)>0 else 0.\n",
" pres_scores.append(pres)\n",
" recall_scores.append(recall)\n",
" f1 = (2 * pres * recall) / (pres + recall) if pres+recall>0 else 0.\n",
" F1_scores.append(f1)\n",
"\n",
" result['Macro-F1-conf'] = sum(F1_scores)/len(F1_scores)\n",
" result['Macro-Recall-conf'] = sum(recall_scores)/len(recall_scores)\n",
" result['Macro-Precision-conf'] = sum(pres_scores)/len(pres_scores)\n",
" \n",
" precision = sum(true_pos) / (sum(true_pos)+sum(false_pos))\n",
" recall = sum(true_pos) / (sum(true_pos)+sum(false_neg))\n",
" F1 = (2 * precision * recall) / (precision + recall)\n",
"\n",
" result['Micro-F1-conf'] = F1\n",
" result['Micro-Recall-conf'] = recall\n",
" result['Micro-Precision-conf'] = precision\n",
" \n",
" # f1 score from scikit-learn as comparison\n",
" \n",
" mlb = MultiLabelBinarizer()\n",
" y_true_b = mlb.fit_transform(y_true)\n",
" y_pred_b = mlb.transform(y_pred)\n",
" \n",
" result['Micro-F1-sklearn'] = f1_score(y_true_b, y_pred_b, average='micro')\n",
" result['Macro-F1-sklearn'] = f1_score(y_true_b, y_pred_b, average='macro')\n",
" \n",
" # result['logs'] = logs\n",
" \n",
" return result\n",
"res = evaluate_dataset(gold, sample)\n",
"print(json.dumps(res, indent=2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evaluate all"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"benchmark dataset : IITB\n",
"system being evaluated: IITB/Babelfy.ttl\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"http://dbpedia.org/resource/Say_\"I_Gotta_Believe!\" does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/Robert_\"Say\"_McIntosh does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/John_\"Rookie\"_Wright does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/Say_\"I_Gotta_Believe!\" does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/Running_with_Scissors_(\"Weird_Al\"_Yankovic_album) does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/The_Unreleased_\"D.C._Tapes\" does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/\"A\"_Device does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/Sacred_Heart_\"The_Video\" does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/Robert_\"Say\"_McIntosh does not look like a valid URI, trying to serialize this will break.\n",
"http://dbpedia.org/resource/Say_\"I_Gotta_Believe!\" does not look like a valid URI, trying to serialize this will break.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"system being evaluated: IITB/DBpedia_Spotlight.ttl\n",
"system being evaluated: IITB/WAT.ttl\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>system</th>\n",
" <th>accuracy</th>\n",
" <th>error</th>\n",
" <th>Macro-F1</th>\n",
" <th>Macro-Recall</th>\n",
" <th>Macro-Precision</th>\n",
" <th>Micro-F1</th>\n",
" <th>Micro-Recall</th>\n",
" <th>Micro-Precision</th>\n",
" <th>Macro-F1-conf</th>\n",
" <th>Macro-Recall-conf</th>\n",
" <th>Macro-Precision-conf</th>\n",
" <th>Micro-F1-conf</th>\n",
" <th>Micro-Recall-conf</th>\n",
" <th>Micro-Precision-conf</th>\n",
" <th>Micro-F1-sklearn</th>\n",
" <th>Macro-F1-sklearn</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Babelfy</td>\n",
" <td>0.305713</td>\n",
" <td>0.694287</td>\n",
" <td>0.449039</td>\n",
" <td>0.701616</td>\n",
" <td>0.336072</td>\n",
" <td>0.468270</td>\n",
" <td>0.721449</td>\n",
" <td>0.346628</td>\n",
" <td>0.490400</td>\n",
" <td>0.641623</td>\n",
" <td>0.403131</td>\n",
" <td>0.514160</td>\n",
" <td>0.662756</td>\n",
" <td>0.419993</td>\n",
" <td>0.514809</td>\n",
" <td>0.346628</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>DBpedia_Spotlight</td>\n",
" <td>0.322591</td>\n",
" <td>0.677409</td>\n",
" <td>0.467552</td>\n",
" <td>0.808242</td>\n",
" <td>0.333896</td>\n",
" <td>0.487817</td>\n",
" <td>0.802991</td>\n",
" <td>0.350317</td>\n",
" <td>0.467552</td>\n",
" <td>0.808242</td>\n",
" <td>0.333896</td>\n",
" <td>0.487817</td>\n",
" <td>0.802991</td>\n",
" <td>0.350317</td>\n",
" <td>0.518867</td>\n",
" <td>0.350317</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>WAT</td>\n",
" <td>0.324940</td>\n",
" <td>0.675060</td>\n",
" <td>0.470418</td>\n",
" <td>0.607975</td>\n",
" <td>0.389413</td>\n",
" <td>0.490498</td>\n",
" <td>0.618142</td>\n",
" <td>0.406547</td>\n",
" <td>0.390630</td>\n",
" <td>0.297625</td>\n",
" <td>0.598235</td>\n",
" <td>0.395742</td>\n",
" <td>0.286696</td>\n",
" <td>0.638660</td>\n",
" <td>0.578078</td>\n",
" <td>0.406547</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" system accuracy error Macro-F1 Macro-Recall \\\n",
"0 Babelfy 0.305713 0.694287 0.449039 0.701616 \n",
"1 DBpedia_Spotlight 0.322591 0.677409 0.467552 0.808242 \n",
"2 WAT 0.324940 0.675060 0.470418 0.607975 \n",
"\n",
" Macro-Precision Micro-F1 Micro-Recall Micro-Precision Macro-F1-conf \\\n",
"0 0.336072 0.468270 0.721449 0.346628 0.490400 \n",
"1 0.333896 0.487817 0.802991 0.350317 0.467552 \n",
"2 0.389413 0.490498 0.618142 0.406547 0.390630 \n",
"\n",
" Macro-Recall-conf Macro-Precision-conf Micro-F1-conf Micro-Recall-conf \\\n",
"0 0.641623 0.403131 0.514160 0.662756 \n",
"1 0.808242 0.333896 0.487817 0.802991 \n",
"2 0.297625 0.598235 0.395742 0.286696 \n",
"\n",
" Micro-Precision-conf Micro-F1-sklearn Macro-F1-sklearn \n",
"0 0.419993 0.514809 0.346628 \n",
"1 0.350317 0.518867 0.350317 \n",
"2 0.638660 0.578078 0.406547 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"benchmark dataset : KORE50\n",
"system being evaluated: KORE50/Babelfy.ttl\n",
"system being evaluated: KORE50/DBpedia_Spotlight.ttl\n",
"system being evaluated: KORE50/WAT.ttl\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>system</th>\n",
" <th>accuracy</th>\n",
" <th>error</th>\n",
" <th>Macro-F1</th>\n",
" <th>Macro-Recall</th>\n",
" <th>Macro-Precision</th>\n",
" <th>Micro-F1</th>\n",
" <th>Micro-Recall</th>\n",
" <th>Micro-Precision</th>\n",
" <th>Macro-F1-conf</th>\n",
" <th>Macro-Recall-conf</th>\n",
" <th>Macro-Precision-conf</th>\n",
" <th>Micro-F1-conf</th>\n",
" <th>Micro-Recall-conf</th>\n",
" <th>Micro-Precision-conf</th>\n",
" <th>Micro-F1-sklearn</th>\n",
" <th>Macro-F1-sklearn</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Babelfy</td>\n",
" <td>0.666667</td>\n",
" <td>0.333333</td>\n",
" <td>0.724944</td>\n",
" <td>0.860000</td>\n",
" <td>0.661333</td>\n",
" <td>0.800000</td>\n",
" <td>0.932039</td>\n",
" <td>0.700730</td>\n",
" <td>0.728991</td>\n",
" <td>0.860000</td>\n",
" <td>0.678332</td>\n",
" <td>0.815881</td>\n",
" <td>0.892825</td>\n",
" <td>0.751147</td>\n",
" <td>0.824034</td>\n",
" <td>0.700730</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>DBpedia_Spotlight</td>\n",
" <td>0.430556</td>\n",
" <td>0.569444</td>\n",
" <td>0.498159</td>\n",
" <td>0.626000</td>\n",
" <td>0.453000</td>\n",
" <td>0.601942</td>\n",
" <td>0.815789</td>\n",
" <td>0.476923</td>\n",
" <td>0.498159</td>\n",
" <td>0.626000</td>\n",
" <td>0.453000</td>\n",
" <td>0.601942</td>\n",
" <td>0.815789</td>\n",
" <td>0.476923</td>\n",
" <td>0.645833</td>\n",
" <td>0.476923</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>WAT</td>\n",
" <td>0.520833</td>\n",
" <td>0.479167</td>\n",
" <td>0.578254</td>\n",
" <td>0.746667</td>\n",
" <td>0.497000</td>\n",
" <td>0.684932</td>\n",
" <td>0.903614</td>\n",
" <td>0.551471</td>\n",
" <td>0.593953</td>\n",
" <td>0.743413</td>\n",
" <td>0.531099</td>\n",
" <td>0.683245</td>\n",
" <td>0.765355</td>\n",
" <td>0.617047</td>\n",
" <td>0.710900</td>\n",
" <td>0.551471</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" system accuracy error Macro-F1 Macro-Recall \\\n",
"0 Babelfy 0.666667 0.333333 0.724944 0.860000 \n",
"1 DBpedia_Spotlight 0.430556 0.569444 0.498159 0.626000 \n",
"2 WAT 0.520833 0.479167 0.578254 0.746667 \n",
"\n",
" Macro-Precision Micro-F1 Micro-Recall Micro-Precision Macro-F1-conf \\\n",
"0 0.661333 0.800000 0.932039 0.700730 0.728991 \n",
"1 0.453000 0.601942 0.815789 0.476923 0.498159 \n",
"2 0.497000 0.684932 0.903614 0.551471 0.593953 \n",
"\n",
" Macro-Recall-conf Macro-Precision-conf Micro-F1-conf Micro-Recall-conf \\\n",
"0 0.860000 0.678332 0.815881 0.892825 \n",
"1 0.626000 0.453000 0.601942 0.815789 \n",
"2 0.743413 0.531099 0.683245 0.765355 \n",
"\n",
" Micro-Precision-conf Micro-F1-sklearn Macro-F1-sklearn \n",
"0 0.751147 0.824034 0.700730 \n",
"1 0.476923 0.645833 0.476923 \n",
"2 0.617047 0.710900 0.551471 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"benchmark dataset : MSNBC\n",
"system being evaluated: MSNBC/Babelfy.ttl\n",
"system being evaluated: MSNBC/DBpedia_Spotlight.ttl\n",
"system being evaluated: MSNBC/WAT.ttl\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>system</th>\n",
" <th>accuracy</th>\n",
" <th>error</th>\n",
" <th>Macro-F1</th>\n",
" <th>Macro-Recall</th>\n",
" <th>Macro-Precision</th>\n",
" <th>Micro-F1</th>\n",
" <th>Micro-Recall</th>\n",
" <th>Micro-Precision</th>\n",
" <th>Macro-F1-conf</th>\n",
" <th>Macro-Recall-conf</th>\n",
" <th>Macro-Precision-conf</th>\n",
" <th>Micro-F1-conf</th>\n",
" <th>Micro-Recall-conf</th>\n",
" <th>Micro-Precision-conf</th>\n",
" <th>Micro-F1-sklearn</th>\n",
" <th>Macro-F1-sklearn</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Babelfy</td>\n",
" <td>0.531459</td>\n",
" <td>0.468541</td>\n",
" <td>0.613726</td>\n",
" <td>0.743991</td>\n",
" <td>0.543233</td>\n",
" <td>0.694056</td>\n",
" <td>0.815195</td>\n",
" <td>0.604262</td>\n",
" <td>0.620300</td>\n",
" <td>0.701066</td>\n",
" <td>0.580370</td>\n",
" <td>0.691166</td>\n",
" <td>0.756431</td>\n",
" <td>0.636269</td>\n",
" <td>0.753321</td>\n",
" <td>0.604262</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>DBpedia_Spotlight</td>\n",
" <td>0.441767</td>\n",
" <td>0.558233</td>\n",
" <td>0.576075</td>\n",
" <td>0.650875</td>\n",
" <td>0.533669</td>\n",
" <td>0.612813</td>\n",
" <td>0.638298</td>\n",
" <td>0.589286</td>\n",
" <td>0.576075</td>\n",
" <td>0.650875</td>\n",
" <td>0.533669</td>\n",
" <td>0.612813</td>\n",
" <td>0.638298</td>\n",
" <td>0.589286</td>\n",
" <td>0.741573</td>\n",
" <td>0.589286</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>WAT</td>\n",
" <td>0.507363</td>\n",
" <td>0.492637</td>\n",
" <td>0.618954</td>\n",
" <td>0.706914</td>\n",
" <td>0.570966</td>\n",
" <td>0.673179</td>\n",
" <td>0.697974</td>\n",
" <td>0.650086</td>\n",
" <td>0.573834</td>\n",
" <td>0.537680</td>\n",
" <td>0.661128</td>\n",
" <td>0.586712</td>\n",
" <td>0.484312</td>\n",
" <td>0.744024</td>\n",
" <td>0.787942</td>\n",
" <td>0.650086</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" system accuracy error Macro-F1 Macro-Recall \\\n",
"0 Babelfy 0.531459 0.468541 0.613726 0.743991 \n",
"1 DBpedia_Spotlight 0.441767 0.558233 0.576075 0.650875 \n",
"2 WAT 0.507363 0.492637 0.618954 0.706914 \n",
"\n",
" Macro-Precision Micro-F1 Micro-Recall Micro-Precision Macro-F1-conf \\\n",
"0 0.543233 0.694056 0.815195 0.604262 0.620300 \n",
"1 0.533669 0.612813 0.638298 0.589286 0.576075 \n",
"2 0.570966 0.673179 0.697974 0.650086 0.573834 \n",
"\n",
" Macro-Recall-conf Macro-Precision-conf Micro-F1-conf Micro-Recall-conf \\\n",
"0 0.701066 0.580370 0.691166 0.756431 \n",
"1 0.650875 0.533669 0.612813 0.638298 \n",
"2 0.537680 0.661128 0.586712 0.484312 \n",
"\n",
" Micro-Precision-conf Micro-F1-sklearn Macro-F1-sklearn \n",
"0 0.636269 0.753321 0.604262 \n",
"1 0.589286 0.741573 0.589286 \n",
"2 0.744024 0.787942 0.650086 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"benchmark dataset : OKE_2015_Task_1_example_set\n",
"system being evaluated: OKE_2015_Task_1_example_set/Babelfy.ttl\n",
"system being evaluated: OKE_2015_Task_1_example_set/DBpedia_Spotlight.ttl\n",
"system being evaluated: OKE_2015_Task_1_example_set/WAT.ttl\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>system</th>\n",
" <th>accuracy</th>\n",
" <th>error</th>\n",
" <th>Macro-F1</th>\n",
" <th>Macro-Recall</th>\n",
" <th>Macro-Precision</th>\n",
" <th>Micro-F1</th>\n",
" <th>Micro-Recall</th>\n",
" <th>Micro-Precision</th>\n",
" <th>Macro-F1-conf</th>\n",
" <th>Macro-Recall-conf</th>\n",
" <th>Macro-Precision-conf</th>\n",
" <th>Micro-F1-conf</th>\n",
" <th>Micro-Recall-conf</th>\n",
" <th>Micro-Precision-conf</th>\n",
" <th>Micro-F1-sklearn</th>\n",
" <th>Macro-F1-sklearn</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Babelfy</td>\n",
" <td>0.666667</td>\n",
" <td>0.333333</td>\n",
" <td>0.688889</td>\n",
" <td>0.833333</td>\n",
" <td>0.611111</td>\n",
" <td>0.800000</td>\n",
" <td>0.888889</td>\n",
" <td>0.727273</td>\n",
" <td>0.813094</td>\n",
" <td>0.833333</td>\n",
" <td>0.796540</td>\n",
" <td>0.845975</td>\n",
" <td>0.872938</td>\n",
" <td>0.820628</td>\n",
" <td>0.842105</td>\n",
" <td>0.727273</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>DBpedia_Spotlight</td>\n",
" <td>0.083333</td>\n",
" <td>0.916667</td>\n",
" <td>0.133333</td>\n",
" <td>0.111111</td>\n",
" <td>0.166667</td>\n",
" <td>0.153846</td>\n",
" <td>0.100000</td>\n",
" <td>0.333333</td>\n",
" <td>0.133333</td>\n",
" <td>0.111111</td>\n",
" <td>0.166667</td>\n",
" <td>0.153846</td>\n",
" <td>0.100000</td>\n",
" <td>0.333333</td>\n",
" <td>0.500000</td>\n",
" <td>0.333333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>WAT</td>\n",
" <td>0.750000</td>\n",
" <td>0.250000</td>\n",
" <td>0.777778</td>\n",
" <td>1.000000</td>\n",
" <td>0.666667</td>\n",
" <td>0.857143</td>\n",
" <td>1.000000</td>\n",
" <td>0.750000</td>\n",
" <td>0.823177</td>\n",
" <td>1.000000</td>\n",
" <td>0.721286</td>\n",
" <td>0.940835</td>\n",
" <td>1.000000</td>\n",
" <td>0.888279</td>\n",
" <td>0.857143</td>\n",
" <td>0.750000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" system accuracy error Macro-F1 Macro-Recall \\\n",
"0 Babelfy 0.666667 0.333333 0.688889 0.833333 \n",
"1 DBpedia_Spotlight 0.083333 0.916667 0.133333 0.111111 \n",
"2 WAT 0.750000 0.250000 0.777778 1.000000 \n",
"\n",
" Macro-Precision Micro-F1 Micro-Recall Micro-Precision Macro-F1-conf \\\n",
"0 0.611111 0.800000 0.888889 0.727273 0.813094 \n",
"1 0.166667 0.153846 0.100000 0.333333 0.133333 \n",
"2 0.666667 0.857143 1.000000 0.750000 0.823177 \n",
"\n",
" Macro-Recall-conf Macro-Precision-conf Micro-F1-conf Micro-Recall-conf \\\n",
"0 0.833333 0.796540 0.845975 0.872938 \n",
"1 0.111111 0.166667 0.153846 0.100000 \n",
"2 1.000000 0.721286 0.940835 1.000000 \n",
"\n",
" Micro-Precision-conf Micro-F1-sklearn Macro-F1-sklearn \n",
"0 0.820628 0.842105 0.727273 \n",
"1 0.333333 0.500000 0.333333 \n",
"2 0.888279 0.857143 0.750000 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEXCAYAAAC9A7+nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAfEUlEQVR4nO3de5hcdZ3n8fenL0nnRsKEgCQdSHRRAuQypImIclOQW4QnOzxCzMgA6yIKK+rCyjyzi4rris64Dgy3J7KQQVkIDKBRo6gryH1MIiEQEA0YSBsuISTccu3Od/84p5PT1VVd1Z3qVPfpz+t56kmdc351zrfS3Z/zq9+p+pUiAjMzG/jqal2AmZlVhwPdzCwnHOhmZjnhQDczywkHuplZTjjQzcxywoFuZpYTDnQbNCStlnSCpHMlPZyueydz2yFpc2Z5nqSvSdqeWfespL+p9XMxK8aBboNaRIzsuAEvAZ/IrLstbbYw0+aLwA8l7Verms1KcaCb9UBE3Ae8Dbyv1rWYFWqodQFmA4UkAacCQ4BnalyOWRcOdLPyPilpNkmQDwX+PiI21rYks6485GJW3p0RMSYihpMMtZwj6bO1LsqskAPdrAciYjXwc+ATNS7FrAsHulkPSGoGTgZW1roWs0IOdLPyzup4HzqwBHgE+HqNazLrQv6CCzOzfHAP3cwsJ8oGuqSbJb0m6ekS2yXpGkmrJK2QdHj1yzQzs3Iq6aEvILkIVMopwEHp7QLght0vy8zMeqpsoEfEg8Ab3TQ5A7g1Eo8DYyTtX60CzcysMtX4pOgEYE1muTVd93JhQ0kXkPTiGTFixMyDDz64Coc3Mxs8li1b9npEjCu2rRqBriLrir51JiLmA/MBWlpaYunSpVU4vJnZ4CHpxVLbqvEul1ZgYma5GVhbhf2amVkPVCPQF5HMbSFJRwJvRkSX4RYzM+tbZYdcJN0OHAfsI6kV+CrQCBARNwKLSaYUXQVsAs7rq2LNzKy0soEeEXPLbA/goqpVZGZ7zPbt22ltbWXLli21LsUKNDU10dzcTGNjY8WP8XzoZoNYa2sro0aNYtKkSSTf32H9QUSwfv16WltbmTx5csWP80f/zQaxLVu2MHbsWId5PyOJsWPH9viVkwPdbJBzmPdPvfm5ONDNzHLCgW5mNSWJT3/60zuX29raGDduHLNnzwZg0aJFXHXVVVU/7oIFCxg3bhwzZsxgxowZnHPOOQDcddddHHroodTV1THQPvzoi6JmVlMjRozg6aefZvPmzQwbNoxf/epXTJgwYef2008/ndNPP72ifUUEEUFdXWV91bPOOotrr72207rDDjuMe+65h89+duB9bax76GZWc6eccgo/+9nPALj99tuZO3fXu6UXLFjAxRdfDMCrr77KnDlzmD59OtOnT+fRRx9l9erVTJkyhc9//vMcfvjhrFmzhssuu4zDDjuMqVOnsnDhwh7VMmXKFD7wgQ9U78ntQe6hmxkAX//JSp5Z+1ZV93nI+L346icOLdvu7LPP5sorr2T27NmsWLGC888/n4ceeqhLuy984Qsce+yx3HvvvbS3t/POO++wYcMGnnvuOW655Rauv/567r77bpYvX86TTz7J66+/zhFHHMExxxzD/vt3nQR24cKFPPzwwwBccsklnHfewP5cpAPdzGpu2rRprF69mttvv51TTz21ZLvf/OY33HrrrQDU19czevRoNmzYwIEHHsiRRx4JwMMPP8zcuXOpr69nv/3249hjj2XJkiVFh22KDbkMZA50MwOoqCfdl04//XQuvfRSHnjgAdavX9+jx44YMWLn/VLfk3zdddfx/e9/H4DFixf3vtB+zGPoZtYvnH/++VxxxRVMnTq1ZJuPfexj3HBD8qVo7e3tvPVW1yGiY445hoULF9Le3s66det48MEHmTVrFhdddBHLly9n+fLljB8/vs+eRy050M2sX2hubuaSSy7pts3VV1/N/fffz9SpU5k5cyYrV67s0mbOnDlMmzaN6dOn89GPfpTvfOc7vOc976m4jnvvvZfm5mYee+wxTjvtNE466aQeP5daUamXJ33NX3BhVnvPPvssU6ZMqXUZVkKxn4+kZRHRUqy9e+hmZjnhQDczywkHuplZTjjQzcxywoFuZpYTDnQzs5xwoJtZTQ326XMfeughDj30UGbMmMHmzZt3a1/+6L+Z1dRgnz73tttu49JLL63KxGDuoZtZzQ3E6XNXrVrFCSecwPTp0zn88MN5/vnniYiix37ggQc47rjjOPPMMzn44IOZN28eEcFNN93EnXfeyZVXXsm8efN6VGcx7qGbWeLnl8MrT1V3n++ZCqeUHy4ZiNPnzps3j8svv5w5c+awZcsWduzYwT333FP02ABPPPEEK1euZPz48Xz4wx/mkUce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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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KtvRIRcvevXqxcyZM4mOjmbDhg00bdrU63oPP/wwrVq1Yv369axdu5bate2Hxfbt2+nfvz9//vkn4eHhrFu3jvXr17NkyRKeeuopDhw44PX5Zs2adWHIZeLEiRn2+pRSgclv99B92ZPOKPXq1WPPnj2EhYVx5513JrveTz/9xJQpUwAICgqicOHCHD9+nGuvvZZmzZoB8PvvvxMaGkpQUBClS5emVatWrF692uuwjbchF6WU8pXuoSejU6dOPPnkk4SGhqb5sfnz57/wc3KtFT799NMLe+P791/WvFIppdJMAz0ZgwcP5qWXXqJu3brJrnPrrbcyatQoAOLj4zl58vIx/5tvvplZs2YRHx9PZGQkv/32G02aNOGBBx5g3bp1rFu3jrJly2bY61BKZR8a6MkoX748jzzySIrrfPTRR/z888/UrVuXRo0asXnz5svW6dq1K/Xq1aN+/frccsstvPvuu1xzzTU+1zFv3jzKly/P8uXL6dChA3fccUeaX4tSKnvwq26LW7du1bM6/Jj+/yjlvpS6LeoeulJKBQgNdKWUChAa6EopFSA00JVSKkBooCulVIDQQFdKqQChgZ5Edm+fu3TpUmrXrk2DBg04d+5chm9PKZV+/LaXi1uye/vc6dOn8+STTzJo0KBM2Z5SKv34b6AvehYObkzf57ymLrRPfe86K7bP3bFjByNGjCAyMpKgoCDmzJlDlSpVePrppy/b9i+//MIrr7xCiRIl2LRpE40aNWLatGmMHz+e2bNns3jxYpYsWcL06dN9rlMp5T4dcvEiK7bP7dOnDw888ADr169n2bJllClThrlz5ya77T///JMPP/yQLVu2sGvXLv744w+GDBlCp06d+N///qdhrlQW5L976D7sSWeUrNY+99SpU/z777907doVgDx58qS47UKFCtGkSRPKl7dX5mnQoAF79uyhRYsWad62Usp/6B56Mvy9fe6gQYNo0KABd955Z7LbSKlPT+7cuS/8HBQURFxcXJprUEr5Fw30ZPh7+9yJEyeybt06vv32WwoVKkT58uX56quvAIiJieHs2bPJblspFZg00JOR1drnTp06lY8//ph69epx4403cvDgwavetlIqa9H2ucpn+v+jlPu0fa5SSmUDGuhKKRUg/C7Q3RoCUinT/xel/J9fBXqePHk4evSohoefMcZw9OjRC+e3K6X8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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"dslist = sorted(glob.glob('datasets/*.*'))\n",
"all_dataset = []\n",
"for dataset in dslist:\n",
" ds_item = {}\n",
" \n",
" \n",
" gold = load_dataset(dataset)\n",
" \n",
" datasetname = os.path.basename(dataset)\n",
" datasetname, _ = os.path.splitext(datasetname)\n",
" datasetname\n",
" \n",
" ds_item['dataset'] = datasetname\n",
" print('benchmark dataset : ', datasetname)\n",
" \n",
" all_systems = []\n",
" \n",
" systems = sorted(glob.glob(datasetname+'/*.*'))\n",
" for system in systems:\n",
" sys_name, _ = os.path.splitext(os.path.basename(system))\n",
" sys_item = {'system': sys_name}\n",
" print('system being evaluated: ', system)\n",
" sample = load_dataset(system)\n",
" benchmark = evaluate_dataset(gold, sample)\n",
" \n",
" all_systems.append({**sys_item, **benchmark})\n",
" df = pd.DataFrame(all_systems)\n",
" display(df)\n",
" df.plot(x=\"system\", y=['Micro-F1','Micro-F1-conf'], title=datasetname, ylim=(0., 1.));\n",
" ds_item['result'] = all_systems\n",
" all_dataset.append(ds_item)\n",
" \n",
"# print(json.dumps(all_dataset, indent=2))\n",
" "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
@LittlePea13
Copy link

Code to get Confidence weighted Metrics

true_pos = []
false_pos = []
false_neg = []
mctr = 1
for sample_sent, gold_sent in zip(sample, gold):
    pred_id = [str(instance['uri']) for instance in sample_sent['mentions']]
    gold_id = [str(instance['uri']) for instance in gold_sent['mentions']]
    intersect = []
    false_preds = []
    # Check for intersecting URIs
    for idx, uri in enumerate(pred_id):
        if uri in gold_id:
            intersect.append([idx, gold_id.index(uri)])
        else:
            # False Predictions from system
            false_preds.append(idx)
    # Missing preds from system
    missing_preds = len(gold_id) - len(intersect)

    print(len(sample_sent['mentions']), len(gold_sent['mentions']))
    
    tp = 0
    # Start with false preds from system for False Positives
    fp = sum([float(sample_sent['mentions'][fal_pred]['confidence']) for fal_pred in false_preds])
    fn = missing_preds
    for sample_mention_id, gold_mention_id in intersect:
        print(sample_mention_id, gold_mention_id)
        sample_mention = sample_sent['mentions'][sample_mention_id]
        gold_mention = gold_sent['mentions'][gold_mention_id]

        print('begin : ',sample_mention['begin'], gold_mention['begin'])
        print('begin : ',sample_mention['end'], gold_mention['end'])
        print('anchor : ', repr(sample_mention['anchor'].toPython()), repr(gold_mention['anchor'].toPython()))
        print('identRef sample : ',sample_mention['identRef'])
        print('identRef gold : ', gold_mention['identRef'])
        # strong match
        print('confidence : ', sample_mention['confidence'])
#         print('match score (me): ', me_strong_entity_matching(sample_mention, gold_mention))
        print('match score (ma): ', ma_strong_annotation_matching(sample_mention, gold_mention))
#         yt.append(mctr)
        if ma_strong_annotation_matching(sample_mention, gold_mention)==1:
            tp += float(sample_mention['confidence'])
        else:
#             if 'notInWiki' in gold_mention['identRef'][0]:
#                 fp += float(confidence)
            fp += float(sample_mention['confidence'])
        print()
    true_pos.append(tp)
    false_pos.append(fp)
    false_neg.append(fn)
    print('--')

F1_scores = []
pres_scores = []
recall_scores = []

for tp, fp, fn in zip(true_pos, false_pos, false_neg):
    pres_scores.append(tp / (tp+fp))
    recall_scores.append(tp/(tp + fn))
    F1_scores.append((2 * pres_scores[-1] * recall_scores[-1]) / (pres_scores[-1] + recall_scores[-1]))
    
print('Macro-F1', sum(F1_scores)/len(F1_scores))
print('Macro-Recall', sum(recall_scores)/len(recall_scores))
print('Macro-Precision', sum(pres_scores)/len(pres_scores))


precision = sum(true_pos) / (sum(true_pos)+sum(false_pos))
recall = sum(true_pos) / (sum(true_pos)+sum(false_neg))
F1 = (2 * precision * recall) / (precision + recall)
print('Micro-F1', F1)
print('Macro-Recall', recall)
print('Macro-Precision', precision)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment