Namen aus einem Text extrahieren o. Named Entity Recogntion

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.
Uhrenmacher
User
Beiträge: 16
Registriert: Freitag 3. Oktober 2014, 12:00

@snafu, dann mache ich ganz sicher wieder irgendeinen dummen Fehler. :oops:

Ich hätte eine sehr simple Frage, die mich gerade zum Wahnsinn treibt:

Das ist ein Code um bestimmte Namen zu finden:

Code: Alles auswählen

for m in re.finditer("(?:Dr\.|med\.|Family)\s*([A-Z][a-z]+(?: [A-Z][a-z]+)?)", my_text):
    print '%02d-%02d: %s' % (m.start(), m.end(), m.group(1))
Der funktioniert soweit gut. Wie bekomme ich jetzt aber die Ausgabe in eine neue Liste? Die Ausgabe sieht so aus:

Code: Alles auswählen

74090-74112: Johannes Restnoan
87125-87138: Matheus
Jetzt möchte ich eine Liste, in der Johannes, Restnoan und Matheus drin stehen, damit ich mit dieser Namensliste später weiterarbeiten kann.
Meine Lösungsansätze scheinen lächerlich zu sein:

Code: Alles auswählen

neue_list = m.group(1)
#oder etwas in der Richtung:
lst = []
for i in m.group(1):
    lst.append(i)
print lst.append(i)
Was natürlich alles nichts bringt. Bei neue_list bekomme ich lediglich Johannes, bei anderen nichts... :roll:
BlackJack

@Uhrenmacher: Das was Du im ersten Beispiel *ausgibst* möchtest Du in einer Liste haben? Dann solltest Du vielleicht an der Stelle wo Du etwas augibst, das was Du ausgibst an eine Liste anhängen. Dann hast Du hinterher all das was ausgegeben wurde, in einer Liste.
Uhrenmacher
User
Beiträge: 16
Registriert: Freitag 3. Oktober 2014, 12:00

Code: Alles auswählen

for m in re.finditer("(?:Dr\.|med\.|Familie|Herzog|Frau|Herr|Fräulein|Tante|Onkel|sagte|schrie|hauchte|raunte|Bruder|Schwester|Verwandte|Professor|Doktor|dachte|fühlte|sprach|Vater|Mutter)\s*([A-Z][a-z]+(?: [A-Z][a-z]+)?)", raw_text):
        newlist = '%02d-%02d: %s' % (m.start(), m.end(), m.group(1))
        print newlist
Meinst Du so etwas in der Richtung? Da bekomme ich irgendwie immer nur die erste Zeile ausgegeben, und zwar nur "113782-113795: Johannes". Ich habe da doch irgendwo einen Denkfehler drin?!

Ich habe das mit den Ausgaben und der Weiterverarbeitung noch nicht so ganz verstanden. Irgendwie scheitere ich ständig daran wie ich den output weiterverarbeiten kann. Ich habe mir noch einmal die input-output Dokumentation von python.org angeschaut, aber ich komm einfach nicht drauf. :?
BlackJack

@Uhrenmacher: `newlist` ist ein falscher Name weil das keine Liste ist. Du musst an der Stelle das Teilergebnis an eine Liste anhängen. Wenn Du da immer nur eine Zuweisung machst, dann wird der Name ja in jedem Schleifendurchlauf an einen neuen Wert gebunden und der alte wird dabei natürlich ”vergessen”.

Ausgaben gehen aus dem Programm raus, die werden angezeigt oder in eine Datei weggeschrieben und stehen Dir im Programm nicht mehr zur Verfügung. Das heisst Du muss im Programm dafür sorgen das die Sachen die Du später im Programm noch brauchst in einer geeigneten Datenstruktur aufgehoben werden. Und die Daten selbst auch in einer geigneten Form. Also zum Beispiel die Daten von einem Treffer nicht in einer Zeichenkette sondern als Tupel, falls man diese Daten später noch mal einzeln benötigt. Dann will man ja nicht wieder anfangen irgendwelche selbst erstellten Zeichenketten zu zerlegen.
Uhrenmacher
User
Beiträge: 16
Registriert: Freitag 3. Oktober 2014, 12:00

BlackJack hat geschrieben:@Uhrenmacher: `newlist` ist ein falscher Name weil das keine Liste ist. Du musst an der Stelle das Teilergebnis an eine Liste anhängen. Wenn Du da immer nur eine Zuweisung machst, dann wird der Name ja in jedem Schleifendurchlauf an einen neuen Wert gebunden und der alte wird dabei natürlich ”vergessen”.
Das erklärt warum ich nur das letzte Johannes bekomme! Danke!
BlackJack hat geschrieben:Ausgaben gehen aus dem Programm raus, die werden angezeigt oder in eine Datei weggeschrieben und stehen Dir im Programm nicht mehr zur Verfügung. Das heisst Du muss im Programm dafür sorgen das die Sachen die Du später im Programm noch brauchst in einer geeigneten Datenstruktur aufgehoben werden. Und die Daten selbst auch in einer geigneten Form. Also zum Beispiel die Daten von einem Treffer nicht in einer Zeichenkette sondern als Tupel, falls man diese Daten später noch mal einzeln benötigt. Dann will man ja nicht wieder anfangen irgendwelche selbst erstellten Zeichenketten zu zerlegen.
Das mit den Tupel schaue ich mir gerade noch einmal genauer an. So langsam fange ich an sie zu verstehen, hoffentlich.

Kannst Du mir evtl. noch einen Hinweis in Form eines Schlagwortes oder ähnliches geben, was ich in dieser dritten Zeile ändern muss, um eine Liste zu bekommen mit der ich weiterarbeiten kann? Ich habe das doch richtig verstanden, dass ich in dieser dritten Zeile etwas ändern muss?
BlackJack

@Stephan: Das Stichwort ist wohl ”anhängen” auf Englisch zu übersetzen. Wie man mit einer Schleife eine Liste mit Inhalt füllt sollte eigentlich in jedem Grundlagentutorial vorkommen. Listen und deren Methoden sollten ”sitzen”, das sind sozusgaben Basisvokabeln.
Uhrenmacher
User
Beiträge: 16
Registriert: Freitag 3. Oktober 2014, 12:00

Okay, Danke.
Ich bekomme es zwar weiterhin nicht hin und finde kein Tutorial das mir da weiterhilft, aber meine Nerven liegen blank was diese eine Zeile angeht. Vielleicht finde ich eine Möglichkeit das alles zu umgehen.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@Uhrenmacher: da Listoperationen so etwas grundlegendes sind, wirst Du kaum sinnvoll mit Python arbeiten können, wenn Du jedesmal, wenn Listen benötigt werden eine Umgehung suchst.
Uhrenmacher
User
Beiträge: 16
Registriert: Freitag 3. Oktober 2014, 12:00

@Sirius3

Ich habe ja erst vor wenigen Wochen mit Python angefangen. Ich kann Listen erstellen, Listen zusammenfügen, mit Listen spielen. Nur finde ich keine Möglichkeit, Zeile drei in eine Liste zu packen. Ich weiß, dass es nur eine kleine Kleinigkeit ist, und wenn ich dann irgendwann drauf stoße, ich mir mit der flachen Hand auf die Stirn schlagen werde, aber momentan finde ich einfach keine Lösung dafür. Wie gesagt, ich bin noch ganz am Anfang, da ist es sicher normal, dass man an Kleinigkeiten verzweifelt, obwohl sie zum Basiswissen gehören.

Ich habe jetzt viele Tutorials mit Listen durch, aber ich finde einfach nicht was ich brauche. :K
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

sowas:

Code: Alles auswählen

names = []
for m in re.finditer("(?:Dr\.|med\.|Familie|Herzog|Frau|Herr|Fräulein|Tante|Onkel|sagte|schrie|hauchte|raunte|Bruder|Schwester|Verwandte|Professor|Doktor|dachte|fühlte|sprach|Vater|Mutter)\s+([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)", raw_text):
        names.append((m.start(), m.end(), m.group(1)))
Uhrenmacher
User
Beiträge: 16
Registriert: Freitag 3. Oktober 2014, 12:00

@Sirius3

Das gibts doch nicht! Vielen Dank!
Ich hatte es verdammt noch einmal damit versucht, allerdings hatte ich nicht noch die eine "extra" Klammer drum rum! Ich hatte nur "neue_liste.append(m.start(), m.end(), m.group(1))" und da habe ich natürlich eine Fehlermeldung bekommen. Meine Güte!

/Edit
Es hat mich wieder ein paar Minuten gekostet, aber jetzt habe ich sogar verstanden, warum da noch einmal eine Klammer rum musste.
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

Hallo Kollegen!

ich habe ein ähnliches Problem.
Ich bin zwar mit den Python-HOWTOs und den Beiträgen dieses Forums schon in die Nähe der Lösung gekommen, aber eben nicht ganz.

Hintergrund:
Ich möchte von einer Webseite einen Wert auslesen. (Soweit - sogut)

Dazu habe ich mit BeautifulSoup und RE den Inhalt eingelesen und als Str-Text in eine Variable gespeichert. Das klappt sogar. :wink:
Nun interessiert mich aber nicht der ganze Text, sondern nur eine Zeile. Die Zeile hat sogar einen Wert, mit der man sie identifizieren kann.

Der Text sieht prinzipiell wie folgt aus:

<4710;<Text_1>;<Text_2>;<Wert_1>;<Text_3>;<Wert_2>;<Text_4>;...usw.
<4711 - eindeutiger Identifier in Form einer Ziffernfolge>;<Text_1>;<Text_2>;<Wert_1>;<Text_3>;<Wert_2>;<Text_4>;...usw.
<4712;<Text_1>;<Text_2>;<Wert_1>;<Text_3>;<Wert_2>;<Text_4>;...usw.


Die Zeile in dem die 4711 vorkommt interessiert mich. Von dort möchte ich die Werte 1 und 2 speichern.
Ich komme aber irgendwie nicht dran.
Mit den REs kann ich nur die 4711 eingrenzen, ich möchte aber nur die beiden Werte, oder zumindest die ganze Zeile.

Hat jemand vielleicht eine Idee?

Vielen Dank und beste Grüße
U32
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht einen 5-jahre alten Thread fleddern. Stell bitte eine neue Frage. Und die Chancen auf Antwort erhoehen sich deutlich, wenn die gezeigten HTML-Schnipsel den echten entsprechen, und nicht etwas, das irgendwie paraphrasiert ist. Denn so wie das da aussieht kann ich mir *SEHR* schwer vorstellen, dass das irgendwer ausliefert. Denn ein Browser muss das ja auch noch anzeigen koennen, und das da ist kein HTML.
Antworten