{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "c32bf0b9-1445-4ede-ae49-7dd63ff3b08e", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:37.268964Z", "iopub.status.busy": "2024-01-17T01:35:37.268658Z", "iopub.status.idle": "2024-01-17T01:35:37.284720Z", "shell.execute_reply": "2024-01-17T01:35:37.282292Z", "shell.execute_reply.started": "2024-01-17T01:35:37.268927Z" } }, "outputs": [], "source": [ "# for use in tutorial and development; do not include this `sys.path` change in production:\n", "import sys ; sys.path.insert(0, \"../\")" ] }, { "cell_type": "markdown", "id": "c8ff5d81-110c-42ae-8aa7-ed4fffea40c6", "metadata": {}, "source": [ "# reproduce results from the \"InGram\" paper" ] }, { "cell_type": "markdown", "id": "1e847d0a-bc6c-470a-9fef-620ebbdbbbc3", "metadata": {}, "source": [ "This is an attempt to reproduce the _graph of relations_ example given in `lee2023ingram`" ] }, { "cell_type": "markdown", "id": "61d8d39a-23e4-48e7-b8f4-0dd724ccf586", "metadata": {}, "source": [ "## environment" ] }, { "cell_type": "code", "execution_count": 2, "id": "22489527-2ad5-4e3c-be23-f511e6bcf69f", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:37.296455Z", "iopub.status.busy": "2024-01-17T01:35:37.295661Z", "iopub.status.idle": "2024-01-17T01:35:45.520968Z", "shell.execute_reply": "2024-01-17T01:35:45.519870Z", "shell.execute_reply.started": "2024-01-17T01:35:37.296419Z" }, "scrolled": true }, "outputs": [], "source": [ "import os\n", "import pathlib\n", "import typing\n", "\n", "from icecream import ic\n", "from pyinstrument import Profiler\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import pyvis\n", "\n", "import textgraphs" ] }, { "cell_type": "code", "execution_count": 3, "id": "438f5775-487b-493e-a172-59b652b94955", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:45.525301Z", "iopub.status.busy": "2024-01-17T01:35:45.524842Z", "iopub.status.idle": "2024-01-17T01:35:45.547432Z", "shell.execute_reply": "2024-01-17T01:35:45.546101Z", "shell.execute_reply.started": "2024-01-17T01:35:45.525270Z" } }, "outputs": [], "source": [ "%load_ext watermark" ] }, { "cell_type": "code", "execution_count": 4, "id": "adc052dd-5cca-4d11-b543-3f0999f4f883", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:45.548916Z", "iopub.status.busy": "2024-01-17T01:35:45.548691Z", "iopub.status.idle": "2024-01-17T01:35:45.592124Z", "shell.execute_reply": "2024-01-17T01:35:45.590790Z", "shell.execute_reply.started": "2024-01-17T01:35:45.548889Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Last updated: 2024-01-16T17:35:45.550539-08:00\n", "\n", "Python implementation: CPython\n", "Python version : 3.10.11\n", "IPython version : 8.20.0\n", "\n", "Compiler : Clang 13.0.0 (clang-1300.0.29.30)\n", "OS : Darwin\n", "Release : 21.6.0\n", "Machine : x86_64\n", "Processor : i386\n", "CPU cores : 8\n", "Architecture: 64bit\n", "\n" ] } ], "source": [ "%watermark" ] }, { "cell_type": "code", "execution_count": 5, "id": "6e4618da-daf9-44c9-adbb-e5781dba5504", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:45.597302Z", "iopub.status.busy": "2024-01-17T01:35:45.596553Z", "iopub.status.idle": "2024-01-17T01:35:45.623704Z", "shell.execute_reply": "2024-01-17T01:35:45.621991Z", "shell.execute_reply.started": "2024-01-17T01:35:45.597251Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "matplotlib: 3.8.2\n", "pandas : 2.1.4\n", "pyvis : 0.3.2\n", "textgraphs: 0.5.0\n", "sys : 3.10.11 (v3.10.11:7d4cc5aa85, Apr 4 2023, 19:05:19) [Clang 13.0.0 (clang-1300.0.29.30)]\n", "\n" ] } ], "source": [ "%watermark --iversions" ] }, { "cell_type": "markdown", "id": "1a04e3dc-57d8-43a4-a342-cc38b86fc6a6", "metadata": {}, "source": [ "## load example graph" ] }, { "cell_type": "markdown", "id": "7c567afd-2f44-4391-899a-da6aba3d222e", "metadata": {}, "source": [ "load from a JSON file which replicates the data for the \"Figure 3\" example" ] }, { "cell_type": "code", "execution_count": 6, "id": "630430c5-21dc-4897-9a4b-3b01baf3de17", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:45.625764Z", "iopub.status.busy": "2024-01-17T01:35:45.625341Z", "iopub.status.idle": "2024-01-17T01:35:45.633487Z", "shell.execute_reply": "2024-01-17T01:35:45.632477Z", "shell.execute_reply.started": "2024-01-17T01:35:45.625720Z" } }, "outputs": [], "source": [ "graph: textgraphs.GraphOfRelations = textgraphs.GraphOfRelations(\n", " textgraphs.SimpleGraph()\n", ")\n", "\n", "ingram_path: pathlib.Path = pathlib.Path(os.getcwd()) / \"ingram.json\"\n", "\n", "graph.load_ingram(\n", " ingram_path,\n", " debug = False,\n", ")" ] }, { "cell_type": "markdown", "id": "01152885-f301-49b1-ab61-f5b19d81c036", "metadata": {}, "source": [ "set up the statistical stack profiling" ] }, { "cell_type": "code", "execution_count": 7, "id": "2a289117-301d-4027-ae1b-200201fb5f93", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:45.639466Z", "iopub.status.busy": "2024-01-17T01:35:45.639216Z", "iopub.status.idle": "2024-01-17T01:35:45.646105Z", "shell.execute_reply": "2024-01-17T01:35:45.644476Z", "shell.execute_reply.started": "2024-01-17T01:35:45.639439Z" } }, "outputs": [], "source": [ "profiler: Profiler = Profiler()\n", "profiler.start()" ] }, { "cell_type": "markdown", "id": "bf9d4f99-b82b-4d11-a9a4-31d0337f4aa8", "metadata": {}, "source": [ "## decouple graph edges into \"seeds\"" ] }, { "cell_type": "code", "execution_count": 8, "id": "da6fcb0f-b2ac-4f74-af39-2c129c750cab", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:45.648335Z", "iopub.status.busy": "2024-01-17T01:35:45.647905Z", "iopub.status.idle": "2024-01-17T01:35:46.520730Z", "shell.execute_reply": "2024-01-17T01:35:46.518237Z", "shell.execute_reply.started": "2024-01-17T01:35:45.648291Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- triples in source graph ---\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "ic| edge.src_node: 0, rel_id: 1, edge.dst_node: 1\n", "ic| edge.src_node: 0, rel_id: 0, edge.dst_node: 2\n", "ic| edge.src_node: 0, rel_id: 0, edge.dst_node: 3\n", "ic| edge.src_node: 4, rel_id: 2, edge.dst_node: 2\n", "ic| edge.src_node: 4, rel_id: 2, edge.dst_node: 3\n", "ic| edge.src_node: 4, rel_id: 1, edge.dst_node: 5\n", "ic| edge.src_node: 6, rel_id: 1, edge.dst_node: 5\n", "ic| edge.src_node: 6, rel_id: 2, edge.dst_node: 7\n", "ic| edge.src_node: 6, rel_id: 4, edge.dst_node: 8\n", "ic| edge.src_node: 9, " ] }, { "name": "stdout", "output_type": "stream", "text": [ " Steven_Spielberg Profession Director\n", " Steven_Spielberg Directed Catch_Me_If_Can\n", " Steven_Spielberg Directed Saving_Private_Ryan\n", " Tom_Hanks ActedIn Catch_Me_If_Can\n", " Tom_Hanks ActedIn Saving_Private_Ryan\n", " Tom_Hanks Profession Actor\n", " Mark_Hamil Profession Actor\n", " Mark_Hamil ActedIn Star_Wars\n", " Mark_Hamil BornIn California\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "rel_id: 5, edge.dst_node: 10\n", "ic| edge.src_node: 9, rel_id: 4, edge.dst_node: 10\n", "ic| edge.src_node: 9, rel_id: 3, edge.dst_node: 8\n", "ic| edge.src_node: 11, rel_id: 4, edge.dst_node: 12\n", "ic| edge.src_node: 11, rel_id: 3, edge.dst_node: 12\n", "ic| edge.src_node: 11, rel_id: 3, edge.dst_node: 8\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Brad_Pitt Nationality USA\n", " Brad_Pitt BornIn USA\n", " Brad_Pitt LivedIn California\n", " Clint_Eastwood BornIn San_Francisco\n", " Clint_Eastwood LivedIn San_Francisco\n", " Clint_Eastwood LivedIn California\n" ] } ], "source": [ "graph.seeds(\n", " debug = True,\n", ")" ] }, { "cell_type": "code", "execution_count": 9, "id": "a9c0fd41-45e9-4019-94bf-8e2cf5c33454", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:46.524005Z", "iopub.status.busy": "2024-01-17T01:35:46.523531Z", "iopub.status.idle": "2024-01-17T01:35:46.531929Z", "shell.execute_reply": "2024-01-17T01:35:46.530922Z", "shell.execute_reply.started": "2024-01-17T01:35:46.523965Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- nodes in source graph ---\n", "n: 0, Steven_Spielberg\n", " head: []\n", " tail: [(0, 'Profession', 1), (0, 'Directed', 2), (0, 'Directed', 3)]\n", "n: 1, Director\n", " head: [(0, 'Profession', 1)]\n", " tail: []\n", "n: 2, Catch_Me_If_Can\n", " head: [(0, 'Directed', 2), (4, 'ActedIn', 2)]\n", " tail: []\n", "n: 3, Saving_Private_Ryan\n", " head: [(0, 'Directed', 3), (4, 'ActedIn', 3)]\n", " tail: []\n", "n: 4, Tom_Hanks\n", " head: []\n", " tail: [(4, 'ActedIn', 2), (4, 'ActedIn', 3), (4, 'Profession', 5)]\n", "n: 5, Actor\n", " head: [(4, 'Profession', 5), (6, 'Profession', 5)]\n", " tail: []\n", "n: 6, Mark_Hamil\n", " head: []\n", " tail: [(6, 'Profession', 5), (6, 'ActedIn', 7), (6, 'BornIn', 8)]\n", "n: 7, Star_Wars\n", " head: [(6, 'ActedIn', 7)]\n", " tail: []\n", "n: 8, California\n", " head: [(6, 'BornIn', 8), (9, 'LivedIn', 8), (11, 'LivedIn', 8)]\n", " tail: []\n", "n: 9, Brad_Pitt\n", " head: []\n", " tail: [(9, 'Nationality', 10), (9, 'BornIn', 10), (9, 'LivedIn', 8)]\n", "n: 10, USA\n", " head: [(9, 'Nationality', 10), (9, 'BornIn', 10)]\n", " tail: []\n", "n: 11, Clint_Eastwood\n", " head: []\n", " tail: [(11, 'BornIn', 12), (11, 'LivedIn', 12), (11, 'LivedIn', 8)]\n", "n: 12, San_Francisco\n", " head: [(11, 'BornIn', 12), (11, 'LivedIn', 12)]\n", " tail: []\n", "\n", "--- edges in source graph ---\n", "e: 0, Directed\n", "e: 1, Profession\n", "e: 2, ActedIn\n", "e: 3, LivedIn\n", "e: 4, BornIn\n", "e: 5, Nationality\n" ] } ], "source": [ "graph.trace_source_graph()" ] }, { "cell_type": "markdown", "id": "7e7cb5f3-132c-4999-81eb-4f6167a31c9e", "metadata": {}, "source": [ "## construct a _graph of relations_" ] }, { "cell_type": "markdown", "id": "105702ed-7f9c-42ca-a57b-f1b15a206acf", "metadata": { "execution": { "iopub.execute_input": "2024-01-02T22:31:57.839227Z", "iopub.status.busy": "2024-01-02T22:31:57.838113Z", "iopub.status.idle": "2024-01-02T22:31:57.853374Z", "shell.execute_reply": "2024-01-02T22:31:57.851669Z", "shell.execute_reply.started": "2024-01-02T22:31:57.839155Z" } }, "source": [ "Transform the graph data into _graph of relations_" ] }, { "cell_type": "code", "execution_count": 10, "id": "eae8da18-f1be-4673-94e7-7b633bab9bd1", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:46.534228Z", "iopub.status.busy": "2024-01-17T01:35:46.533720Z", "iopub.status.idle": "2024-01-17T01:35:48.718340Z", "shell.execute_reply": "2024-01-17T01:35:48.715493Z", "shell.execute_reply.started": "2024-01-17T01:35:46.534166Z" }, "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "ic| node_id: 0, len(seeds" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- transformed triples ---\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "): 3\n", "ic| trans_arc: TransArc(pair_key=(0, 1),\n", " a_rel=1,\n", " b_rel=0,\n", " node_id=0,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(0, 1),\n", " a_rel=1,\n", " b_rel=0,\n", " node_id=0,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(0, 0),\n", " a_rel=0,\n", " b_rel=0,\n", " node_id=0,\n", " a_dir=,\n", " b_dir=)\n", "ic| node_id: 1, len(seeds" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "): 1\n", "ic| node_id: 2, len(seeds): 2\n", "ic| trans_arc: TransArc(pair_key=(0, 2),\n", " a_rel=0,\n", " b_rel=2,\n", " node_id=2,\n", " a_dir=,\n", " b_dir=<" ] }, { "name": "stdout", "output_type": "stream", "text": [ " (0, 2) Directed.head Catch_Me_If_Can ActedIn.head\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "RelDir.HEAD: 0>)\n", "ic| node_id: 3, len(seeds): 2\n", "ic| trans_arc: TransArc(pair_key=(0, 2),\n", " a_rel=0,\n", " b_rel=2,\n", " node_id=3,\n", " a_dir=,\n", " b_dir=)\n", "ic| node_id" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (0, 2) Directed.head Saving_Private_Ryan ActedIn.head\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ ": 4, len(seeds): 3\n", "ic| trans_arc: TransArc(pair_key=(2, 2),\n", " a_rel=2,\n", " b_rel=2,\n", " node_id=4,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(1, 2),\n", " a_rel=2,\n", " b_rel=1,\n", " node_id=4,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(1, 2)" ] }, { "name": "stdout", "output_type": "stream", "text": [ " (2, 2) ActedIn.tail Tom_Hanks ActedIn.tail\n", "\n", " (1, 2) ActedIn.tail Tom_Hanks Profession.tail\n", "\n", " (1, 2) ActedIn.tail Tom_Hanks Profession.tail\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ ",\n", " a_rel=2,\n", " b_rel=1,\n", " node_id=4,\n", " a_dir=,\n", " b_dir=)\n", "ic|" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " node_id: 5, len(seeds): 2\n", "ic| trans_arc: TransArc(pair_key=(1, 1),\n", " a_rel=1,\n", " b_rel=1,\n", " " ] }, { "name": "stdout", "output_type": "stream", "text": [ " (1, 1) Profession.head Actor Profession.head\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "node_id=5,\n", " a_dir=,\n", " b_dir=)\n", "ic| node_id: 6, len(seeds): 3\n", "ic| trans_arc: TransArc(pair_key=(1, 2),\n", " a_rel=1,\n", " b_rel=2,\n", " node_id=6,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(1, 4),\n", " a_rel=1,\n", " b_rel=4,\n", " node_id=6,\n", " a_dir" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (1, 4) Profession.tail Mark_Hamil BornIn.tail\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(2, 4),\n", " a_rel=2,\n", " b_rel=4,\n", " node_id=6,\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (2, 4) ActedIn.tail Mark_Hamil BornIn.tail\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " a_dir=,\n", " b_dir=)\n", "ic| node_id: 7, len(seeds): 1\n", "ic| node_id: 8, len(seeds): 3\n", "ic| trans_arc: TransArc(pair_key=(3, 4),\n", " a_rel=4,\n", " b_rel=3,\n", " node_id=8,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(3, 4),\n", " a_rel=4,\n", " b_rel=3,\n", " node_id=8,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(3, 3),\n", " a_rel=3,\n", " b_rel=3,\n", " node_id=8,\n", " a_dir=,\n", " b_dir=)\n", "ic| node_id: 9, len(seeds): 3\n", "ic" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (3, 4) BornIn.head California LivedIn.head\n", "\n", " (3, 3) LivedIn.head California LivedIn.head\n", "\n", " (4, 5) Nationality.tail Brad_Pitt BornIn.tail\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "| trans_arc: TransArc(pair_key=(4, 5),\n", " a_rel=5,\n", " b_rel=4,\n", " node_id=9,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(3, 5),\n", " a_rel=5,\n", " b_rel=3,\n", " node_id=9,\n", " a_dir=,\n", " b_dir=<" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (3, 5) Nationality.tail Brad_Pitt LivedIn.tail\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "RelDir.TAIL: 1>)\n", "ic| trans_arc: TransArc(pair_key=(3, 4),\n", " a_rel=4,\n", " b_rel=3,\n", " node_id=9,\n", " a_dir=,\n", " b_dir=)\n", "ic| node_id: 10, len(seeds): 2\n", "ic| trans_arc: TransArc(pair_key=(4, 5),\n", " a_rel=5,\n", " b_rel=4,\n", " node_id=10,\n", " a_dir=,\n", " b_dir=)\n", "ic| node_id: 11, len(seeds): 3\n", "ic| trans_arc: TransArc(pair_key=(3, " ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (3, 4) BornIn.tail Brad_Pitt LivedIn.tail\n", "\n", " (4, 5) Nationality.head USA BornIn.head\n", "\n", " (3, 4) BornIn.tail Clint_Eastwood LivedIn.tail\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "4),\n", " a_rel=4,\n", " b_rel=3,\n", " node_id=11,\n", " a_dir=,\n", " b_dir=)\n", "ic" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (3, 4) BornIn.tail Clint_Eastwood LivedIn.tail\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "| trans_arc: TransArc(pair_key=(3, 4),\n", " a_rel=4,\n", " b_rel=3,\n", " node_id=11,\n", " a_dir=,\n", " b_dir=)\n", "ic| trans_arc: TransArc(pair_key=(3, 3),\n", " a_rel=3,\n", " b_rel=3,\n", " node_id=11,\n", " a_dir=,\n", " b_dir=)\n", "ic| node_id: 12, len(seeds" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " (3, 3) LivedIn.tail Clint_Eastwood LivedIn.tail\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "): 2\n", "ic| trans_arc: TransArc(pair_key=(3, 4),\n", " a_rel=4,\n", " b_rel=3,\n", " node_id=12,\n", " a_dir=,\n", " b_dir=)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " (3, 4) BornIn.head San_Francisco LivedIn.head\n", "\n" ] } ], "source": [ "graph.construct_gor(\n", "\tdebug = True,\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "id": "d5a06b72-c19b-440c-83c7-332f28aa9586", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:48.731674Z", "iopub.status.busy": "2024-01-17T01:35:48.731142Z", "iopub.status.idle": "2024-01-17T01:35:48.745182Z", "shell.execute_reply": "2024-01-17T01:35:48.739573Z", "shell.execute_reply.started": "2024-01-17T01:35:48.731638Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- collect shared entity tallies ---\n", "0 Directed\n", " h: 4 dict_items([(2, 4.0)])\n", " t: 6 dict_items([(0, 3.0), (1, 3.0)])\n", "1 Profession\n", " h: 3 dict_items([(1, 3.0)])\n", " t: 10 dict_items([(0, 3.0), (2, 5.0), (4, 2.0)])\n", "2 ActedIn\n", " h: 4 dict_items([(0, 4.0)])\n", " t: 10 dict_items([(1, 5.0), (2, 3.0), (4, 2.0)])\n", "3 LivedIn\n", " h: 8 dict_items([(3, 3.0), (4, 5.0)])\n", " t: 10 dict_items([(3, 3.0), (4, 5.0), (5, 2.0)])\n", "4 BornIn\n", " h: 7 dict_items([(3, 5.0), (5, 2.0)])\n", " t: 11 dict_items([(1, 2.0), (2, 2.0), (3, 5.0), (5, 2.0)])\n", "5 Nationality\n", " h: 2 dict_items([(4, 2.0)])\n", " t: 4 dict_items([(3, 2.0), (4, 2.0)])\n" ] } ], "source": [ "scores: typing.Dict[ tuple, float ] = graph.get_affinity_scores(\n", " debug = True,\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "id": "a3d2310b-11c1-476d-82ab-1e34bc496cb1", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:48.749266Z", "iopub.status.busy": "2024-01-17T01:35:48.748905Z", "iopub.status.idle": "2024-01-17T01:35:48.964799Z", "shell.execute_reply": "2024-01-17T01:35:48.957975Z", "shell.execute_reply.started": "2024-01-17T01:35:48.749231Z" }, "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "ic| scores: {(0, 0): 0.3,\n", " (0, 1): 0.2653846153846154,\n", " (0, 2): 0.34285714285714286,\n", " (1, 1): 0.23076923076923078,\n", " (1, 2): 0.3708791208791209,\n", " (1, 4): 0.13247863247863248,\n", " (2, 2): 0.21428571428571427,\n", " (2, 4): 0.12698412698412698,\n", " (3, 3): 0.3333333333333333,\n", " (3, 4): 0.5555555555555556,\n", " (3, 5): 0.2222222222222222,\n", " (4, 5): 0.4444444444444444}\n" ] } ], "source": [ "ic(scores);" ] }, { "cell_type": "markdown", "id": "8b71b841-0cf5-4cc6-af4c-c85344b8f6c5", "metadata": {}, "source": [ "## visualize the transform results" ] }, { "cell_type": "code", "execution_count": 13, "id": "5901a49e-3f90-4061-9c3a-e9d1f05b40f3", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:48.973661Z", "iopub.status.busy": "2024-01-17T01:35:48.973146Z", "iopub.status.idle": "2024-01-17T01:35:49.339291Z", "shell.execute_reply": "2024-01-17T01:35:49.337857Z", "shell.execute_reply.started": "2024-01-17T01:35:48.973607Z" } }, "outputs": [ { "data": { "image/png": "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DdpOp5OoqCjCw8Npbm5WVwH1/C15Zt08+eSTnH322eoSvEKcKK1Wq57g21IUBZvN1qE1obS0FLvdrt4uICCg09aEE9nL4e677+a9997DbDazZMkSbrrpph55jk6nk88++4zly5dz8OBBli9f3mEtCl/g9TCwZ88eHnnkERoaGrjzzjvZvXt3u+sP/4HGx8dz3nnnce+997J06VKio6OprKxk/fr1TJ8+nbPPPpsHH3yQxx9/nIULF6pjBqZMmUJ0dDRarZb8/Hy1ZWHOnDm88MILrF69mpkzZwKwc+dOHA4HEyZM4PLLL+eRRx5h5syZpKWlcf/996tv6gNhtOzx6G6Y6E6gOd7r2wah7hz/eBQUFFBQUHBc9zmRsBIUFEROTk6HY9lsNlpbW0lOTm53eVJSEuvWrTvq83G5XOj1et5//32qqqo4++yz1d9vz9+gTqdj/fr17Nq1i5dffvmoYwU8y+UOpNYf0Xc0Gg0BAQEEBAR0mALo6XLwjA/bvHmzOgts0KBB3HTTTYwcObJdQAgPD++wQFNbnoWgbrvtNu65554efS56vZ4pU6bw008/sX79eiZOnNijx+8pXgkDixYt4oEHHkCr1ZKcnMy5557Lhg0biIuL6xAGoGMgWLFiBU8++SRnnnkmZrOZuLg4Zs2axfTp0wkJCWHVqlUsXryY0aNHAzB58mSmTJlCYGAg9957L3PmzMFut/P0009z8cUX88EHH/Doo4+yYMEC3G432dnZPPzwwwBce+215OfnM2XKFHQ6HYsXL+aDDz7o/RfJB/nbm/mxgownTOTn51NXV8eYMWP6JPAc6STscrlwu90dPv177nekZkrPOu3fffcdCxYs4Mknn1T/dg733HPPMW7cOMaOHXvU127Dhg20tLR0ep23WnB6skurq/WB700h6+/adjkEBgbyxz/+kYULF2KxWLj33nt59NFH+f7772lpaaGpqYnKykpMJhOTJk064jGfffZZQkNDe3SlwcPde++9PPHEE2zbtk3d7MqXaJQufPxpbGwkPDychoaGds2PfcVisfTqNA3PghpCnIgff/yRiIgIsrOzvV0KwcHBvPzyy8ybN0+9bOHChezcuZNPP/0Uk8mkNvsDalfAf//7Xy699FLuuOMO7rrrrk67zOrr60lNTeXPf/4z11577VFPcmazGafT2aXA0xctTEe7TW/z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Cm644QYqKyt577332nXZeDgcDq666io2b97M559/ftS553q9vt0YEJfLhd1uP2JryPEshuMJQifSvTIQgsezzz7bJ2tuNDU1sW3bNs4888xefyzRnoQB0ad0Oh16vf64pyN1RXf6Hd966y0WLFjAb37zG66++uoermzgu/XWW7n00ks544wzuPDCC3nrrbf49ttv+frrrwkODubNN98kMDCQWbNmodfryc/P56677kKn0/Htt9922prT3NzM1VdfzcGDB/n666+POrBUo9EQHh7epS4mD8/Yi+PpTjnSv06n86jXH2/w6InBo10ZWHqs4JGRkcFTTz3Fhg0bmDdvHm+99RaTJk1Srz/55JO55557mD17NtXV1SxevJjvvvsOjUbDzJkzeeihh9SA/vHHH7N06VJqamq48MILO30PCAsLY8yYMcyfPx+DwUBTUxOfffYZSUlJvPzyy0ybNq3Lr6M4PhIGRJ8LCgpqt7BQTx73RF155ZVceeWVPViNf5kxYwaPPPIIixcv5ne/+x1xcXG88MIL6tTR5cuXExkZycyZMwG45pprWLt2LXPnzmXZsmUEBAQQHBzMpEmTGDduHIqicM4557B161Y+/vhjrFYrpaWlmEwmIiMje2RchueE2BP938fSNnh0Z4yHJ3jY7fYjhpbj4QkHnhUCO9PU1ERQUBAXXXQR7777rhoGNm/eTHl5Oeeddx6KojB37lwmTpzIxo0bsVqtzJ8/n6effprFixezf/9+brzxRl5//XV+85vf8NZbb3HvvfeSm5vb7rFWr16tzgR69913+fjjj3n77bd54oknmD9/fpf2RBEnRsKA6HM6nY6goKAeHZUcFBQko5G9bOHChVx55ZXU19djMBjIyMhQP3k+99xzaDQadTDh9OnTOeWUU8jPz+fnn3+mtbVVXUNi/PjxVFVVUVlZSVhYGOedd566xr3b7ebLL7/kN7/5jdee54noq+ChKMoJDS41Go1HrS0jI4PLLruM2bNnq+Ht3Xff5YILLiAwMJBNmzZx8OBB/vWvf6HVagkKCuKOO+7grrvuYvHixaxatYrTTjuNc845BzgUBl966aUOj/PII4+oY0LOO+88tSXgmmuu4YEHHqC2trbT5ZBF90kYEF5hMplwu909Ml85ICBA5in7AJ1OR1xcXKcbzJx66qntvr/77ruPeqz4+Hj27dvX4XKXy+WTfeq+wjOb5niDR2BgYKezPgBCQ0MJDAxk3LhxxMfH8/nnnzNjxgw+/PBD/vrXvwJQVFREQ0MDmZmZ6v08oQSgoqKC1NTUdsc9/HtPHStXrgQgISFBvdwzU6WpqUnCQC+RMCC8JjAwEK1W260WgqCgIAkCfkRaf/qewWAgKysLOLQ2yHvvvUdQUBCBgYFql0FycjKxsbHs3r2702MkJCSwfv36dpeVlJQwfvz4dpfZbDZZpthLBtaaqKLfMZlMhIWFHXfzqV6vJywsTIKAED3E6XRitVrVr7Yn5dmzZ+N2u7n00kv55ptvePHFF5kzZ47aSjN27FiSk5N57LHHaGpqQlEUiouL+eqrrwC48MILWbt2LV9++SVOp5M33nij3YJkHhs2bGi31oToOxIGhNfpdDp1JUOTyXTEueyeZUvDwsIIDQ2VT4lC9KB77rmHwMBA9WvYsGHqdRdffDEtLS2kpKRw0kknsXbtWi699FL1ep1Ox9///nfKyso4+eSTSU9P59JLL1U3/hoyZAgvvvgi9913H1lZWWzcuLHT6YMffvhhp+tIiN4niw4Jn+RZ6MZDp9NJX7EQXuTrC4aJzsmiQ6Jf68pCN0KIvuPLC4aJ7pNuAiGEEMfkWTCsN8hGRd4nYUAIIUSX9FYzvnQPeJ+EASGEEF3iWTCsJ8mCYb5BwoAQQoguM5lMR9zK+njJgmG+Q8KAEEKI4xIYGNjtFgLPwkXCN8hwbSGEEMfNZDKh1+uxWCzHtQupXq+XrgEfJGFACCHECfEsGOZyubDZbDgcDnU/gra0Wi0GgwGTySQhwEdJGBBCCNEtbQcWyoJh/ZOEASGEED1GFgzrn2QAoRBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnurTptKIoADQ2NvZqMUIIIYToOZ7ztuc8fiRdCgNNTU0ApKamdrMsIYQQQvS1pqYmwsPDj3i9RjlWXADcbjdlZWWEhoai0Wh6tEAhhBBC9A5FUWhqaiIpKQmt9sgjA7oUBoQQQggxcMkAQiGEEMLPSRgQQggh/JyEASGEEMLPSRgQQggh/JyEASGEEMLPSRgQQggh/JyEASGEEMLP/f+Pu7DOLdgI9AAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph.render_gor_plt(scores)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 14, "id": "8fa85274-6d16-48eb-b875-01108a9575b8", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:49.341965Z", "iopub.status.busy": "2024-01-17T01:35:49.341537Z", "iopub.status.idle": "2024-01-17T01:35:49.383683Z", "shell.execute_reply": "2024-01-17T01:35:49.382725Z", "shell.execute_reply.started": "2024-01-17T01:35:49.341916Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tmp.fig03.html\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pv_graph: pyvis.network.Network = graph.render_gor_pyvis(scores)\n", "\n", "pv_graph.force_atlas_2based(\n", " gravity = -38,\n", " central_gravity = 0.01,\n", " spring_length = 231,\n", " spring_strength = 0.7,\n", " damping = 0.8,\n", " overlap = 0,\n", ")\n", "\n", "pv_graph.show_buttons(filter_ = [ \"physics\" ])\n", "pv_graph.toggle_physics(True)\n", "\n", "pv_graph.prep_notebook()\n", "pv_graph.show(\"tmp.fig03.html\")" ] }, { "cell_type": "markdown", "id": "07cf6fca-af95-4cf0-9e3b-247521bafbff", "metadata": {}, "source": [ "## analysis" ] }, { "cell_type": "markdown", "id": "97af44dc-4e56-4986-9f54-cbfaff67e3d4", "metadata": {}, "source": [ "As the results below above illustrate, the computed _affinity scores_ differ from what is published in `lee2023ingram`. After trying several different variations of interpretation for the paper's descriptions, the current approach provides the closest approximation that we have obtained." ] }, { "cell_type": "code", "execution_count": 15, "id": "f64462b4-654a-4e2e-bea2-a36bdc5ec967", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:49.387402Z", "iopub.status.busy": "2024-01-17T01:35:49.386218Z", "iopub.status.idle": "2024-01-17T01:35:49.434520Z", "shell.execute_reply": "2024-01-17T01:35:49.432123Z", "shell.execute_reply.started": "2024-01-17T01:35:49.387333Z" } }, "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", "
pairrel_arel_baffinityexpected
0(0, 0)DirectedDirected0.30NaN
1(0, 1)DirectedProfession0.270.22
2(0, 2)DirectedActedIn0.340.50
3(1, 1)ProfessionProfession0.23NaN
4(1, 2)ProfessionActedIn0.370.33
5(1, 4)ProfessionBornIn0.130.11
6(2, 2)ActedInActedIn0.21NaN
7(2, 4)ActedInBornIn0.130.11
8(3, 3)LivedInLivedIn0.33NaN
9(3, 4)LivedInBornIn0.560.81
10(3, 5)LivedInNationality0.220.11
11(4, 5)BornInNationality0.440.36
\n", "
" ], "text/plain": [ " pair rel_a rel_b affinity expected\n", "0 (0, 0) Directed Directed 0.30 NaN\n", "1 (0, 1) Directed Profession 0.27 0.22\n", "2 (0, 2) Directed ActedIn 0.34 0.50\n", "3 (1, 1) Profession Profession 0.23 NaN\n", "4 (1, 2) Profession ActedIn 0.37 0.33\n", "5 (1, 4) Profession BornIn 0.13 0.11\n", "6 (2, 2) ActedIn ActedIn 0.21 NaN\n", "7 (2, 4) ActedIn BornIn 0.13 0.11\n", "8 (3, 3) LivedIn LivedIn 0.33 NaN\n", "9 (3, 4) LivedIn BornIn 0.56 0.81\n", "10 (3, 5) LivedIn Nationality 0.22 0.11\n", "11 (4, 5) BornIn Nationality 0.44 0.36" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df: pd.DataFrame = graph.trace_metrics(scores)\n", "df" ] }, { "cell_type": "markdown", "id": "ff49fe28-e75f-4590-8b87-0d8962928cba", "metadata": {}, "source": [ "## statistical stack profile instrumentation" ] }, { "cell_type": "code", "execution_count": 16, "id": "af4ecb06-370f-4077-9899-29a1673e4768", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:49.437344Z", "iopub.status.busy": "2024-01-17T01:35:49.436840Z", "iopub.status.idle": "2024-01-17T01:35:49.444892Z", "shell.execute_reply": "2024-01-17T01:35:49.444135Z", "shell.execute_reply.started": "2024-01-17T01:35:49.437293Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profiler.stop()" ] }, { "cell_type": "code", "execution_count": 17, "id": "d5ac2ce6-15b1-41ad-8215-8a5f76036cf1", "metadata": { "execution": { "iopub.execute_input": "2024-01-17T01:35:49.446514Z", "iopub.status.busy": "2024-01-17T01:35:49.446199Z", "iopub.status.idle": "2024-01-17T01:35:49.728817Z", "shell.execute_reply": "2024-01-17T01:35:49.728098Z", "shell.execute_reply.started": "2024-01-17T01:35:49.446483Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " _ ._ __/__ _ _ _ _ _/_ Recorded: 17:35:45 Samples: 2526\n", " /_//_/// /_\\ / //_// / //_'/ // Duration: 3.799 CPU time: 4.060\n", "/ _/ v4.6.1\n", "\n", "Program: /Users/paco/src/textgraphs/venv/lib/python3.10/site-packages/ipykernel_launcher.py -f /Users/paco/Library/Jupyter/runtime/kernel-27f0c564-73f8-45ab-9f64-8b064ae1de10.json\n", "\n", "3.799 IPythonKernel.dispatch_queue ipykernel/kernelbase.py:525\n", "└─ 3.791 IPythonKernel.process_one ipykernel/kernelbase.py:511\n", " [10 frames hidden] ipykernel, IPython\n", " 3.680 ZMQInteractiveShell.run_ast_nodes IPython/core/interactiveshell.py:3394\n", " ├─ 2.176 ../ipykernel_4421/3358887201.py:1\n", " │ └─ 2.176 GraphOfRelations.construct_gor textgraphs/gor.py:311\n", " │ ├─ 1.607 IceCreamDebugger.__call__ icecream/icecream.py:204\n", " │ │ [17 frames hidden] icecream, colorama, ipykernel, thread...\n", " │ │ 1.078 lock.acquire \n", " │ └─ 0.566 GraphOfRelations._transformed_triples textgraphs/gor.py:275\n", " │ └─ 0.563 IceCreamDebugger.__call__ icecream/icecream.py:204\n", " │ [13 frames hidden] icecream, colorama, ipykernel, zmq, t...\n", " ├─ 0.866 ../ipykernel_4421/4061275008.py:1\n", " │ └─ 0.866 GraphOfRelations.seeds textgraphs/gor.py:197\n", " │ └─ 0.865 IceCreamDebugger.__call__ icecream/icecream.py:204\n", " │ [42 frames hidden] icecream, inspect, posixpath, ../ipykernel_4421/559531165.py:1\n", " │ ├─ 0.234 show matplotlib/pyplot.py:482\n", " │ │ [32 frames hidden] matplotlib, matplotlib_inline, IPytho...\n", " │ └─ 0.128 GraphOfRelations.render_gor_plt textgraphs/gor.py:522\n", " │ └─ 0.104 draw_networkx networkx/drawing/nx_pylab.py:127\n", " │ [6 frames hidden] networkx, matplotlib\n", " ├─ 0.197 ../ipykernel_4421/1169542473.py:1\n", " │ └─ 0.197 IceCreamDebugger.__call__ icecream/icecream.py:204\n", " │ [14 frames hidden] icecream, colorama, ipykernel, thread...\n", " └─ 0.041 ../ipykernel_4421/2247466716.py:1\n", "\n", "\n" ] } ], "source": [ "profiler.print()" ] }, { "cell_type": "markdown", "id": "c47bcfd2-2bd6-49a5-8f1a-102d90edde39", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## outro" ] }, { "cell_type": "markdown", "id": "68bea4f9-aec2-4b28-8f08-a4034851d066", "metadata": {}, "source": [ "_\\[ more parts are in progress, getting added to this demo \\]_" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.11" } }, "nbformat": 4, "nbformat_minor": 5 }