Seite 1 von 1

Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 12:56
von Noranora
Hallo!
Ich möchte gerne eine Text datei einlesen und dort jeweils die einzelnen Sätze rausgeben lassen.
Dafür fange ich damit an, mit einem RegEx jeweils die letzten Worte in einem Satz zu finden.
mit re.sub würde ich jetzt gerne alle "!", "." und "?" und ":" durch "." ersetzen. Damit ich anschließend mit einer for Schleife nur noch nach "." suchen muss, damit mir alle Sätze angezeigt werden.

Bisher bin ich soweit:

Code: Alles auswählen

import re
def saetze():
        
    text= open("probecdu.txt") # liest den Inhalt der Datei
    inhalt= text.read()
    regex= r"\w*[.?!]+(?=\s)"
    if re.search (r"\w[.?!]+(?=\s)",inhalt):
        print (inhalt)

Das Problem ist, dass jetzt der komplette Text ausgegeben wid. Ich möchte aber lediglich die die Stellen, an denen ein Satzzeichen hinter einem Wort steht.

Wie kann ich das beheben?

Ich weiß, ich bin leider nicht so der Pro, aber dafür für jede Hilfe umso dankbarer!

LG

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 13:01
von snafu
Schau dir mal `re.findall()` an. Dein Pattern müsstest du dann natürlich so angeben, dass immer nur das jeweils relevante Wort abgelegt wird. Alternativ geht auch `re.finditer()`, welches genau so funktioniert, aber einen Iterator anstelle einer Liste liefert.

EDIT
Kleine Korrektur: `re.finditer()` liefert jeweils ein `MatchObject`, während `re.findall()` Strings in die resultierende Liste ablegt (bzw Tupel, falls mehrere Gruppen im Pattern angegeben werden).

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 13:17
von Noranora
Hallo! Ich brauche die Änderungen später aber dann in dem vollständige Text, mit .join() funktioniert die Umformung von Liste in den kompletten Text dann nicht mehr...?

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 13:22
von Sirius3
@Noranora: warum so umständlich? Warum suchst Du nicht gleich nach ganzen Sätzen?

Code: Alles auswählen

saetze = re.findall(".*?[.:!?]", text)

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 13:30
von Noranora
Super! Vielen, vieln Dank euch beiden! :)

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 13:31
von snafu
Vielleicht einfach mal die Doku bemühen. Ist etwas in dieser Art gemeint?

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 16:43
von Noranora
Hallo! Ja das geht auf jedenfall in die richtige Richtung, vor allem das mit den adverbs. Ich möchte sowas jedoch für Nomen und Verben im Deutschen machen. Irgendwie funktioniert es nicht so richtig

Code: Alles auswählen

import re
def saetze():
        
    text= open("probecdu.txt") # liest den Inhalt der Datei
    inhalt= text.read()
    sen= re.findall(".*?[.:!?]",inhalt) # findet alle Sätze im Text und packt sie in eine Liste!
    #print (sen)
    satzzahl=len(sen)
    for x in range (0,satzzahl):
        nomen=re.findall (r"^[A-Z][a-z]*",sen)
        verben_en=re.findall ("\w+en")
        verben_e=re.findall ("\w+t")
        verben_st=re.findall("\w+st")
        
        print (nomen)
        print (verben_en)
        print (verben_e)
        print (verben_st)

Weißt du was mein Fehler ist?

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:08
von Sirius3
@Noranora: Funktioniert nicht, ist eine ziemlich schlechte Fehlerbeschreibung. Was sind Deine Ausgangsdaten? Was erwartest Du? Was bekommst Du als Ergebnis? Und warum entspricht dies nicht Deinen Erwartungen?

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:12
von Noranora
Ich habe erwartet, dass mit den regExp die Nomen und Verben aus den Listenelementen ausgegeben werden...angezeigt wird mir jedoch folgendes:

Code: Alles auswählen

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    saetze()
  File "D:\DNJ\UNIVERSITÄT\WS14_15\Pojektseminar_Ttechnologie\python-datei.py", line 10, in saetze
    nomen=re.findall (r"^[A-Z][a-z]*",sen)
  File "C:\Python34\lib\re.py", line 206, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:21
von pillmuncher
@Noranora: Du möchtest nicht über eine Sequenz von Zahlen, sonder über eine von Sätzen iterieren. Tipp: Listen sind iterierbar.

Übrigens ist der reguläre Ausdruck für die Nomina falsch. Lies nochmal in der Doku nach, was ^ tut.

Und: So funktioniert linguistische Analyse nicht. Was zB. machst du mit Sätzen wie "Sehenden Auges liefen sie in ihr Verderben." Ist das "Sehenden" ein Nomen? Denn es beginnt ja mit einem Großbuchstaben. Oder ein Verb? Und ist "Verderben" hier ein Verb? Beide enden ja mit "en".

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:26
von Noranora
Hallo Pillmuncher! Hast du vielleicht eine Idee, wo ich das mit der llinguistischen Analyse nochmal nachlesen könnte, irgendein Skript oder so? suche mich schon überall wund, ich dachte mir schon, dass die Ausdrücke etwas vage sind, aber bin noch zu keiner besseren Lösung gekommen.:/

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:37
von pillmuncher
@Noranora: Meine erste Anlaufstelle wäre nltk. Computerlinguistik ist allerdings nicht trivial.

Welches Problem willst du denn tatsächlich lösen? Vielleicht gibt es ja einen einfacheren Weg.

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:38
von Noranora
Ich möchte einen Text einlesen lassen und jeweils das Nomen und das Verb eines Satzes angezeigt bekommen.

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:46
von Noranora
Ich habe gerade etwas von dem treetagger gelesen, kennst du dich damit aus Mir ist nämlich nicht so ganz klar, wie ich den in mein Pythonprogramm implementiere? Oder muss ich da mit der CommandoShell arbeiten?

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Donnerstag 21. Januar 2016, 17:54
von pillmuncher
Noranora hat geschrieben:Ich möchte einen Text einlesen lassen und jeweils das Nomen und das Verb eines Satzes angezeigt bekommen.
Es gibt Sätze mit mehreren Nonima und Verben. Die Nomina können im delben Kasus stehen, etwa bei Aufzählungen. Oder in verschiedenen, wenn das Verb zB. transitiv ist: "Peter wirft einen Stein". Verben können im Deutschen aus mehreren Worten bestehen: "Peter hat einen Stein geworfen". Deshalb nochmal: Was möchtest du tatsächlich? Alle Nomina und Verben? Oder nur alle Nomina in Subjektstellung und die dazugehörigen Verben? Stehen alle Verben im Präsens, oder gibt es auch welche im Perfekt/Plusquamperfekt? Was ist mit Partizipien? Was, wenn in der Subjektstellung kein Nomen steht, sondern ein Personalpronomen? zB: "Auf dem Oktoberfest tanzten wir auf dem Tisch" - hier ist das Subjekt des Satzes "wir". Wenn du ein paar Beispiele der zu analysierenden Sätze zusammen mit dem gewünschten Ergebnis zeigen könntest, könnte man evtl. mehr dazu sagen, wie man vorgehen müsste.

Re: Satzzeichen immer durch einen Punkt ersetzen

Verfasst: Freitag 22. Januar 2016, 09:00
von Noranora
Hallo!

Ich habe nun mal ein bisschen mit nltk rumprobiert...ich habe dabei mit Ipython Notebook gearbeitet und folgende Anweisungen:

Code: Alles auswählen

import nltk
datei= open("probe.txt")
inhalt=datei.read()
erst=nltk.corpus.PlaintextCorpusReader("probe.txt", ".*",encoding="utf-8")
deutsch=u("probe.txt")
tokenit= nltk.tokenize.WordPunctTokenizer().tokenize(deutsch)
print (tokenit)
text= word_tokenize(deutsch)
print (erst)


Jedoch bekomme ich dann nur zurück:

Code: Alles auswählen

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-21-e881663862ca> in <module>()
      3 inhalt=datei.read()
      4 erst=nltk.corpus.PlaintextCorpusReader("pressefertig.txt", ".*",encoding="utf-8")
----> 5 deutsch=u("pressefertig.txt")
      6 tokenit= nltk.tokenize.WordPunctTokenizer().tokenize(deutsch)
      7 print (tokenit)

NameError: name 'u' is not defined




u habe ich dort stehen, damit Umlaute wie ä ü ö und ß auch angezeigt werden können.

Weiter wollte ich dann mit

Code: Alles auswählen

nltk.FreqDist(text)
Die Vorkommen von den einzelnen Wörtern zählen lassen, jedoch funktioniert dies auch nicht so richtig.
Wichtiger ist aber, mit welcher Funktion könnte ich nun die Wortarten der einzelnen Wörter bestimmen?


Ich hoffe hier gibt es jemand, der sich ein bisschen besser auskennt als ich :/...LG