Compare commits

...

8 commits

2 changed files with 62 additions and 17 deletions

View file

@ -1,6 +1,19 @@
EXCLUDED_WORDS = { 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", "aber",
"aktiv",
"alle", "alle",
"als", "als",
"am", "am",
@ -9,15 +22,20 @@ EXCLUDED_WORDS = {
"auf", "auf",
"aus", "aus",
"bei", "bei",
"beim",
"bereits",
"bis", "bis",
"bist",
"chf", "chf",
"dabei", "dabei",
"dafür", "dafür",
"damit", "damit",
"dank", "dank",
"dann",
"das", "das",
"dass", "dass",
"davon", "davon",
"dazu",
"deine", "deine",
"deiner", "deiner",
"dem", "dem",
@ -27,6 +45,9 @@ EXCLUDED_WORDS = {
"die", "die",
"diese", "diese",
"diesem", "diesem",
"diesen",
"dieser",
"dieses",
"dir", "dir",
"doch", "doch",
"dort", "dort",
@ -46,8 +67,11 @@ EXCLUDED_WORDS = {
"euch", "euch",
"euro", "euro",
"für", "für",
"gegen",
"gibt", "gibt",
"habe",
"haben", "haben",
"habt",
"hat", "hat",
"heute", "heute",
"hier", "hier",
@ -60,8 +84,10 @@ EXCLUDED_WORDS = {
"in", "in",
"ins", "ins",
"ist", "ist",
"ja",
"jetzt", "jetzt",
"kann", "kann",
"keine",
"konnte", "konnte",
"man", "man",
"mehr", "mehr",
@ -73,8 +99,10 @@ EXCLUDED_WORDS = {
"mit", "mit",
"morgen", "morgen",
"nach", "nach",
"nein",
"nicht", "nicht",
"noch", "noch",
"nun",
"nur", "nur",
"oder", "oder",
"ohne", "ohne",
@ -85,6 +113,7 @@ EXCLUDED_WORDS = {
"sich", "sich",
"sie", "sie",
"sind", "sind",
"soll",
"um", "um",
"und", "und",
"uns", "uns",
@ -95,6 +124,10 @@ EXCLUDED_WORDS = {
"vor", "vor",
"war", "war",
"was", "was",
"weil",
"welche",
"welcher",
"welches",
"wenig", "wenig",
"weniger", "weniger",
"wenn", "wenn",
@ -110,10 +143,12 @@ EXCLUDED_WORDS = {
"zu", "zu",
"zum", "zum",
"zur", "zur",
"zwei",
"über", "über",
# Englische wörter # Englische Wörter
"about", "about",
"and", "and",
"before",
"default", "default",
"i", "i",
"in", "in",
@ -122,11 +157,13 @@ EXCLUDED_WORDS = {
"no", "no",
"of", "of",
"or", "or",
"previous",
"that", "that",
"the", "the",
"this", "this",
"to", "to",
"will", "will",
"with",
"yes", "yes",
"you", "you",
"your", "your",

View file

@ -37,7 +37,7 @@ class FileScanner(HTMLParser):
def scan_file(self): def scan_file(self):
# Datei einlesen # Datei einlesen
content = read_file(self.file) content = read_file(self.file)
# HTMLParser aufrufen um HTML-Syntax-Elemente zu entfernen. # HTMLParser aufrufen, um HTML-Syntax-Elemente zu entfernen.
self.feed(content) self.feed(content)
words_with_usage = {} words_with_usage = {}
@ -52,7 +52,7 @@ class FileScanner(HTMLParser):
title_words = set(title.split('-')) title_words = set(title.split('-'))
for word in words: for word in words:
# Verschiedene Zeichen vom Anfang und Ende der Wörter entfernen. # Verschiedene Zeichen vom Anfang und Ende der Wörter entfernen.
tag_name = word.strip(".,:;!?\"'()«»") tag_name = word.strip(".,:;!?\"'()-„“«» ")
# Leere Wörter ignorieren # Leere Wörter ignorieren
if not tag_name: if not tag_name:
continue continue
@ -77,12 +77,15 @@ class FileScanner(HTMLParser):
# Die Anzahl der Großbuchstaben in dem originalen Wort zählen ... # Die Anzahl der Großbuchstaben in dem originalen Wort zählen ...
upper_letters_count = len(_UPPER_CHECK.findall(tag_name)) upper_letters_count = len(_UPPER_CHECK.findall(tag_name))
# ... und die Bewertung entsprechen der Anzahl verbessern. # ... und die Bewertung entsprechen der Anzahl verbessern.
score += upper_letters_count * 5 score += upper_letters_count * 10
# Die Bewertung für das Wort speichern. # Die Bewertung leicht erhöhen, wenn ein Bindestrich im Wort enthalten ist.
# Wenn das Wort bereits eine Bewertung besitzt werden die beiden Bewertungen zusammen gerechnet. if '-' in word:
score += 1
if word not in words_with_usage: if word not in words_with_usage:
# Die Bewertung für das Wort speichern.
words_with_usage[word] = Tag(name=tag_name, score=score) words_with_usage[word] = Tag(name=tag_name, score=score)
else: else:
# Wenn das Wort bereits eine Bewertung besitzt, werden die beiden Bewertungen zusammen gerechnet.
words_with_usage[word].score += score words_with_usage[word].score += score
link_words = [] link_words = []
@ -90,11 +93,14 @@ class FileScanner(HTMLParser):
# Eventuelle URL-codierte Zeichen in die eigentlichen Zeichen umwandeln. (z.B. %2F -> /) # Eventuelle URL-codierte Zeichen in die eigentlichen Zeichen umwandeln. (z.B. %2F -> /)
link = unquote_plus(link) link = unquote_plus(link)
# Link-Teile in einzelne Wörter aufteilen # Link-Teile in einzelne Wörter aufteilen
words += re.split(r'[/\-_#.?&=]', link) link_words += re.split(r'[/\-_#.?&=]', link)
for link_word in link_words: for link_word in link_words:
# Alle Buchstaben verkleinern
link_word = link_word.lower() 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: 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 # Die Wörter nach ihrer Bewertung sortieren
return sorted(words_with_usage.values(), key=lambda tag: tag.score, reverse=True) return sorted(words_with_usage.values(), key=lambda tag: tag.score, reverse=True)
@ -110,23 +116,25 @@ class FileScanner(HTMLParser):
break break
def handle_data(self, data): 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: if self._current_html_tag in EXCLUDED_HTML_TAGS:
return 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) self.texte.append(data)
def _link_result(self, link_match): def _link_replace(self, link_match):
self.links.append(link_match.group(0)) self.links.append(link_match.group(0))
return '' return ''
def display_tags(tags, min_score): def display_tags(tags, max_tags):
# Die Ergebnisse auf der Konsole ausgeben. # Die Ergebnisse auf der Konsole ausgeben.
for tag in tags: for index, tag in enumerate(tags,):
if tag.score <= min_score: if index >= max_tags:
continue break
print(f"Score: {tag.score:>3} Word: {tag.name}") print(f"Score: {tag.score:>3} Word: {tag.name}")
@ -163,7 +171,7 @@ def main():
scanner = FileScanner(file) scanner = FileScanner(file)
tags = scanner.scan_file() tags = scanner.scan_file()
# Die Ergebnisse auf der Konsole ausgeben # 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. # 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 final_tags[title] = tags[:TAGS_PER_ARTICLE] if len(tags) > TAGS_PER_ARTICLE else tags
# Die Ausgabedatei schreiben # Die Ausgabedatei schreiben