Detektor Wahrnehmungsart

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Liebes Forum,
ich arbeite an einem Detektor, der aus echtsprachlichen Sätzen die Wahrnehmungsart filtern und durch w1() für "optisch", w2() für "akustisch", w3() für "riechen", w4() für "tasten" und w5() für "schmecken" ersetzen soll.

Code: Alles auswählen

import re

sight_words = set(["sehen", "sehe", "siehst", "sieht", "seht", "gesehen", "sah", "sahst", "saht", "sahen", "erspähen", "erspähe", "erspähst", "erspäht", "erspähte", "erspähtest", "erspähten", "erspähtet", "spähen", "spähe", "spähst", "späht", "spähte", "spähtest", "spähten", "spähtet", "bemerken", "bemerke", "bemerkst", "bemerkt", "bemerkte", "bemerktest", "bemerkten", "bemerktet", "entdecken", "entdecke", "entdeckst", "entdeckt", "entdeckte", "entdecktest", "entdecktet", "entdeckten", "erblicken", "erblicke", "erblickst", "erblickt", "erblickte", "erblicktest", "erblicktet", "erblickten", "gewahren", "gewahre", "gewahrst", "gewahrt", "gewahrte", "gewahrtest", "gewahrten", "gewahrtet", "schauen", "schaue", "schaust", "schaut", "schaute", "schautest", "schauten", "schautet", "geschaut", "sichten", "sichte", "sichtest", "sichtet", "sichtete," "sichtetest", "sichteten", "sichtetet", "gesichtet" ])

hearing_words = set(["hören", "höre", "hörst", "hört", "hörte", "hörtest", "hörte", "hörten", "hörtet", "gehört", "Gehör", "lausche", "lauschst", "lauscht", "lauschen", "gelauscht", "lauschte", "lauschtest", "lauschten", "lauschtet", "horche", "horchst", "horcht", "horchen", "horchte",  "horchtest", "horchten", "horchtet", "gehorcht", "Ohren", "vernehme", "vernehmst", "vernimmst", "vernimmt", "vernehmt", "vernehmen", "vernahm", "vernahmst", "vernahmen", "vernahmt", "vernommen"  ])

smell_words = set(["riechen", "rieche", "riechst", "riecht", "roch", "rochst", "rochen", "rocht", "gerochen", "schnuppern", "schnuppere", "schnupperst", "schnuppert", "schnupperte", "schnuppertest", "schnuppertet", "schnupperten", "geschnuppert"])

touch_words = set(["tasten", "taste", "tastest", "tastet", "getastet", "tastete", "tastetest", "tasteten", "tastetet", "fühlen", "fühle", "fühlst", "fühlt", "gefühlt", "fühlte", "fühltest", "fühlten", "fühltet", "greife", "greifst", "greift", "begreifen", "begriffen", "begriff", "begriffst", "begrifft"])

taste_words = set(["schmecken", "schmecke", "schmeckst", "schmeckt", "schmeckte", "schmecktest", "schmeckten", "geschmeckt"])

# Hauptteil des Programms
sentence = input("Bitte geben Sie einen Satz ein: ")
words = sentence.split()

for i in range(len(words)):
    word = words[i].strip(".,!?:;")  # Entfernen Sie Zeichen am Ende des Wortes
    if word in sight_words:
        words[i] = re.sub(r'\b{}\b'.format(word), 'sight', words[i])
    elif word in hearing_words:
        words[i] = re.sub(r'\b{}\b'.format(word), 'hearing', words[i])
    elif word in smell_words:
        words[i] = re.sub(r'\b{}\b'.format(word), 'smell', words[i])
    elif word in touch_words:
        words[i] = re.sub(r'\b{}\b'.format(word), 'touch', words[i])
    elif word in taste_words:
        words[i] = re.sub(r'\b{}\b'.format(word), 'taste', words[i])

sentence = " ".join(words)
print(sentence)
Das klappt auch soweit ganz gut, aber aus irgendeinem Grund hängt mir das Programm an die geschlossene Klammer den letzten Buchstaben des gefundenen Wortes. Beispiel: "Bitte geben Sie einen Satz ein: Ich sehe das Auto. FALSCHES Ergebnis: "Ich w1()e das Auto." RICHTIG sollte es heißen: "Bitte geben Sie einen Satz ein: Ich sehe das Auto.
Ich w1() das Auto." Halt ohne das angehängte "e", das von "sehe" stammt.

Leider komme ich nicht drauf, wo der Fehler liegen könnte. Seht ihr was?
1000 Dank im Voraus
von

Andreas
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Andreas22: Der Beitragstext und das Programm passen nicht zusammen. Da steht nichts von irgendwelchen w<nummer>(). Testlauf:

Code: Alles auswählen

Bitte geben Sie einen Satz ein: Ich sehe das Auto.
Ich sight das Auto.
In `sight_words` ist übrigens ein Fehler, da ist einmal ein Komma *in* eine Zeichenkette gerutscht und es stehen zwei Zeichenketten direkt hintereinander. Das ist gültige Python-Syntax — der Compiler verbindet die dann einfach zu einer Zeichenkette — aber inhaltlich ist das hier sicher nicht gewollt. Hat den Fehler schon ChatGPT gemacht, oder hast Du den eingebaut?

``for i in range(len(sequence):`` ist in Python ein „anti pattern“. Man kann direkt über die Elemente der Sequenz/Liste iterieren, ohne den Umweg über einen Laufindex. Man würde auch nicht die bestehende Liste verändern, sondern einfach eine neue aufbauen, mit den geänderten Werten. Oder man schreibt den Code so um, dass man `str.join()` einen Generator übergibt, ohne das man selbst nochmal eine Liste hat. Dieses `re.sub()`-Konstrukt ist unsinnig, denn wenn das Wort in einer der Mengen vorkommt, dann wird das `re.sub()` immer das Wort ersetzen — dafür braucht man dann aber überhaupt keine Ersetzung, sondern man nimmt dann einfach ohne irgendeinen Umweg das entsprechende Wort. Was einen dann dazu führt, dass man einfach ein Wörterbuch von *_word auf das jeweilige Ersatzwort aufbauen kann.

Äquivalentes, effizienteres Programm ohne unsinnigen `re`-Einsatz:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    word_to_whatever = {}
    for whatever, words in [
        (
            "sight",
            [
                "sehen",
                "sehe",
                "siehst",
                "sieht",
                "seht",
                "gesehen",
                "sah",
                "sahst",
                "saht",
                "sahen",
                "erspähen",
                "erspähe",
                "erspähst",
                "erspäht",
                "erspähte",
                "erspähtest",
                "erspähten",
                "erspähtet",
                "spähen",
                "spähe",
                "spähst",
                "späht",
                "spähte",
                "spähtest",
                "spähten",
                "spähtet",
                "bemerken",
                "bemerke",
                "bemerkst",
                "bemerkt",
                "bemerkte",
                "bemerktest",
                "bemerkten",
                "bemerktet",
                "entdecken",
                "entdecke",
                "entdeckst",
                "entdeckt",
                "entdeckte",
                "entdecktest",
                "entdecktet",
                "entdeckten",
                "erblicken",
                "erblicke",
                "erblickst",
                "erblickt",
                "erblickte",
                "erblicktest",
                "erblicktet",
                "erblickten",
                "gewahren",
                "gewahre",
                "gewahrst",
                "gewahrt",
                "gewahrte",
                "gewahrtest",
                "gewahrten",
                "gewahrtet",
                "schauen",
                "schaue",
                "schaust",
                "schaut",
                "schaute",
                "schautest",
                "schauten",
                "schautet",
                "geschaut",
                "sichten",
                "sichte",
                "sichtest",
                "sichtet",
                "sichtete",
                "sichtetest",
                "sichteten",
                "sichtetet",
                "gesichtet",
            ],
        ),
        (
            "hearing",
            [
                "hören",
                "höre",
                "hörst",
                "hört",
                "hörte",
                "hörtest",
                "hörte",
                "hörten",
                "hörtet",
                "gehört",
                "Gehör",
                "lausche",
                "lauschst",
                "lauscht",
                "lauschen",
                "gelauscht",
                "lauschte",
                "lauschtest",
                "lauschten",
                "lauschtet",
                "horche",
                "horchst",
                "horcht",
                "horchen",
                "horchte",
                "horchtest",
                "horchten",
                "horchtet",
                "gehorcht",
                "Ohren",
                "vernehme",
                "vernehmst",
                "vernimmst",
                "vernimmt",
                "vernehmt",
                "vernehmen",
                "vernahm",
                "vernahmst",
                "vernahmen",
                "vernahmt",
                "vernommen",
            ],
        ),
        (
            "smell",
            [
                "riechen",
                "rieche",
                "riechst",
                "riecht",
                "roch",
                "rochst",
                "rochen",
                "rocht",
                "gerochen",
                "schnuppern",
                "schnuppere",
                "schnupperst",
                "schnuppert",
                "schnupperte",
                "schnuppertest",
                "schnuppertet",
                "schnupperten",
                "geschnuppert",
            ],
        ),
        (
            "touch",
            [
                "tasten",
                "taste",
                "tastest",
                "tastet",
                "getastet",
                "tastete",
                "tastetest",
                "tasteten",
                "tastetet",
                "fühlen",
                "fühle",
                "fühlst",
                "fühlt",
                "gefühlt",
                "fühlte",
                "fühltest",
                "fühlten",
                "fühltet",
                "greife",
                "greifst",
                "greift",
                "begreifen",
                "begriffen",
                "begriff",
                "begriffst",
                "begrifft",
            ],
        ),
        (
            "taste",
            [
                "schmecken",
                "schmecke",
                "schmeckst",
                "schmeckt",
                "schmeckte",
                "schmecktest",
                "schmeckten",
                "geschmeckt",
            ],
        ),
    ]:
        word_to_whatever.update((word, whatever) for word in words)

    print(
        " ".join(
            word_to_whatever.get(word.strip(".,!?:;"), word)
            for word in input("Bitte geben Sie einen Satz ein: ").split()
        )
    )


if __name__ == "__main__":
    main()
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Benutzeravatar
Kebap
User
Beiträge: 696
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Welches Problem wolltest du denn eigentlich lösen?
Warum brauchst du (in einem Zwischenschritt?) einen Satz wie "Ich w1() das Auto"?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Ich bin eigentlich Autor und arbeite schon länger an einer Fusion von K.I.-Modulen mit Literatur. Dafür habe ich ABEL konzipiert, eine Abstraktionssprache, die aus echtsprachlichen Sätzen das herausziehen soll, was ich für das Wichtigste halte. So sollen u.a. meine Romane irgendwann als Formel-Konvolut vorliegen, um sie besser maschinenlesbar zu machen.
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Aber will man da wieder platten Text heraus bekommen? Doch eigentlich nicht, denn den muss man dann ja wieder parsen und hat Mehrdeutigkeiten. Ich kann mir nicht vorstellen, dass es da nicht schon Formate, zum Beispiel XML-basiert, von den Leuten gibt, die sich mit natürlicher Sprache beschäftigen, um Texte mit Metainformationen zu annotieren, so dass man den Ursprungstext und die Annotationen hat, und die auch jederzeit wieder sauber trennen kann.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Selbstverständlich gibt es Dinge in dieser Richtung, beispielsweise SALSA der Computerlinguisten um Prof. Pinkal in Saarbrücken. Da fehlt mir aber vieles, deshalb habe ich meine eigene Abstraktionssprache (ABEL) konzipiert, die ich jetzt umzusetzen versuche. Die soll, wie gesagt, Formeln ausgeben. Ein Satz wie "Ich w1() das Auto" ist da nur eine Zwischenstufe. Mein Versuch oben war nur der Detektor für die "Wahrnehmungsart". Es gibt aber noch viele andere Detektoren, die über 40 weitere ABEL-Zeichen und deren Kombinationen umsetzen. Beispielsweise wird die "Oben-unten-Relation" einfach durch einen Bruchstrich angegeben. Im Zähler steht dann, was oben ist, im Nenner, was unten ist. Soweit selbsterklärend. Versieht man den Bruchstrich mit dem Abstraktionszeichen "^", hat man es mit Hierarchien zu tun. Wird in einem Chat z.B. gesagt: "Opa war 1942 unter General Rommel in Afrika." würde die Hierarchie so notiert "^Rommel/Opa(1942/Afrika)" Bei der Nachfrage "Wer war eigentlich der Chef meines Großvaters in Afrika." würde das in der Formel notiert "^X/Opa(y/Afrika)" und könnte nach X aufgelöst werden. Will man das zur Entwicklung eines Traumes nutzen, macht man einfach das, was Träume immer machen, nämlich Ent-Abstrahieren. Man löscht also das Abstraktionszeichen "^" und hat wieder eine oben-unten-Struktur, die es erlaubt, Rommel und den Großvater darin eine Bergtour machen zu lassen. An der Stelle geht halt der Autor mit mir durch :)
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Andreas22: Formel ist halt für mich etwas eindeutiges und das was Du da beschreibst ist das nicht. Das würde ja aus "Ich sehe das w1() in dem Beispielsatz" die ”Formel” "Ich w1() das w1() in dem Beispielsatz" machen. Und das bei "^X/Opa(y/Afrika)" X und y Variablen sind, Opa und Afrika aber nicht, kann man ja auch nicht eindeutig erkennen.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Ich denke, man muss den Ausdruck "Formel" nicht zwingend streng mathematisch sehen. Prof. Benzmüller, der sich unter anderem am DFKI und der FU mit K.I. und Logik beschäftigt, bezeichnet ABEL als spezielle Form der Prädikatenlogik. Ich baue das Ganze einfach mal zusammen und wenn mir alles um die Ohren fliegt, werde ich schon sehen, was ich da über Jahre für einen Kappes gemacht habe.
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Egal wie man das sieht, wenn die Notation mehrdeutig ist, wird die maschinelle Verarbeitung halt schwierig bis unmöglich. Man kann auf Daten die eine Struktur haben, nicht einfach auf flachen Zeichenketten mit suchen & ersetzen operieren. Und man braucht Syntax um Schlüsselworte und Operatoren eindeutig von Werten unterscheiden zu können. Und wenn die Werte beliebige Texte sein können, also auch Texte über ABEL selbst, kann man auch nicht sagen das da zwei unterschiedliche Alphabete verwendet werden. Zumal so Sachen wie "/" und runde Klammern ja durchaus auch schon in ganz normalen Texten vorkommen. Da muss man ja noch nicht mal die Meta-Ebene aufmachen, dass man mit ABEL auch Texte die ABEL als Thema haben, verarbeiten können sollte.

ABEL ist als Name übrigens schon mal belegt mit einer Sprache die sich mit Logik beschäftigt: https://de.wikipedia.org/wiki/Advanced_ ... n_Language
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Grundsätzlich sind das sehr berechtigte Fragen. Ich habe mir schon deshalb früh Gedanken zu einer Abgrenzung von Echtsprache und ABEL gemacht, weil ich bewusst die Zeichen nutzbar machen wollte, die auf dem Keyboard zu finden sind. Ist innerhalb eines in ABEL geschriebenen Textes ein tatsächliches "geteilt durch-Zeichen" gemeint, muss das Zeichen deshalb in Anführungszeichen stehen. Auch werden die gewonnenen ABEL-Zeichen dann in eine Struktur eingefügt, die sich bewusst um Einfachheit bemüht und zum Beispiel die SPO-Regel beinhaltet, da im Deutschen z.B. die Satzzeichen ein wenig "driften". Vielen Dank für den Hinweis auf die Hardwarebeschreibungs-Sprache ABEL. Ich habe schon davon gehört und hoffe, "mein" ABEL geht schon deshalb als Homonym durch, als das "alte" kaum noch in Gebrauch ist.
nezzcarth
User
Beiträge: 1650
Registriert: Samstag 16. April 2011, 12:47

Andreas22 hat geschrieben: Mittwoch 28. Juni 2023, 22:10 ich arbeite an einem Detektor, der aus echtsprachlichen Sätzen die Wahrnehmungsart filtern und durch w1() für "optisch", w2() für "akustisch", w3() für "riechen", w4() für "tasten" und w5() für "schmecken" ersetzen soll.
Das ist ein komplexes Thema, das vertiefte Fachkenntnisse erfordert, die man sich aneignen muss, wenn man es einigermaßen zufriedenstellend umsetzen möchte (wobei ich natürlich nicht weiß, was für dich "zufriedenstellend "ist :) ). Das mindeste, was ich vorschlagen möchte, ist, dass du wenigstens die Verwendung eines Lemmatizers in Erwägung ziehen solltest, um dir diese ganzen ausgeschriebenen Verbformen in den Listen zu ersparen. Die gängigen NLP-Bibliotheken (für Python) bringen so etwas in der Regel schon mit.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Keine Sorge, ich arbeite u.a. mit Computerlinguisten zusammen, um das Know-how einzufahren, das ich selbst nicht habe. Die sehen sich meine Vorschläge an, bevor sie an den Start gehen. Vielen Dank für die Anregung.
Antworten