Wer als letztes antwortet kriegt viel mehr als nur 128 Dias

So wie es aussieht wird er von meiner Funktion erkannt, trotzdem sehr seltsam... Einige andere wie der Schädel gehen auch, so halbwegs... ☠

Edit: Bei der Gesamtstatistik, bei der nach den wenigsten % ungültigen sortiert wird erkennt man schon deutlich, dass zu oft am Verhalten, dass Zeichen wie * oder ^ als Satzzeichen zählen festgehalten wird. Allein bei mir sind 47 ungültige Beiträge dazu gekommen.
 
Zuletzt bearbeitet:
@Cer66 ich denke mit Dinge wie :D meinst du Emoticons, wobei auch die nicht klar abgegrenzt sind (wie alles aus der Umgangssprache). Ich fürchte um das zu wissen, muss an aus dem letzten Jahrtausend stammen und/oder smart-lose Handys besessen haben. :D
 
Du hast Recht. Sollen die jetzt also aufgenommen werden oder eher nicht? Manche wie :) :D :o werden ja schon vom Forum umgewandelt.
SpielerAnzahl BeiträgeAnzahl nicht regelkonformer BeiträgeProzentanzahl nicht regelkonformer Beiträge
PiusG6822.941176470588235%
Cer6626371064.019719378081152%
maua124221315.408753096614368%
crafter_01012986.2015503875969%
tuxrandom725466.344827586206897%
fscript25721676.493001555209954%
Sparktr411276.569343065693431%
MagicBookworm63731679.165526675786593%
Lonely_Wolf21501510.0%
Dakota751241310.483870967741936%
Gingernils3323510.542168674698797%
JF_kein_K6547511.46788990825688%
Live_Is_Live50612.0%
ttolkin2853712.982456140350877%
Dragonly4469913.043478260869565%
derschneck_2854114.385964912280702%
Atlasfreak4206114.523809523809526%
Steinsamurai2794917.562724014336915%
Groundcrafter571221.052631578947366%
Vani2252711221.25237191650854%
ChaosQueen__1222722.131147540983605%
Hase_222681623.52941176470588%
EinSev631726.984126984126984%
untergrund11173429.059829059829063%
Yazinda1594729.559748427672954%
Soldwyn1786335.39325842696629%
paulisttot50019839.6%
Olke1174841.02564102564102%
Silva_VE33213941.86746987951807%
Pokethestupid733345.20547945205479%
Theodorianum502346.0%
Fredie1104583865.51724137931035%
.
 
Zuletzt bearbeitet:
Hab jetzt mal eine Funktion geschrieben, die das besser machen sollte:
Python:
import regex as re
from .emojis import is_emoji  # Makes use of https://pypi.org/project/emoji/


# Source: https://de.m.wikipedia.org/wiki/Satzzeichen
PUNCTUATION = r".?!\"„“‚‘»«‹›,;:'’–—‐\-·/\()\[\]<>{}…☞‽¡¿⸘、"


def rules_reworked(content: str) -> dict[str, bool]:
    content = content.strip()  # Remove trailing and leading whitespaces
    compliance = {
        "word_count": True,
        "first_letter": True,
        "punctuation": True,
    }
    if not content:
        return {
            k: False for k in compliance.keys()
        }
    # Word count
    # Using re.split() instead of str.split() as re supports all whitespaces
    # out of the box.
    word_count = len(re.split(
        fr"[\s{PUNCTUATION}]",  # Split words by whitespace and punctuation
        content,
    ))
    if word_count < 5:
        compliance["word_count"] = False
    # First Letter
    # Get index of first letter
    # This requires the third party regex module to work
    # Therefore `import regex as re`
    # This works with all Unicode letters, including äöü, ß and âáà.
    first_letter_match = re.search('\\p{L}', content, re.UNICODE)
    if (
        first_letter_match is None  # No letter in content
        or not first_letter_match.captures()[0].isupper()  # noqa  # letter not uppercase
    ):
        compliance["first_letter"] = False
    # Punctuation
    # Last forum emoji has already been replaced with a dot
    last_char = content[-1]
    if (
        last_char not in PUNCTUATION
        and not is_emoji(last_char)  # noqa
    ):
        compliance["punctuation"] = False
    return compliance

Hier sind ein paar Tests:
Python:
>>> from uw_stats.stats import scraper
>>> rw = scraper.rules_reworked
>>> rw("Hi")
{'word_count': False, 'first_letter': True, 'punctuation': False}
>>> rw("Hi.")
{'word_count': False, 'first_letter': True, 'punctuation': True}
>>> rw("Hi ich bin Cer GPT.")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Hi.ich.bin.Cer.GPT.")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Hi.ich.bin.Cer.GPT☺")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("hi.ich.bin.Cer.GPT☺")
{'word_count': True, 'first_letter': False, 'punctuation': True}
>>> rw("Das hier ist ein sehr, sehr, sehr langer text ohne einem Punkt am Ende")
{'word_count': True, 'first_letter': True, 'punctuation': False}
>>> rw("Das sind fünf ganze Wörter,")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter;")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter:")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter>")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter)")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter!")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter$$$")
{'word_count': True, 'first_letter': True, 'punctuation': False}
>>> rw("Das sind fünf ganze Wörter-")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter_")
{'word_count': True, 'first_letter': True, 'punctuation': False}
>>> rw("Das sind fünf ganze Wörter/")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter\\")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Das sind fünf ganze Wörter^")
{'word_count': True, 'first_letter': True, 'punctuation': False}
>>> rw("Das sind fünf ganze Wörter°")
{'word_count': True, 'first_letter': True, 'punctuation': False}
>>> rw("Das sind fünf ganze Wörter#")
{'word_count': True, 'first_letter': True, 'punctuation': False}
>>> rw("Das sind fünf ganze Wörter'")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Hier ist ein Zitat: „Das Wetter ist schlecht.“")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Hier ist ein Zitat: »Das Wetter ist schlecht.«")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("Ü <- Hier ein Umlaut als erster Buchstabe")
{'word_count': True, 'first_letter': True, 'punctuation': False}
>>> rw("ß <- sz hat keine große Version")
{'word_count': True, 'first_letter': False, 'punctuation': False}
>>> rw("Ô <- ein besonderes großes o.")
{'word_count': True, 'first_letter': True, 'punctuation': True}
>>> rw("")
{'word_count': False, 'first_letter': False, 'punctuation': False}

Sieht soweit ganz gut aus, oder?

Edit: Fehler bei leerem content behoben, hier ist noch die is_emoji() Funktion:
Python:
import emoji

EMOJI_LIST = list(emoji.EMOJI_DATA.keys())


def is_emoji(string: str) -> bool:
    try:
        return string in EMOJI_LIST
    except IndexError:  # Empty string
        return False
Bitte kein return in einem try. D:

Python:
import emoji

EMOJI_LIST = list(emoji.EMOJI_DATA.keys())


def is_emoji(string: str) -> bool:
    try:
        out = string in EMOJI_LIST
    except IndexError:  # Empty string
        return False
    return out

Besser. Was für eine String übergibst du? Wie kann diese empty sein?


Die Satzzeichen würde ich entweder extrem eng fassen (.!?) und dann aber vorher Klammern, Anführungszeichen und Sternchen heraus filtern, oder sehr weit fassen .;:!"()[]{}?„“”»«*…–›‹‚‘ und vermutlich noch mehr...
 
Zuletzt bearbeitet:
Die Satzzeichen sind ja über der Funktion als Konstante:
PUNCTUATION = r".?!\"„“‚‘»«‹›,;:'’–—‐\-·/\()\[\]<>{}…☞‽¡¿⸘、"

Warum kein return im try? Das macht doch nur etwas aus, wenn ein else block dabei ist.

Der string kann in diesem Kontext nicht leer sein, allerdings ist das ja eine eigenständige Funktion die auch in einem Kontext mit möglicherweise leerem String aufgerufen werden kann. Ein leerer string ist kein Emoji, also warum Fehler werfen?

Edit: Wenn du es dir noch genauer ansehen willst, meinen GitHub hast du ja.
 
Warum kein return im try? Das macht doch nur etwas aus, wenn ein else block dabei ist.
Weil im try so wenig Code wie möglich stehen sollte.

PEP8 schrieb:
Additionally, for all try/except clauses, limit the try clause to the absolute minimum amount of code necessary. Again, this avoids masking bugs.

In deinem Fall, sollte das keine Probleme machen... Aber nicht nur ein else kann Probleme machen:

Python:
def foo():
    try:
        return True
    finally:
        return False

Was ist das Ergebnis? Was sollte das Ergebnis sein?
 
True, oder SyntaxError. Ich tippe mal auf True, allerdings müsste der finally trotzdem laufen.
 
Auf den internationalen Frauentag? Warum?
Wir schreiben da die Mathe BLF. Da es die BLF nur in Sachsen gibt, erkläre ich das mal kurz. BLF bedeutet Besondere Leistungsfeststellung. Die wird in Sachsen jedes Jahr in Klasse 10 in den Fächern Deutsch, Englisch und Mathe gemacht. Deutsch ist dieses Schuljahr am 04.03., Englisch ist am 06.03. und Mathe am 08.03.. Unser Mathelehrer versucht mit unserer Klasse den besten Durchschnitt von ganz Sachsen dieses Jahr zu machen. Ich werde zwar wahrscheinlich wieder eine 1 schreiben, aber so gut sind die anderen aus meiner Klasse jetzt auch nicht. Er sagt jedoch, dass wir eine sehr gute Klasse sind, was ich mir auch vorstellen kann. Außerdem hat er jetzt schon einige Aufgaben von ehemaligen BLFs in Arbeiten drangenommen und will auch weiter mit uns viel üben. Schwierig wird es aber trotzdem. Mal schauen. Das gute ist, dass ich eh nicht besser als 1 werden kann und dafür auch nicht üben muss. Außerdem kann es dann auch nicht an mir liegen, wenn wir es nicht schaffen sollten und ich kann mich besser auf die anderen BLFs konzentrieren. Ende.
 
Wir schreiben da die Mathe BLF. Da es die BLF nur in Sachsen gibt, erkläre ich das mal kurz. BLF bedeutet Besondere Leistungsfeststellung.
Sowas gibts in Hessen auch, nennt sich Lernstandserhebung. Dürfte ich da mal angeben? Ich war in Klasse 8 sowohl in Mathematik als auch in Französisch Jahrgangsbeste :p
 

Benutzer, die dieses Thema gerade lesen

  • ONLINE 56 Spieler