diff --git a/WWW21-Information_Extraction_from_Co-Occurring_Similar_Entities.ipynb b/WWW21-Information_Extraction_from_Co-Occurring_Similar_Entities.ipynb index 49ce31f..ccb6edd 100644 --- a/WWW21-Information_Extraction_from_Co-Occurring_Similar_Entities.ipynb +++ b/WWW21-Information_Extraction_from_Co-Occurring_Similar_Entities.ipynb @@ -4,15 +4,2121 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Code and results of our TheWebConf 2021 paper `Information Extraction from Co-Occurring Similar Entities` will be published here very soon." + "# Information Extraction from Similar Co-Occurring Entities\n", + "This notebook contains the necessary code for reproducing the results of the paper \"Information Extraction from Similar Co-Occurring Entities\". The functionality for extracting new entities and facts for CaLiGraph is already implemented in the extraction framework. Here, we simply run this functionality to show the results and extend some parts to extract results for DBpedia as well.\n", + "\n", + "To reproduce the results, parts of the CaLiGraph extraction framework need to be run first. If necessary, the extraction will be triggered automatically from this notebook. A full run of this notebook needs roughly two days (plus three additional days when running the extraction framework). For hardware requirements, refer to the README.\n", + "\n", + "Evaluation results of the paper and all triples produced in this notebook can be downloaded [here](http://data.dws.informatik.uni-mannheim.de/CaLiGraph/www2021/).\n", + "\n", + "*Note: The results produced here differ slightly from the results of the paper as we use new Wikipedia and DBpedia dumps from 2020 instead of from 2016.*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparations" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-03-03 16:50:32,375 DEBUG: RDFLib Version: 5.0.0\n" + ] + } + ], + "source": [ + "# imports\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "pd.options.display.max_rows = 50\n", + "pd.options.display.max_columns = 50\n", + "pd.options.display.max_colwidth = 100\n", + "\n", + "import impl.dbpedia.store as dbp_store\n", + "import impl.dbpedia.util as dbp_util\n", + "import impl.util.rdf as rdf_util\n", + "import impl.util.serialize as serialize_util\n", + "from impl import caligraph\n", + "import impl.caligraph.util as clg_util\n", + "from impl.listing import context, extract" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-03-03 20:15:32,126 INFO: Note: NumExpr detected 32 cores but \"NUMEXPR_MAX_THREADS\" not set, so enforcing safe limit of 8.\n", + "2021-03-03 20:15:32,130 INFO: NumExpr defaulting to 8 threads.\n" + ] + } + ], + "source": [ + "# load data\n", + "graph = caligraph.get_axiom_graph()\n", + "df = context.retrieve_page_entity_context(graph)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Type Extraction for *DBpedia*" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# compute valid combinations of types and NE tags\n", + "\n", + "def _get_transitive_types_dbp(entity_name: str) -> set:\n", + " dbp_uri = dbp_util.name2resource(str(entity_name))\n", + " transitive_types = dbp_store.get_transitive_types(dbp_uri).difference({rdf_util.CLASS_OWL_THING})\n", + " return {dbp_util.type2name(t) for t in transitive_types}\n", + "\n", + "def _get_valid_tags_for_entity_types_dbp(dft: pd.DataFrame, threshold: float) -> dict:\n", + " tag_probabilities = context._get_tag_probabilities(dft)\n", + " valid_tags = tag_probabilities[tag_probabilities['tag_fit'] >= threshold].groupby('E_enttype')['E_tag'].apply(lambda x: x.values.tolist()).to_dict()\n", + " for ent_type in set(valid_tags): # assign tags of parents to types without tags (to avoid inconsistencies)\n", + " valid_tags[ent_type] = _compute_valid_tags_for_type_dbp(ent_type, valid_tags)\n", + " return valid_tags\n", + "\n", + "def _compute_valid_tags_for_type_dbp(ent_type: str, valid_tags: dict) -> set:\n", + " if ent_type not in valid_tags:\n", + " return set()\n", + " if not valid_tags[ent_type]:\n", + " valid_tags[ent_type] = {tag for ptype in _get_supertypes_dbp(ent_type) for tag in _compute_valid_tags_for_type_dbp(ptype, valid_tags)}\n", + " return valid_tags[ent_type]\n", + "\n", + "def _get_supertypes_dbp(type_name: str) -> set:\n", + " dbp_type = dbp_util.name2type(str(type_name))\n", + " return {dbp_util.type2name(t) for t in dbp_store.get_supertypes(dbp_type).difference({rdf_util.CLASS_OWL_THING})}\n", + "\n", + "df_types_dbp = pd.DataFrame([{'E_ent': ent, 'E_enttype': t} for ent in df['E_ent'].unique() for t in _get_transitive_types_dbp(ent)])\n", + "dft_dbp = pd.merge(left=df, right=df_types_dbp, on='E_ent')\n", + "valid_tags_dbp = _get_valid_tags_for_entity_types_dbp(dft_dbp, .35)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# extract rules\n", + "\n", + "rule_dfs_dbp = {}\n", + "for rule_name, rule_pattern in extract.RULE_PATTERNS.items():\n", + " dft_by_page = extract._aggregate_types_by_page(dft_dbp, rule_pattern)\n", + " rule_dfs_dbp[rule_name] = extract._aggregate_types_by_section(dft_by_page, rule_pattern)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Threshold Selection" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# extract all possible new types up to a very low threshold (mean >= 0.25 and std <= 0.75)\n", + "\n", + "threshold_rule_dfs_dbp = [rule_dfs_dbp[rule_name].query(f'micro_mean > .25 & micro_std < .75').reset_index()[rule_pattern + ['E_enttype', 'micro_mean', 'micro_std']].drop_duplicates() for rule_name, rule_pattern in extract.RULE_PATTERNS.items()]\n", + "threshold_types_dbp = extract._extract_new_types(threshold_rule_dfs_dbp, df, df_types_dbp)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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e2y9tpPO4sWLiffGe/bZZxk1ahQtW4a0uc0229S4jqOPPppWrVrRp08fvvvuu421/T59+lBWVrax3Lbbbsu///3veid0jeUiInUzYQK0a1d1Xrt2YX6OTJ48mSVLljBjxgxmzpxJ165dG21YgrZt22a1rZYtW7JhwwaATcpX1O4LCgpo1arVxr7lBQUFVZpYVq9eTdu2besdsxK6iNTNsGEwaVKokZuF50mT6tXLpUOHDnz99dcbp7/88ku23XZbWrVqxbRp01gY/SI48MADeeKJJ1i9ejUrV66scy+U1O3F7brrrlVq0UcddRS33HLLxkRc0eRSUlLCjBkzgNDmXhcffvghvXv3rtN745TQRaTuhg2DsjLYsCE81yOZA3Tu3JkDDzyQ3r17c9FFFzFs2DCmT59Onz59uPvuu9l9990BGDBgAIMGDaJv374cffTR9OnTh6222qrW2+vbty8tWrRgr7322uSk6JZbbkmPHj2YN28eAMOHD6eoqIi+ffuy1157bewd8/vf/54xY8ZQWlpKixYtah3D559/Ttu2bdluu+1q/d5UebtJdGlpqSf5jkXqhy7N0dy5c9ljjz3yHUZWVq5cSfv27Vm1ahWHHHIIkyZNon///jndxqOPPsqMGTO44oorcrreuOuvv56OHTty+umnb7Is3edhZjPcvTTdunRSVESapZEjRzJnzhxWr17NKaeckvNkDnD88cezrB69drKx9dZbc9JJJ+VkXUroItIspbsg6Oyzz+aVV16pMm/MmDGcdtppdd7O8OHD6/zebNQntlRK6CKSGBMnTsx3CHmlk6IiIgmhhC4ikhBK6CIiCaE2dBHJKBfdb+PUFbdhqYYuIk1GQwyf+/7779OvXz/23ntv5s+fz/e+9z2g5qFzmyMldBFpMhoiodd1LPTmSAldRJqM+Hjo5513Xl7HQm+O1IYuIk1GfDz09evXs2rVqryMhd5cKaGLSJOUz7HQmysldBFpkuJjobdq1YqSkpJGGwu9uVJCF5GMGrubYXx88urGQj/jjDO45JJLWL9+PU8++SQjR46s17aSQgldRJqM+HjoAwYM4P3336dPnz6UlpamHQu9a9euORkL/dRTT+W8887L9e40uqwSupkNBG4AWgC3ufuVacr8FBgPODDL3X+ewzhFZDORTVfCCy+8kPHjx28cC726e3GOHz++yvTK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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def visualise_type_thresholds(df, tag_probabilities, bin_count):\n", + " \"\"\"Visualize the tag fit in relation to the confidence and consistency (here: std).\"\"\"\n", + " df = pd.merge(df, tag_probabilities, on=['E_enttype', 'E_tag'])\n", + " \n", + " min_mean = .25\n", + " mean_conf_labels = [min_mean + x / bin_count * (1 - min_mean) for x in range(bin_count)]\n", + " df['mean_confidence'] = pd.cut(df['micro_mean'], bin_count, labels=mean_conf_labels)\n", + " \n", + " # per bin\n", + " plt.bar(x=mean_conf_labels, height=df.groupby('mean_confidence')['tag_fit'].mean().values, width=(1-min_mean)/bin_count*0.8, align='edge', label='tag_fit')\n", + " # cumulative\n", + " cumulative_tag_fit = [df[df['micro_mean'] > x]['tag_fit'].mean() for x in mean_conf_labels]\n", + " plt.plot(mean_conf_labels, cumulative_tag_fit, 'ro--', label='tag_fit (cum)')\n", + " plt.xlabel('Pattern Confidence')\n", + " plt.title('Pattern Confidence vs. Tagger Confidence')\n", + " plt.legend()\n", + " plt.show()\n", + "\n", + " max_std = .75\n", + " std_conf_labels = [(x+1) / bin_count * max_std for x in range(bin_count)]\n", + " df['std_confidence'] = pd.cut(df['micro_std'], bin_count, labels=std_conf_labels)\n", + "\n", + " # per bin\n", + " plt.bar(x=std_conf_labels, height=df.groupby('std_confidence')['tag_fit'].mean().values, width=max_std/bin_count*-0.8, align='edge', label='tag_fit')\n", + " # cumulative\n", + " cumulative_tag_fit = [df[df['micro_std'] < x]['tag_fit'].mean() for x in std_conf_labels]\n", + " plt.plot(std_conf_labels, cumulative_tag_fit, 'ro--', label='tag_fit (cum)')\n", + " plt.xlabel('Pattern Std.Dev.')\n", + " plt.title('Pattern Std.Dev. vs. Tagger Confidence')\n", + " plt.legend()\n", + " plt.show()\n", + " \n", + "visualise_type_thresholds(threshold_types_dbp, context._get_tag_probabilities(dft_dbp), 15)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Results" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# filter rules by threshold and compute filtered types\n", + "\n", + "new_types_dbp = extract._extract_new_types_with_threshold(df, df_types_dbp, rule_dfs_dbp)\n", + "filtered_types_dbp = extract._filter_new_types_by_tag(new_types_dbp, valid_tags_dbp)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
P_basetypeTS_textE_enttypemicro_meanmicro_stdPE_entE_textE_tagTS_entS_textS_entE_idTS_enttypeS_enttypeP_type
29480310WorkPersonnelPerson0.9731510.045563Vanished GardensVanished Gardens--Bernie GrundmanBernie GrundmanPERSONNonePersonnelNone39380735.0NaNNaNAlbum
18362792OtherPeoplePerson0.9902740.019795MenasceDaniel MenasceDaniel MenascePERSONNonePeopleNone38921168.0NaNNaNOther
20987372OtherSpeciesEukaryote0.9913290.015792CoelotesCoelotes striatilamnisCoelotes s. ketmenensisOTHERNoneSpeciesNone33212227.0NaNNaNOther
31684226OrganisationFirst World WarOrganisation1.0000000.0000006th (United Kingdom) Division6th (United Kingdom) Division--9th (Service)9th (Service)ORGWorld War ILater in the WarNone4250374.0MilitaryConflictNaNMilitaryUnit
29948623WorkTrack listingMusicalWork0.9431740.103822A Picture of Me (Without You)A Picture of Me (Without You)--She Loves Me (Right Out of My Mind)She Loves Me (Right Out of My Mind)WORK_OF_ARTNoneTrack listingNone16758878.0NaNNaNAlbum
9052004LocationStoresCompany0.9834710.023047Eastport PlazaEastport Plaza--Nail TekNail TekORGNoneStoresNone30609099.0NaNNaNShoppingMall
28487131WorkPersonnelArtist0.8788500.140657SimetriSitiSimetriSiti--Jay FrancoJay FrancoPERSONNonePersonnelNone37829447.0NaNNaNAlbum
34360607OtherRolling stockMeanOfTransportation1.0000000.000000KamomeKamome--485 series EMUs485 series EMUsPRODUCTNoneRolling stock used in the pastNone16899907.0NaNNaNOther
21119704OtherSpeciesSpecies0.9996080.002107GageaGagea hiensisGagea hiensisOTHERNoneSpeciesNone7517175.0NaNNaNOther
2532341ListChampions by yearAthlete0.9818840.112793List of Grand Slam men's singles championsAshley Cooper (tennis player)Ashley CooperPERSONNoneChampions by yearNone8457320.0NaNNaNList
28815210WorkPersonnelMusicalArtist0.8717310.145537Loud 'n' RawLoud 'n' Raw--Hirotsugu HommaHirotsugu HommaPERSONNonePersonnelNone25800546.0NaNNaNAlbum
30777644WorkTrack listingSong0.8887730.173072Strange BluesStrange BluesStrange BluesWORK_OF_ARTNoneTrack listingNone32289269.0NaNNaNAlbum
3295536ListForza ItaliaPerson1.0000000.000000List of members of the Italian Senate, 1996–2001Dino De AnnaDino De AnnaPERSONForza ItaliaForza ItaliaForza Italia33607227.0PoliticalPartyPoliticalPartyList
16237881OtherLine of SuccessionAgent1.0000000.000000Earl of LonsdaleEarl of Lonsdale--Nikolas LowtherNikolas LowtherPERSONNoneLine of SuccessionNone3832509.0NaNNaNOther
20650923OtherSpeciesAnimal0.9342130.151303NeonoemacheilusNeonoemacheilus morehensisNeonoemacheilus morehensisSPECIESNoneSpeciesNone29062922.0NaNNaNOther
9728401OrganisationAffiliated artistsPerson0.8571430.000000301Studios301Studios--Max HabenMax HabenPERSONNoneAffiliated artistsNone20434515.0NaNNaNRecordLabel
28364375WorkPersonnelArtist0.8788500.140657BatbabyBatbaby--Amy LutherAmy LutherPERSONNonePersonnelNone29141603.0NaNNaNAlbum
9212341LocationTowns and villages in the districtPopulatedPlace1.0000000.000000Kottayam districtKottayam district--MudiyoorkaraMudiyoorkaraGPENoneOther villagesNone690614.0NaNNaNAdministrativeRegion
23163889PersonFeature filmsWork0.9954340.005732Peggy McCayPeggy McCay--Daddy's GirlDaddy's GirlWORK_OF_ARTNoneFeature filmsNone7372097.0NaNNaNPerson
31266144WorkTrack listingWork0.9493920.093618Regresará Por MíRegresará Por Mí--Tu MisericordiaTu MisericordiaWORK_OF_ARTNoneTrack listingNone27737421.0NaNNaNAlbum
\n", + "
" + ], + "text/plain": [ + " P_basetype TS_text \\\n", + "29480310 Work Personnel \n", + "18362792 Other People \n", + "20987372 Other Species \n", + "31684226 Organisation First World War \n", + "29948623 Work Track listing \n", + "9052004 Location Stores \n", + "28487131 Work Personnel \n", + "34360607 Other Rolling stock \n", + "21119704 Other Species \n", + "2532341 List Champions by year \n", + "28815210 Work Personnel \n", + "30777644 Work Track listing \n", + "3295536 List Forza Italia \n", + "16237881 Other Line of Succession \n", + "20650923 Other Species \n", + "9728401 Organisation Affiliated artists \n", + "28364375 Work Personnel \n", + "9212341 Location Towns and villages in the district \n", + "23163889 Person Feature films \n", + "31266144 Work Track listing \n", + "\n", + " E_enttype micro_mean micro_std \\\n", + "29480310 Person 0.973151 0.045563 \n", + "18362792 Person 0.990274 0.019795 \n", + "20987372 Eukaryote 0.991329 0.015792 \n", + "31684226 Organisation 1.000000 0.000000 \n", + "29948623 MusicalWork 0.943174 0.103822 \n", + "9052004 Company 0.983471 0.023047 \n", + "28487131 Artist 0.878850 0.140657 \n", + "34360607 MeanOfTransportation 1.000000 0.000000 \n", + "21119704 Species 0.999608 0.002107 \n", + "2532341 Athlete 0.981884 0.112793 \n", + "28815210 MusicalArtist 0.871731 0.145537 \n", + "30777644 Song 0.888773 0.173072 \n", + "3295536 Person 1.000000 0.000000 \n", + "16237881 Agent 1.000000 0.000000 \n", + "20650923 Animal 0.934213 0.151303 \n", + "9728401 Person 0.857143 0.000000 \n", + "28364375 Artist 0.878850 0.140657 \n", + "9212341 PopulatedPlace 1.000000 0.000000 \n", + "23163889 Work 0.995434 0.005732 \n", + "31266144 Work 0.949392 0.093618 \n", + "\n", + " P \\\n", + "29480310 Vanished Gardens \n", + "18362792 Menasce \n", + "20987372 Coelotes \n", + "31684226 6th (United Kingdom) Division \n", + "29948623 A Picture of Me (Without You) \n", + "9052004 Eastport Plaza \n", + "28487131 SimetriSiti \n", + "34360607 Kamome \n", + "21119704 Gagea \n", + "2532341 List of Grand Slam men's singles champions \n", + "28815210 Loud 'n' Raw \n", + "30777644 Strange Blues \n", + "3295536 List of members of the Italian Senate, 1996–2001 \n", + "16237881 Earl of Lonsdale \n", + "20650923 Neonoemacheilus \n", + "9728401 301Studios \n", + "28364375 Batbaby \n", + "9212341 Kottayam district \n", + "23163889 Peggy McCay \n", + "31266144 Regresará Por Mí \n", + "\n", + " E_ent \\\n", + "29480310 Vanished Gardens--Bernie Grundman \n", + "18362792 Daniel Menasce \n", + "20987372 Coelotes striatilamnis \n", + "31684226 6th (United Kingdom) Division--9th (Service) \n", + "29948623 A Picture of Me (Without You)--She Loves Me (Right Out of My Mind) \n", + "9052004 Eastport Plaza--Nail Tek \n", + "28487131 SimetriSiti--Jay Franco \n", + "34360607 Kamome--485 series EMUs \n", + "21119704 Gagea hiensis \n", + "2532341 Ashley Cooper (tennis player) \n", + "28815210 Loud 'n' Raw--Hirotsugu Homma \n", + "30777644 Strange Blues \n", + "3295536 Dino De Anna \n", + "16237881 Earl of Lonsdale--Nikolas Lowther \n", + "20650923 Neonoemacheilus morehensis \n", + "9728401 301Studios--Max Haben \n", + "28364375 Batbaby--Amy Luther \n", + "9212341 Kottayam district--Mudiyoorkara \n", + "23163889 Peggy McCay--Daddy's Girl \n", + "31266144 Regresará Por Mí--Tu Misericordia \n", + "\n", + " E_text E_tag TS_ent \\\n", + "29480310 Bernie Grundman PERSON None \n", + "18362792 Daniel Menasce PERSON None \n", + "20987372 Coelotes s. ketmenensis OTHER None \n", + "31684226 9th (Service) ORG World War I \n", + "29948623 She Loves Me (Right Out of My Mind) WORK_OF_ART None \n", + "9052004 Nail Tek ORG None \n", + "28487131 Jay Franco PERSON None \n", + "34360607 485 series EMUs PRODUCT None \n", + "21119704 Gagea hiensis OTHER None \n", + "2532341 Ashley Cooper PERSON None \n", + "28815210 Hirotsugu Homma PERSON None \n", + "30777644 Strange Blues WORK_OF_ART None \n", + "3295536 Dino De Anna PERSON Forza Italia \n", + "16237881 Nikolas Lowther PERSON None \n", + "20650923 Neonoemacheilus morehensis SPECIES None \n", + "9728401 Max Haben PERSON None \n", + "28364375 Amy Luther PERSON None \n", + "9212341 Mudiyoorkara GPE None \n", + "23163889 Daddy's Girl WORK_OF_ART None \n", + "31266144 Tu Misericordia WORK_OF_ART None \n", + "\n", + " S_text S_ent E_id \\\n", + "29480310 Personnel None 39380735.0 \n", + "18362792 People None 38921168.0 \n", + "20987372 Species None 33212227.0 \n", + "31684226 Later in the War None 4250374.0 \n", + "29948623 Track listing None 16758878.0 \n", + "9052004 Stores None 30609099.0 \n", + "28487131 Personnel None 37829447.0 \n", + "34360607 Rolling stock used in the past None 16899907.0 \n", + "21119704 Species None 7517175.0 \n", + "2532341 Champions by year None 8457320.0 \n", + "28815210 Personnel None 25800546.0 \n", + "30777644 Track listing None 32289269.0 \n", + "3295536 Forza Italia Forza Italia 33607227.0 \n", + "16237881 Line of Succession None 3832509.0 \n", + "20650923 Species None 29062922.0 \n", + "9728401 Affiliated artists None 20434515.0 \n", + "28364375 Personnel None 29141603.0 \n", + "9212341 Other villages None 690614.0 \n", + "23163889 Feature films None 7372097.0 \n", + "31266144 Track listing None 27737421.0 \n", + "\n", + " TS_enttype S_enttype P_type \n", + "29480310 NaN NaN Album \n", + "18362792 NaN NaN Other \n", + "20987372 NaN NaN Other \n", + "31684226 MilitaryConflict NaN MilitaryUnit \n", + "29948623 NaN NaN Album \n", + "9052004 NaN NaN ShoppingMall \n", + "28487131 NaN NaN Album \n", + "34360607 NaN NaN Other \n", + "21119704 NaN NaN Other \n", + "2532341 NaN NaN List \n", + "28815210 NaN NaN Album \n", + "30777644 NaN NaN Album \n", + "3295536 PoliticalParty PoliticalParty List \n", + "16237881 NaN NaN Other \n", + "20650923 NaN NaN Other \n", + "9728401 NaN NaN RecordLabel \n", + "28364375 NaN NaN Album \n", + "9212341 NaN NaN AdministrativeRegion \n", + "23163889 NaN NaN Person \n", + "31266144 NaN NaN Album " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filtered_types_dbp.sample(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
E_textE_enttype
14654325Nicolae NegumereanuMartialArtist
29470332ErgunPerson
14416762Nilkanth Singh MundaPolitician
21230683Medetera valaisensisSpecies
24549197Daïnah la métisseWork
29966481Steady RainMusicalWork
15827202Harry WeisbergAgent
30065800Slide ShowMusicalWork
26804418Amelia WiśniewskaAgent
29313304Joshua Levy-Person
32285183Maeght FoundationArchitecturalStructure
212625Mars MatrixVideoGame
28654942Chris LawsMusicalArtist
35334405The TigressFilm
29280036A. J. BensonPerson
3270801Art DeCarloGridironFootballPlayer
3806127KENH-LDBroadcaster
20592007Euclystis golosusAnimal
909124Alina GrachevaPerson
14001821LeadbetterSnookerPlayer
\n", + "
" + ], + "text/plain": [ + " E_text E_enttype\n", + "14654325 Nicolae Negumereanu MartialArtist\n", + "29470332 Ergun Person\n", + "14416762 Nilkanth Singh Munda Politician\n", + "21230683 Medetera valaisensis Species\n", + "24549197 Daïnah la métisse Work\n", + "29966481 Steady Rain MusicalWork\n", + "15827202 Harry Weisberg Agent\n", + "30065800 Slide Show MusicalWork\n", + "26804418 Amelia Wiśniewska Agent\n", + "29313304 Joshua Levy- Person\n", + "32285183 Maeght Foundation ArchitecturalStructure\n", + "212625 Mars Matrix VideoGame\n", + "28654942 Chris Laws MusicalArtist\n", + "35334405 The Tigress Film\n", + "29280036 A. J. Benson Person\n", + "3270801 Art DeCarlo GridironFootballPlayer\n", + "3806127 KENH-LD Broadcaster\n", + "20592007 Euclystis golosus Animal\n", + "909124 Alina Gracheva Person\n", + "14001821 Leadbetter SnookerPlayer" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filtered_types_dbp.sample(20)[['E_text', 'E_enttype']]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# write new types to file\n", + "def serialize_types_dbp(df, filename):\n", + " triples = [serialize_util.as_object_triple(dbp_util.name2resource(r['E_ent']), rdf_util.PREDICATE_TYPE, dbp_util.name2type(r['E_enttype'])) for _, r in df.iterrows()]\n", + " with open(filename, mode='w') as f:\n", + " f.writelines(triples)\n", + "\n", + "serialize_types_dbp(filtered_types_dbp, 'new_types_dbpedia.nt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Type Extraction for *CaLiGraph*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# compute valid combinations of types and NE tags\n", + "\n", + "df_types_clg = context.get_entity_types(df, graph)\n", + "dft_clg = pd.merge(left=df, right=df_types_clg, on='E_ent')\n", + "valid_tags_clg = context.get_valid_tags_for_entity_types(dft_clg, graph, .35)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# extract rules\n", + "\n", + "rule_dfs_clg = {}\n", + "for rule_name, rule_pattern in extract.RULE_PATTERNS.items():\n", + " dft_by_page = extract._aggregate_types_by_page(dft_clg, rule_pattern)\n", + " rule_dfs_clg[rule_name] = extract._aggregate_types_by_section(dft_by_page, rule_pattern)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# filter rules by threshold and compute filtered types\n", + "\n", + "new_types_clg = extract._extract_new_types_with_threshold(df, df_types_clg, rule_dfs_clg)\n", + "filtered_types_clg = extract._filter_new_types_by_tag(new_types_clg, valid_tags_clg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write new types to file\n", + "\n", + "def serialize_types_clg(df, filename):\n", + " triples = [serialize_util.as_object_triple(clg_util.name2clg_resource(r['E_ent']), rdf_util.PREDICATE_TYPE, clg_util.name2clg_type(r['E_enttype'])) for _, r in df.iterrows()]\n", + " with open(filename, mode='w') as f:\n", + " f.writelines(triples)\n", + "\n", + "serialize_types_clg(filtered_types_clg, 'new_types_caligraph.nt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Relation Extraction" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# retrieve existing relations\n", + "\n", + "df_rels = context.get_entity_relations()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Threshold Selection" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# extract all possible rules for relations with PageEntity as target\n", + "\n", + "rule_dfs = {}\n", + "dfr = extract._create_relation_df(df, df_rels, 'P')\n", + "dfr_types = extract._create_relation_type_df(dfr)\n", + "for rule_name, rule_pattern in extract.RULE_PATTERNS.items():\n", + " dfr_by_page = extract._aggregate_relations_by_page(df, dfr, df_rels, rule_pattern)\n", + " rule_dfs[rule_name] = extract._aggregate_relations_by_section(dfr_by_page, rule_pattern)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# generate all possible relations up to a very low threshold (mean > 0.25 and std < 0.75)\n", + "threshold_rule_dfs = [rule_dfs[rule_name].query(f'page_count > 2 & micro_mean > .25 & micro_std < .75').reset_index()[rule_pattern + ['rel', 'micro_mean', 'micro_std']].drop_duplicates() for rule_name, rule_pattern in extract.RULE_PATTERNS.items()]\n", + "threshold_relations = extract._extract_new_relations(threshold_rule_dfs, 'P', df, dfr_types, df_rels)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Enp2djY5OTnJ2ryISFoysxUlzVOVi4hIRCihi4hEhBK6iEhEpFTnXNu2bWP16tVs2bIl2aHUeHXr1qV169ZkZWUlOxQRiVNKJfTVq1fTqFEjsrOz8X0iSTI451i/fj2rV6+mffv2yQ5HROKUUlUuW7ZsoWnTpkrmSWZmNG3aVGdKImkmpRI6oGSeIvR/EEk/KZfQRUSkYpTQRUQiIqUaRctt4kQYORJWroS2bWHMGBg8uMKr27BhA08//TRXXHFFAoOEzz77jEGDBmFmvPDCC5x//vnMnTuX3Nxc5s6dy3nnnRfzfWvWrOGSSy5hypQpCY0nbNCgQYwePZpOnSL5RC4Rske8Xqn35449PUGRVL30LaFPnAjDhsGKFeCc/ztsmJ9eQRs2bODBBx9MYJDeK6+8wllnncXHH39Mhw4dmDt3LgC5ubk8/fTTJb7v7rvv5pJLKvLIzfhdfvnljBs3ruwFRSTlpXZC791791dhwr3xRsjP33X5/HwYPtwPr1u3+3vLMGLECJYtW0b37t25/vrr2bRpEyeddBI9evSga9euvPrqqzuXHT16NAcccADHHnss5557LnfddVfMdU6dOpV7772Xv/3tb5x44okANGzYcOf23nrrLbp3784999yz23tffPFF+vTpA8D27du57rrr6NKlC926deOBBx4AfJ8469atAyAnJ4fewX6OGjWKIUOGcNxxx9GuXTteeuklbrjhBrp27UqfPn3Ytm0bAMcddxwzZsygoKBgt+2LSHpJ3yqX1atjT1+/vsKrHDt2LJ9++inz588HoKCggJdffpnGjRuzbt06jjzySPr160dOTg4vvvgiCxYsYNu2bfTo0YPDDjss5jpPO+00LrvsMho2bMh111232/buuuuumFUqy5cvp0mTJtSpUweACRMmkJuby/z586lVqxbfffddmfuzbNkyZs2axeLFiznqqKN48cUXGTduHAMHDuT1119nwIABZGRk0LFjRxYsWFDiPohIekjthD57dsnz2rb11SzFtQsew9isWenvj4Nzjptuuok5c+aQkZHBV199xdq1a3nnnXfo378/devWpW7dupxxxhllr6yc1qxZQ/PmRT1kzpgxg8suu4xatfy/bK+99ipzHX379iUrK4uuXbuyffv2naX9rl27kpubu3O5Fi1a8PXXXyuhi6S51K5yKc2YMVC//q7T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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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8j4ooYuIJAkldBGRJKFG0QYue9JL1Xr+umk/jlMkUi/NmQOTJ8OGDdC1K0ydCqMrc3+Q0rZv385jjz3GlVdeGccg4fPPP2fUqFGYGc888wwXXXQRixYtYt26dSxatIif//znUZ+3ZcsWLrvsMl588cW4xhM2atQobrvtNnr06FHtbekMXUSqZs4cGDcO1q8H5/zfceP88iravn079913X8UFK+n555/n3HPP5ZNPPqF79+4sWrQIgHXr1vHYY2Xf1fCuu+7isssui3s8YVdccQXTp0+Py7aU0EWkbKeddvBUknBvvBHy80uXz8+HiRP9423bDn5uBSZNmsSaNWsYMGAA119/PTt37uT000/n2GOPpW/fvvz973/fX/a2227jyCOPZPDgwVx44YXceeedUbc5f/58/vSnP3H//fczdOhQAJo3b75/f2+//TYDBgzg7rvvPui5c+fOZdiwYQAUFRVx3XXX0adPH/r168e9994L+HGptm3bBsDixYs5LTjOKVOmMGbMGIYMGUJWVhbPPvssN9xwA3379mXYsGEUFBQAMGTIEF577TUKCwsrfH0qoioXEama3Nzoy/PyqrzJadOmsWzZMpYsWQJAYWEhzz33HC1btmTbtm2ceOKJjBgxgsWLFzN37lyWLl1KQUEBxx57LMcdd1zUbf7oRz9i/PjxNG/enOuuu+6g/d15551Rq1S+/PJL2rRpQ+PG/paks2bNYt26dSxZsoS0tDS+/fbbCo9nzZo1LFiwgBUrVnDSSScxd+5cpk+fzjnnnMNLL73E2WefTUpKCkcccQRLly4t8xhipYQuImV7882y13Xt6qtZImVl+b/t25f//Bg45/j973/PW2+9RUpKCps2beLrr79m4cKFjBw5kiZNmtCkSRPOOuusau0nmi1bttChw4FRal977TXGjx9PWppPm23btq1wG8OHDyc9PZ2+fftSVFS0/2y/b9++rFu3bn+5jh07snnz5mondFW5iEjVTJ0KGRmll2Vk+OVxMmfOHLZu3cpHH33EkiVLOOSQQ2ptWIKmTZvGtK+0tDSKi4sBDipfcnafkpJCenr6/r7lKSkppapY9uzZQ9OmTasdsxK6iFTN6NEwa5Y/Izfzf2fNqlYvlxYtWrBjx479899//z0dO3YkPT2dBQsWsD74RTBo0CBeeOEF9uzZw86dO6vcCyVyf2E9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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# visualise thresholds\n", + "\n", + "def visualise_relation_thresholds(df, target, tag_probabilities, bin_count): \n", + " \"\"\"Visualize the tag fit in relation to the confidence and consistency (here: std).\"\"\"\n", + " # add tag_fit\n", + " df = pd.merge(df, tag_probabilities, left_on=['E_predtype', 'E_tag'], right_on=['E_enttype', 'E_tag'])\n", + " \n", + " min_mean = .25\n", + " mean_conf_labels = [min_mean + x / bin_count * (1 - min_mean) for x in range(bin_count)]\n", + " df['mean_confidence'] = pd.cut(df['micro_mean'], bin_count, labels=mean_conf_labels)\n", + " max_std = .75\n", + " std_conf_labels = [(x+1) / bin_count * max_std for x in range(bin_count)]\n", + " df['std_confidence'] = pd.cut(df['micro_std'], bin_count, labels=std_conf_labels)\n", + " \n", + " ## tag_fit with confidence ##\n", + " # per bin\n", + " plt.bar(x=mean_conf_labels, height=df.groupby('mean_confidence')['tag_fit'].mean().values, width=(1-min_mean)/bin_count*0.8, align='edge', label='tag_fit')\n", + " # cumulative\n", + " cumulative_tag_fit = [df[df['micro_mean'] > x]['tag_fit'].mean() for x in mean_conf_labels]\n", + " plt.plot(mean_conf_labels, cumulative_tag_fit, 'ro--', label='tag_fit (cum)')\n", + " plt.xlabel('Pattern Confidence')\n", + " plt.title('Pattern Confidence vs. Tagger Confidence')\n", + " plt.legend()\n", + " plt.show()\n", + " \n", + " ## tag_fit with consistency ##\n", + " # per bin\n", + " plt.bar(x=std_conf_labels, height=df.groupby('std_confidence')['tag_fit'].mean().values, width=max_std/bin_count*-0.8, align='edge', label='tag_fit')\n", + " # cumulative\n", + " cumulative_tag_fit = [df[df['micro_std'] < x]['tag_fit'].mean() for x in std_conf_labels]\n", + " plt.plot(std_conf_labels, cumulative_tag_fit, 'ro--', label='tag_fit (cum)')\n", + " plt.xlabel('Pattern Std.Dev.')\n", + " plt.title('Pattern Std.Dev. vs. Tagger Confidence')\n", + " plt.legend()\n", + " plt.show()\n", + " \n", + "visualise_relation_thresholds(threshold_relations, 'P', context._get_tag_probabilities(dft_dbp), 15)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Results" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# retrieve new relations for all three targets\n", + "df_new_relations = extract._compute_new_relations(df, df_rels, 'P', valid_tags_dbp)\n", + "df_new_relations = pd.concat([df_new_relations, extract._compute_new_relations(df, df_rels, 'TS_ent', valid_tags_dbp)])\n", + "df_new_relations = pd.concat([df_new_relations, extract._compute_new_relations(df, df_rels, 'S_ent', valid_tags_dbp)])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
P_basetypeTS_textrelmicro_meanmicro_stdPE_entE_textE_tagTS_entS_textS_entE_idTS_enttypeS_enttypeP_typepredinvE_predtypetarget
1804314OtherSpecies< genus <0.9770190.045419HalimuraenaHalimuraena shakaiHalimuraena shakaiSPECIESNoneSpeciesNone39648306NaNNaNOtherhttp://dbpedia.org/ontology/genusTrueSpeciesHalimuraena
216985LocationCommunities< subdivision <0.9573670.098188Christian County, MissouriChadwick, MissouriChadwickGPENoneOther unincorporated communitiesNone1353294NaNNaNAdministrativeRegionhttp://dbpedia.org/ontology/subdivisionTruePopulatedPlaceChristian County, Missouri
107055ListOdonata< order <1.0000000.000000List of least concern insectsPinheyschna subpupillataStream hawkerSPECIESOdonataAeshnidsAeshnidae36319656NaNNaNListhttp://dbpedia.org/ontology/orderTrueSpeciesOdonata
1650594OtherSpecies< genus <0.9770190.045419EupoeciliaEupoecilia kruegerianaEupoecilia kruegerianaSPECIESNoneSpeciesNone25698774NaNNaNOtherhttp://dbpedia.org/ontology/genusTrueSpeciesEupoecilia
61042ListGastropods< family <1.0000000.000000List of vulnerable molluscsBrotia wykoffiBrotia wykoffiSPECIESGastropodaPachychilidsPachychilidae36300492NaNNaNListhttp://dbpedia.org/ontology/familyTrueSpeciesPachychilidae
1732647OtherSpecies< genus <0.9770190.045419LeptonetaLeptoneta maculosaL. maculosaOTHERNoneSpeciesNone37360208NaNNaNOtherhttp://dbpedia.org/ontology/genusTrueSpeciesLeptoneta
2084439SpeciesSpecies< genus <0.9840590.029726Triphora (gastropod)Triphora dalliTriphora dalliSPECIESSpeciesSpeciesSpecies32364528NaNNaNMolluscahttp://dbpedia.org/ontology/genusTrueSpeciesTriphora (gastropod)
654105PersonDirecting filmography< director <1.0000000.000000Jonathan FrakesJonathan Frakes--All or NothingAll or NothingWORK_OF_ARTNoneTelevisionNone1103264NaNNaNPersonhttp://dbpedia.org/ontology/directorTrueFilmJonathan Frakes
806033PersonFilm scores< musicComposer <0.8732880.154829Don PrestonThe Underachievers (film)The UnderachieversWORK_OF_ARTNoneFilm scoresNone12602413NaNNaNMusicalArtisthttp://dbpedia.org/ontology/musicComposerTrueWorkDon Preston
611381OrganisationSingles< artist <0.9032260.130987La FactoríaLa Factoría--AmigaAmigaWORK_OF_ARTNoneSinglesNone21081955NaNNaNBandhttp://dbpedia.org/ontology/artistTrueMusicalWorkLa Factoría
1509909OtherSpecies< genus <0.9770190.045419Mouse-eared batMyotis oxyotusMyotis oxyotusOTHERNoneSpeciesNone8796526NaNNaNOtherhttp://dbpedia.org/ontology/genusTrueSpeciesMouse-eared bat
1226829SpeciesMain< genus <0.9851820.098228ApristusApristus striatusApristus striatusOTHERNoneMainNone28762634NaNNaNInsecthttp://dbpedia.org/ontology/genusTrueSpeciesApristus
385490LocationCommunities< subdivision <0.9808440.034299Arkansas County, ArkansasNady, ArkansasNadyGPENoneUnincorporated communitiesNone1240891NaNNaNAdministrativeRegionhttp://dbpedia.org/ontology/subdivisionTruePopulatedPlaceArkansas County, Arkansas
795111PersonWorks< author <0.9583950.199014Krishna SobtiKrishna Sobti--BadalonBadalonWORK_OF_ARTNoneNovelsNone20960058NaNNaNWriterhttp://dbpedia.org/ontology/authorTrueWorkKrishna Sobti
63260ListInsects< family <1.0000000.000000List of least concern arthropodsMicrathyria caerulistylaBlue-tipped dasherSPECIESInsectLibellulidsLibellulidae36130044NaNNaNListhttp://dbpedia.org/ontology/familyTrueSpeciesLibellulidae
285621WorkPersonnel< associatedBand <1.0000000.000000The Real Thing (Midnight Oil album)Bones HillmanBones HillmanPERSONNoneMidnight OilMidnight Oil10413938NaNAgentAlbumhttp://dbpedia.org/ontology/associatedBandTrueAgentMidnight Oil
61849ListMolluscs< phylum <0.9076920.043341List of endangered invertebratesHadopyrgus brevisHadopyrgus brevisSPECIESMolluscaHydrobiidsHydrobiidae36240302NaNNaNListhttp://dbpedia.org/ontology/phylumTrueSpeciesMollusca
20940PersonCareer statistics> team >0.9314800.106772Joe LedleyJoe Ledley--NewcastleNewcastleORGNoneCareer statisticsNone10472566NaNNaNSoccerPlayerhttp://dbpedia.org/ontology/teamFalseSportsTeamJoe Ledley
688946PersonPartial filmography< director <0.9223600.164080George Hill (director)Min and BillMin and BillWORK_OF_ARTNoneDirectorNone9569050NaNNaNPersonhttp://dbpedia.org/ontology/directorTrueFilmGeorge Hill (director)
1480502OtherList of species< genus <0.9878050.021681CybisterCybister crassipesCybister crassipesOTHERNoneList of speciesNone24520612NaNNaNOtherhttp://dbpedia.org/ontology/genusTrueSpeciesCybister
\n", + "
" + ], + "text/plain": [ + " P_basetype TS_text rel micro_mean \\\n", + "1804314 Other Species < genus < 0.977019 \n", + "216985 Location Communities < subdivision < 0.957367 \n", + "107055 List Odonata < order < 1.000000 \n", + "1650594 Other Species < genus < 0.977019 \n", + "61042 List Gastropods < family < 1.000000 \n", + "1732647 Other Species < genus < 0.977019 \n", + "2084439 Species Species < genus < 0.984059 \n", + "654105 Person Directing filmography < director < 1.000000 \n", + "806033 Person Film scores < musicComposer < 0.873288 \n", + "611381 Organisation Singles < artist < 0.903226 \n", + "1509909 Other Species < genus < 0.977019 \n", + "1226829 Species Main < genus < 0.985182 \n", + "385490 Location Communities < subdivision < 0.980844 \n", + "795111 Person Works < author < 0.958395 \n", + "63260 List Insects < family < 1.000000 \n", + "285621 Work Personnel < associatedBand < 1.000000 \n", + "61849 List Molluscs < phylum < 0.907692 \n", + "20940 Person Career statistics > team > 0.931480 \n", + "688946 Person Partial filmography < director < 0.922360 \n", + "1480502 Other List of species < genus < 0.987805 \n", + "\n", + " micro_std P \\\n", + "1804314 0.045419 Halimuraena \n", + "216985 0.098188 Christian County, Missouri \n", + "107055 0.000000 List of least concern insects \n", + "1650594 0.045419 Eupoecilia \n", + "61042 0.000000 List of vulnerable molluscs \n", + "1732647 0.045419 Leptoneta \n", + "2084439 0.029726 Triphora (gastropod) \n", + "654105 0.000000 Jonathan Frakes \n", + "806033 0.154829 Don Preston \n", + "611381 0.130987 La Factoría \n", + "1509909 0.045419 Mouse-eared bat \n", + "1226829 0.098228 Apristus \n", + "385490 0.034299 Arkansas County, Arkansas \n", + "795111 0.199014 Krishna Sobti \n", + "63260 0.000000 List of least concern arthropods \n", + "285621 0.000000 The Real Thing (Midnight Oil album) \n", + "61849 0.043341 List of endangered invertebrates \n", + "20940 0.106772 Joe Ledley \n", + "688946 0.164080 George Hill (director) \n", + "1480502 0.021681 Cybister \n", + "\n", + " E_ent E_text E_tag \\\n", + "1804314 Halimuraena shakai Halimuraena shakai SPECIES \n", + "216985 Chadwick, Missouri Chadwick GPE \n", + "107055 Pinheyschna subpupillata Stream hawker SPECIES \n", + "1650594 Eupoecilia kruegeriana Eupoecilia kruegeriana SPECIES \n", + "61042 Brotia wykoffi Brotia wykoffi SPECIES \n", + "1732647 Leptoneta maculosa L. maculosa OTHER \n", + "2084439 Triphora dalli Triphora dalli SPECIES \n", + "654105 Jonathan Frakes--All or Nothing All or Nothing WORK_OF_ART \n", + "806033 The Underachievers (film) The Underachievers WORK_OF_ART \n", + "611381 La Factoría--Amiga Amiga WORK_OF_ART \n", + "1509909 Myotis oxyotus Myotis oxyotus OTHER \n", + "1226829 Apristus striatus Apristus striatus OTHER \n", + "385490 Nady, Arkansas Nady GPE \n", + "795111 Krishna Sobti--Badalon Badalon WORK_OF_ART \n", + "63260 Micrathyria caerulistyla Blue-tipped dasher SPECIES \n", + "285621 Bones Hillman Bones Hillman PERSON \n", + "61849 Hadopyrgus brevis Hadopyrgus brevis SPECIES \n", + "20940 Joe Ledley--Newcastle Newcastle ORG \n", + "688946 Min and Bill Min and Bill WORK_OF_ART \n", + "1480502 Cybister crassipes Cybister crassipes OTHER \n", + "\n", + " TS_ent S_text S_ent \\\n", + "1804314 None Species None \n", + "216985 None Other unincorporated communities None \n", + "107055 Odonata Aeshnids Aeshnidae \n", + "1650594 None Species None \n", + "61042 Gastropoda Pachychilids Pachychilidae \n", + "1732647 None Species None \n", + "2084439 Species Species Species \n", + "654105 None Television None \n", + "806033 None Film scores None \n", + "611381 None Singles None \n", + "1509909 None Species None \n", + "1226829 None Main None \n", + "385490 None Unincorporated communities None \n", + "795111 None Novels None \n", + "63260 Insect Libellulids Libellulidae \n", + "285621 None Midnight Oil Midnight Oil \n", + "61849 Mollusca Hydrobiids Hydrobiidae \n", + "20940 None Career statistics None \n", + "688946 None Director None \n", + "1480502 None List of species None \n", + "\n", + " E_id TS_enttype S_enttype P_type \\\n", + "1804314 39648306 NaN NaN Other \n", + "216985 1353294 NaN NaN AdministrativeRegion \n", + "107055 36319656 NaN NaN List \n", + "1650594 25698774 NaN NaN Other \n", + "61042 36300492 NaN NaN List \n", + "1732647 37360208 NaN NaN Other \n", + "2084439 32364528 NaN NaN Mollusca \n", + "654105 1103264 NaN NaN Person \n", + "806033 12602413 NaN NaN MusicalArtist \n", + "611381 21081955 NaN NaN Band \n", + "1509909 8796526 NaN NaN Other \n", + "1226829 28762634 NaN NaN Insect \n", + "385490 1240891 NaN NaN AdministrativeRegion \n", + "795111 20960058 NaN NaN Writer \n", + "63260 36130044 NaN NaN List \n", + "285621 10413938 NaN Agent Album \n", + "61849 36240302 NaN NaN List \n", + "20940 10472566 NaN NaN SoccerPlayer \n", + "688946 9569050 NaN NaN Person \n", + "1480502 24520612 NaN NaN Other \n", + "\n", + " pred inv E_predtype \\\n", + "1804314 http://dbpedia.org/ontology/genus True Species \n", + "216985 http://dbpedia.org/ontology/subdivision True PopulatedPlace \n", + "107055 http://dbpedia.org/ontology/order True Species \n", + "1650594 http://dbpedia.org/ontology/genus True Species \n", + "61042 http://dbpedia.org/ontology/family True Species \n", + "1732647 http://dbpedia.org/ontology/genus True Species \n", + "2084439 http://dbpedia.org/ontology/genus True Species \n", + "654105 http://dbpedia.org/ontology/director True Film \n", + "806033 http://dbpedia.org/ontology/musicComposer True Work \n", + "611381 http://dbpedia.org/ontology/artist True MusicalWork \n", + "1509909 http://dbpedia.org/ontology/genus True Species \n", + "1226829 http://dbpedia.org/ontology/genus True Species \n", + "385490 http://dbpedia.org/ontology/subdivision True PopulatedPlace \n", + "795111 http://dbpedia.org/ontology/author True Work \n", + "63260 http://dbpedia.org/ontology/family True Species \n", + "285621 http://dbpedia.org/ontology/associatedBand True Agent \n", + "61849 http://dbpedia.org/ontology/phylum True Species \n", + "20940 http://dbpedia.org/ontology/team False SportsTeam \n", + "688946 http://dbpedia.org/ontology/director True Film \n", + "1480502 http://dbpedia.org/ontology/genus True Species \n", + "\n", + " target \n", + "1804314 Halimuraena \n", + "216985 Christian County, Missouri \n", + "107055 Odonata \n", + "1650594 Eupoecilia \n", + "61042 Pachychilidae \n", + "1732647 Leptoneta \n", + "2084439 Triphora (gastropod) \n", + "654105 Jonathan Frakes \n", + "806033 Don Preston \n", + "611381 La Factoría \n", + "1509909 Mouse-eared bat \n", + "1226829 Apristus \n", + "385490 Arkansas County, Arkansas \n", + "795111 Krishna Sobti \n", + "63260 Libellulidae \n", + "285621 Midnight Oil \n", + "61849 Mollusca \n", + "20940 Joe Ledley \n", + "688946 George Hill (director) \n", + "1480502 Cybister " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_new_relations.sample(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
targetrelE_text
274906Sturgeon County< subdivision <Nywening
864833Anthyllis< genus <Anthyllis splendens
1209316Psilochilus< genus <Psilochilus vallecaucanus
228388Sumner County, Kansas< subdivision <Cicero
1671191Tethya< genus <Tethya irisae
288516Eaton County, Michigan> largestCity >Eaton Rapids
287348Boone County, Missouri> largestCity >Ashland
1758229Ormiscus< genus <Ormiscus vulgaris
1748675Sphecodes< genus <Sphecodes mutillaeformis
1787612Silis (beetle)< genus <Silis parallela
1157946Diplopterygium< genus <Diplopterygium conversum
841225Agrimonia< genus <Agrimonia parviflora
1945864Dermestes< genus <Dermestes patagoniensis
1197572Tamolanica< genus <Tamolanica katauana
268117Tupelo micropolitan area< subdivision <Tupelo
147551Promachus (fly)< genus <Promachus neligens
179891Zonaria> bandMember >Rickard Lundmark
1699982Melanorivulus< genus <Melanorivulus amambaiensis
816105Bacillus< genus <B. haloalkaliphilus
1219087Bubastes< genus <Bubastes blackburni
\n", + "
" + ], + "text/plain": [ + " target rel E_text\n", + "274906 Sturgeon County < subdivision < Nywening\n", + "864833 Anthyllis < genus < Anthyllis splendens\n", + "1209316 Psilochilus < genus < Psilochilus vallecaucanus\n", + "228388 Sumner County, Kansas < subdivision < Cicero\n", + "1671191 Tethya < genus < Tethya irisae\n", + "288516 Eaton County, Michigan > largestCity > Eaton Rapids\n", + "287348 Boone County, Missouri > largestCity > Ashland\n", + "1758229 Ormiscus < genus < Ormiscus vulgaris\n", + "1748675 Sphecodes < genus < Sphecodes mutillaeformis\n", + "1787612 Silis (beetle) < genus < Silis parallela\n", + "1157946 Diplopterygium < genus < Diplopterygium conversum\n", + "841225 Agrimonia < genus < Agrimonia parviflora\n", + "1945864 Dermestes < genus < Dermestes patagoniensis\n", + "1197572 Tamolanica < genus < Tamolanica katauana\n", + "268117 Tupelo micropolitan area < subdivision < Tupelo\n", + "147551 Promachus (fly) < genus < Promachus neligens\n", + "179891 Zonaria > bandMember > Rickard Lundmark\n", + "1699982 Melanorivulus < genus < Melanorivulus amambaiensis\n", + "816105 Bacillus < genus < B. haloalkaliphilus\n", + "1219087 Bubastes < genus < Bubastes blackburni" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_new_relations.sample(20)[['target', 'rel', 'E_text']]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# write new relations to file\n", + "\n", + "def serialize_relations(df, filename):\n", + " triples = []\n", + " for _, r in df.iterrows():\n", + " s, p, o = clg_util.name2clg_resource(r['target']), r['pred'].replace('dbpedia', 'caligraph'), clg_util.name2clg_resource(r['E_ent'])\n", + " if r['inv']:\n", + " s, o = o, s\n", + " triples.append(serialize_util.as_object_triple(s, p, o))\n", + " with open(filename, mode='w') as f:\n", + " f.writelines(triples)\n", + " \n", + "serialize_relations(df_new_relations, 'new_relations.nt')" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "CaLiGraph (from pipenv)", "language": "python", - "name": "python3" + "name": "caligraph" }, "language_info": { "codemirror_mode": {