Substantive mit Python filtern

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
Vesemir
User
Beiträge: 3
Registriert: Montag 6. April 2026, 16:39

Gibt es einen einfachen Weg deutsche Substabtive aus einem Datensatz zu filtern. Gerne mit nltk oder so simpel wie möglich. Ich will mir die 200 häufigsten anzeigen lassen
nezzcarth
User
Beiträge: 1803
Registriert: Samstag 16. April 2011, 12:47

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:
"""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
wortzahl =
{'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:

Code: Alles auswählen

sortiert_dict = {key: value for key, value in sorted(wortzahl.items(), reverse=True, key=lambda item: item[1])}
Dann einfach die ersten 200 von sortiert_dict abzweigen!

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

@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:

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()
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.
Antworten