Satz mit bestimmter Länge aus Text extrahieren

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.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

sparrow hat geschrieben: Montag 1. August 2022, 21:12 Wenn natürlich nachträglich Dinge gemacht werden sollen ist das möglicherweise etwas anderes - aber für das reine zählen von Wörtern in enem Satz wäre mir persönlich das zu viel Kanonen auf Spatzen.
Als Heuristik kann man das machen. Aber natürliche Sprache ist halt sehr komplex und es kommen diverse Sonderfälle vor, die man oft nicht alle auf dem Schirm hat. Im Originaltext kommt zum Beispiel in größerer Zahl so etwas vor:

Code: Alles auswählen

In [1]: words = open('./nltk_data/corpora/gutenberg/carroll-alice.txt').read().split()

In [2]: [word for word in words if "--" in word]
Out[2]: 
 'rabbit-hole--and',
…
 'particular--Here,',
…
 'muchness--you',
 'muchness"--did',
…
 "Alice)--'and",
…
 "eyes.--'Tell",
 'adventures--beginning',
…
 "'important--unimportant--unimportant--important--'",
…
 'again--"BEFORE',
…
 'farm-yard--while']

Da bietet es sich an, eine Bibliothek zu verwenden, in der so etwas sauber einmal implementiert wurde. Und es ist doch schön, dass das mit Python so einfach geht.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AlinaPy: Sorry wenn Dir das „von oben herab“ vorkommt. Ich habe versucht durch Nachfragen und Hinweise, die auf einem Lösungsweg wichtig sein können, weiter zu helfen. Ich habe allgemein einen Ansatz zum Programmieren an sich vorgeschlagen — in immer kleinere Teilprobleme zerlegen bis die so klein sind, das sie einfach lösbar sind — und auf alle Werkzeuge hingewiesen, die nötig sind um dieses konkrete Problem zu lösen.

Dein Ansatz immer mehr zu googlen ist eher nicht hilfreich. Die Python-Dokumentation sollte da eigentlich ausreichen, denn neben dem NLTK-Teil zum Einlesen den Du schon hast, sollte das mit dem Grundwissen aus dem Tutorial in der Dokumentation und der Dokumentation zu den beteiligten Datentypen/Modulen lösbar sein. Also Sprachgrundlagen wie Schleifen, bedingte Ausführung, Umgang mit Zeichenketten und Listen, also Sachen, die man für so ziemlich *jedes* Programm braucht. Und dann noch das `random`-Modul.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
AlinaPy
User
Beiträge: 9
Registriert: Sonntag 31. Juli 2022, 19:12

#### Finales Update

Nachdem zuletzt geposteten Code von mir habe ich manuell einfach alle Sätze entfernt, bei denen diese hätten Apostrophen vorhanden sein müssen und diese daher komisch aussehen. Auch ein oder zwei andere Sätze musste ich dabei rausnehmen, weil das keine richtigen Sätze waren (Fun Fact: von den 1703 Sätzen sind am Ende nur noch 35 übrig)

Da das Rausfiltern dieser Sätze eigentlich nicht die Hauptaufgabe war und man damit erst so richtig loslegt, ist mir dieser kleiner Mankel nun egal, da man mit diesen Sätzen trotzdem perfekt weiter arbeiten kann.

Nochmal vielen Dank für die vielen Hilfen, Tipps und Beiträge! Und gleichzeitig auch ein Entschuldigen für einige meiner Antworten, die aufgrund meiner Verzweiflung, rückblickend, zum Teil echt gemein klingen.
Aufgrund zu weniger geteilter Infos meinerseits bzw. Fehlkommunikation entstanden Missverständnisse.

Ich wollte diese Frage als beantwortet oder so markieren (weiß gar nicht ob es das gibt), aber ich hoffe, dieser Beitrag reicht erstmal als Abschluss.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hattest du dich denn mal in die String-Methoden von Python eingelesen? Es gibt z.B. replace(). Damit könnte man jeden Apostroph durch einen leeren String ersetzen lassen und damit effektiv entfernen. Wendet man das vor der Tokenisierung auf den gesamten Text an (also bevor nltk den überhaupt "sieht"), dann müssten sich wie gewünscht einzelne Wörter da ergeben, wo durch den Apostroph vorher fälschlicherweise zwei erkannt wurden. Wäre bestimmt besser als manuell an die Sätze zu gehen, wenn's eigentlich ausprogrammiert werden sollte.

Und was sind denn "keine richtigen" Sätze? Ich würde einen Satz so definieren, dass er mit einem Punkt endet. Ich weiß ja nicht, wie das bei dir im Programm aussieht. Und falls das ein sehr kurzer Satz ist, dann spielt das ja keine Rolle, weil du eh nur nach 10 Wörtern filterst.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ist ja auch irgendwo Definitionssache — ich hätte ja gesagt das mit den Apostrophen *sind* in der Regel zwei Wörter. Also beispielsweise "what's" ist ja "what is", oder "I've" ist "I have", und so weiter.

Andererseits hat man dann so Sachen wie ['Soo', '--', 'oop', 'of', 'the', 'e', '--', 'e', '--', 'evening', ',', 'Beautiful', ',', 'beautiful', 'Soup', '!'] was 10 ”Wörter” hat, wo gestottert wird und ein Wort falsch geschrieben ist, weil es eher ”lautsprachlich“ dort steht. Man kann jetzt aber auch nicht einfach '--' durch eine leere Zeichenkette vor dem zerlegen in Wörter ersetzen, denn nezzcarth hat weiter oben ja so einige Beispiele aus dem Text gezeigt, wo das tatsächlich zwei Wörter trennt.

Bei mir kommen 55 Sätze heraus. Natürlich mit dem „beautiful soup“-Satz. Vielleicht ist ja auch einer der beabsichtigten Lerneffekte, dass Rechner bei der Verarbeitung von natürlicher Sprache an ihre Grenzen kommen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Außer beim 's hinter einem Namen. Da kürzt es kein zweites Wort ab. Und da wird's dann wirklich tricky.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich lese das immer als his/hers/theirs. "Peter's Vuvuzela" ist "Peter his Vuvuzela", in grosser Uebereinstimmung zum rheinsischen, wo man ja auch gerne "dim Pitter sin Vuvuzela" sagen wuerde... :D
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Beim Apostroph muss man mehrere Varianten unterscheiden (alle Beispiele aus dem Text): Kontraktion von zwei Wörtern ("they'll", "that's", "you're", "I'm", "We've" "shan't"), Auslassung innerhalb eines Worts ("ma'am"), Genitiv-Markierung/"saxon genitive" ("Alice's"). Nur bei Variante 1 kann man zwei Wörter zählen. Dazu kann man diese auflösen, entweder selbst oder z.B. mit https://pypi.org/project/contractions/. Das löst dann allerdings auch Formen wie "gotta" und "wanna" auf.
__deets__ hat geschrieben: Mittwoch 3. August 2022, 17:42 Ich lese das immer als his/hers/theirs. "Peter's Vuvuzela" ist "Peter his Vuvuzela", in grosser Uebereinstimmung zum rheinsischen, wo man ja auch gerne "dim Pitter sin Vuvuzela" sagen wuerde... :D
Das ist eine gute Eselsbrücke, man kann aber sprachgeschichtlich zeigen, dass das nicht der Ursprung ist.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Woher kommt das denn dann?
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

__deets__ hat geschrieben: Mittwoch 3. August 2022, 20:14 Woher kommt das denn dann?
Kurzfassung: Alt- und Mittelenglisch kann man sich grammatisch eher ein bisschen so wie Deutsch oder Latein vorstellen. Da gab es dieselben vier Fälle wie heute noch im Deutschen (bzw. mehr), die durch Endungen ausgedrückt wurden (abhängig vom Geschlecht, Stamm, …). Das 's ist ein Überbleibsel so einer Endung (-es), die später dann verallgemeinert wurde. Eine gängige Theorie zum Apostroph ist, soweit ich weiß, dass der irgendwann dazu kam, um den weggefallen Laut zu markieren, ähnlich wie bei meinem "Ma'am"-Beispiel oben.
Antworten