Substantive mit Python filtern
Du kannst mit einem Part-of-Speech-Tagger die Wortarten in einem Text bestimmen und anschließend dann nach Substantiven filtern. POS-Tagger gibt es als Teil größerer Frameworks (spaCy, nltk, textblob) oder standalone.
-
Pedroski55
- User
- Beiträge: 52
- Registriert: Freitag 25. Juli 2025, 00:20
Nichts einfacher wie das! Probieren wir mit diesem Text:
wortzahl =
"""Ein neues Jahr besteht aus insgesamt vier Jahreszeiten.
Frühling, Sommer, Herbst und Winter folgen nacheinander.
Das Jahr beginnt im Januar.
Im Januar und Februar ist es draußen noch sehr kalt und man muss sich warm anziehen, um nicht zu frieren und krank zu werden.
Der Frühling beginnt im März.
Dann steigen die Temperaturen und es wird wieder wärmer.
In den Monaten März, April und Mai ist Frühling.
Von Juni bis September findet der Sommer statt.
Der Sommer ist die heißeste Jahreszeit in Deutschland.
Viele Menschen fahren in dieser Zeit in den Urlaub.
Ab Mitte September bis November gibt es in Deutschland den Herbst.
Dann wird es draußen langsam kälter und man muss sich wieder wärmer anziehen.
Der November und Dezember sind die letzten Monate des Jahres.
Dann stellt sich der Winter ein.
Wenn es besonders kalt ist, kann es im Winter schneien."""
Code: Alles auswählen
import regex as re
# alle gesuchte Worter
worter = ['Jahr', 'Frühling', 'Sommer', 'Herbst', 'Winter']
# Dict um Zahlen zu speichern
wortzahl = {wort: 0 for wort in worter}
# speicher die Datei als Textdatei um sich das Leben bequem zu machen
dtext = '/home/peterr/temp/Deutschetexte/Dtext1.txt'
# falls der Text sehr gross ist benutze einen Generator
def zeilen_holen(text):
with open(text) as f:
for line in f:
yield line
# finde alle Buchstaben und nur Buchstaben
e = re.compile(r'\w+')
# entferne was nicht Buchstabe ist ,.; Leertaste usw
def entferne_zeichen(text):
res = e.findall(text)
return res
for l in zeilen_holen(dtext):
print(l)
linie_list = entferne_zeichen(l)
for wort in linie_list:
if wort in worter:
wortzahl[wort] +=1{'Jahr': 2, 'Frühling': 3, 'Sommer': 3, 'Herbst': 2, 'Winter': 3}
-
Pedroski55
- User
- Beiträge: 52
- Registriert: Freitag 25. Juli 2025, 00:20
Fiel mir grad ein:
Nun müsste man die obige Liste worter mit einer Liste aller Substantive. Die Internetseite hier hat eine solche Liste.
Bißchen webscraping und könnte man sich die holen.
Dann das Resultat nach Haufigkeit der Worter sortieren:
Dann einfach die ersten 200 von sortiert_dict abzweigen!
Nun müsste man die obige Liste worter mit einer Liste aller Substantive. Die Internetseite hier hat eine solche Liste.
Bißchen webscraping und könnte man sich die holen.
Dann das Resultat nach Haufigkeit der Worter sortieren:
Code: Alles auswählen
sortiert_dict = {key: value for key, value in sorted(wortzahl.items(), reverse=True, key=lambda item: item[1])}Code: Alles auswählen
häufige_worter = {}
if len(sortiert_dict) < 200:
häufige_worter = sortiert_dict
else:
count = 1
for key in sortiert_dict.keys():
häufige_worter[key] = sortiert_dict[key]
count +=1
if count > 200:
break- noisefloor
- User
- Beiträge: 4319
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@Vesemir: was hast du den schon probiert? Ich habe vor ein paar Jahren mal was mit nltk gemacht, das war eigentlich relativ einfach. Auf jeden Fall ist das besser und zuverlässiger, als sich low-tech irgendwas selber zusammen zu basteln. Zumal die Bibliotheken direkt noch den "Service" liefern, Einzahl und Mehrzahl zu erkennen und (wenn gewünscht) einem Nomen zuzuordnen.
Gruß, noisefloor
@Vesemir: was hast du den schon probiert? Ich habe vor ein paar Jahren mal was mit nltk gemacht, das war eigentlich relativ einfach. Auf jeden Fall ist das besser und zuverlässiger, als sich low-tech irgendwas selber zusammen zu basteln. Zumal die Bibliotheken direkt noch den "Service" liefern, Einzahl und Mehrzahl zu erkennen und (wenn gewünscht) einem Nomen zuzuordnen.
Gruß, noisefloor
@Pedroski55: auch wenn Du beratungsresistent bist, hier nochmal alle Kommentare, die auch schon bei Deinen anderen Beiträgen hier gelten: benutze kein extra Modul regex, wenn aus auch das ganz normale re-Modul aus der Standardbibliothek tut. Einbuchstabige Variablennamen sind schlecht, weil sie nichts aussagen, l ist besonders schlecht, weil man es leicht mit 1 oder I verwechseln kann. Was soll das d in dtext bedeuten?
Funktionen sollten einen Namen haben, der auch sagt, was die Funktion macht, `entferne_zeichen` macht aber was ganz anderes.
Wenn man etwas zählen will, dann gibt es dafür collections.Counter, das muß man nicht selbst programmieren.
Das ganze könnte also so aussehen:
Aber es gilt das, was noisefloor geschrieben hat: mit regulären Ausdrücken und Wortlisten kommt man nicht sehr weit, wenn man im deutschen Substantive finden will.
Funktionen sollten einen Namen haben, der auch sagt, was die Funktion macht, `entferne_zeichen` macht aber was ganz anderes.
Wenn man etwas zählen will, dann gibt es dafür collections.Counter, das muß man nicht selbst programmieren.
Das ganze könnte also so aussehen:
Code: Alles auswählen
import re
from collections import Counter
INPUT_FILENAME = '/home/peterr/temp/Deutschetexte/Dtext1.txt'
WORDS = ['Jahr', 'Frühling', 'Sommer', 'Herbst', 'Winter']
WORD_REGEX = re.compile(r"\w+")
def iter_words(filename):
with open(filename) as lines:
for line in lines:
for word in WORD_REGEX.findall(line):
yield word
def main():
words_count = Counter(
word
for word in iter_words(INPUT_FILENAME)
if word in WORDS
)
print("Die 10 häufigsten Wörter")
for word, count in words_count.most_common(10):
print(f"{word}: {count}")
if __name__ == "__main__":
main()