You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
6.0 KiB

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)