Satzzeichen immer durch einen Punkt ersetzen

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
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

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
Zuletzt geändert von Anonymous am Donnerstag 21. Januar 2016, 14:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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).
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

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...?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Noranora: warum so umständlich? Warum suchst Du nicht gleich nach ganzen Sätzen?

Code: Alles auswählen

saetze = re.findall(".*?[.:!?]", text)
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Super! Vielen, vieln Dank euch beiden! :)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht einfach mal die Doku bemühen. Ist etwas in dieser Art gemeint?
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

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?
Zuletzt geändert von Anonymous am Donnerstag 21. Januar 2016, 16:57, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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".
In specifications, Murphy's Law supersedes Ohm's.
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

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.:/
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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.
In specifications, Murphy's Law supersedes Ohm's.
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Ich möchte einen Text einlesen lassen und jeweils das Nomen und das Verb eines Satzes angezeigt bekommen.
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

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?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

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
Antworten