diff --git a/exclude.py b/exclude.py index 553c591..0f38222 100644 --- a/exclude.py +++ b/exclude.py @@ -1,6 +1,19 @@ EXCLUDED_WORDS = { - # Deutsche wörter + # Sehr häufig vorkommende Tags + # "aktualisiert", + # "behoben", + # "datei", + # "dateien", + # "erschienen", + # "neue", + # "version", + # "versionen", + # "veröffentlicht", + # "installieren", + # "deinstallieren", + # Deutsche Wörter "aber", + "aktiv", "alle", "als", "am", @@ -9,15 +22,20 @@ EXCLUDED_WORDS = { "auf", "aus", "bei", + "beim", + "bereits", "bis", + "bist", "chf", "dabei", "dafür", "damit", "dank", + "dann", "das", "dass", "davon", + "dazu", "deine", "deiner", "dem", @@ -27,6 +45,9 @@ EXCLUDED_WORDS = { "die", "diese", "diesem", + "diesen", + "dieser", + "dieses", "dir", "doch", "dort", @@ -46,8 +67,11 @@ EXCLUDED_WORDS = { "euch", "euro", "für", + "gegen", "gibt", + "habe", "haben", + "habt", "hat", "heute", "hier", @@ -60,8 +84,10 @@ EXCLUDED_WORDS = { "in", "ins", "ist", + "ja", "jetzt", "kann", + "keine", "konnte", "man", "mehr", @@ -73,8 +99,10 @@ EXCLUDED_WORDS = { "mit", "morgen", "nach", + "nein", "nicht", "noch", + "nun", "nur", "oder", "ohne", @@ -85,6 +113,7 @@ EXCLUDED_WORDS = { "sich", "sie", "sind", + "soll", "um", "und", "uns", @@ -95,6 +124,10 @@ EXCLUDED_WORDS = { "vor", "war", "was", + "weil", + "welche", + "welcher", + "welches", "wenig", "weniger", "wenn", @@ -110,10 +143,12 @@ EXCLUDED_WORDS = { "zu", "zum", "zur", + "zwei", "über", - # Englische wörter + # Englische Wörter "about", "and", + "before", "default", "i", "in", @@ -122,11 +157,13 @@ EXCLUDED_WORDS = { "no", "of", "or", + "previous", "that", "the", "this", "to", "will", + "with", "yes", "you", "your", diff --git a/tagger.py b/tagger.py index 83e1ec8..1c5551f 100644 --- a/tagger.py +++ b/tagger.py @@ -37,7 +37,7 @@ class FileScanner(HTMLParser): def scan_file(self): # Datei einlesen content = read_file(self.file) - # HTMLParser aufrufen um HTML-Syntax-Elemente zu entfernen. + # HTMLParser aufrufen, um HTML-Syntax-Elemente zu entfernen. self.feed(content) words_with_usage = {} @@ -52,7 +52,7 @@ class FileScanner(HTMLParser): title_words = set(title.split('-')) for word in words: # Verschiedene Zeichen vom Anfang und Ende der Wörter entfernen. - tag_name = word.strip(".,:;!?\"'()«»") + tag_name = word.strip(".,:;!?\"'()-„“«» ") # Leere Wörter ignorieren if not tag_name: continue @@ -77,12 +77,15 @@ class FileScanner(HTMLParser): # Die Anzahl der Großbuchstaben in dem originalen Wort zählen ... upper_letters_count = len(_UPPER_CHECK.findall(tag_name)) # ... und die Bewertung entsprechen der Anzahl verbessern. - score += upper_letters_count * 5 - # Die Bewertung für das Wort speichern. - # Wenn das Wort bereits eine Bewertung besitzt werden die beiden Bewertungen zusammen gerechnet. + score += upper_letters_count * 10 + # Die Bewertung leicht erhöhen, wenn ein Bindestrich im Wort enthalten ist. + if '-' in word: + score += 1 if word not in words_with_usage: + # Die Bewertung für das Wort speichern. words_with_usage[word] = Tag(name=tag_name, score=score) else: + # Wenn das Wort bereits eine Bewertung besitzt, werden die beiden Bewertungen zusammen gerechnet. words_with_usage[word].score += score link_words = [] @@ -90,11 +93,14 @@ class FileScanner(HTMLParser): # Eventuelle URL-codierte Zeichen in die eigentlichen Zeichen umwandeln. (z.B. %2F -> /) link = unquote_plus(link) # Link-Teile in einzelne Wörter aufteilen - words += re.split(r'[/\-_#.?&=]', link) + link_words += re.split(r'[/\-_#.?&=]', link) for link_word in link_words: + # Alle Buchstaben verkleinern link_word = link_word.lower() + # Wenn ein Wort aus dem Text auch in einem Link vorkommt, wird die Bewertung erhöht. + # Somit kann verhindert werden, dass Link-Bestandteile als Tags vorgeschlagen werden (z.B. E7xcsFpR). if link_word in words_with_usage: - words_with_usage[link_word] += 10 + words_with_usage[link_word].score += 10 # Die Wörter nach ihrer Bewertung sortieren return sorted(words_with_usage.values(), key=lambda tag: tag.score, reverse=True) @@ -110,23 +116,25 @@ class FileScanner(HTMLParser): break def handle_data(self, data): - # Den Text innerhalb eines HTML-Elements mit einbeziehen. + # Den Inhalt des aktuellen HTML-Tags ignorieren, wenn dieser auf der Liste der ausgeschlossenen HTML-Tags steht. if self._current_html_tag in EXCLUDED_HTML_TAGS: return - data = _LINK_PATTERN.sub(self._link_result, data) + # Links aus dem HTML-Text extrahieren und entfernen + data = _LINK_PATTERN.sub(self._link_replace, data) + # Den restlichen Text (ohne Links) innerhalb eines HTML-Elements mit einbeziehen. self.texte.append(data) - def _link_result(self, link_match): + def _link_replace(self, link_match): self.links.append(link_match.group(0)) return '' -def display_tags(tags, min_score): +def display_tags(tags, max_tags): # Die Ergebnisse auf der Konsole ausgeben. - for tag in tags: - if tag.score <= min_score: - continue + for index, tag in enumerate(tags,): + if index >= max_tags: + break print(f"Score: {tag.score:>3} Word: {tag.name}") @@ -163,7 +171,7 @@ def main(): scanner = FileScanner(file) tags = scanner.scan_file() # Die Ergebnisse auf der Konsole ausgeben - display_tags(tags, min_score=20) + display_tags(tags, max_tags=10) # Die eingestellte Anzahl an Tags für die Ausgabedatei übernehmen, sofern vorhanden. final_tags[title] = tags[:TAGS_PER_ARTICLE] if len(tags) > TAGS_PER_ARTICLE else tags # Die Ausgabedatei schreiben