about summary refs log tree commit diff stats
path: root/archive/2025/summer/bsc_gerg/src/knowledge/llm/extract.py
blob: 682b100df45fd6ef915ce238bbb57268a674b109 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import re
from typing import AsyncIterable

from src.terminology.event import TextExtracted, Event, TermExtracted, OccurrenceResolved
from src.terminology.terminology import TermExtractor

DEVELOPER_PROMPT: str = """
Du bist Experte für Terminologie und Fachbegriffe. 
Deine Aufgabe besteht darin, aus einem Text Begriffe, Abkürzungen und Phrasen zu extrahieren. 
Du extrahierst nur Terminologie, die wahrscheinlich in der Eisenbahn verwendet wird.
Du erkennst Abkürzungen und behällst sie unverändert bei. Nur wenn die vollständige Form vorhanden ist, fügst du sie in Klammern am Ende des Begriffs an.
Du extrahierst Phrasen und Wörter sowie verschachtelte Begriffe und deren Einzelteile.
Achte bei längeren Phrasen darauf, ob aus dem Text klar wird, dass es sich um einen besonderen Begriff handelt, der Wahrscheinlich verwendet wird.
Beginne mit den Begriffen, die am wahrscheinlichsten relevant sind.
Gib nur eine Liste von Begriffen zurück. Extrahiere nur Begriffe, die besonders für den Kontext "Eisenbahn" sind!
"""

EXAMPLE_USER: str = """
Input:
Du musst das Hauptsignal auf Fahrt stellen.
"""

OUTPUT_ASSISTANT: str = """
Output:
- Hauptsignal auf Fahrt stellen
- Hauptsignal
- auf Fahrt stellen
- Fahrtstellung eines Hauptsignals
"""

class LLMTermExtractor(TermExtractor):


    async def get_llm_response(self, text: str) -> str:
        pass

    async def activate(self, event: TextExtracted) -> AsyncIterable[Event]:
        source = self.blackboard.add_text_source(event.text)
        response = await self.get_llm_response(event.text)
        response = response.split("\n")
        terms = [candidate[2:] for candidate in response if candidate.startswith("-") or candidate.startswith("*")]

        for term in terms:

            variation_match = re.search(r"\(.+\)$", term)
            abbreviation = None

            if variation_match:
                variation = (variation_match.group(0)
                                .replace("(", "")
                                .replace(")", "")
                                .strip())
                term = term.replace(variation_match.group(0), "").strip()
                if len(variation) > len(term):
                    abbreviation = term
                    term = variation
                else:
                    abbreviation = variation
                    term = term

            t = self.blackboard.find_term(term_str=term)

            if t is None:
                t = self.blackboard.add_term(term=term)

            if abbreviation and not abbreviation in t.variations:
                t.variations.append(abbreviation)

            t.occurrences.append(source.id)
            yield TermExtracted(term=t)
            yield OccurrenceResolved(term=t, source=source)