NicolasGaudemet commited on
Commit
9a98211
1 Parent(s): 61e5603

Update summarizer_app.py

Browse files
Files changed (1) hide show
  1. summarizer_app.py +47 -43
summarizer_app.py CHANGED
@@ -1,70 +1,74 @@
1
  import os
2
  import json
3
- from langchain import OpenAI, PromptTemplate, LLMChain
 
4
  from langchain.chat_models import ChatOpenAI
 
5
  from langchain.text_splitter import CharacterTextSplitter
6
- from langchain.chains.mapreduce import MapReduceChain
7
  from langchain.prompts import PromptTemplate
8
- from langchain.docstore.document import Document
9
  from langchain.chains.summarize import load_summarize_chain
10
  import gradio as gr
11
 
12
  #chargement des paramètres
13
  with open("parametres.json", "r") as p:
14
  params = json.load(p)
15
- taille_max_texte = params["taille_max_texte"]
16
- taille_resume = params["taille_resume"]
17
- modele = params["modele"]
18
- chunk_size = params["taille_chunks"]
19
- chunks_max = taille_max_texte*2//chunk_size
20
 
21
- #définition du LLM
22
- llm = ChatOpenAI(model_name="gpt-3.5-turbo", max_tokens = taille_resume, temperature=0, openai_api_key = os.environ['OpenaiKey'])
23
- #llm = OpenAI(model_name = modele, max_tokens = taille_resume, temperature=0, openai_api_key = os.environ['OpenaiKey'])
24
 
25
- #résumé d'un texte
 
 
 
 
 
 
 
 
26
 
27
- def summarize_text(text_to_summarize, llm):
28
-
29
- #préparation du texte
30
- text_splitter = CharacterTextSplitter(chunk_size=chunk_size)
31
- texts = text_splitter.split_text(text_to_summarize)
32
- docs = [Document(page_content=t) for t in texts[:chunks_max]]
 
 
 
 
 
33
 
34
  #résumé
35
- prompt_template = """Write a summary of the following:
36
- {text}""" + f"""
37
- Make sure the length of the summary you write is higher than {taille_resume//2} words and lower than {taille_resume//1.5} words.
38
- Make also sure that it is in the same langage than the original text.
39
- SUMMARY:"""
40
  summary_langage_prompt = PromptTemplate(template=prompt_template, input_variables=['text'])
41
- #summary_langage_prompt.format(taille=f"{summary_length}")
42
  chain = load_summarize_chain(llm, chain_type="map_reduce", return_intermediate_steps=True, map_prompt=summary_langage_prompt, combine_prompt = summary_langage_prompt)
43
- steps = chain({"input_documents": docs}, return_only_outputs=True)
44
-
45
- print(len(steps['intermediate_steps']))
46
- print(steps['intermediate_steps'])
47
-
48
- return steps['output_text']
49
 
50
- # Lecture et résumé d'un fichier texte
 
51
 
52
- def summarize_uploaded_file(file):
53
- if not file.name.endswith('.txt'):
54
- return ("Le fichier doit être un fichier texte (.txt)")
55
- with open(file.name, "r", encoding = "latin-1") as f:
56
- text = f.read()
57
- summary = summarize_text(text, llm)
58
- return summary
59
 
60
  # Création de l'interface Gradio
61
 
62
  iface = gr.Interface(
63
- fn=summarize_uploaded_file,
64
- inputs="file",
65
- outputs=gr.outputs.Textbox(label="Résumé"),
66
- title="Long Text Summarizer",
67
- description="par Nicolas \nRésume un long fichier texte",
 
 
 
 
 
 
 
 
68
  allow_flagging = "never")
69
 
70
  # Lancer l'interface
 
1
  import os
2
  import json
3
+ import openai
4
+ from langchain.document_loaders import PDFMinerLoader, UnstructuredURLLoader
5
  from langchain.chat_models import ChatOpenAI
6
+ from langchain import PromptTemplate, LLMChain
7
  from langchain.text_splitter import CharacterTextSplitter
 
8
  from langchain.prompts import PromptTemplate
 
9
  from langchain.chains.summarize import load_summarize_chain
10
  import gradio as gr
11
 
12
  #chargement des paramètres
13
  with open("parametres.json", "r") as p:
14
  params = json.load(p)
15
+ max_pages = params["max_pages"]
 
 
 
 
16
 
17
+ def summarize(taille_resume, Document, url):
 
 
18
 
19
+ # loads a PDF document
20
+ if not Document and not url:
21
+ return "Merci de fournir un document PDF ou lien vers un site web"
22
+ elif not Document:
23
+ loader = UnstructuredURLLoader(urls = [url])
24
+ elif not Document.name.endswith('.pdf'):
25
+ return ("Merci de fournir un document PDF")
26
+ else:
27
+ loader = PDFMinerLoader(Document.name) #PyPDFLoader créerait des pages trop petites (ex : 1 mot par page si ca vient d'un Ppt)
28
 
29
+ docs = loader.load()
30
+
31
+ #préparation du texte
32
+ text_splitter = CharacterTextSplitter(separator = "\n", chunk_size=5000)
33
+ docs = text_splitter.split_documents(docs)
34
+ print(str(len(docs)) + " pages pour un maximum de " + str(max_pages))
35
+
36
+ chunked_docs = docs[:int(max_pages/3)]
37
+
38
+ #définition du LLM
39
+ llm = ChatOpenAI(model_name="gpt-3.5-turbo", max_tokens = taille_resume*2.2, temperature=0, openai_api_key = os.environ['OpenaiKey'])
40
 
41
  #résumé
42
+ prompt_template = f"""Écris un résumé structuré et détaillé du document délimité par des triples accents graves.
43
+ ASSURE-TOI que la longueur de ce résumé soit supérieure à {int(taille_resume/1.5)} mots et inférieure à {int(taille_resume*1.5)} mots.
44
+ ASSURE-TOI AUSSI, C'EST LE PLUS IMPORTANT que la dernière phrase de ton résumé soit complète et se termine par un point.
45
+ AJOUTE ENFIN le signe " |" après ce point final.
46
+ """ + """DOCUMENT : ```{text}```"""
47
  summary_langage_prompt = PromptTemplate(template=prompt_template, input_variables=['text'])
 
48
  chain = load_summarize_chain(llm, chain_type="map_reduce", return_intermediate_steps=True, map_prompt=summary_langage_prompt, combine_prompt = summary_langage_prompt)
49
+ steps = chain({"input_documents": chunked_docs}, return_only_outputs=True)
 
 
 
 
 
50
 
51
+ summary = steps['output_text']
52
+ summary = summary + " " + str(len(summary.split())) + " mots"
53
 
54
+ return summary
 
 
 
 
 
 
55
 
56
  # Création de l'interface Gradio
57
 
58
  iface = gr.Interface(
59
+ fn=summarize,
60
+ inputs=[gr.Slider(
61
+ minimum=100,
62
+ maximum=500,
63
+ label="Taille indicative en mots",
64
+ value=100,
65
+ step=50),
66
+ "file",
67
+ gr.Textbox(label="Ou copier le lien")
68
+ ],
69
+ outputs=[gr.Textbox(label="Résumé")],
70
+ title="Document Summarizer",
71
+ description="par Nicolas \nRésume un PDF ou un site web",
72
  allow_flagging = "never")
73
 
74
  # Lancer l'interface