michahe
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Hallo,
ich suche eine "übersichtliche" Methode, um Textstrings auf "Reizworte" zu prüfen und das Ergebnis in einer Variablen zu speichern; die Textstrings als Beispiel:
Franz kam mit dem Auto
Bettina hatte einen ausgedehnten Spaziergang
Gehen ist eine gesund Art der Fortbewegung
Fritz nutzt ein neues Fahrrad Die Auswertung: String enthält Auto oder Fahrrad oder ..., Ergebnis = "FAHREN", String enthält Spaziergang oder Gehen, Ergebnis = "GEHEN". Die Liste der Reizworte ist deutlich länger, deshalb die Frage nach "übersichtlich". Danke, Michael
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | STIMULI = {
("Auto", "Fahrrad"): "FAHREN",
("Spaziergang", "Gehen"): "GEHEN",
}
s = """
Franz kam mit dem Auto
Bettina hatte einen ausgedehnten Spaziergang
Gehen ist eine gesund Art der Fortbewegung
Fritz nutzt ein neues Fahrrad
Fritz hat einen Platten, daher macht er einen Spaziergang mit seinem Fahrrad.
"""
for line in s.splitlines():
categories = set()
for words, category in STIMULI.items():
if any(word for word in words if word in line):
categories.add(category)
print(f"Zeile\n{line=}\nenthält Worte der Kategorien {', '.join(categories)}")
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Wow, vielen Dank!
Dein Code funktioniert(e), bis ich eine Erweiterung gemacht habe für ein Reizwort / eine Kategorie, die in der Liste nicht vorkommt; meine Änderung:
STIMULI = {
("Auto", "Fahrrad"): "FAHREN",
("Spaziergang", "Gehen"): "GEHEN",
("PYTHON", "BASH"): "PROGRAMMIEREN",
}
Nun ist "PROGRAMMIEREN" immer im Ergebnis mit dabei ...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Kann ich leider nicht nachvollziehen:
$ python3 << EOF
> STIMULI = {
("Auto", "Fahrrad"): "FAHREN",
("Spaziergang", "Gehen"): "GEHEN",
("PYTHON", "BASH"): "PROGRAMMIEREN",
}
s = """
Franz kam mit dem Auto
Bettina hatte einen ausgedehnten Spaziergang
Gehen ist eine gesund Art der Fortbewegung
Fritz nutzt ein neues Fahrrad
Fritz hat einen Platten, daher macht er einen Spaziergang mit seinem Fahrrad.
"""
for line in s.splitlines():
categories = set()
for words, category in STIMULI.items():
if any(word for word in words if word in line):
categories.add(category)
print(f"Zeile\n{line=}\nenthält Worte der Kategorien {', '.join(categories)}")
> EOF
Zeile
line=''
enthält Worte der Kategorien
Zeile
line='Franz kam mit dem Auto'
enthält Worte der Kategorien FAHREN
Zeile
line='Bettina hatte einen ausgedehnten Spaziergang'
enthält Worte der Kategorien GEHEN
Zeile
line='Gehen ist eine gesund Art der Fortbewegung'
enthält Worte der Kategorien GEHEN
Zeile
line='Fritz nutzt ein neues Fahrrad'
enthält Worte der Kategorien FAHREN
Zeile
line='Fritz hat einen Platten, daher macht er einen Spaziergang mit seinem Fahrrad.'
enthält Worte der Kategorien GEHEN, FAHREN
Eventuell hast du da noch etwas anderes verändert?
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Danke seahawk1986, Kann ich leider nicht nachvollziehen: ...
Eventuell hast du da noch etwas anderes verändert?
Klar, habe ich für meine Anwendung:
categories = set()
print(analyze_file)
for words, category in STIMULI.items():
if any(word for word in words if word in analyze_file):
categories.add(category)
print(categories)
print(len(categories))
und erhalte
Fahrrad Gehen 22.txt
{'GEHEN', 'FAHREN', 'PROGRAMMIEREN'}
3
Ratlos, Michael
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Wenn ich das richtig verstehe, enhält analyze-file nur den Dateinamen - die Datei musst du ja erst mal öffnen, bevor du mit ihr arbeiten - also z.B. wenn du für die komplette Datei schauen willst, ob Worte aus einer Kategorie vorkommen:
| categories = set()
print(analyze_file)
with open(analyze_file) as f:
content = f.read()
for words, category in STIMULI.items():
if any(word for word in words if word in content):
categories.add(category)
print(categories)
print(len(categories))
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Wenn ich das richtig verstehe, enhält analyze-file nur den Dateinamen
Ja, und genau die Dateinamen jeweils in analyze-file sollen geprüft werden. also z.B.
Fahrrad Gehen 22.txt
Fahrrad 33.xy
BASH 55.sh
Außerdem: Für mein analyze-file
Fahrrad Gehen 22.txt
liefert mein Code
{'GEHEN', 'FAHREN', 'PROGRAMMIEREN'}
also mit 'PROGRAMMIEREN' mehr als in der Variable steht ...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Zeig mal bitte das komplette Skript und wenn du ipython/Jupyter Notebook nutzt, starte im Zweifelsfall den Kernel mal neu.
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Danke seahawk1986, Zeig mal bitte das komplette Skript ...
Es funktioniert jetzt, ist aber extrem mysteriös: Ich habe
das System neu gestartet, keine Verbesserung. Eine anonymisierte (gekürzte) Version für Dich erstellt: Funktioniert richtig! Die originale .py geöffnet und den Text über die Zwischenablage in eine neue Datei neu.py kopiert, gestartet: Funktioniert richtig! kDiff auf beide Dateien angewendet: Ein (welcher?) Unterschied in der letzten (Leer-)Zeile. Die originale .py in Kate geöffnet, letzte Leerzeile gelöscht und neu hinzu, gespeichert, gestartet: Funktioniert richtig!
Keine Ahnung, was das Problem war ...
Leider doch nicht, sobald ich die STIMULI-Liste ergänze, kommt das Problem:
STIMULI = {
("Auto", "Fahrrad"): "FAHREN",
("Spaziergang", "Gehen"): "GEHEN",
("BASH", "PYTHON"): "PROGRAMMIEREN",
("XXX", "YYY"): "UNFUG",
}
STIMULI = {
("Auto", "Fahrrad"): "FAHREN",
("Spaziergang", "Gehen"): "GEHEN",
("BASH", "PYTHON"): "PROGRAMMIEREN",
("XXX", "YYY"): "UNFUG",
("ZZZ"): "UNSINN",
}
STIMULI = {
("Auto", "Fahrrad"): "FAHREN",
("Spaziergang", "Gehen"): "GEHEN",
("BASH", "PYTHON"): "PROGRAMMIEREN",
("XXX", "YYY"): "UNFUG",
("ZZZ"): "UNSINN",
("Laufen"): "LAUFEN",
}
Ich begreife es nicht ...
|
san04
Anmeldungsdatum: 19. Januar 2010
Beiträge: 1074
|
Moin, Diese Zeile
("Laufen"): "LAUFEN",
definiert als Dictionary-Key kein Tuple sondern einen String. Daher läuft diese Zeile
if any(word for word in words if word in line):
nicht durch die einzelnen Elemente des Tuples, sondern durch die des Strings, prüft also gegen die einzelnen enthaltenen Buchstaben (L, a, u, f, e, n). Das "e" z. B. findet sich in jeder deiner Beispielzeilen, daher ist die Zeile wahr und die Kategorie wird angehängt. Dein XXX, YYY, ZZZ Beispiel ist insofern unglücklich gewählt, als dass diese Buchstaben nicht so häufig im Deutschen vorkommen. Wenn Zacharias mit dem Auto gekommen wäre, sähe die Situation schon wieder anders aus und deine Version 2 gibt (im wahrsten Sinne) "UNSINN" aus 😉 Es sollte also funktionieren, wenn du im Falle von nur einem Wort das Tuple erzwingst, z. B. so:
("Laufen",): "LAUFEN", Bestimmt geht das noch eleganter, aber dann muss seahawk1986 nochmal ran ☺
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
san04 schrieb: Bestimmt geht das noch eleganter, aber dann muss seahawk1986 nochmal ran ☺
Wenn man keine Angst vor regulären Ausdrücken hat, könnte man das Problem auch mit https://docs.python.org/3/library/re.html angehen - also z.B.: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | #!/usr/bin/env python3
import re
STIMULI = {
re.compile("Auto|Fahrrad", re.I): "FAHREN",
re.compile("Spaziergang|Gehen", re.I): "GEHEN",
re.compile("BASH|PYTHON", re.I): "PROGRAMMIEREN",
re.compile("XXX|YYY", re.I): "UNFUG",
re.compile("ZZZ", re.I): "UNSINN",
re.compile("Laufen", re.I): "LAUFEN",
}
filenames = ["Fahrrad Gehen 22.txt", "Fahrrad 33.xy", "BASH 55.sh"]
categories = set()
for filename in filenames:
for term, category in STIMULI.items():
if (m:= term.search(filename)):
categories.add(category)
print(f"{filename=}: match={m[0]} {category=}")
print(categories)
print(len(categories))
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Danke san04, Diese Zeile
("Laufen"): "LAUFEN",
definiert als Dictionary-Key kein Tuple sondern einen String.
Jetzt verstehe ich wenigstens, warum meine Ergäznungen nicht funktioniert haben!
|