cd@bziiit.com commited on
Commit
a8ccf10
·
1 Parent(s): 136f21f

Adapt splitting

Browse files
Files changed (1) hide show
  1. langchain-neo4j.ipynb +89 -89
langchain-neo4j.ipynb CHANGED
@@ -2,12 +2,15 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 3,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
9
  "import os\n",
10
  "from langchain_neo4j import Neo4jGraph\n",
 
 
 
11
  "\n",
12
  "neo4j_uri = os.getenv(\"NEO4J_URI\")\n",
13
  "neo4j_username = os.getenv(\"NEO4J_USERNAME\")\n",
@@ -42,106 +45,69 @@
42
  "cell_type": "code",
43
  "execution_count": 6,
44
  "metadata": {},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  "outputs": [
46
  {
47
  "name": "stdout",
48
  "output_type": "stream",
49
  "text": [
50
- "Nodes:[Node(id='Marie Curie', type='Person', properties={}), Node(id='Polish', type='Nationality', properties={}), Node(id='French', type='Nationality', properties={}), Node(id='Physicist', type='Profession', properties={}), Node(id='Chemist', type='Profession', properties={}), Node(id='Radioactivity', type='Concept', properties={}), Node(id='Nobel Prize', type='Award', properties={}), Node(id='Pierre Curie', type='Person', properties={}), Node(id='Curie Family', type='Family', properties={}), Node(id='University Of Paris', type='Organisation', properties={})]\n",
51
- "Relationships:[Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='Polish', type='Nationality', properties={}), type='NATIONALITY', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='French', type='Nationality', properties={}), type='NATIONALITY', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='Physicist', type='Profession', properties={}), type='PROFESSION', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='Chemist', type='Profession', properties={}), type='PROFESSION', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='Radioactivity', type='Concept', properties={}), type='RESEARCHER', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='Nobel Prize', type='Award', properties={}), type='WINNER', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='Pierre Curie', type='Person', properties={}), type='SPOUSE', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='Curie Family', type='Family', properties={}), type='MEMBER', properties={}), Relationship(source=Node(id='Marie Curie', type='Person', properties={}), target=Node(id='University Of Paris', type='Organisation', properties={}), type='PROFESSOR', properties={})]\n"
52
  ]
53
  }
54
  ],
55
  "source": [
56
- "from langchain_core.documents import Document\n",
57
  "\n",
58
- "text = \"\"\"\n",
59
- "Marie Curie, born in 1867, was a Polish and naturalised-French physicist and chemist who conducted pioneering research on radioactivity.\n",
60
- "She was the first woman to win a Nobel Prize, the first person to win a Nobel Prize twice, and the only person to win a Nobel Prize in two scientific fields.\n",
61
- "Her husband, Pierre Curie, was a co-winner of her first Nobel Prize, making them the first-ever married couple to win the Nobel Prize and launching the Curie family legacy of five Nobel Prizes.\n",
62
- "She was, in 1906, the first woman to become a professor at the University of Paris.\n",
63
- "\"\"\"\n",
64
- "documents = [Document(page_content=text)]\n",
65
- "graph_documents = llm_transformer.convert_to_graph_documents(documents)\n",
66
- "print(f\"Nodes:{graph_documents[0].nodes}\")\n",
67
- "print(f\"Relationships:{graph_documents[0].relationships}\")"
68
  ]
69
  },
70
  {
71
  "cell_type": "code",
72
- "execution_count": 15,
73
  "metadata": {},
74
  "outputs": [
75
  {
76
  "name": "stdout",
77
  "output_type": "stream",
78
  "text": [
79
- "WARNING:tensorflow:From c:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\tf_keras\\src\\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.\n",
80
- "\n"
81
- ]
82
- },
83
- {
84
- "name": "stderr",
85
- "output_type": "stream",
86
- "text": [
87
- "Device set to use cpu\n"
88
- ]
89
- },
90
- {
91
- "ename": "RuntimeError",
92
- "evalue": "bad allocation",
93
- "output_type": "error",
94
- "traceback": [
95
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
96
- "\u001b[1;31mRuntimeError\u001b[0m Traceback (most recent call last)",
97
- "Cell \u001b[1;32mIn[15], line 41\u001b[0m\n\u001b[0;32m 38\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39m \u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mjoin(summaries) \u001b[39m# Concaténer les résumés\u001b[39;00m\n\u001b[0;32m 40\u001b[0m \u001b[39m# Appliquer la compression à chaque texte\u001b[39;00m\n\u001b[1;32m---> 41\u001b[0m compressed_texts \u001b[39m=\u001b[39m [compress_text(text) \u001b[39mfor\u001b[39;00m text \u001b[39min\u001b[39;00m texts]\n\u001b[0;32m 43\u001b[0m \u001b[39m# Convertir en documents pour le modèle\u001b[39;00m\n\u001b[0;32m 44\u001b[0m documents \u001b[39m=\u001b[39m [Document(page_content\u001b[39m=\u001b[39mtext) \u001b[39mfor\u001b[39;00m text \u001b[39min\u001b[39;00m compressed_texts]\n",
98
- "Cell \u001b[1;32mIn[15], line 41\u001b[0m, in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 38\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39m \u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mjoin(summaries) \u001b[39m# Concaténer les résumés\u001b[39;00m\n\u001b[0;32m 40\u001b[0m \u001b[39m# Appliquer la compression à chaque texte\u001b[39;00m\n\u001b[1;32m---> 41\u001b[0m compressed_texts \u001b[39m=\u001b[39m [compress_text(text) \u001b[39mfor\u001b[39;00m text \u001b[39min\u001b[39;00m texts]\n\u001b[0;32m 43\u001b[0m \u001b[39m# Convertir en documents pour le modèle\u001b[39;00m\n\u001b[0;32m 44\u001b[0m documents \u001b[39m=\u001b[39m [Document(page_content\u001b[39m=\u001b[39mtext) \u001b[39mfor\u001b[39;00m text \u001b[39min\u001b[39;00m compressed_texts]\n",
99
- "Cell \u001b[1;32mIn[15], line 36\u001b[0m, in \u001b[0;36mcompress_text\u001b[1;34m(text)\u001b[0m\n\u001b[0;32m 33\u001b[0m max_input \u001b[39m=\u001b[39m \u001b[39m1024\u001b[39m \u001b[39m# Taille max du modèle de résumé\u001b[39;00m\n\u001b[0;32m 34\u001b[0m chunks \u001b[39m=\u001b[39m [text[i:i\u001b[39m+\u001b[39mmax_input] \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(\u001b[39m0\u001b[39m, \u001b[39mlen\u001b[39m(text), max_input)] \u001b[39m# Découpage\u001b[39;00m\n\u001b[1;32m---> 36\u001b[0m summaries \u001b[39m=\u001b[39m [summarizer(chunk, max_length\u001b[39m=\u001b[39m\u001b[39m200\u001b[39m, min_length\u001b[39m=\u001b[39m\u001b[39m50\u001b[39m, do_sample\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m)[\u001b[39m0\u001b[39m][\u001b[39m'\u001b[39m\u001b[39msummary_text\u001b[39m\u001b[39m'\u001b[39m] \u001b[39mfor\u001b[39;00m chunk \u001b[39min\u001b[39;00m chunks]\n\u001b[0;32m 38\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39m \u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mjoin(summaries)\n",
100
- "Cell \u001b[1;32mIn[15], line 36\u001b[0m, in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 33\u001b[0m max_input \u001b[39m=\u001b[39m \u001b[39m1024\u001b[39m \u001b[39m# Taille max du modèle de résumé\u001b[39;00m\n\u001b[0;32m 34\u001b[0m chunks \u001b[39m=\u001b[39m [text[i:i\u001b[39m+\u001b[39mmax_input] \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(\u001b[39m0\u001b[39m, \u001b[39mlen\u001b[39m(text), max_input)] \u001b[39m# Découpage\u001b[39;00m\n\u001b[1;32m---> 36\u001b[0m summaries \u001b[39m=\u001b[39m [summarizer(chunk, max_length\u001b[39m=\u001b[39;49m\u001b[39m200\u001b[39;49m, min_length\u001b[39m=\u001b[39;49m\u001b[39m50\u001b[39;49m, do_sample\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m)[\u001b[39m0\u001b[39m][\u001b[39m'\u001b[39m\u001b[39msummary_text\u001b[39m\u001b[39m'\u001b[39m] \u001b[39mfor\u001b[39;00m chunk \u001b[39min\u001b[39;00m chunks]\n\u001b[0;32m 38\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39m \u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mjoin(summaries)\n",
101
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\pipelines\\text2text_generation.py:280\u001b[0m, in \u001b[0;36mSummarizationPipeline.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 256\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m 257\u001b[0m \u001b[39m \u001b[39m\u001b[39mr\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 258\u001b[0m \u001b[39m Summarize the text(s) given as inputs.\u001b[39;00m\n\u001b[0;32m 259\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 278\u001b[0m \u001b[39m ids of the summary.\u001b[39;00m\n\u001b[0;32m 279\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 280\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__call__\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n",
102
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\pipelines\\text2text_generation.py:173\u001b[0m, in \u001b[0;36mText2TextGenerationPipeline.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m 145\u001b[0m \u001b[39m \u001b[39m\u001b[39mr\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 146\u001b[0m \u001b[39m Generate the output text(s) using text(s) given as inputs.\u001b[39;00m\n\u001b[0;32m 147\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 170\u001b[0m \u001b[39m ids of the generated text.\u001b[39;00m\n\u001b[0;32m 171\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 173\u001b[0m result \u001b[39m=\u001b[39m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__call__\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 174\u001b[0m \u001b[39mif\u001b[39;00m (\n\u001b[0;32m 175\u001b[0m \u001b[39misinstance\u001b[39m(args[\u001b[39m0\u001b[39m], \u001b[39mlist\u001b[39m)\n\u001b[0;32m 176\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mall\u001b[39m(\u001b[39misinstance\u001b[39m(el, \u001b[39mstr\u001b[39m) \u001b[39mfor\u001b[39;00m el \u001b[39min\u001b[39;00m args[\u001b[39m0\u001b[39m])\n\u001b[0;32m 177\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mall\u001b[39m(\u001b[39mlen\u001b[39m(res) \u001b[39m==\u001b[39m \u001b[39m1\u001b[39m \u001b[39mfor\u001b[39;00m res \u001b[39min\u001b[39;00m result)\n\u001b[0;32m 178\u001b[0m ):\n\u001b[0;32m 179\u001b[0m \u001b[39mreturn\u001b[39;00m [res[\u001b[39m0\u001b[39m] \u001b[39mfor\u001b[39;00m res \u001b[39min\u001b[39;00m result]\n",
103
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\pipelines\\base.py:1362\u001b[0m, in \u001b[0;36mPipeline.__call__\u001b[1;34m(self, inputs, num_workers, batch_size, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1354\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mnext\u001b[39m(\n\u001b[0;32m 1355\u001b[0m \u001b[39miter\u001b[39m(\n\u001b[0;32m 1356\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mget_iterator(\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1359\u001b[0m )\n\u001b[0;32m 1360\u001b[0m )\n\u001b[0;32m 1361\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m-> 1362\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mrun_single(inputs, preprocess_params, forward_params, postprocess_params)\n",
104
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\pipelines\\base.py:1369\u001b[0m, in \u001b[0;36mPipeline.run_single\u001b[1;34m(self, inputs, preprocess_params, forward_params, postprocess_params)\u001b[0m\n\u001b[0;32m 1367\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mrun_single\u001b[39m(\u001b[39mself\u001b[39m, inputs, preprocess_params, forward_params, postprocess_params):\n\u001b[0;32m 1368\u001b[0m model_inputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpreprocess(inputs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mpreprocess_params)\n\u001b[1;32m-> 1369\u001b[0m model_outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mforward(model_inputs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mforward_params)\n\u001b[0;32m 1370\u001b[0m outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpostprocess(model_outputs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mpostprocess_params)\n\u001b[0;32m 1371\u001b[0m \u001b[39mreturn\u001b[39;00m outputs\n",
105
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\pipelines\\base.py:1269\u001b[0m, in \u001b[0;36mPipeline.forward\u001b[1;34m(self, model_inputs, **forward_params)\u001b[0m\n\u001b[0;32m 1267\u001b[0m \u001b[39mwith\u001b[39;00m inference_context():\n\u001b[0;32m 1268\u001b[0m model_inputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_ensure_tensor_on_device(model_inputs, device\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdevice)\n\u001b[1;32m-> 1269\u001b[0m model_outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward(model_inputs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mforward_params)\n\u001b[0;32m 1270\u001b[0m model_outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_ensure_tensor_on_device(model_outputs, device\u001b[39m=\u001b[39mtorch\u001b[39m.\u001b[39mdevice(\u001b[39m\"\u001b[39m\u001b[39mcpu\u001b[39m\u001b[39m\"\u001b[39m))\n\u001b[0;32m 1271\u001b[0m \u001b[39melse\u001b[39;00m:\n",
106
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\pipelines\\text2text_generation.py:202\u001b[0m, in \u001b[0;36mText2TextGenerationPipeline._forward\u001b[1;34m(self, model_inputs, **generate_kwargs)\u001b[0m\n\u001b[0;32m 199\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39mgeneration_config\u001b[39m\u001b[39m\"\u001b[39m \u001b[39mnot\u001b[39;00m \u001b[39min\u001b[39;00m generate_kwargs:\n\u001b[0;32m 200\u001b[0m generate_kwargs[\u001b[39m\"\u001b[39m\u001b[39mgeneration_config\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mgeneration_config\n\u001b[1;32m--> 202\u001b[0m output_ids \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel\u001b[39m.\u001b[39mgenerate(\u001b[39m*\u001b[39m\u001b[39m*\u001b[39mmodel_inputs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mgenerate_kwargs)\n\u001b[0;32m 203\u001b[0m out_b \u001b[39m=\u001b[39m output_ids\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m]\n\u001b[0;32m 204\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mframework \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mpt\u001b[39m\u001b[39m\"\u001b[39m:\n",
107
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\torch\\utils\\_contextlib.py:116\u001b[0m, in \u001b[0;36mcontext_decorator.<locals>.decorate_context\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 113\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[0;32m 114\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecorate_context\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m 115\u001b[0m \u001b[39mwith\u001b[39;00m ctx_factory():\n\u001b[1;32m--> 116\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n",
108
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\generation\\utils.py:2286\u001b[0m, in \u001b[0;36mGenerationMixin.generate\u001b[1;34m(self, inputs, generation_config, logits_processor, stopping_criteria, prefix_allowed_tokens_fn, synced_gpus, assistant_model, streamer, negative_prompt_ids, negative_prompt_attention_mask, **kwargs)\u001b[0m\n\u001b[0;32m 2278\u001b[0m input_ids, model_kwargs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_expand_inputs_for_generation(\n\u001b[0;32m 2279\u001b[0m input_ids\u001b[39m=\u001b[39minput_ids,\n\u001b[0;32m 2280\u001b[0m expand_size\u001b[39m=\u001b[39mgeneration_config\u001b[39m.\u001b[39mnum_beams,\n\u001b[0;32m 2281\u001b[0m is_encoder_decoder\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mconfig\u001b[39m.\u001b[39mis_encoder_decoder,\n\u001b[0;32m 2282\u001b[0m \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mmodel_kwargs,\n\u001b[0;32m 2283\u001b[0m )\n\u001b[0;32m 2285\u001b[0m \u001b[39m# 13. run beam sample\u001b[39;00m\n\u001b[1;32m-> 2286\u001b[0m result \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_beam_search(\n\u001b[0;32m 2287\u001b[0m input_ids,\n\u001b[0;32m 2288\u001b[0m beam_scorer,\n\u001b[0;32m 2289\u001b[0m logits_processor\u001b[39m=\u001b[39mprepared_logits_processor,\n\u001b[0;32m 2290\u001b[0m stopping_criteria\u001b[39m=\u001b[39mprepared_stopping_criteria,\n\u001b[0;32m 2291\u001b[0m generation_config\u001b[39m=\u001b[39mgeneration_config,\n\u001b[0;32m 2292\u001b[0m synced_gpus\u001b[39m=\u001b[39msynced_gpus,\n\u001b[0;32m 2293\u001b[0m \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mmodel_kwargs,\n\u001b[0;32m 2294\u001b[0m )\n\u001b[0;32m 2296\u001b[0m \u001b[39melif\u001b[39;00m generation_mode \u001b[39m==\u001b[39m GenerationMode\u001b[39m.\u001b[39mGROUP_BEAM_SEARCH:\n\u001b[0;32m 2297\u001b[0m \u001b[39m# 11. prepare beam search scorer\u001b[39;00m\n\u001b[0;32m 2298\u001b[0m beam_scorer \u001b[39m=\u001b[39m BeamSearchScorer(\n\u001b[0;32m 2299\u001b[0m batch_size\u001b[39m=\u001b[39mbatch_size,\n\u001b[0;32m 2300\u001b[0m num_beams\u001b[39m=\u001b[39mgeneration_config\u001b[39m.\u001b[39mnum_beams,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 2306\u001b[0m max_length\u001b[39m=\u001b[39mgeneration_config\u001b[39m.\u001b[39mmax_length,\n\u001b[0;32m 2307\u001b[0m )\n",
109
- "File \u001b[1;32mc:\\Users\\etulyon1\\Anaconda3\\envs\\python_env\\lib\\site-packages\\transformers\\generation\\utils.py:3566\u001b[0m, in \u001b[0;36mGenerationMixin._beam_search\u001b[1;34m(self, input_ids, beam_scorer, logits_processor, stopping_criteria, generation_config, synced_gpus, **model_kwargs)\u001b[0m\n\u001b[0;32m 3564\u001b[0m next_tokens \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mgather(next_tokens, \u001b[39m-\u001b[39m\u001b[39m1\u001b[39m, _indices)\n\u001b[0;32m 3565\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m-> 3566\u001b[0m next_token_scores, next_tokens \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39;49mtopk(\n\u001b[0;32m 3567\u001b[0m next_token_scores, n_tokens_to_keep, dim\u001b[39m=\u001b[39;49m\u001b[39m1\u001b[39;49m, largest\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, \u001b[39msorted\u001b[39;49m\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m\n\u001b[0;32m 3568\u001b[0m )\n\u001b[0;32m 3570\u001b[0m next_indices \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mdiv(next_tokens, vocab_size, rounding_mode\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mfloor\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 3571\u001b[0m next_tokens \u001b[39m=\u001b[39m next_tokens \u001b[39m%\u001b[39m vocab_size\n",
110
- "\u001b[1;31mRuntimeError\u001b[0m: bad allocation"
111
  ]
112
  }
113
  ],
114
  "source": [
115
- "from pdf_processing import get_existing_pdf, load_and_preprocess_pdf, split_text\n",
116
- "from transformers import AutoTokenizer\n",
117
- "\n",
118
- "from transformers import pipeline\n",
119
- "\n",
120
- "# Modèle de résumé \n",
121
- "summarizer = pipeline(\"summarization\", model=\"facebook/bart-large-cnn\")\n",
122
- "\n",
123
- "allowed_relationships = [\n",
124
- " \"CONNAÎT\", \"SITUE_DANS\", \"FAIT_PARTIE_DE\", \"SE_PRODUIT_PENDANT\", \"IMPLIQUE\",\n",
125
- " \"S'OPPOSE_À\", \"CRÉÉ_PAR\", \"INSPIRÉ_PAR\", \"REPRÉSENTE\", \"TRANSFORME\"\n",
126
- "]\n",
127
- "allowed_nodes = [\n",
128
- " \"Personnage\", \"Objet\", \"Lieu\", \"Événement\", \"PériodeTemporelle\",\n",
129
- " \"Protagoniste\", \"Antagoniste\", \"PersonnageSecondaire\", \"CréatureMythique\",\n",
130
- " \"FigureHistorique\", \"Narrateur\", \"Thème\", \"Motif\", \"Symbole\"\n",
131
- "]\n",
132
- "\n",
133
- "llm_transformer_tuple = LLMGraphTransformer(\n",
134
- " llm=llm,\n",
135
- " allowed_nodes=allowed_nodes,\n",
136
- " allowed_relationships=allowed_relationships,\n",
137
- ")\n",
138
- "\n",
139
- "pdf_files = get_existing_pdf()\n",
140
- "texts = []\n",
141
- "for pdf_file in pdf_files:\n",
142
- " text = load_and_preprocess_pdf(pdf_file)\n",
143
- " texts.extend(split_text(text))\n",
144
- "\n",
145
  "\n",
146
  "def compress_text(text):\n",
147
  " max_input = 1024 # Taille max du modèle de résumé\n",
@@ -152,22 +118,61 @@
152
  " return \" \".join(summaries) # Concaténer les résumés\n",
153
  "\n",
154
  "# Appliquer la compression à chaque texte\n",
155
- "compressed_texts = [compress_text(text) for text in texts]\n",
 
156
  "\n",
157
  "# Convertir en documents pour le modèle\n",
158
  "documents = [Document(page_content=text) for text in compressed_texts]\n",
159
- "\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  "# Envoyer les documents au LLM pour extraction des relations\n",
161
- "graph_documents_filtered = llm_transformer_tuple.convert_to_graph_documents(documents)\n",
 
 
 
 
 
 
 
162
  "\n",
163
  "# Afficher les résultats\n",
164
  "print(f\"Nodes:{graph_documents_filtered[0].nodes}\")\n",
165
- "print(f\"Relationships:{graph_documents_filtered[0].relationships}\")"
 
 
166
  ]
167
  },
 
 
 
 
 
168
  {
169
  "cell_type": "code",
170
- "execution_count": 3,
171
  "metadata": {},
172
  "outputs": [
173
  {
@@ -249,7 +254,7 @@
249
  ],
250
  "metadata": {
251
  "kernelspec": {
252
- "display_name": "Python 3.10.16 ('python_env')",
253
  "language": "python",
254
  "name": "python3"
255
  },
@@ -263,12 +268,7 @@
263
  "name": "python",
264
  "nbconvert_exporter": "python",
265
  "pygments_lexer": "ipython3",
266
- "version": "3.10.16"
267
- },
268
- "vscode": {
269
- "interpreter": {
270
- "hash": "61b9aa377fb83f63bad7741d096e61bd539c2bb481b5373a09d4b308f1781ad2"
271
- }
272
  }
273
  },
274
  "nbformat": 4,
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 4,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
9
  "import os\n",
10
  "from langchain_neo4j import Neo4jGraph\n",
11
+ "from dotenv import load_dotenv\n",
12
+ "\n",
13
+ "load_dotenv()\n",
14
  "\n",
15
  "neo4j_uri = os.getenv(\"NEO4J_URI\")\n",
16
  "neo4j_username = os.getenv(\"NEO4J_USERNAME\")\n",
 
45
  "cell_type": "code",
46
  "execution_count": 6,
47
  "metadata": {},
48
+ "outputs": [],
49
+ "source": [
50
+ "from transformers import pipeline\n",
51
+ "\n",
52
+ "# Modèle de résumé \n",
53
+ "summarizer = pipeline(\"summarization\", model=\"facebook/bart-large-cnn\")\n",
54
+ "\n",
55
+ "allowed_relationships = [\n",
56
+ " \"CONNAÎT\", \"SITUE_DANS\", \"FAIT_PARTIE_DE\", \"SE_PRODUIT_PENDANT\", \"IMPLIQUE\",\n",
57
+ " \"S'OPPOSE_À\", \"CRÉÉ_PAR\", \"INSPIRÉ_PAR\", \"REPRÉSENTE\", \"TRANSFORME\"\n",
58
+ "]\n",
59
+ "allowed_nodes = [\n",
60
+ " \"Personnage\", \"Objet\", \"Lieu\", \"Événement\", \"PériodeTemporelle\",\n",
61
+ " \"Protagoniste\", \"Antagoniste\", \"PersonnageSecondaire\", \"CréatureMythique\",\n",
62
+ " \"FigureHistorique\", \"Narrateur\", \"Thème\", \"Motif\", \"Symbole\"\n",
63
+ "]\n",
64
+ "\n",
65
+ "llm_transformer_tuple = LLMGraphTransformer(\n",
66
+ " llm=llm,\n",
67
+ " allowed_nodes=allowed_nodes,\n",
68
+ " allowed_relationships=allowed_relationships,\n",
69
+ ")"
70
+ ]
71
+ },
72
+ {
73
+ "cell_type": "code",
74
+ "execution_count": 7,
75
+ "metadata": {},
76
  "outputs": [
77
  {
78
  "name": "stdout",
79
  "output_type": "stream",
80
  "text": [
81
+ "Nb Texts : 60\n"
 
82
  ]
83
  }
84
  ],
85
  "source": [
 
86
  "\n",
87
+ "from pdf_processing import get_existing_pdf, load_and_preprocess_pdf, split_text\n",
88
+ "\n",
89
+ "path_pdf_file = get_existing_pdf()\n",
90
+ "text = load_and_preprocess_pdf(path_pdf_file)\n",
91
+ "texts = split_text(text)\n",
92
+ "\n",
93
+ "print(f\"Nb Texts : {len(texts)}\")\n"
 
 
 
94
  ]
95
  },
96
  {
97
  "cell_type": "code",
98
+ "execution_count": 8,
99
  "metadata": {},
100
  "outputs": [
101
  {
102
  "name": "stdout",
103
  "output_type": "stream",
104
  "text": [
105
+ "Nb Documents : 60\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  ]
107
  }
108
  ],
109
  "source": [
110
+ "from langchain_core.documents import Document\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  "\n",
112
  "def compress_text(text):\n",
113
  " max_input = 1024 # Taille max du modèle de résumé\n",
 
118
  " return \" \".join(summaries) # Concaténer les résumés\n",
119
  "\n",
120
  "# Appliquer la compression à chaque texte\n",
121
+ "# compressed_texts = [compress_text(text) for text in texts]\n",
122
+ "compressed_texts = texts\n",
123
  "\n",
124
  "# Convertir en documents pour le modèle\n",
125
  "documents = [Document(page_content=text) for text in compressed_texts]\n",
126
+ "print(f\"Nb Documents : {len(documents)}\")"
127
+ ]
128
+ },
129
+ {
130
+ "cell_type": "markdown",
131
+ "metadata": {},
132
+ "source": [
133
+ "# Convert to Graph"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "code",
138
+ "execution_count": null,
139
+ "metadata": {},
140
+ "outputs": [
141
+ {
142
+ "name": "stdout",
143
+ "output_type": "stream",
144
+ "text": [
145
+ "nodes=[Node(id='Gaspard Boréal', type='Personnage', properties={}), Node(id='La Confession Muette', type='Objet', properties={}), Node(id='Théo', type='Personnage', properties={}), Node(id='Robin', type='Personnage', properties={}), Node(id='Aurélien', type='Personnage', properties={}), Node(id='Keziah', type='Personnage', properties={}), Node(id='Gaston Bachelard', type='Personnage', properties={}), Node(id='Tristan', type='Personnage', properties={}), Node(id='Anne-Hélène', type='Personnage', properties={}), Node(id='Musée', type='Lieu', properties={}), Node(id='Bruxelles', type='Lieu', properties={})] relationships=[Relationship(source=Node(id='Gaspard Boréal', type='Personnage', properties={}), target=Node(id='La Confession Muette', type='Objet', properties={}), type='CRÉÉ_PAR', properties={}), Relationship(source=Node(id='Gaspard Boréal', type='Personnage', properties={}), target=Node(id='Théo', type='Personnage', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Gaspard Boréal', type='Personnage', properties={}), target=Node(id='Robin', type='Personnage', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Gaspard Boréal', type='Personnage', properties={}), target=Node(id='Aurélien', type='Personnage', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Gaspard Boréal', type='Personnage', properties={}), target=Node(id='Keziah', type='Personnage', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Tristan', type='Personnage', properties={}), target=Node(id='Musée', type='Lieu', properties={}), type='SITUE_DANS', properties={}), Relationship(source=Node(id='Anne-Hélène', type='Personnage', properties={}), target=Node(id='Bruxelles', type='Lieu', properties={}), type='SITUE_DANS', properties={})] source=Document(metadata={}, page_content=\"Gaspard Boréal\\nLa Confession muette\\n© Gaspard Boréal, 2025\\nISBN numérique : 979-10-405-7304-3\\nwww.librinova.com\\nLe Code de la propriété intellectuelle interdit les copies ou reproductions destinées à une utilisation collective. Toute\\nreprésentation ou reproduction intégrale ou partielle faite par quelque procédé que ce soit, sans le consentement de l’auteur ou de\\nses ayants cause, est illicite et constitue une contrefaçon sanctionnée par les articles L335-2 et suivants du Code de la propriété\\nintellectuelle.\\n« À Théo, Robin, Aurélien, Keziah »\\nC’est à vos côtés que ce récit a tracé ses premières lignes\\nlaissant l’imagina\\x00on y poser sa signature\\n« Imaginer, c’est hausser le réel d’un ton. »\\nGaston Bachelard\\nScène 01 : Le guide du Musée\\nC'est son instant préféré !\\nObserver, scruter, détecter quels sont ceux qui vont préférer entrer dans\\ncet immense ascenseur dont il est le guide depuis cinq ans…\\nPosi\\x00onné inlassablement dans le même angle, au fond, proche du tableau\\nde bord lui perme\\x00ant d'ac\\x00ver toutes les op\\x00ons disponibles, pour\\nmonter aux étages les tableaux et fresques des nouvelles collec\\x00ons ou\\npour accueillir les groupes d'enfants et visiteurs, préférant le confort à la\\nmontée par les escaliers du musée.\\nPourtant si elles-ils savaient !\\nTristan n'est pas très grand, la trentaine, avec ce type de costume gris que\\nl'on ne regarde pas, un peu trop sobre, trop neutre pour a\\x00rer l'œil.\\nC'est sa pe\\x00te oreille\\x00e blanche que l'on peut remarquer si on lui prête\\na\\x00en\\x00on. Pour renforcer son rôle apparemment bien normé, Tristan\\nadopte toujours la même posture afin que les visiteurs ne s'intéressent pas\\nà lui, ni aux mouvements discrets de son corps, de ses yeux ou de ses\\nmains. Seul détail pouvant surprendre les plus a\\x00en\\x00fs : les sub\\x00les\\norchidées ton sur ton finement brodées sur ses poignets de chemise.\\nEncore faut-il pour cela le regarder, lui, si discret, si effacé !\\nPourtant, il lui suffit d'une simple montée du rez-de-chaussée vers le 3ième\\nétage de l'exposi\\x00on Magri\\x00e, de quelques sourcillements et tapotements,\\npour disposer de toutes les informa\\x00ons lui perme\\x00ant de choisir celui ou\\ncelle qu’il va portraiturer !\\nScène 02 : La directrice du musée\\n« Aujourd'hui je vais rencontrer le futur ».\\nCe\\x00e pensée amuse Anne-Hélène, alors qu'elle se \\x00ent devant le miroir\\nornementé de sa chambre baignée par la lumière douce de Bruxelles. Le\\nsilence de la pièce n’est troublé que par le léger bruissement de ses gestes.\")\n",
146
+ "nodes=[Node(id='Chambre', type='Lieu', properties={}), Node(id='Bruxelles', type='Lieu', properties={}), Node(id='Elle', type='Personnage', properties={}), Node(id='Brosse En Ivoire', type='Objet', properties={}), Node(id='Artiste Sculpteur', type='Personnage', properties={}), Node(id='Cheveux', type='Objet', properties={}), Node(id='Mèches Argentées', type='Objet', properties={}), Node(id='Reflet', type='Objet', properties={}), Node(id='Musée', type='Lieu', properties={}), Node(id='Exposition', type='Événement', properties={}), Node(id='René Magritte', type='Personnage', properties={}), Node(id='Œuvres', type='Objet', properties={}), Node(id='Visiteurs', type='Personnage', properties={}), Node(id='Idées Créatives', type='Motif', properties={}), Node(id='Anne Hélène', type='Personnage', properties={}), Node(id='Gaîté Lyrique', type='Lieu', properties={}), Node(id='Paris', type='Lieu', properties={}), Node(id='Musées Royaux Des Beaux-Arts De Belgique', type='Lieu', properties={}), Node(id='Prédécesseur', type='Personnage', properties={}), Node(id='Collectif', type='Personnage', properties={}), Node(id='Ancien Directeur', type='Personnage', properties={}), Node(id='Esprit Magritte', type='Motif', properties={}), Node(id='Avant-Garde Surréaliste Belge', type='Motif', properties={}), Node(id='Humour Subtil', type='Motif', properties={}), Node(id='Paradoxes', type='Motif', properties={}), Node(id='Public', type='Personnage', properties={}), Node(id='Réalité', type='Thème', properties={}), Node(id='Groupe De Travail', type='Personnage', properties={}), Node(id='Jeunes Artistes Engagés', type='Personnage', properties={})] relationships=[Relationship(source=Node(id='Chambre', type='Lieu', properties={}), target=Node(id='Bruxelles', type='Lieu', properties={}), type='SITUE_DANS', properties={}), Relationship(source=Node(id='Elle', type='Personnage', properties={}), target=Node(id='Brosse En Ivoire', type='Objet', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Brosse En Ivoire', type='Objet', properties={}), target=Node(id='Artiste Sculpteur', type='Personnage', properties={}), type='CRÉÉ_PAR', properties={}), Relationship(source=Node(id='Elle', type='Personnage', properties={}), target=Node(id='Cheveux', type='Objet', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Cheveux', type='Objet', properties={}), target=Node(id='Mèches Argentées', type='Objet', properties={}), type='FAIT_PARTIE_DE', properties={}), Relationship(source=Node(id='Elle', type='Personnage', properties={}), target=Node(id='Reflet', type='Objet', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Elle', type='Personnage', properties={}), target=Node(id='Musée', type='Lieu', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Musée', type='Lieu', properties={}), target=Node(id='Exposition', type='Événement', properties={}), type='IMPLIQUE', properties={}), Relationship(source=Node(id='Exposition', type='Événement', properties={}), target=Node(id='René Magritte', type='Personnage', properties={}), type='REPRÉSENTE', properties={}), Relationship(source=Node(id='Œuvres', type='Objet', properties={}), target=Node(id='Visiteurs', type='Personnage', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Visiteurs', type='Personnage', properties={}), target=Node(id='Idées Créatives', type='Motif', properties={}), type='INSPIRÉ_PAR', properties={}), Relationship(source=Node(id='Anne Hélène', type='Personnage', properties={}), target=Node(id='Gaîté Lyrique', type='Lieu', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Gaîté Lyrique', type='Lieu', properties={}), target=Node(id='Paris', type='Lieu', properties={}), type='SITUE_DANS', properties={}), Relationship(source=Node(id='Anne Hélène', type='Personnage', properties={}), target=Node(id='Musées Royaux Des Beaux-Arts De Belgique', type='Lieu', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Prédécesseur', type='Personnage', properties={}), target=Node(id='Collectif', type='Personnage', properties={}), type=\"S'OPPOSE_À\", properties={}), Relationship(source=Node(id='Collectif', type='Personnage', properties={}), target=Node(id='Ancien Directeur', type='Personnage', properties={}), type=\"S'OPPOSE_À\", properties={}), Relationship(source=Node(id='Esprit Magritte', type='Motif', properties={}), target=Node(id='Avant-Garde Surréaliste Belge', type='Motif', properties={}), type='REPRÉSENTE', properties={}), Relationship(source=Node(id='Avant-Garde Surréaliste Belge', type='Motif', properties={}), target=Node(id='Humour Subtil', type='Motif', properties={}), type='REPRÉSENTE', properties={}), Relationship(source=Node(id='Humour Subtil', type='Motif', properties={}), target=Node(id='Paradoxes', type='Motif', properties={}), type='REPRÉSENTE', properties={}), Relationship(source=Node(id='Paradoxes', type='Motif', properties={}), target=Node(id='Public', type='Personnage', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Public', type='Personnage', properties={}), target=Node(id='Réalité', type='Thème', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Anne Hélène', type='Personnage', properties={}), target=Node(id='Groupe De Travail', type='Personnage', properties={}), type='CONNAÎT', properties={}), Relationship(source=Node(id='Groupe De Travail', type='Personnage', properties={}), target=Node(id='Jeunes Artistes Engagés', type='Personnage', properties={}), type='CONNAÎT', properties={})] source=Document(metadata={}, page_content=\"ornementé de sa chambre baignée par la lumière douce de Bruxelles. Le\\nsilence de la pièce n’est troublé que par le léger bruissement de ses gestes.\\nElle saisit la brosse en ivoire, objet précieux que lui a offert un ar\\x00ste\\nsculpteur, amoureux secret et discret, et commence à démêler ses cheveux\\navec précau\\x00on. Chaque coup de brosse semble une caresse, un rituel\\nin\\x00me qu'elle accomplit avec une précision presque cérémoniale. Ses\\ncheveux, autrefois d’un noir profond, sont maintenant parsemés de légères\\nmèches argentées, témoins silencieux du passage du temps.\\nElle observe son reflet avec une a\\x00en\\x00on par\\x00culière. Elle aime éprouver\\nla sérénité de ces moments de solitude où elle proje\\x00e le futur de ses\\njournées en contemplant les signes discrets de son passé. Une ques\\x00on lui\\nrevient à l’esprit :\\n« Quel ar\\x00ste vais-je pouvoir convaincre de par\\x00ciper à la créa\\x00on de ce\\x00e\\nprochaine exposi\\x00on ? »\\nAlors que sa main con\\x00nue de parcourir ses longs cheveux, dans un va et\\nvient régulier et souple pour bien les lisser, elle prend la mesure de\\nl'incroyable challenge qu'elle a proposé à la gouvernance du musée :\\n« Limites de l’imaginaire ou Limites planétaires ? ». Une exposi\\x00on\\naudacieuse et provocante où un ar\\x00ste contemporain va explorer les neuf\\nlimites planétaires à travers le prisme surréaliste des tableaux de René\\nMagri\\x00e.\\nL’enjeu de l’exposi\\x00on : confronter les œuvres de l’ar\\x00ste et les visiteurs\\npour inspirer à ces derniers des idées créa\\x00ves.\\nIl y a seulement trois mois, Anne Hélène avait accepté de qui\\x00er la\\ndirec\\x00on de la Gaîté Lyrique à Paris pour l'une des plus pres\\x00gieuses\\nins\\x00tu\\x00ons culturelles d’Europe : les Musées Royaux des Beaux-Arts de\\nBelgique. Elle avait alors découvert une situa\\x00on catastrophique laissée par\\nson prédécesseur ! Un collec\\x00f rassemblant plus de trente personnes\\ndénonçait des « condi\\x00ons de travail épouvantables », des « menaces\\nrégulières » et une « ges\\x00on calamiteuse » et il avait contraint l'ancien\\ndirecteur à démissionner !\\nIl était urgent de relancer l'ins\\x00tu\\x00on en y restaurant l'esprit « Magri\\x00e » :\\ncelui de l’avant-garde surréaliste belge d’un humour sub\\x00l, jouant avec les\\nparadoxes pour surprendre son public, et posant des ques\\x00ons\\nphilosophiques sur la réalité. C'est ainsi qu'était née ce\\x00e idée, avec le\\ngroupe de travail qu'elle avait mis en place, dès le premier mois de sa prise\\nde poste.\\nIl fallait désormais recruter de jeunes ar\\x00stes engagés pour créer, passer\")\n"
147
+ ]
148
+ }
149
+ ],
150
+ "source": [
151
  "# Envoyer les documents au LLM pour extraction des relations\n",
152
+ "documents = documents[:5]\n",
153
+ "graph_documents_filtered = []\n",
154
+ "\n",
155
+ "for doc in documents:\n",
156
+ " graph_doc = llm_transformer_tuple.convert_to_graph_documents([doc])\n",
157
+ " print(graph_doc[0])\n",
158
+ "\n",
159
+ " graph_documents_filtered.append(graph_doc[0])\n",
160
  "\n",
161
  "# Afficher les résultats\n",
162
  "print(f\"Nodes:{graph_documents_filtered[0].nodes}\")\n",
163
+ "print(f\"Relationships:{graph_documents_filtered[0].relationships}\")\n",
164
+ "\n",
165
+ "graph.add_graph_documents(graph_documents_filtered, baseEntityLabel=True)"
166
  ]
167
  },
168
+ {
169
+ "cell_type": "markdown",
170
+ "metadata": {},
171
+ "source": []
172
+ },
173
  {
174
  "cell_type": "code",
175
+ "execution_count": null,
176
  "metadata": {},
177
  "outputs": [
178
  {
 
254
  ],
255
  "metadata": {
256
  "kernelspec": {
257
+ "display_name": "Python 3",
258
  "language": "python",
259
  "name": "python3"
260
  },
 
268
  "name": "python",
269
  "nbconvert_exporter": "python",
270
  "pygments_lexer": "ipython3",
271
+ "version": "3.12.2"
 
 
 
 
 
272
  }
273
  },
274
  "nbformat": 4,