from _llm import LLM import fitz from _arango import arango from openai import OpenAI from pprint import pprint from print_color import * class Section: def __init__(self, type, page, filename="Förhörsprotokoll.pdf"): self.type = type self.filename = filename self.text = "" self.person = "" self.role = "" self.topic = "" self.date = "" self.start_page = page self.key = "" self.llm = LLM(chat=True) def add_to_arango(self): # prompt = f'Sammanfatta texten nedan: \n\n """{self.text[:7000]}""" \n\nSammanfattning:' # llm = LLM(chat=False) # self.summary = llm.generate(prompt) # print_green(self.summary) arango_doc = { "_key": self.key, "person": self.person, "role": self.role, "topic": self.topic, "date": self.date, "page": self.start_page, "text": self.text, "filename": self.filename, #"summary": self.summary, "name": self.name, } arango.db.collection(self.type).insert(arango_doc, overwrite_mode="update") print(f"Added {self.type} to ArangoDB with key {self.key}") def extract_interrogation(self, text): self.person = self.llm.generate( f'Kolla på texten nedan: \n\n """{text}""" \n\n Vem är förhörd? Namnet står ofta på formen "Efternamn, Förnamn". Jag vill att su ska svara på formen "Förnamn Efternamn"' ) number_of_names = len(self.person.split(' ')) if number_of_names != 2: first_name = self.llm.generate( f'Personens formella namn är alltså {self.person}. Om du kollar på själva föhörstexten, är personens förnamn (det som personen kallas för)? Svara bara med ett förnamn.' ) last_name = self.llm.generate( f'Och i efternamn?' ) self.name = f'{first_name} {last_name}' print_rainbow(self.person, '->', self.name) else: self.name = self.person self.role = self.llm.generate( f'Vem är {self.person}? Svara så kort som möjligt med titel eller beskrivning.' ) self.topic = self.llm.generate( f'Vad handlade förhöret om? Svara så kortfattat som möjligt.' ) self.date = self.llm.generate( f'När ägde förhöret rum? Svara på formen YYY-MM-DD' ) cursor = arango.db.aql.execute(f'for doc in interrogations filter doc.page == {self.start_page} return doc._key', count=True) if cursor.count() == 1: self.key = cursor.next() else: print_red("Could not find key") self.key = arango.fix_key_name(f"{self.person}_{self.date}_p.{self.start_page}") def extract_pm(self, text): self.person = self.llm.generate( f'Kolla på texten nedan: \n\n """{text}""" \n\n Vem är uppgiftslämnare? Svara på formen "Förnamn Efternamn" \n\nPM:' ) self.role = self.llm.generate( f'Kolla på texten nedan: \n\n """{text}""" \n\n Vem är {self.person}? Svara "None" om det inte framgår. \n\nTitel på person:' ) self.topic = self.llm.generate( f'Kolla på texten nedan: \n\n """{text}""" \n\n Vad handlade informationen om? Svara så kortfattat som möjligt. Svara "None" om det inte framgår. \n\Svar:' ) self.date = self.llm.generate( f'Kolla på texten nedan: \n\n """{text}""" \n\n När lämnades informationen? Svara på formen YYY-MM-DD \n\nDatum:' ) self.key = arango.fix_key_name(f"{self.person}_{self.date}_p.{self.start_page}") def new_interrogation(page, section): if section.text != "": section.add_to_arango() section = Section("interrogations", page.number) section.extract_interrogation(page.get_text()) return section def new_pm(page, section): if section.text != "": section.add_to_arango() section = Section("pms", page.number) section.extract_interrogation(page.get_text()) return section def is_new_interrogation(page_text, page): # Check if there is a new interrogation control_words_interrogation = [ "Förhörsdatum", "Förhör påbörjat", "Förhör avslutat", "Förhörssätt", "Typ av förhör", "Förhörsvittne", ] n_control_words_interrogation = 0 for word in control_words_interrogation: if word in page_text: n_control_words_interrogation += 1 if n_control_words_interrogation >= 2: print_purple('New interrogation', page) return True def is_new_pm(page_text, page): control_words_pm = [ "PM", "Uppgiften avser", "Upprättad av", "Sätt på vilket uppgift lämnats", "Uppgiftslämnare", ] n_control_words_pm = 0 for word in control_words_pm: if word in page_text: n_control_words_pm += 1 if n_control_words_pm >= 2: print_blue('New PM', page) return True # * Llama # Open the PDF file filename = "Förhörsprotokoll.pdf" area = fitz.Rect(0, 40, 520, 800) # To exlude the header doc = fitz.open(f"/home/lasse/mala/Förhörsprotokoll.pdf") section = Section("interrogations", 0) for page in doc.pages(9, len(doc) - 1): # Get the text from the page page_text = page.get_text("text") if is_new_interrogation(page_text, page): section = new_interrogation(page, section) area = fitz.Rect(0, 400, 520, 800) elif is_new_pm(page_text, page): # Check if there is a new PM area = fitz.Rect(0, 400, 520, 800) section = new_pm(page, section) else: # It's a "normal" page area = fitz.Rect(0, 40, 520, 800) # To exlude the header blocks = page.get_text("blocks", clip=area) for block in blocks: section.text += block[4] + "\n\n" new_interrogation(page, section)