use links to only increase score and don't add new words

This commit is contained in:
OneNewDev 2022-06-06 15:36:36 +02:00
parent 710faa4611
commit 9eda3b29f8

View file

@ -17,6 +17,7 @@ EXCLUDED_HTML_TAGS = {'code'}
# Wegen Performance vordefinierte Variablen # Wegen Performance vordefinierte Variablen
_UPPER_CHECK = re.compile(r'[A-Z]') _UPPER_CHECK = re.compile(r'[A-Z]')
_LINK_PATTERN = re.compile(r'https?://\S+')
@dataclass @dataclass
@ -30,6 +31,7 @@ class FileScanner(HTMLParser):
super().__init__() super().__init__()
self.file = file self.file = file
self.texte = [] self.texte = []
self.links = []
self._current_html_tag = None self._current_html_tag = None
def scan_file(self): def scan_file(self):
@ -41,10 +43,8 @@ class FileScanner(HTMLParser):
words_with_usage = {} words_with_usage = {}
words = [] words = []
for text in self.texte: for text in self.texte:
# Eventuelle URL-codierte Zeichen in die eigentliche Zeichen umwandeln. (z.B. %2F -> /)
text = unquote_plus(text)
# Textteile in einzelne Wörter aufteilen # Textteile in einzelne Wörter aufteilen
words += re.split(r'[ /\-_#\n.?=]', text) words += re.split(r'[ \n\-_/]', text)
# Die Anzahl, der Wörter in der aktuellen Datei, auf der Konsole ausgeben # Die Anzahl, der Wörter in der aktuellen Datei, auf der Konsole ausgeben
title = self.file.parent.name title = self.file.parent.name
print(f'\nFile {title} contains {len(words)} words') print(f'\nFile {title} contains {len(words)} words')
@ -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
@ -84,6 +84,18 @@ class FileScanner(HTMLParser):
words_with_usage[word] = Tag(name=tag_name, score=score) words_with_usage[word] = Tag(name=tag_name, score=score)
else: else:
words_with_usage[word].score += score words_with_usage[word].score += score
link_words = []
for link in self.links:
# 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)
for link_word in link_words:
link_word = link_word.lower()
if link_word in words_with_usage:
words_with_usage[link_word] += 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)
@ -94,14 +106,21 @@ class FileScanner(HTMLParser):
return return
for attr_name, attr_value in attrs: for attr_name, attr_value in attrs:
if attr_name == "href": if attr_name == "href":
self.texte.append(attr_value) self.links.append(attr_value)
break break
def handle_data(self, data): def handle_data(self, data):
if self._current_html_tag not in EXCLUDED_HTML_TAGS:
# Den Text innerhalb eines HTML-Elements mit einbeziehen. # Den Text innerhalb eines HTML-Elements mit einbeziehen.
if self._current_html_tag in EXCLUDED_HTML_TAGS:
return
data = _LINK_PATTERN.sub(self._link_result, data)
self.texte.append(data) self.texte.append(data)
def _link_result(self, link_match):
self.links.append(link_match.group(0))
return ''
def display_tags(tags, min_score): def display_tags(tags, min_score):
# Die Ergebnisse auf der Konsole ausgeben. # Die Ergebnisse auf der Konsole ausgeben.