Compare commits

..

8 commits

2 changed files with 62 additions and 17 deletions

View file

@ -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",

View file

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