From 759efa135d740ef633e1715ce578e41d6911636b Mon Sep 17 00:00:00 2001 From: Gregor Middell Date: Fri, 27 Sep 2024 14:56:23 +0200 Subject: [PATCH] Refactoring --- .flake8 | 6 + .github/FUNDING.yml | 1 - .github/workflows/syntax-and-unit-tests.yml | 33 - .github/workflows/test.yml | 24 + .gitignore | 1 + .pre-commit-config.yaml | 27 + .zenodo.json | 21 - LICENSE | 2 +- MANIFEST.in | 3 - README.md | 13 +- demo/demo.conllu | 34 - demo/demo_quaxa.py | 28 - pyproject.toml | 48 + quaxa/VulGer.csv | 3301 +++++++++++++++++++ quaxa/__init__.py | 308 +- quaxa/quaxa.py | 523 --- requirements-dev.txt | 7 - requirements.txt | 2 - setup.py | 37 - test/test_quaxa.py | 664 ---- {test => tests}/__init__.py | 0 tests/test_quaxa.py | 92 + 22 files changed, 3799 insertions(+), 1376 deletions(-) create mode 100644 .flake8 delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/workflows/syntax-and-unit-tests.yml create mode 100644 .github/workflows/test.yml create mode 100644 .pre-commit-config.yaml delete mode 100644 .zenodo.json delete mode 100644 MANIFEST.in delete mode 100644 demo/demo.conllu delete mode 100644 demo/demo_quaxa.py create mode 100644 pyproject.toml create mode 100644 quaxa/VulGer.csv delete mode 100644 quaxa/quaxa.py delete mode 100644 requirements-dev.txt delete mode 100644 requirements.txt delete mode 100644 setup.py delete mode 100644 test/test_quaxa.py rename {test => tests}/__init__.py (100%) create mode 100644 tests/test_quaxa.py diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..82dbbd2 --- /dev/null +++ b/.flake8 @@ -0,0 +1,6 @@ +[flake8] +max-line-length = 80 +extend-select = B950 +extend-ignore = E203,E501,E701 +per-file-ignores = + quaxa/__init__.py:F401 diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 3fdc614..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: [ulf1, LydiaKoerber] diff --git a/.github/workflows/syntax-and-unit-tests.yml b/.github/workflows/syntax-and-unit-tests.yml deleted file mode 100644 index f98e88d..0000000 --- a/.github/workflows/syntax-and-unit-tests.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Python application - -on: [push] - -jobs: - build: - - runs-on: ubuntu-18.04 - - strategy: - matrix: - python-version: ['3.7', '3.x'] - - name: Python ${{ matrix.python-version }} Tests - - steps: - - uses: actions/checkout@v1 - - name: Setup python - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements.txt - pip install -r requirements-dev.txt - - name: Lint with flake8 - run: | - flake8 --ignore=F401 --exclude=$(grep -v '^#' .gitignore | xargs | sed -e 's/ /,/g') - - name: Unit Test with unittest - run: | - PYTHONPATH=. python -m unittest diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..14b731b --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,24 @@ +name: Python application + +on: [push] + +jobs: + build: + strategy: + matrix: + platform: [windows-latest, macos-latest, ubuntu-latest] + + runs-on: ${{ matrix.platform }} + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Install dependencies + run: | + pip install -U pip + pip install '.[dev]' + - name: Run unit tests + run: | + pytest --cov=quaxa diff --git a/.gitignore b/.gitignore index 91fcca3..1fb03ec 100644 --- a/.gitignore +++ b/.gitignore @@ -108,3 +108,4 @@ venv.bak/ .vscode profile/data* .theia +*.temp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..29ced40 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,27 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files +- repo: https://github.com/psf/black + rev: 22.10.0 + hooks: + - id: black +- repo: https://github.com/PyCQA/flake8 + rev: 7.0.0 + hooks: + - id: flake8 + additional_dependencies: [flake8-bugbear] +- repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort +- repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.8.0 + hooks: + - id: mypy diff --git a/.zenodo.json b/.zenodo.json deleted file mode 100644 index a7a0fa0..0000000 --- a/.zenodo.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "creators": [ - { - "name": "Lydia Körber", - "orcid": "0000-0002-8937-3799" - }, - { - "name": "Ulf Hamster", - "orcid": "0000-0002-0440-4868" - } - ], - "title": "QUAXA: QUAlity of sentence eXAmples scoring", - "description": "Rule-based sentence scoring algorithm based on GDEX.", - "license": "Apache-2.0", - "upload_type": "software", - "keywords": [ - "sentence scoring", - "good example extractor", - "German" - ] -} \ No newline at end of file diff --git a/LICENSE b/LICENSE index 5de6c20..01644d6 100644 --- a/LICENSE +++ b/LICENSE @@ -198,4 +198,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 783709f..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include README.md -include README.rst -recursive-include test *.py diff --git a/README.md b/README.md index b092e64..27c3ca4 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Wenn 1 Knock-out Kriterium identifiziert wird, dann wird direkt der Score direkt | `has_blacklist_words` | bool | Satzbeleg enthält Wörter, sodass in keinem Fall der Satzbeleg als Wörterbuchbeispiel in Betracht gezogen wird; ausgenommen das Blacklist-Wort ist selbt der Wörterbucheintrag. (dt. Blacklist ist voreingestellt) | [1] GDEX blacklist | ### Diskontierungsfakoren -Je Kriterium wird ein Faktor berechnet, und alle Faktoren miteinander multipliziert. +Je Kriterium wird ein Faktor berechnet, und alle Faktoren miteinander multipliziert. Wenn bspw. ein Faktor eine Penality von 0.1 bekommt, dann ist der Faktor 0.9. Für den Gesamtscore wird der Gesamtfaktor mit 0.5 multipliziert. @@ -79,11 +79,11 @@ pip install -r requirements-dev.txt --no-cache-dir Publish ```sh -python setup.py sdist +python setup.py sdist twine upload -r pypi dist/* ``` -### Clean up +### Clean up ```sh find . -type f -name "*.pyc" | xargs rm @@ -104,6 +104,11 @@ Please contribute using [Github Flow](https://guides.github.com/introduction/flo ### Acknowledgements The "Evidence" project was funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) - [433249742](https://gepris.dfg.de/gepris/projekt/433249742) (GU 798/27-1; GE 1119/11-1). +QUAXA makes use of [VulGer](https://aclanthology.org/W19-3513), a +lexicon covering words from the lower end of the German language +register — terms typically considered rough, vulgar, or +obscene. VulGer is used under the terms of the CC-BY-SA license. + ### Maintenance - till 31.Aug.2023 (v0.1.0) the code repository was maintained within the DFG project [433249742](https://gepris.dfg.de/gepris/projekt/433249742) -- since 01.Sep.2023 (v0.1.0) the code repository is maintained by Ulf Hamster. \ No newline at end of file +- since 01.Sep.2023 (v0.1.0) the code repository is maintained by Ulf Hamster. diff --git a/demo/demo.conllu b/demo/demo.conllu deleted file mode 100644 index eb4717e..0000000 --- a/demo/demo.conllu +++ /dev/null @@ -1,34 +0,0 @@ -# sent_id = test-s20 -# text = An den anderen Tischen sah es nicht besser aus. -1 An an ADP APPR _ 4 case _ _ -2 den der DET ART Case=Dat|Definite=Def|Number=Plur|PronType=Art 4 det _ _ -3 anderen anderer DET ADJA Case=Dat|Gender=Masc|Number=Plur|PronType=Ind 4 det _ _ -4 Tischen Tisch NOUN NN Case=Dat|Gender=Masc|Number=Plur 5 obl _ _ -5 sah sehen VERB VVFIN Mood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin 0 root _ _ -6 es es PRON PPER Case=Nom|Gender=Neut|Number=Sing|Person=3|PronType=Prs 5 nsubj _ _ -7 nicht nicht PART PTKNEG Polarity=Neg 8 advmod _ _ -8 besser gut ADJ ADJD Degree=Cmp 5 xcomp _ _ -9 aus aus ADP PTKVZ _ 5 compound:prt _ SpaceAfter=No -10 . . PUNCT $. _ 5 punct _ _ - -# sent_id = test-s3 -# text = Ist ja wohl ein Witz. -1 Ist sein AUX VAFIN Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 5 cop _ _ -2 ja ja PART ADV _ 5 advmod _ _ -3 wohl wohl ADV ADV _ 5 advmod _ _ -4 ein ein DET ART Case=Nom|Definite=Ind|Gender=Masc|Number=Sing|NumType=Card|PronType=Art 5 det _ _ -5 Witz Witz NOUN NN Case=Nom|Gender=Masc|Number=Sing 0 root _ SpaceAfter=No -6 . . PUNCT $. _ 5 punct _ _ - -# sent_id = test-s4 -# text = "Bitte Termin im Internet machen." -1 " " PUNCT $( _ 7 punct _ SpaceAfter=No -2 Bitte bitten ADV ADV _ 7 advmod _ _ -3 Termin Termin NOUN NN Case=Nom|Gender=Masc|Number=Sing 7 obj _ _ -4-5 im _ _ _ _ _ _ _ _ -4 in in ADP APPR _ 6 case _ _ -5 dem der DET ART Case=Dat|Definite=Def|Gender=Neut|Number=Sing|PronType=Art 6 det _ _ -6 Internet Internet NOUN NN Case=Dat|Gender=Neut|Number=Sing 7 obl _ _ -7 machen machen VERB VVINF VerbForm=Inf 0 root _ SpaceAfter=No -8 . . PUNCT $. _ 7 punct _ SpaceAfter=No -9 " " PUNCT $( _ 7 punct _ _ diff --git a/demo/demo_quaxa.py b/demo/demo_quaxa.py deleted file mode 100644 index 42c4ba3..0000000 --- a/demo/demo_quaxa.py +++ /dev/null @@ -1,28 +0,0 @@ -import conllu -import random -import quaxa -import quaxa.reader - -random.seed(42) - - -def demo(): - # read conllu file - corpus = conllu.parse(open('demo.conllu', 'r').read()) - # compute scores for example sentences - for annot in corpus: - lemmas_content = [ - tok.get('lemma') for tok in annot - if tok.get('upos') in {'NOUN', 'VERB', 'ADJ'} - ] - sent = annot.metadata['text'] - for headword in lemmas_content: - factor = quaxa.total_score( - headword=headword, txt=sent, annotation=annot) - print(( - "total_score:" - f"{factor: 7.4f} | {headword} | {sent[:50]} ...")) - - -if __name__ == '__main__': - demo() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e3f7442 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,48 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "quaxa" +version = "0.1.1" +description = "QUAlity of sentence eXAmples scoring" +authors = [{name = "Ulf Hamster", email = "554c46@gmail.com"}] +classifiers = [ + "Development Status :: 1 - Planning", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Topic :: Education", + "Topic :: Scientific/Engineering", + "Topic :: Text Processing :: Linguistic" +] +requires-python = ">=3.7" +dependencies = ["spacy>=3.7"] +dynamic = ["readme"] + +[project.optional-dependencies] +dev = [ + "coverage", + "flake8", + "flake8-bugbear", + "mypy", + "pre-commit", + "pytest", + "pytest-cov", + "de-core-news-sm @ https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-3.7.0/de_core_news_sm-3.7.0-py3-none-any.whl#sha256=d88c737eb7eb766f730f6a2dcb99dfcdb81623e1e0d89a9c638a2182ac19c52e" +] + +[project.urls] +Homepage = "https://github.com/ulf1/quaxa" + +[tool.isort] +profile = "black" + +[tool.setuptools.dynamic] +readme = {file = ["README.md"], content-type = "text/markdown"} + +[tool.setuptools.packages.find] +exclude = ["tests"] + +[tool.setuptools.package-data] +"quaxa" = ["VulGer.csv"] diff --git a/quaxa/VulGer.csv b/quaxa/VulGer.csv new file mode 100644 index 0000000..3ded446 --- /dev/null +++ b/quaxa/VulGer.csv @@ -0,0 +1,3301 @@ +Word,Score +Koffer,0.875 +leicht,0.875 +richtig,0.850 +Laden,0.850 +Mensch,0.850 +Biene,0.850 +Chor,0.850 +wirklich,0.850 +Mandarine,0.850 +echt,0.825 +Sonnenblume,0.825 +Beeren,0.825 +Unsinn,0.825 +attraktiv,0.825 +Wichtigkeit,0.825 +beeindruckend,0.825 +Hefe,0.825 +dunkel,0.825 +trinken,0.825 +Erdbeere,0.825 +Schneeflocken,0.800 +Luftdruck,0.800 +erfolgreich,0.800 +Kommode,0.800 +Administration,0.800 +Apotheke,0.800 +Mund,0.800 +machen,0.800 +preiswert,0.800 +durchdacht,0.800 +Brüder,0.800 +Hausmittel,0.800 +Abenteuer,0.800 +Geselle,0.775 +Radfahrer,0.775 +gelungen,0.775 +eindrucksvoll,0.775 +Hund,0.775 +Mühle,0.775 +Banane,0.775 +veranschaulichen,0.775 +Praktikant,0.775 +perfekt,0.775 +direkt,0.775 +unwichtig,0.775 +Brosche,0.775 +lila,0.775 +entspannt,0.775 +Fahrradfahrer,0.775 +Broschüre,0.750 +Auto,0.750 +Besen,0.750 +permanent,0.750 +Insekt,0.750 +langweilig,0.750 +Verein,0.750 +sonnig,0.750 +offenherzig,0.750 +gefunden,0.750 +Spanngurt,0.750 +Gitarre,0.750 +jemand,0.750 +entfernen,0.750 +rot,0.750 +nett,0.750 +Ei,0.725 +Schraubenzieher,0.725 +Chemie,0.725 +munter,0.725 +phantastisch,0.725 +Mandarinen,0.725 +Gestalt,0.725 +bedeutsam,0.725 +Kohl,0.725 +Hilfestellung,0.725 +vielseitig,0.725 +intensiv,0.725 +einfallsreich,0.725 +gutaussehend,0.725 +irgendwie,0.725 +Abschnitt,0.725 +hungrig,0.725 +altmodisch,0.725 +modern,0.725 +Mitbürger,0.725 +bezaubern,0.725 +aushalten,0.725 +lecker,0.725 +ertragen,0.725 +Himbeer,0.725 +großartig,0.725 +Lastwagen,0.725 +humorvoll,0.725 +elegant,0.725 +Business,0.700 +ehemalig,0.700 +ansehnlich,0.700 +genial,0.700 +Reihe,0.700 +passend,0.700 +Miene,0.700 +Klugheit,0.700 +Schiff,0.700 +Heidelbeere,0.700 +umgraben,0.700 +Vögel,0.700 +Kachel,0.700 +Steuerzahler,0.700 +wunderbar,0.700 +blau,0.700 +Individuum,0.700 +experimentierfreudig,0.700 +erstklassig,0.700 +treffend,0.700 +interessant,0.700 +witzig,0.700 +Karotte,0.700 +beschaffen,0.700 +tätig,0.675 +zierlich,0.675 +gerade,0.675 +zauberhaft,0.675 +Wassermelone,0.675 +Nuss,0.675 +abgeben,0.675 +originell,0.675 +Orgel,0.675 +uninteressant,0.675 +hart,0.675 +Spitzname,0.675 +ultimativ,0.675 +Polizei,0.675 +manövrieren,0.675 +hell,0.675 +Demonstrant,0.675 +Karotten,0.675 +Nase,0.675 +Kirschen,0.675 +anspruchsvoll,0.675 +kontaktfreudig,0.675 +freundlich,0.675 +glitzernd,0.675 +seltsam,0.675 +Zwetschgen,0.675 +Kaffeefahrt,0.675 +neongelb,0.675 +kulinarisch,0.675 +Wespe,0.675 +Gans,0.675 +irgendjemand,0.675 +fabelhaft,0.675 +Zitrone,0.675 +wirkliches,0.675 +bunt,0.650 +hervorragend,0.650 +verführerisch,0.650 +Weißbrot,0.650 +unterhaltsam,0.650 +extravagant,0.650 +Kasten,0.650 +Dentist,0.650 +hochbezahlt,0.650 +Fass,0.650 +Keilriemen,0.650 +neumodisch,0.650 +magisch,0.650 +auflesen,0.650 +eigenartig,0.650 +Nichts,0.650 +Larven,0.650 +gar,0.650 +Fenchel,0.650 +Trauben,0.650 +Kaviar,0.650 +braungebrannt,0.650 +bestehend,0.650 +innovativ,0.650 +Marder,0.650 +pädagogisch,0.650 +abwechslungsreich,0.650 +temperamentvoll,0.650 +einzigartig,0.650 +Blues,0.650 +irgendwas,0.650 +Figuren,0.650 +Psychologe,0.625 +Kohlrabi,0.625 +Schüssel,0.625 +Ameise,0.625 +flach,0.625 +altertümlich,0.625 +aufregend,0.625 +Phrase,0.625 +blond,0.625 +super,0.625 +verbauen,0.625 +Einheitskleidung,0.625 +beeilen,0.625 +Joghurtbecher,0.625 +demontieren,0.625 +Süßkram,0.625 +faszinierend,0.625 +edel,0.625 +Eierbecher,0.625 +fantastisch,0.625 +Dackel,0.625 +Pfote,0.625 +Typen,0.625 +irgendwer,0.625 +Technokratin,0.625 +Schinken,0.625 +Streusel,0.625 +nerven,0.625 +Kahn,0.625 +Leinöl,0.625 +alt,0.600 +Charge,0.600 +Ignoranz,0.600 +lustig,0.600 +andauernd,0.600 +abenteuerlustig,0.600 +Mücke,0.600 +unkonventionell,0.600 +Fahrtunterbrechung,0.600 +tätowiert,0.600 +merkwürdig,0.600 +Vogel,0.600 +exklusiv,0.600 +schneiden,0.600 +Steigbügelhalter,0.600 +flüssig,0.600 +ahnungslos,0.600 +satteln,0.600 +Laufrad,0.600 +nasskalt,0.600 +taufrisch,0.600 +eiskalt,0.600 +realistisch,0.600 +grobmaschig,0.600 +gestreift,0.600 +meistbesucht,0.600 +reiten,0.600 +anhänglich,0.600 +buddeln,0.600 +Gesinnung,0.600 +supernett,0.600 +Fleisch,0.600 +traumhaft,0.600 +Abrakadabra,0.600 +Bohnen,0.600 +Therapeut,0.600 +traurig,0.600 +toll,0.600 +Türschlitz,0.575 +finden,0.575 +Schlitten,0.575 +belanglos,0.575 +Kraut,0.575 +Faun,0.575 +bezaubernd,0.575 +unsinnig,0.575 +Kehle,0.575 +Herzchen,0.575 +unerfahren,0.575 +herausragend,0.575 +betagt,0.575 +indirekt,0.575 +sinnlos,0.575 +facettenreich,0.575 +familiär,0.575 +andauern,0.575 +Aprikosen,0.575 +Masche,0.575 +Erdloch,0.575 +rustikal,0.575 +dauernd,0.575 +unlogisch,0.575 +Patron,0.575 +Dutzendware,0.575 +Subjekt,0.575 +nachlaufen,0.575 +Advokat,0.575 +bemalen,0.575 +Garnichts,0.575 +Psychiater,0.575 +Gamer,0.575 +zärtlich,0.575 +Kapitalist,0.550 +Zeitgenosse,0.550 +gesucht,0.550 +kraftvoll,0.550 +Tierchen,0.550 +Scheich,0.550 +Stieftochter,0.550 +einschränken,0.550 +Kuh,0.550 +Knorpel,0.550 +teuer,0.550 +liebkosen,0.550 +Belehrung,0.550 +Bauer,0.550 +kurzhaarig,0.550 +orangefarben,0.550 +Poem,0.550 +unvergesslich,0.550 +niedlich,0.550 +unternehmungslustig,0.550 +nervig,0.550 +wundervoll,0.550 +seelisch,0.550 +ambitioniert,0.550 +Aberglauben,0.550 +reizvoll,0.550 +langhaarig,0.550 +verstockt,0.550 +Dentistin,0.550 +demonstrierend,0.550 +Soße,0.550 +Sitzungsniederschrift,0.550 +waschecht,0.550 +glorreich,0.550 +Hirsch,0.550 +spannend,0.525 +irgendein,0.525 +Gummibärchen,0.525 +Glückspilz,0.525 +Einheitsbrei,0.525 +Entität,0.525 +Gemäuer,0.525 +Pinsel,0.525 +Hausmittelchen,0.525 +widersinnig,0.525 +kommandieren,0.525 +Selbstschutz,0.525 +laienhaft,0.525 +Schuppen,0.525 +Anfänger,0.525 +albern,0.525 +explosiv,0.525 +sympathisch,0.525 +klugreden,0.525 +faszinieren,0.525 +befremdlich,0.525 +Druckerei,0.525 +Fliegerei,0.525 +Hammer,0.525 +longieren,0.525 +kultig,0.525 +atemberaubend,0.525 +Psychotherapeut,0.525 +bescheiden,0.525 +herumfantasieren,0.525 +packend,0.525 +Pädagogiker,0.525 +banal,0.525 +ausgraben,0.525 +eklektisch,0.525 +kaputtgehen,0.525 +garnicht,0.525 +fegen,0.525 +Ross,0.525 +liebenswert,0.525 +rockig,0.525 +Provinz,0.525 +klasse,0.525 +hinterhertelefonieren,0.525 +moralisierend,0.500 +unrealistisch,0.500 +Obrigkeit,0.500 +untätig,0.500 +Bürste,0.500 +Ohrwurm,0.500 +Sonntagsfahrer,0.500 +romantisch,0.500 +pflaumenblau,0.500 +stylisch,0.500 +Frosch,0.500 +pausenlos,0.500 +eingeschränkt,0.500 +unglaublich,0.500 +Trivialliteratur,0.500 +hinreißend,0.500 +fabrizieren,0.500 +Stahlbürste,0.500 +Lache,0.500 +schimpfen,0.500 +begeisternd,0.500 +Geheimdienste,0.500 +Schwabe,0.500 +belehrend,0.500 +sozialpädagogisch,0.500 +Singerei,0.500 +schwierig,0.500 +reglementieren,0.500 +Streber,0.500 +Hochmut,0.500 +garnix,0.500 +angesagt,0.500 +Regime,0.500 +aberwitzig,0.500 +bitterkalt,0.475 +Spielwiese,0.475 +grotesk,0.475 +Topfen,0.475 +verwackelt,0.475 +Bürokratismus,0.475 +unnötig,0.475 +beeindrucken,0.475 +Lust,0.475 +Spruch,0.475 +schick,0.475 +schmunzeln,0.475 +herumhantieren,0.475 +Landsleute,0.475 +baumelnd,0.475 +hantieren,0.475 +unbelichtet,0.475 +abgenutzt,0.475 +Wohnmaschine,0.475 +Phantomdiskussion,0.475 +wortakrobatisch,0.475 +abschneiden,0.475 +Prinzesschen,0.475 +Vierbeiner,0.475 +liebreizend,0.475 +prickelnd,0.475 +Melonen,0.475 +Verunglimpfung,0.475 +Motten,0.475 +gewitzt,0.475 +stillos,0.475 +rauslocken,0.475 +kleinlich,0.475 +ratternd,0.475 +sinnlich,0.475 +Blinddarm,0.475 +spaßig,0.475 +weiterreiten,0.475 +Kuli,0.475 +Gurt,0.475 +Helfershelfer,0.475 +antiquiert,0.475 +Zeug,0.475 +Telekomiker,0.475 +trivial,0.475 +berechnend,0.475 +herrlich,0.475 +eingebildet,0.475 +Ungeziefer,0.475 +Machtpolitikerin,0.475 +Anschuldigung,0.475 +heiß,0.475 +skurril,0.475 +verhungern,0.450 +Rinder,0.450 +spitzenmäßig,0.450 +herunterrasseln,0.450 +Sekte,0.450 +Drache,0.450 +rausbauen,0.450 +halbgar,0.450 +Tschechei,0.450 +Quatsch,0.450 +unrasiert,0.450 +Reiterin,0.450 +Tonne,0.450 +Niemand,0.450 +unbedeutend,0.450 +unmittelbar,0.450 +Aufpasserin,0.450 +kindlich,0.450 +Gaul,0.450 +übel,0.450 +Tumor,0.450 +phantasieren,0.450 +Clown,0.450 +Anstalt,0.450 +Naivität,0.450 +wild,0.450 +ulkig,0.450 +Neudeutsch,0.450 +Werbefilmchen,0.450 +Null,0.450 +Rührschinken,0.450 +unwissend,0.450 +naiv,0.450 +Clique,0.450 +Renegatentum,0.450 +gigantisch,0.450 +schnulzig,0.450 +Kinderkram,0.450 +sauer,0.450 +wehrlos,0.450 +Systemmeinung,0.425 +Trecker,0.425 +Fähnchen,0.425 +kosmopolitisch,0.425 +unmoralisch,0.425 +superklasse,0.425 +machtbesessen,0.425 +Schlot,0.425 +Aberglaube,0.425 +Kraftwort,0.425 +kleinbürgerlich,0.425 +Mist,0.425 +Siebensachen,0.425 +Angst,0.425 +lachhaft,0.425 +typisch,0.425 +Pampers,0.425 +saftig,0.425 +wegschmeißen,0.425 +Klette,0.425 +Unterton,0.425 +Müll,0.425 +unsympathisch,0.425 +ausgeheult,0.425 +abkassieren,0.425 +Haartruhe,0.425 +Halbwissen,0.425 +Betonklotz,0.425 +Biedermeier,0.425 +kleingeistig,0.425 +Zone,0.425 +auseinandernehmen,0.425 +einstig,0.425 +Immobilienspekulant,0.425 +Amateur,0.425 +abhauen,0.425 +Sentimentalität,0.425 +Fritz,0.425 +anschuldigen,0.425 +Steinzeit,0.425 +komisch,0.425 +Paladin,0.425 +Maschinerie,0.425 +butterweich,0.400 +belogen,0.400 +Aufpasser,0.400 +Heuschrecke,0.400 +Lobestiraden,0.400 +notorisch,0.400 +Dose,0.400 +tiefschürfend,0.400 +packen,0.400 +unersättlich,0.400 +abwegig,0.400 +Panik,0.400 +Lauch,0.400 +unentwegt,0.400 +Steuersitz,0.400 +reaktionär,0.400 +beschimpfen,0.400 +trendig,0.400 +Ausbeutung,0.400 +Starallüren,0.400 +sensationell,0.400 +sinnfrei,0.400 +Isegrim,0.400 +ausfegen,0.400 +Blase,0.400 +auszubuddeln,0.400 +Stamm,0.400 +abgefahren,0.400 +Flosse,0.400 +Filz,0.400 +steinzeitlich,0.400 +entstammen,0.400 +fesselnd,0.400 +verbrannt,0.400 +Phobiker,0.400 +Zärtlichkeit,0.400 +Schreiberei,0.400 +Milieu,0.400 +Parole,0.400 +lax,0.400 +supertoll,0.375 +spießig,0.375 +Byzantiner,0.375 +Rohrstock,0.375 +Alter,0.375 +Gesträuch,0.375 +Jargon,0.375 +Schwammerl,0.375 +Deklamation,0.375 +rasiert,0.375 +Erpressung,0.375 +Zyste,0.375 +Scholastik,0.375 +Gummi,0.375 +link,0.375 +grandios,0.375 +behaart,0.375 +Mau-Mau,0.375 +abgedroschen,0.375 +staubtrocken,0.375 +Gestalten,0.375 +geistlos,0.375 +Langweiler,0.375 +Brühe,0.375 +renitent,0.375 +unverwüstlich,0.375 +Krücke,0.375 +blutjung,0.375 +Anzugträger,0.375 +Clan,0.375 +spalten,0.375 +stumpf,0.375 +degenerieren,0.375 +seicht,0.375 +Nabel,0.375 +Ostblock,0.375 +Dorfklatsch,0.375 +vollschlank,0.375 +beleidigend,0.375 +herumpfuschen,0.375 +schlecht,0.375 +Farce,0.375 +rumhantieren,0.375 +liebeshungrig,0.375 +Meute,0.375 +Idealismus,0.375 +Machtpolitik,0.375 +Klamotte,0.375 +Pflaume,0.375 +Abfallprodukt,0.375 +Autohupen,0.375 +kaputtmachen,0.375 +Gesell,0.375 +verbuddeln,0.375 +Chaot,0.350 +eingraben,0.350 +Verachtung,0.350 +Bolzen,0.350 +betrügen,0.350 +Büffel,0.350 +ausklopfen,0.350 +Dragoner,0.350 +episch,0.350 +abreißen,0.350 +Fidschi,0.350 +moralistisch,0.350 +frech,0.350 +veralbert,0.350 +rausnehmen,0.350 +ausbeuten,0.350 +schmeißen,0.350 +lamentieren,0.350 +surren,0.350 +Bube,0.350 +gebetsmühlenartig,0.350 +genervt,0.350 +druckvoll,0.350 +laschen,0.350 +wachsweich,0.350 +Juristenlatein,0.350 +zugestopft,0.350 +besorgen,0.350 +Fliegenfänger,0.350 +billig,0.350 +Trabant,0.350 +machtbewusst,0.350 +Agitation,0.350 +Sermon,0.350 +Stiefmutter,0.350 +Geschreibsel,0.350 +aufgescheucht,0.350 +Sophistik,0.350 +nichtmenschlich,0.350 +Brummer,0.350 +zusammenfegen,0.350 +ruinieren,0.350 +wohlgeformt,0.350 +mimen,0.350 +chillig,0.350 +veralbern,0.350 +Zuträger,0.350 +Trip,0.350 +weggemacht,0.350 +unkultiviert,0.350 +tendenziös,0.350 +galoppieren,0.350 +irrelevant,0.350 +wegradieren,0.350 +Natter,0.350 +absurd,0.350 +lasch,0.350 +abschlagen,0.350 +schnibbeln,0.350 +fantasieren,0.350 +Angeber,0.350 +Luxusproblem,0.350 +soft,0.350 +Geschmäckle,0.325 +reitend,0.325 +Gehabe,0.325 +dürftig,0.325 +Hyäne,0.325 +Gazette,0.325 +Bauchraum,0.325 +Handbetrieb,0.325 +Mittelchen,0.325 +Ziegenbart,0.325 +Kirschpflaumen,0.325 +Wurstel,0.325 +Säbelrasseln,0.325 +durchfegen,0.325 +ungebildet,0.325 +Kitsch,0.325 +Schmiere,0.325 +Prachttempel,0.325 +Domestik,0.325 +bombastisch,0.325 +Schrieb,0.325 +nass,0.325 +ausgehungert,0.325 +brabbeln,0.325 +rauswerfen,0.325 +Ziege,0.325 +pflastern,0.325 +Sargnagel,0.325 +Wust,0.325 +Mischling,0.325 +aufgerissen,0.325 +wichtigmachen,0.325 +Hutfahrer,0.325 +Strohfeuer,0.325 +erschreckend,0.325 +Profanität,0.325 +Taktierereien,0.325 +ausbürsten,0.325 +Byzantinismus,0.325 +wehleidig,0.325 +schematisch,0.325 +megacool,0.325 +arbeitsscheu,0.325 +eingebuddelt,0.325 +megagenial,0.325 +prosaisch,0.325 +Aufguss,0.325 +garnich,0.325 +knausern,0.325 +Sprengstoff,0.325 +Ausnutzung,0.325 +Stiefvater,0.325 +Vehikel,0.325 +kaputt,0.325 +Rohr,0.325 +rausmachen,0.325 +nachbeten,0.325 +Büchse,0.325 +stauchen,0.325 +Neandertaler,0.325 +Wachstumsaktie,0.325 +Putzfimmel,0.325 +pinseln,0.325 +hochgezüchtet,0.325 +Quarktasche,0.325 +Ellbogengesellschaft,0.325 +betrogen,0.300 +Chaise,0.300 +Geschrei,0.300 +Schaulust,0.300 +Klaue,0.300 +Baas,0.300 +Lobtiraden,0.300 +moralisieren,0.300 +plappern,0.300 +zusammenfantasiert,0.300 +Liebhaber,0.300 +reißerisch,0.300 +manieriert,0.300 +Laster,0.300 +schmatzen,0.300 +schnippeln,0.300 +obskur,0.300 +Lobestirade,0.300 +Zwerg,0.300 +Fettnäpfchen,0.300 +Lappen,0.300 +Spießigkeit,0.300 +schrill,0.300 +Schildbürger,0.300 +zeigefreudig,0.300 +Neckname,0.300 +buckeln,0.300 +rechtslastig,0.300 +vermiesen,0.300 +gruselig,0.300 +frusten,0.300 +garkein,0.300 +epigonisch,0.300 +ausschimpfen,0.300 +Litanei,0.300 +Genmanipulation,0.300 +schnöselig,0.300 +Komiker,0.300 +fiedeln,0.300 +wurscht,0.300 +Hinterhalt,0.300 +abstrus,0.300 +Stampfer,0.300 +dazwischenfahren,0.300 +Unfug,0.300 +Blutung,0.300 +Tagedieb,0.300 +anschleifen,0.300 +Taktiererei,0.300 +Halsstarrigkeit,0.300 +Riemen,0.300 +deftig,0.300 +Gourmettempel,0.300 +verbohrt,0.300 +Boulevardpresse,0.300 +uralt,0.300 +unsozial,0.300 +zahnarztmäßig,0.300 +kompilieren,0.300 +Kontrollfreak,0.300 +einnisten,0.300 +skrupellos,0.300 +hausen,0.300 +Geck,0.300 +wegkratzen,0.300 +furchtbar,0.300 +Gejohl,0.300 +Schnüffler,0.300 +versemmeln,0.275 +einpudern,0.275 +extrem,0.275 +miserabel,0.275 +hammer,0.275 +wegbekommen,0.275 +saucool,0.275 +zustopfen,0.275 +mitreiten,0.275 +Götze,0.275 +Witzbold,0.275 +unmenschlich,0.275 +Geschraubtheit,0.275 +verwerflich,0.275 +krankmachen,0.275 +garnichtmehr,0.275 +Machenschaft,0.275 +rumpeln,0.275 +Kalle,0.275 +Bande,0.275 +hochtrabend,0.275 +lausig,0.275 +Oberhammer,0.275 +Römerkragen,0.275 +rausschneiden,0.275 +Dysphemismus,0.275 +Humbug,0.275 +massiv,0.275 +zweitrangig,0.275 +Chose,0.275 +Fregatte,0.275 +einfärbig,0.275 +tönen,0.275 +Knirps,0.275 +Sensationspresse,0.275 +rausgeworfen,0.275 +rumkriechen,0.275 +Malocher,0.275 +Ergebener,0.275 +bocken,0.275 +Massenhysterie,0.275 +Lohnschreiber,0.275 +Ausbeuter,0.275 +gefrustet,0.275 +protestierend,0.275 +zusammenphantasieren,0.275 +charakterlos,0.275 +fetzig,0.275 +abfegen,0.275 +cool,0.275 +altbacken,0.275 +ausgefallen,0.275 +berauschend,0.275 +selbstverliebt,0.275 +hammermäßig,0.275 +frustriert,0.275 +halbstark,0.275 +Beißreflex,0.275 +blöd,0.275 +willenlos,0.275 +Slapstick,0.275 +wegkriegen,0.275 +Stadtstreicher,0.275 +abschaben,0.275 +vermasseln,0.275 +Pingpong,0.275 +patzig,0.275 +bisexuell,0.275 +haarig,0.275 +Macher,0.275 +Schleichwerbung,0.275 +umkippen,0.275 +Pritsche,0.275 +rauskratzen,0.275 +Agitator,0.275 +absplittern,0.275 +gönnerhaft,0.275 +knallhart,0.275 +teutonisch,0.275 +Schleimhaut,0.250 +doll,0.250 +Juristerei,0.250 +ausbuddeln,0.250 +heruntergekommen,0.250 +Singsang,0.250 +Siezerei,0.250 +Provinzbahn,0.250 +verschiffen,0.250 +habgierig,0.250 +psychisch,0.250 +gewissenlos,0.250 +aalglatt,0.250 +Amateurin,0.250 +Zeitungsente,0.250 +hinschmeißen,0.250 +fesch,0.250 +supercool,0.250 +Blondine,0.250 +aufgefressen,0.250 +schräg,0.250 +Schießerei,0.250 +ausgeflippt,0.250 +Lügner,0.250 +Polyp,0.250 +kurvig,0.250 +Provinznest,0.250 +bespaßen,0.250 +Petze,0.250 +wegschneiden,0.250 +Getier,0.250 +Ausschnitte,0.250 +irre,0.250 +Mauerblümchen,0.250 +Gleichmacherei,0.250 +Wirrkopf,0.250 +Lippenbekenntnis,0.250 +Lausebengel,0.250 +Iwan,0.250 +harmoniesüchtig,0.250 +kranken,0.250 +Trittbrettfahrer,0.250 +gerissen,0.250 +tratschen,0.250 +Tränchen,0.250 +dumm,0.250 +Profitmacherei,0.250 +paktieren,0.250 +rausschmeißen,0.250 +Besatzer,0.250 +wegschnippeln,0.250 +wuchtig,0.250 +jammernd,0.250 +Rechtspopulismus,0.250 +vollgeschmiert,0.250 +barmen,0.250 +schrecklich,0.250 +Westler,0.250 +Volkskrankheit,0.250 +megagroß,0.250 +töricht,0.250 +Sterbehilfe,0.250 +Salm,0.225 +Kipper,0.225 +vertrinken,0.225 +Ratsche,0.225 +Schlappen,0.225 +zugespammt,0.225 +expedieren,0.225 +nachplappern,0.225 +Katzenkonzert,0.225 +Osterhasenpädagogik,0.225 +verbohren,0.225 +ruiniert,0.225 +knorrig,0.225 +Parvenü,0.225 +Fachchinesisch,0.225 +halsstarrig,0.225 +Unterbelichtung,0.225 +pubertierend,0.225 +lahm,0.225 +mollig,0.225 +ausgebufft,0.225 +Ami,0.225 +Verwachsung,0.225 +Abszess,0.225 +herunterleiern,0.225 +SBZ,0.225 +Brust,0.225 +wegretuschieren,0.225 +Klientelpartei,0.225 +Hiwi,0.225 +Jeckin,0.225 +abgehen,0.225 +Bruchpilot,0.225 +Gigantismus,0.225 +Geschwätz,0.225 +tierisch,0.225 +blutig,0.225 +herzlos,0.225 +Schrott,0.225 +raubeinig,0.225 +Haufen,0.225 +Milchmädchenrechnung,0.225 +rollern,0.225 +gemein,0.225 +zubetonieren,0.225 +ausschiffen,0.225 +Nylons,0.225 +herumbummeln,0.225 +widerlich,0.225 +brüsten,0.225 +Zeugs,0.225 +bemitleidenswert,0.225 +Gutmensch,0.225 +Ismus,0.225 +reinmachen,0.225 +schweinchenrosa,0.225 +pudern,0.225 +Geltungssucht,0.225 +Schwellung,0.225 +rutschen,0.225 +Landstreicher,0.225 +motzig,0.225 +scheuern,0.225 +zuschmeißen,0.225 +rückständig,0.225 +megatoll,0.225 +raushauen,0.225 +Hausmütterchen,0.225 +Superstition,0.225 +Treiber,0.225 +Vettel,0.225 +schnuppe,0.225 +gebuddelt,0.225 +sattsam,0.225 +groovig,0.225 +abschätzig,0.225 +Klüngel,0.225 +schwätzen,0.200 +autistisch,0.200 +beschränken,0.200 +Pranke,0.200 +Militarismus,0.200 +peinlich,0.200 +chaotisch,0.200 +pedantisch,0.200 +Flegel,0.200 +Tiefflieger,0.200 +Simbel,0.200 +auspowern,0.200 +altersschwach,0.200 +stieren,0.200 +Schreiberling,0.200 +Promenadenmischung,0.200 +Stuss,0.200 +Mistwetter,0.200 +Wankelmütigkeit,0.200 +Spucke,0.200 +eierspeisen,0.200 +Verstocktheit,0.200 +breitmachen,0.200 +widernatürlich,0.200 +wegmachen,0.200 +zischeln,0.200 +quittegelb,0.200 +johlen,0.200 +Wortedrechsler,0.200 +herablassend,0.200 +Dörrpflaume,0.200 +ausgebuddelt,0.200 +Spielverderber,0.200 +Knecht,0.200 +baumeln,0.200 +Zottel,0.200 +Wisch,0.200 +Dunstkreis,0.200 +schwachsinnig,0.200 +saukalt,0.200 +dahergelaufen,0.200 +Satan,0.200 +Lobtirade,0.200 +Panikmache,0.200 +rumgehangen,0.200 +striegeln,0.200 +losreiten,0.200 +Ginger,0.200 +raffgierig,0.200 +Hurra-Geschrei,0.200 +Montagswagen,0.200 +Stiefschwester,0.200 +schweinekalt,0.200 +zynisch,0.200 +aufblasen,0.200 +Habsucht,0.200 +verscharrt,0.200 +Betonburg,0.200 +auspolieren,0.200 +grauslich,0.200 +fratzenhaft,0.200 +Paparazzo,0.200 +Bourgeois,0.200 +schlimm,0.200 +klapprig,0.200 +ungehobelt,0.200 +zubetoniert,0.200 +Kabuff,0.200 +spritzig,0.200 +Lobhudelei,0.200 +Sophist,0.200 +rumheulen,0.200 +Hirngespinst,0.200 +Autoritätsgläubigkeit,0.200 +Technokrat,0.200 +Eurokrat,0.200 +hemmungslos,0.200 +beleidigt,0.200 +Feudalität,0.200 +Lamento,0.200 +Küchenpsychologie,0.200 +Pejorativsuffix,0.200 +Spezis,0.200 +Pantoffelheld,0.200 +Seilschaft,0.200 +erzkonservativ,0.200 +Dichterling,0.200 +Provinzlerin,0.175 +Selbstbeweihräucherung,0.175 +Volks,0.175 +Mammon,0.175 +schlaksig,0.175 +Amigo,0.175 +Gör,0.175 +Unterschicht,0.175 +rumgeschrien,0.175 +Hammeruni,0.175 +Rute,0.175 +Seelenklempner,0.175 +Mandl,0.175 +Hammel,0.175 +unartig,0.175 +Haufe,0.175 +vorsintflutlich,0.175 +krank,0.175 +verschmust,0.175 +Schickeria,0.175 +Geschlossene,0.175 +verrückt,0.175 +schwatzhaft,0.175 +Populismus,0.175 +tröten,0.175 +pejorativ,0.175 +verprassen,0.175 +knochentrocken,0.175 +bizarr,0.175 +verhätscheln,0.175 +Nill,0.175 +Hasenscharte,0.175 +Korpsgeist,0.175 +keppeln,0.175 +Betonkopf,0.175 +aufklauben,0.175 +makaber,0.175 +scharrend,0.175 +Herdprämie,0.175 +Stümper,0.175 +ungezogen,0.175 +Gebrabbel,0.175 +klüngeln,0.175 +feig,0.175 +kriminell,0.175 +machtsüchtig,0.175 +Beckmesser,0.175 +blaustrümpfig,0.175 +Ehrgeizling,0.175 +Spalte,0.175 +Pauker,0.175 +normen,0.175 +Polypen,0.175 +Geschreie,0.175 +betrinken,0.175 +Stutzer,0.175 +ausreiten,0.175 +Ketzerei,0.175 +Elaborat,0.175 +Bammel,0.175 +Fremdarbeiter,0.175 +resch,0.175 +Muffel,0.175 +nimmersatt,0.175 +klecksen,0.175 +runtergeputzt,0.175 +runtergerissen,0.175 +brutal,0.175 +Handlanger,0.175 +krankfeiern,0.175 +Krabbelviecher,0.175 +Paragrafenreiter,0.150 +depretiativ,0.150 +Rundkopf,0.150 +Pharisäer,0.150 +Kommerzialist,0.150 +schwafeln,0.150 +Demokratur,0.150 +Schwachsinn,0.150 +feige,0.150 +Vieh,0.150 +Obrist,0.150 +iPeople,0.150 +verknöchert,0.150 +supi,0.150 +Skribent,0.150 +Stammtischpolitik,0.150 +faseln,0.150 +unterbelichtet,0.150 +hausbacken,0.150 +Lümmel,0.150 +Primitivität,0.150 +Schwarte,0.150 +Kasper,0.150 +beschränkt,0.150 +Getue,0.150 +arrogant,0.150 +zanksüchtig,0.150 +Schuft,0.150 +Mutant,0.150 +jeck,0.150 +bläken,0.150 +Humanvermögen,0.150 +scharren,0.150 +wegfegen,0.150 +aufwiegeln,0.150 +stinkig,0.150 +Grüßaugust,0.150 +Schmierentheater,0.150 +Verbrechen,0.150 +geschert,0.150 +Streiter,0.150 +Fiedler,0.150 +Slang,0.150 +Bestie,0.150 +Stoffel,0.150 +blödsinnig,0.150 +Teufelin,0.150 +kleinkariert,0.150 +bekleistern,0.150 +gutgebaut,0.150 +Käsefüße,0.150 +Ganove,0.150 +homosexuell,0.150 +Turbokapitalismus,0.150 +mäkeln,0.150 +Schnitte,0.150 +Schmierblatt,0.150 +Emo,0.150 +Konsorten,0.150 +Schachtel,0.150 +tumb,0.150 +kobern,0.150 +Ostzone,0.150 +Wichtigtuer,0.150 +Gender-Ideologie,0.150 +daherreden,0.150 +Bettler,0.150 +Gerümpel,0.150 +Eigenbrötlerin,0.150 +sadistisch,0.150 +Hautevolee,0.150 +Krücken,0.150 +dreckig,0.150 +Bock,0.125 +armselig,0.125 +Ehrgeizler,0.125 +infantil,0.125 +herumhantiert,0.125 +buhlen,0.125 +Petrarkismus,0.125 +Kulissenschieber,0.125 +abknibbeln,0.125 +abqualifizieren,0.125 +grenzgenial,0.125 +Zipfel,0.125 +Jesuit,0.125 +belügen,0.125 +abbürsten,0.125 +verschachern,0.125 +krass,0.125 +Teengirl,0.125 +Rattenfänger,0.125 +durchtrieben,0.125 +pampig,0.125 +Butzenscheibenlyrik,0.125 +Mafia,0.125 +Mietskaserne,0.125 +penetrant,0.125 +autoritätsgläubig,0.125 +Marionettenstaat,0.125 +aufgeblasen,0.125 +Protestierender,0.125 +Flickschusterei,0.125 +Kracke,0.125 +Synkretismus,0.125 +Machtpolitiker,0.125 +Kurpfuscher,0.125 +Tinnef,0.125 +vorjammern,0.125 +Zaupe,0.125 +Hetze,0.125 +speckig,0.125 +einschmeißen,0.125 +hirnlos,0.125 +Liliputaner,0.125 +Wolfsrachen,0.125 +gepfeffert,0.125 +hinklotzen,0.125 +Maurerbrause,0.125 +gepierct,0.125 +Liebesspiele,0.125 +Besserwisser,0.125 +gebetsmühlenhaft,0.125 +knackig,0.125 +machtgierig,0.125 +ausgekocht,0.125 +anschmeißen,0.125 +Brecher,0.125 +kapores,0.125 +Machwerk,0.125 +Eigenbrötler,0.125 +Gefühlsduselei,0.125 +durchgeknallt,0.125 +Spießbürger,0.125 +abrauchen,0.125 +zutrinken,0.125 +Darmpolypen,0.125 +verunglimpfen,0.125 +schnurz,0.125 +Vielfrass,0.125 +mafiös,0.125 +herankarren,0.125 +abgehalftert,0.125 +auftakeln,0.125 +Suada,0.125 +Rumpelkammer,0.125 +Götzenbild,0.125 +Fez,0.125 +Okolyt,0.125 +Massenblatt,0.125 +fremdgehen,0.125 +zugeschmissen,0.125 +Dreck,0.125 +Ackergaul,0.125 +verbuddelt,0.100 +Gewinnmacherei,0.100 +Krämerseele,0.100 +harangieren,0.100 +Provinzler,0.100 +einbuddeln,0.100 +derb,0.100 +Seelenschmetter,0.100 +Rauchfangtaube,0.100 +hopsgehen,0.100 +Sklave,0.100 +Tubel,0.100 +Blabla,0.100 +Voyeurismus,0.100 +schlitteln,0.100 +melkitisch,0.100 +Wegelagerer,0.100 +Werbegeschwurbel,0.100 +Verbrecher,0.100 +Kapuzinade,0.100 +Charmebolzen,0.100 +Versager,0.100 +Buhler,0.100 +Matsche,0.100 +Lappe,0.100 +Ghetto,0.100 +Kieberer,0.100 +idiotisch,0.100 +kasuistisch,0.100 +Muff,0.100 +Feigling,0.100 +Hochstapler,0.100 +Dickfelligkeit,0.100 +Hausfrauenpsychologie,0.100 +umschmeißen,0.100 +johlend,0.100 +rumbummeln,0.100 +Befriedigung,0.100 +gepinkelt,0.100 +untertänig,0.100 +Möchtegern,0.100 +Sippschaft,0.100 +Gummiparagraph,0.100 +verhökern,0.100 +Zoni,0.100 +bürsten,0.100 +Loch,0.100 +schlappern,0.100 +zetern,0.100 +antichambrieren,0.100 +Gsiberger,0.100 +stramm,0.100 +Brimborium,0.100 +verhageln,0.100 +Mob,0.100 +verbocken,0.100 +herumlavieren,0.100 +Teutone,0.100 +Perfidie,0.100 +drall,0.100 +Kalfaktor,0.100 +Rotschweif,0.100 +Beckmesserei,0.100 +gammlig,0.100 +unausgegoren,0.100 +Schlipsträger,0.100 +voyeuristisch,0.100 +verderben,0.100 +rumhängen,0.100 +Muskelprotz,0.100 +Filou,0.100 +Brüllwürfel,0.100 +herumeiern,0.100 +menschenverachtend,0.100 +schwängern,0.100 +liederlich,0.100 +Scheckbuchdiplomatie,0.100 +treudoof,0.100 +Keusche,0.100 +zimperlich,0.100 +Nibelungentreue,0.100 +schippern,0.100 +geritten,0.100 +verrucht,0.075 +gebrabbelt,0.075 +verhunzen,0.075 +Egomane,0.075 +ausschlachten,0.075 +devot,0.075 +Teutonismus,0.075 +Klimperer,0.075 +verscherbeln,0.075 +perpetuieren,0.075 +aufkratzen,0.075 +säbeln,0.075 +wursten,0.075 +antisozial,0.075 +Ypsilonwald,0.075 +tabulos,0.075 +Winkeladvokat,0.075 +Weimberl,0.075 +kitschig,0.075 +unterwürfig,0.075 +Straßenkind,0.075 +Handyaner,0.075 +Verleumdung,0.075 +psychopathisch,0.075 +Kreatur,0.075 +Kriecherei,0.075 +mausen,0.075 +Ohnemichel,0.075 +Rotte,0.075 +impotent,0.075 +aufreißen,0.075 +Blondling,0.075 +machthungrig,0.075 +Zenzi,0.075 +triefen,0.075 +Ochse,0.075 +Nazist,0.075 +plump,0.075 +Liebedienerei,0.075 +boshaft,0.075 +reinschmeißen,0.075 +Käseblättchen,0.075 +rattern,0.075 +oll,0.075 +Lügenbold,0.075 +Wischiwaschi,0.075 +Stino,0.075 +schniegeln,0.075 +Kafir,0.075 +Hardcore-Vegetarierin,0.075 +blubbern,0.075 +Politklasse,0.075 +Affentheater,0.075 +Geschäftemacherei,0.075 +Reff,0.075 +Revolverblatt,0.075 +rohren,0.075 +Heckenschütze,0.075 +Schinderei,0.075 +rumpfuschen,0.075 +vollschmieren,0.075 +wanzen,0.075 +grottig,0.075 +saften,0.075 +nichtsnutzig,0.075 +angehupt,0.075 +Putzfraueninsel,0.075 +anreiten,0.075 +Hartzer,0.075 +Kredithai,0.075 +willig,0.075 +Lachnummer,0.075 +Kameraderie,0.075 +verschaukeln,0.075 +Populärpsychologie,0.075 +Gefasel,0.075 +Frauenzimmer,0.075 +blöken,0.075 +Hurrapatriotismus,0.050 +Junkfood,0.050 +Gefühlslegastheniker,0.050 +Geldsack,0.050 +Zocker,0.050 +begriffsstutzig,0.050 +Pascha,0.050 +schwurbeln,0.050 +Pfründe,0.050 +Zwergwuchs,0.050 +Kritikaster,0.050 +geschwätzig,0.050 +Horde,0.050 +ekeln,0.050 +Bankster,0.050 +geldgierig,0.050 +Höfling,0.050 +gefressen,0.050 +Mafiosi,0.050 +Konsumterror,0.050 +zipfelig,0.050 +gefegt,0.050 +verschaukelt,0.050 +Gebräu,0.050 +Gejohle,0.050 +sophistisch,0.050 +Hilfssheriff,0.050 +dienern,0.050 +Homosexueller,0.050 +Wüstling,0.050 +Sozi,0.050 +abgeranzt,0.050 +türken,0.050 +bedeppert,0.050 +Gehupe,0.050 +gesabbelt,0.050 +Herumtreiber,0.050 +Wirtschaftsflüchtling,0.050 +aufplustern,0.050 +Brüste,0.050 +superscharf,0.050 +absäbeln,0.050 +Mongoloismus,0.050 +Schaumschläger,0.050 +Krempel,0.050 +gierig,0.050 +zusammenstückeln,0.050 +Retortenband,0.050 +Überdruck,0.050 +Wohlstandsevangelium,0.050 +bombig,0.050 +mauscheln,0.050 +Seiche,0.050 +Ballerspiel,0.050 +Riemenspanner,0.050 +Schofel,0.050 +Schnecke,0.050 +Quatschkopf,0.050 +Gesäusel,0.050 +Bankert,0.050 +Macker,0.050 +Notnagel,0.050 +geil,0.050 +Dellwarze,0.050 +verdorben,0.050 +hinpfeffern,0.050 +Rädelsführerin,0.050 +Janhagel,0.050 +Alkoholiker,0.050 +Babe,0.025 +Zusammenrottung,0.025 +anschmieren,0.025 +schnipseln,0.025 +Pejorativum,0.025 +Knutscher,0.025 +Hudelei,0.025 +geschmäcklerisch,0.025 +Spesenritterin,0.025 +klackern,0.025 +Heimchen,0.025 +einreiten,0.025 +fies,0.025 +Büttel,0.025 +oberfaul,0.025 +schlitzen,0.025 +Klimbim,0.025 +pulvern,0.025 +ritzen,0.025 +korrupt,0.025 +Kiberer,0.025 +Euter,0.025 +Dranktonne,0.025 +Abzocke,0.025 +Kathole,0.025 +Gummihals,0.025 +bäurisch,0.025 +schnauzen,0.025 +Windbeutelei,0.025 +Spökenkieker,0.025 +Psychopath,0.025 +Revolverpresse,0.025 +Niete,0.025 +Geplapper,0.025 +Getto,0.025 +bechern,0.025 +Zynismus,0.025 +Vorzimmerdrachen,0.025 +Beckmesserin,0.025 +Spesenritter,0.025 +Spindoktor,0.025 +Erregung,0.025 +Schwätzer,0.025 +Dilettant,0.025 +herumspintisieren,0.025 +runterschmeißen,0.025 +Wanze,0.025 +Schwabo,0.025 +Pappen,0.025 +Griechenland-Versteher,0.025 +Schihaserl,0.025 +grauenvoll,0.025 +Vulgarität,0.025 +Höhlenmensch,0.025 +scheintot,0.025 +vollgekleistert,0.025 +Geldmacherei,0.025 +wegschleifen,0.025 +Brut,0.025 +Drahtzieher,0.025 +Wicht,0.025 +Diebesbande,0.025 +Peacenik,0.025 +Hundefraß,0.025 +Matrone,0.025 +labern,0.025 +Katzbuckelei,0.025 +uncool,0.025 +gammelig,0.025 +Revoluzzer,0.025 +nichtswürdig,0.025 +Wanst,0.025 +windelweich,0.025 +Fleischhacker,0.025 +Bio-Deutscher,0.025 +geschwurbelt,0.025 +Schwadroneur,0.025 +Welscher,0.025 +Jecke,0.025 +Zigeunersoße,0.025 +Geschwurbel,0.025 +schludrig,0.025 +kiffen,0.025 +zocken,0.025 +schwadronieren,0.025 +knutschen,0.025 +beflegeln,0.025 +auffressen,0.000 +Papist,0.000 +Schreier,0.000 +Rabulist,0.000 +Nebbochant,0.000 +Duckmäuserei,0.000 +Geschwafel,0.000 +Killerspiel,0.000 +Russlandversteher,0.000 +dick,0.000 +vertrottelt,0.000 +sabbeln,0.000 +Klitsche,0.000 +Ramsch,0.000 +Kriegsgewinnlerin,0.000 +rassig,0.000 +Sozis,0.000 +Glotze,0.000 +einschiffen,0.000 +beleidigen,0.000 +Hetzvideo,0.000 +Pappenschlosser,0.000 +Konsenssoße,0.000 +vollgesaugt,0.000 +Hetzsender,0.000 +Mümmelgreis,0.000 +Tipper,0.000 +Sandler,0.000 +Gequassel,0.000 +Asphaltblatt,0.000 +Kebsfrau,0.000 +vermiest,0.000 +Stinktier,0.000 +schnackseln,0.000 +Fetzen,0.000 +Nikolait,0.000 +fressen,0.000 +Urviech,0.000 +Yankee,0.000 +Pupe,0.000 +Bonze,0.000 +Irre,0.000 +ablecken,0.000 +Räuberzivil,0.000 +Käseblatt,0.000 +Säufer,0.000 +Weinpanscher,0.000 +Besserwessi,0.000 +Piese,0.000 +Zecke,0.000 +Wurstblatt,0.000 +abschimmeln,0.000 +Hardcore-Vegetarier,0.000 +Burleske,0.000 +Schleicher,0.000 +Blunzen,0.000 +Rattenrennen,0.000 +Latrinenparole,0.000 +Humanitätsduselei,0.000 +schofelig,0.000 +zusammenrotten,0.000 +mies,0.000 +Kanonenfutter,0.000 +Poussage,0.000 +pervers,0.000 +Irrenanstalt,0.000 +täppisch,0.000 +Schlaumeier,0.000 +Pinke,0.000 +kopulieren,0.000 +vierschrötig,0.000 +versacken,0.000 +Pixelschubser,0.000 +paaren,0.000 +Jüngelchen,0.000 +verdummen,0.000 +Pseudowissenschaft,0.000 +mafios,0.000 +Gehudele,0.000 +koffern,0.000 +Schrapphals,0.000 +bolschewistisch,0.000 +Tschingg,0.000 +Kebse,0.000 +Barbar,0.000 +Kraftmeier,0.000 +Polente,0.000 +geleckt,0.000 +Laufbursche,0.000 +Ausraster,0.000 +Zahnklempner,0.000 +hoffärtig,0.000 +aufgemotzt,0.000 +einschleimen,-0.025 +Mischpoke,-0.025 +pseudoreligiös,-0.025 +Schwarzkittel,-0.025 +Terrorist,-0.025 +Schmock,-0.025 +maulen,-0.025 +Paselacken,-0.025 +Mähre,-0.025 +Lump,-0.025 +ausspritzen,-0.025 +klittern,-0.025 +Spritnase,-0.025 +Latte,-0.025 +verscharren,-0.025 +klampfen,-0.025 +Fabrikmädchen,-0.025 +Sprachnörgler,-0.025 +Sexspielzeuge,-0.025 +Dunkeldeutschland,-0.025 +runtergeschluckt,-0.025 +verhascht,-0.025 +Parteibonze,-0.025 +Machatschek,-0.025 +doof,-0.025 +strunz,-0.025 +Nerd,-0.025 +Großkotzigkeit,-0.025 +runterrocken,-0.025 +Unterläufel,-0.025 +Jesuslatsche,-0.025 +Wanderpokal,-0.025 +Gutmenschentum,-0.025 +Immobilienhai,-0.025 +Löli,-0.025 +Schweinerei,-0.025 +spechteln,-0.025 +Schinder,-0.025 +schachern,-0.025 +sauberlecken,-0.025 +elendig,-0.025 +verschwurbelt,-0.025 +Bolschewik,-0.025 +Flitzpiepe,-0.025 +Dreckswetter,-0.025 +Gezücht,-0.025 +bescheuert,-0.025 +Schmachtfetzen,-0.025 +schrammeln,-0.025 +sexsüchtig,-0.025 +Papulatur,-0.025 +Knüppel,-0.025 +Verdummung,-0.025 +besserwisserisch,-0.025 +gefesselt,-0.025 +sekten,-0.025 +Halbstarker,-0.025 +Freak,-0.025 +spucken,-0.025 +ausheulen,-0.025 +Loddel,-0.025 +süppeln,-0.025 +prollig,-0.025 +perfid,-0.025 +Kroppzeug,-0.025 +Busen,-0.025 +Hexe,-0.025 +Idiot,-0.025 +Mohrenkopf,-0.025 +Kirchturmpolitik,-0.025 +Daesch,-0.025 +Aktenhengst,-0.025 +dissozial,-0.025 +Verticker,-0.025 +fett,-0.025 +Franzmann,-0.025 +Affe,-0.025 +Alpenindianer,-0.025 +Metzelei,-0.025 +Nymphomane,-0.025 +Pöker,-0.025 +glupschen,-0.025 +petzen,-0.025 +Melkit,-0.025 +Saustall,-0.025 +Achtgroschenjunge,-0.025 +Tratschtante,-0.025 +Tattergreis,-0.025 +Nebbich,-0.025 +Schafskopf,-0.025 +Halbaffe,-0.050 +sabbern,-0.050 +Verspargelung,-0.050 +Lombadier,-0.050 +Jesuslatschen,-0.050 +proletenhaft,-0.050 +Punze,-0.050 +Erbsenzähler,-0.050 +Medienmeute,-0.050 +feil,-0.050 +Hetzblatt,-0.050 +Sack,-0.050 +Lappin,-0.050 +Gutachteritis,-0.050 +Murkser,-0.050 +Rechtsverdreher,-0.050 +rattenscharf,-0.050 +genagelt,-0.050 +Canaille,-0.050 +willfährig,-0.050 +Seelenstriptease,-0.050 +Kuhdorf,-0.050 +Hetzschrift,-0.050 +Konkubine,-0.050 +Klippschule,-0.050 +Habenichts,-0.050 +Dreckspatz,-0.050 +Marionette,-0.050 +Kostgänger,-0.050 +Gejaule,-0.050 +Duzerei,-0.050 +Mokchen,-0.050 +Schundroman,-0.050 +moralinsauer,-0.050 +Hexenjagd,-0.050 +Spießer,-0.050 +keulen,-0.050 +rumknutschen,-0.050 +Felgenkiller,-0.050 +schofel,-0.050 +Piefke,-0.050 +Fusel,-0.050 +flennen,-0.050 +gammeln,-0.050 +Schurkenstaat,-0.050 +Natschalnik,-0.050 +verquast,-0.050 +grenzdebil,-0.050 +abschmieren,-0.050 +Vulgärpsychologie,-0.050 +Visage,-0.050 +Halbdackel,-0.050 +Kahlschlagsanierung,-0.050 +Apparatschik,-0.050 +Genderismus,-0.050 +vegetieren,-0.050 +schlecken,-0.050 +anlabern,-0.050 +begafft,-0.050 +Pinselquäler,-0.050 +Journaille,-0.050 +Musel,-0.050 +eklig,-0.050 +Geilomat,-0.050 +saugut,-0.050 +lästern,-0.050 +zickig,-0.050 +Ferkel,-0.050 +Brauereigaul,-0.075 +lebegeil,-0.075 +Waldschrat,-0.075 +Russland-Versteher,-0.075 +Hürchen,-0.075 +anwidern,-0.075 +masturbierend,-0.075 +Riesensaustall,-0.075 +Putin-Versteher,-0.075 +deppert,-0.075 +Gummiadler,-0.075 +Gottesleugner,-0.075 +Verkalkungszulage,-0.075 +geldgeil,-0.075 +Giftler,-0.075 +Dudelfunk,-0.075 +Sittenstrolch,-0.075 +parasitär,-0.075 +volkstümelnd,-0.075 +Trash,-0.075 +labbern,-0.075 +sülzen,-0.075 +runterholt,-0.075 +abmelken,-0.075 +Scharteke,-0.075 +Gewese,-0.075 +nackig,-0.075 +saugeil,-0.075 +Zeitungsfritze,-0.075 +Hupen,-0.075 +Großmaul,-0.075 +geblasen,-0.075 +welsch,-0.075 +Tschusch,-0.075 +Salonkommunismus,-0.075 +Flatrate-Saufen,-0.075 +Werbefritze,-0.075 +großkotzig,-0.075 +Griesgram,-0.075 +Papierschweizer,-0.075 +anpflaumen,-0.075 +Pappalatur,-0.075 +schnurzegal,-0.075 +Halsabschneider,-0.075 +Saufabend,-0.075 +Cowgirl,-0.075 +Pärchensex,-0.075 +Hetztirade,-0.075 +rausgeknallt,-0.075 +vergammelt,-0.075 +Sklavin,-0.075 +Plebs,-0.075 +hinmachen,-0.075 +Leuteschinder,-0.075 +altklug,-0.075 +Pampe,-0.075 +verblöden,-0.075 +Penis,-0.075 +Hottie,-0.075 +debil,-0.075 +Kauleiste,-0.075 +Rothaut,-0.075 +zureiten,-0.075 +Schwein,-0.075 +Quacksalberin,-0.075 +beknackt,-0.075 +Landei,-0.075 +Sozialklempner,-0.100 +Irrenhaus,-0.100 +Teuro,-0.100 +Hetzfilm,-0.100 +Maulaffe,-0.100 +Schnösel,-0.100 +Balltreter,-0.100 +protzig,-0.100 +Dahergelaufener,-0.100 +Itzig,-0.100 +Querkopf,-0.100 +abschlecken,-0.100 +besoffen,-0.100 +Habschi,-0.100 +Kitzler,-0.100 +Grufti,-0.100 +vulgo,-0.100 +abplatzen,-0.100 +Testeritis,-0.100 +Bierdimpfel,-0.100 +Schlitz,-0.100 +Pinkler,-0.100 +Plörren,-0.100 +Heulsuse,-0.100 +Großkopferte,-0.100 +Beschimpfung,-0.100 +Poetaster,-0.100 +Narr,-0.100 +Boner,-0.100 +Federfuchser,-0.100 +fuddeln,-0.100 +Bulle,-0.100 +Blutkohle,-0.100 +krüppelig,-0.100 +Quacksalber,-0.100 +Lasterhöhle,-0.100 +omfg,-0.100 +vergeigen,-0.100 +erschmieren,-0.100 +volksfeindlich,-0.100 +Aasjägerei,-0.100 +Zockerbude,-0.100 +salbadern,-0.100 +Naivling,-0.100 +ankotzen,-0.100 +scheißegal,-0.100 +kiffend,-0.100 +grottenschlecht,-0.100 +verlogen,-0.100 +Hohlkopf,-0.100 +Korinthenkackerei,-0.100 +Drücker,-0.100 +stinkreich,-0.100 +rausgeschmissen,-0.100 +Tugendterror,-0.100 +leckend,-0.100 +Kopftuchmädchen,-0.100 +Lakai,-0.100 +geifernd,-0.100 +ejakulieren,-0.100 +Amiland,-0.100 +Raufbold,-0.100 +Ausländer,-0.100 +Schoas,-0.125 +Handyot,-0.125 +Fußhupe,-0.125 +ersäufen,-0.125 +Emanze,-0.125 +gottverdammt,-0.125 +Beidl,-0.125 +versaufen,-0.125 +Schnellschuss,-0.125 +Kriegsgewinnler,-0.125 +Knacker,-0.125 +lochen,-0.125 +wegfressen,-0.125 +Großkotz,-0.125 +Drecksladen,-0.125 +Fressalien,-0.125 +Spritti,-0.125 +verzopft,-0.125 +Haderlump,-0.125 +kriecherisch,-0.125 +Analsex,-0.125 +abschachern,-0.125 +Ostlerin,-0.125 +rabulistisch,-0.125 +talentfrei,-0.125 +bestialisch,-0.125 +abzocken,-0.125 +Softie,-0.125 +speiübel,-0.125 +Gschaftlhuberin,-0.125 +Protz,-0.125 +abgezockt,-0.125 +Unband,-0.125 +Geschrammel,-0.125 +schleimen,-0.125 +Bananenrepublik,-0.125 +Flohkino,-0.125 +Fuzzis,-0.125 +Geldsklaven,-0.125 +Ritze,-0.125 +verschachert,-0.125 +Schmierlappen,-0.125 +Abundzubi,-0.125 +Gehänge,-0.125 +Gehudel,-0.125 +gesabbert,-0.125 +verfressen,-0.125 +Russerei,-0.125 +Boche,-0.125 +bekloppt,-0.125 +Parteichinesisch,-0.125 +Rädelsführer,-0.125 +kungeln,-0.125 +hinterhältig,-0.125 +Swinger,-0.125 +Rabenaas,-0.125 +urinieren,-0.125 +kleinbusig,-0.125 +Volksverräterin,-0.125 +Rotzlöffel,-0.125 +betatschen,-0.125 +dahinvegetieren,-0.150 +Politclown,-0.150 +Pöbel,-0.150 +Lumpenproletariat,-0.150 +brunzen,-0.150 +Giftzwerg,-0.150 +Sitzpinkler,-0.150 +Schund,-0.150 +Sexbild,-0.150 +damn,-0.150 +abschrammen,-0.150 +Nillengestell,-0.150 +Kopfgeburt,-0.150 +Scheißkrieg,-0.150 +konsumgeil,-0.150 +Schas,-0.150 +spannen,-0.150 +verhackstücken,-0.150 +auslecken,-0.150 +Kanalratte,-0.150 +Fresssack,-0.150 +Trottel,-0.150 +Fleischberg,-0.150 +Knallcharge,-0.150 +Treiberin,-0.150 +Käsefuß,-0.150 +supergeil,-0.150 +Spielhölle,-0.150 +Pfaffe,-0.150 +Politikerkaste,-0.150 +beckmessern,-0.150 +hirnverbrannt,-0.150 +Aasgeier,-0.150 +knallen,-0.150 +Ostler,-0.150 +Memme,-0.150 +Sex,-0.150 +Quacksalberei,-0.150 +affig,-0.150 +abhocken,-0.150 +Töle,-0.150 +sensationsgeil,-0.150 +Wandschmiererei,-0.150 +Prengel,-0.150 +Inselaffe,-0.150 +Geldgeier,-0.150 +Gschaftlhuber,-0.150 +Kuhkaff,-0.150 +Araberdorf,-0.150 +Viecher,-0.150 +Totschlag,-0.150 +hammerhart,-0.150 +Scheißjob,-0.150 +Schmonzes,-0.150 +straßenköterblond,-0.150 +Putzfetzen,-0.150 +Krakeeler,-0.150 +Barackler,-0.150 +Mätresse,-0.150 +Tuse,-0.175 +Cougar,-0.175 +glotzen,-0.175 +verröcheln,-0.175 +Sauhaufen,-0.175 +verschissen,-0.175 +Killerspiele,-0.175 +Fratze,-0.175 +hackedicht,-0.175 +Wasserkopf,-0.175 +Glumpert,-0.175 +Kaschemme,-0.175 +Schmierfink,-0.175 +Spelunke,-0.175 +sensationsgierig,-0.175 +Sklaventreiber,-0.175 +beschnarchen,-0.175 +Sauglattismus,-0.175 +gegafft,-0.175 +nageln,-0.175 +Halunke,-0.175 +erschachern,-0.175 +Pornostar,-0.175 +Plörre,-0.175 +Loser,-0.175 +Penntüte,-0.175 +snatch,-0.175 +Hudel,-0.175 +nymphomanisch,-0.175 +verblödet,-0.175 +Mietmaul,-0.175 +Klepper,-0.175 +Mof,-0.175 +Ballerbrühe,-0.175 +alleszerfaselnd,-0.175 +Malweib,-0.175 +Tschingili,-0.175 +Bagage,-0.175 +Blutsauger,-0.175 +nude,-0.175 +Hausdrache,-0.175 +Idiotin,-0.175 +Parasit,-0.175 +Gammelei,-0.175 +Femdom,-0.175 +fummeln,-0.175 +Kläffer,-0.175 +klugscheißerisch,-0.175 +Trunkenbold,-0.175 +Dumpfbacke,-0.175 +Provinzkaff,-0.175 +vollgesaut,-0.175 +schmarotzend,-0.175 +sauen,-0.175 +Kaff,-0.175 +pupsegal,-0.175 +nackelig,-0.175 +eingesaut,-0.175 +Fläz,-0.175 +bekackt,-0.175 +Heuchler,-0.175 +erotisch,-0.175 +Fachidiot,-0.175 +weggefressen,-0.175 +Nippel,-0.175 +blöde,-0.175 +vulgarisieren,-0.200 +karrieregeil,-0.200 +Scheißtag,-0.200 +glubschen,-0.200 +schweineteuer,-0.200 +Hottentotten,-0.200 +Fraß,-0.200 +Rindvieh,-0.200 +verarschen,-0.200 +Gfrieß,-0.200 +Kanalratz,-0.200 +Fischkopp,-0.200 +Fettwanst,-0.200 +Blödmann,-0.200 +Tippse,-0.200 +abgekratzt,-0.200 +masturbieren,-0.200 +Faschist,-0.200 +Fesselspiele,-0.200 +Aas,-0.200 +rumsauen,-0.200 +Wessi,-0.200 +Asylant,-0.200 +Alte,-0.200 +Kanaille,-0.200 +vollspritzen,-0.200 +knattern,-0.200 +oberendgeil,-0.200 +Muschpoke,-0.200 +Biester,-0.200 +Lapp,-0.200 +angegafft,-0.200 +Sexbilder,-0.200 +pullern,-0.200 +vollsülzen,-0.200 +großbusig,-0.200 +Pornobilder,-0.200 +Krakeelerin,-0.200 +Klugscheißmodus,-0.200 +Ketzer,-0.200 +Mongolismus,-0.200 +Donnerbalken,-0.200 +Klugscheißertour,-0.200 +Saubande,-0.200 +Taugenichts,-0.200 +gelabbert,-0.200 +Schnodder,-0.200 +Poloch,-0.200 +Rotarsch,-0.200 +Fettbauch,-0.200 +Omme,-0.200 +Lesbensex,-0.200 +herumkrakeelen,-0.200 +Nichtsnutz,-0.200 +besamen,-0.200 +Quetschwurst,-0.200 +abrubbeln,-0.200 +Gesocks,-0.200 +Klugscheißer,-0.200 +Vergewohltätigung,-0.200 +Nazismus,-0.200 +Vergewaltiger,-0.225 +Froschfresser,-0.225 +draufkloppen,-0.225 +lutschen,-0.225 +Ausbeuterbetrieb,-0.225 +Sexstellung,-0.225 +Geilheit,-0.225 +Scheißerchen,-0.225 +Drecksstadt,-0.225 +Dreckskiste,-0.225 +schlabbern,-0.225 +Trulla,-0.225 +Ösi,-0.225 +Kaputtnik,-0.225 +hirnrissig,-0.225 +läppisch,-0.225 +Maulheld,-0.225 +Maul,-0.225 +Kriegstreiber,-0.225 +Nasentripper,-0.225 +Verbrechervisage,-0.225 +Schlitzer,-0.225 +Hornochse,-0.225 +Laffe,-0.225 +Stimmvieh,-0.225 +rotzen,-0.225 +Judenfrage,-0.225 +pampern,-0.225 +klugscheißen,-0.225 +besaufen,-0.225 +Kleinscheiß,-0.225 +Fettkloß,-0.225 +BDSM,-0.225 +abkratzen,-0.225 +schmarotzen,-0.225 +Klugscheißern,-0.225 +Weibervolk,-0.225 +Gesöff,-0.225 +Fratzenbuch,-0.225 +schlampen,-0.225 +Schwulette,-0.225 +plärren,-0.225 +Scheißtyp,-0.225 +profitgeil,-0.225 +Nilliken,-0.225 +Schreckschraube,-0.225 +Ossi,-0.225 +orgeln,-0.225 +Übelkrähe,-0.225 +herausspritzen,-0.225 +Bazi,-0.225 +Schindmähre,-0.225 +Sau,-0.250 +eierköpfig,-0.250 +Schwachfug,-0.250 +Kaffer,-0.250 +Judaslohn,-0.250 +Nillenpilze,-0.250 +Nille,-0.250 +Nillendruck,-0.250 +verratzt,-0.250 +Gesabbel,-0.250 +krepiert,-0.250 +Dreckskerl,-0.250 +Zonendödel,-0.250 +Beschiss,-0.250 +Volltrottel,-0.250 +Hinterlader,-0.250 +arschteuer,-0.250 +Viehzeug,-0.250 +Eierkopf,-0.250 +sexbesessen,-0.250 +ausgelutscht,-0.250 +Itaka,-0.250 +Nillenkarosse,-0.250 +triebgesteuert,-0.250 +Scheißberuf,-0.250 +Mistvieh,-0.250 +Pope,-0.250 +sowjetzonal,-0.250 +Warmduscher,-0.250 +abreiten,-0.250 +Paragrafenhengst,-0.250 +begaffen,-0.250 +knickern,-0.250 +Verarscherei,-0.250 +Sauerei,-0.250 +Bullshit,-0.250 +Russki,-0.250 +Volksseuche,-0.250 +koten,-0.250 +Schnauze,-0.250 +Dreckschleuder,-0.250 +Speckdäne,-0.250 +Skihaserl,-0.250 +Kretin,-0.250 +Hirni,-0.250 +kujonieren,-0.250 +Heckenklescher,-0.250 +ausröcheln,-0.250 +Content-Mafia,-0.250 +Hetzer,-0.250 +Dirne,-0.250 +Gelabber,-0.250 +krepieren,-0.275 +Heckenpenner,-0.275 +Hupfdohle,-0.275 +ekelhaft,-0.275 +reinspritzen,-0.275 +Labertasche,-0.275 +rattig,-0.275 +Schacher,-0.275 +Käsemauken,-0.275 +Raubtierkapitalist,-0.275 +Hanswurst,-0.275 +gaffen,-0.275 +Zylinderzicke,-0.275 +Shice,-0.275 +Stinker,-0.275 +Fimmel,-0.275 +bimsen,-0.275 +Standgebläse,-0.275 +Nillenbeschau,-0.275 +durchbürsten,-0.275 +Fliegenschiss,-0.275 +Drecksverein,-0.275 +Dummi,-0.275 +Rotzbremse,-0.275 +Bettnässer,-0.275 +Bums,-0.275 +Kuhscheiße,-0.275 +Pullermann,-0.275 +Weib,-0.275 +Puff,-0.275 +Depperl,-0.275 +Scheißregierung,-0.275 +Ladenschwengel,-0.275 +Beschäler,-0.275 +Weichei,-0.275 +vollgespritzt,-0.275 +Gesinnungslump,-0.275 +Polack,-0.275 +Pennerglück,-0.275 +Aasgestank,-0.275 +Sexcam,-0.275 +Asi-Toaster,-0.275 +Idiotentest,-0.275 +Drecksjob,-0.275 +dickbusig,-0.275 +Drecksstrom,-0.275 +einsauen,-0.275 +Scheißgefühl,-0.275 +Hofschranze,-0.275 +saufen,-0.275 +geschissen,-0.275 +Ohrfeigengesicht,-0.275 +goil,-0.275 +verkacken,-0.275 +fingern,-0.275 +Spinatwachtel,-0.275 +rannehmen,-0.300 +Dreckszynismus,-0.300 +Kotze,-0.300 +Schmarotzertum,-0.300 +Viech,-0.300 +ultrageil,-0.300 +Twat,-0.300 +verrecken,-0.300 +Marktweib,-0.300 +großschnauzig,-0.300 +räudig,-0.300 +Filzlaus,-0.300 +Biest,-0.300 +Wampe,-0.300 +Fischweib,-0.300 +Schmocks,-0.300 +Sippe,-0.300 +Gierschlund,-0.300 +strullern,-0.300 +vollpfosten,-0.300 +vögeln,-0.300 +Saftladen,-0.300 +geilo,-0.300 +Kiffer,-0.300 +Galgenvogel,-0.300 +machtgeil,-0.300 +Gringo,-0.300 +bibergeil,-0.300 +megageil,-0.300 +Nebochant,-0.300 +dämlich,-0.300 +Drecksmarkt,-0.300 +Körnerfresser,-0.300 +Drecksspiel,-0.300 +Rotz,-0.300 +gehirnamputiert,-0.300 +Kebsweib,-0.300 +Fuzzi,-0.300 +Pinkel,-0.300 +Teenagersex,-0.300 +Schwanz,-0.300 +Gstopfter,-0.300 +Arschbombe,-0.300 +herumschleimen,-0.300 +runterholen,-0.300 +Schmonzette,-0.300 +Pack,-0.325 +hochgeil,-0.325 +Stoßdame,-0.325 +hammergeil,-0.325 +Weiberhass,-0.325 +blasen,-0.325 +Nillenkäse,-0.325 +reihern,-0.325 +abartig,-0.325 +Supertitten,-0.325 +anspritzen,-0.325 +Knackarsch,-0.325 +vollbusig,-0.325 +Schmierlapp,-0.325 +Schwachkopf,-0.325 +Dumpfbatz,-0.325 +tussig,-0.325 +Zigeuner,-0.325 +Olle,-0.325 +furzegal,-0.325 +Vollschmarotzer,-0.325 +Schmierenkomödiant,-0.325 +Korinthenkacker,-0.325 +Scheißwetter,-0.325 +Flintenweib,-0.325 +verarscht,-0.325 +todesgeil,-0.325 +Geili,-0.325 +Schitte,-0.325 +Dreckskapitalismus,-0.325 +Spießbürgerin,-0.325 +Furzkiste,-0.325 +mediengeil,-0.325 +Saufraß,-0.325 +Arschtritt,-0.325 +Nuckelpinne,-0.325 +aufpupsen,-0.325 +Schnorrer,-0.325 +urgeil,-0.325 +Verarschung,-0.325 +Zigeunerin,-0.325 +trashig,-0.325 +Nillenchassis,-0.325 +schwul,-0.325 +viehisch,-0.325 +Scheißhausfliege,-0.325 +Luder,-0.325 +gepisst,-0.325 +ungeil,-0.325 +Blödian,-0.325 +Schickse,-0.325 +Drecksbahn,-0.325 +Popelbremse,-0.325 +Wahlvieh,-0.325 +Lumpenpack,-0.325 +Scheißleben,-0.325 +saufend,-0.325 +Franzacke,-0.325 +herumspinnen,-0.325 +sexhungrig,-0.325 +Gruppensex,-0.325 +scheißliberal,-0.325 +Nillenkauer,-0.325 +Amateursex,-0.325 +großmäulig,-0.350 +Vergeilung,-0.350 +Lutscher,-0.350 +Wurstfinger,-0.350 +abnibbeln,-0.350 +abspritzend,-0.350 +lecken,-0.350 +Scheißspiel,-0.350 +Clit,-0.350 +saudumm,-0.350 +Arschgeige,-0.350 +Lahmarsch,-0.350 +Boobs,-0.350 +Weibsen,-0.350 +Furz,-0.350 +Nillenflicker,-0.350 +Schwuppe,-0.350 +Köter,-0.350 +furzen,-0.350 +begrabschen,-0.350 +Bockmist,-0.350 +Vagosex,-0.350 +rumvögeln,-0.350 +furztrocken,-0.350 +Tussis,-0.350 +Landpomeranze,-0.350 +gefühlsamputiert,-0.350 +Müllkind,-0.350 +verscheißern,-0.350 +Küchenbulle,-0.350 +angepinkelt,-0.350 +Blag,-0.350 +Saupreiß,-0.350 +pisswarm,-0.350 +Stecher,-0.350 +Asoziale,-0.350 +kotzübel,-0.350 +Drecksstrauch,-0.350 +Armeleutegeruch,-0.350 +Kuttenbrunzer,-0.350 +Klugscheißermodus,-0.350 +Scheißhausparole,-0.350 +Gaysex,-0.350 +Untermensch,-0.350 +abgespritzt,-0.350 +Blage,-0.350 +Klugscheißerin,-0.350 +Rotzgöre,-0.350 +Vogelschiss,-0.375 +Asi,-0.375 +abspritzen,-0.375 +Nillenbrenner,-0.375 +asozial,-0.375 +squirten,-0.375 +Bullerei,-0.375 +kackfrech,-0.375 +Boxenluder,-0.375 +Furzidee,-0.375 +vollgepisst,-0.375 +ersaufen,-0.375 +blutgeil,-0.375 +wtf,-0.375 +Nillenpfleger,-0.375 +titelgeil,-0.375 +Oralsex,-0.375 +Dildo,-0.375 +Rattenloch,-0.375 +Budelhupfer,-0.375 +flachlegen,-0.375 +absauen,-0.375 +Scheißangst,-0.375 +Drecksseite,-0.375 +versauen,-0.375 +durchknallen,-0.375 +hinterfotzig,-0.375 +Schweinebande,-0.375 +Schweinehund,-0.375 +Ausgeburt,-0.375 +Schmarotzer,-0.375 +Sacklpicker,-0.375 +Scheißwut,-0.375 +Schleimer,-0.375 +Wildsau,-0.375 +Schisser,-0.375 +Rassenhygiene,-0.375 +Kanak-Sprak,-0.375 +säuisch,-0.375 +anpinkeln,-0.375 +Hartz-4ler,-0.375 +Quadratschädel,-0.375 +titted,-0.375 +pipiwarm,-0.375 +Fresse,-0.400 +bumsfidel,-0.400 +begrabbeln,-0.400 +lahmarschig,-0.400 +Scheißwelt,-0.400 +versaut,-0.400 +affengeil,-0.400 +Scheißsystem,-0.400 +versoffen,-0.400 +Möpse,-0.400 +aufgegeilt,-0.400 +angepisst,-0.400 +nillenkrank,-0.400 +Bumskontakt,-0.400 +Saftschubse,-0.400 +Kackstiefel,-0.400 +Mongo,-0.400 +Drecksblatt,-0.400 +Nillenmasseur,-0.400 +Tussi,-0.400 +aufgeilen,-0.400 +fuck,-0.400 +kacke,-0.400 +Mannweib,-0.400 +Depp,-0.400 +Schabracke,-0.400 +Arschkriecherei,-0.400 +stutenbissig,-0.400 +Hundsfott,-0.400 +Pestbeule,-0.400 +Volksverräter,-0.400 +Schweinefraß,-0.400 +Arschgeweih,-0.400 +Bumse,-0.400 +Cum,-0.400 +Nillengarage,-0.400 +Scheißidee,-0.400 +Tusse,-0.400 +Drecksschwein,-0.400 +endgeil,-0.400 +zeigegeil,-0.425 +Nillenparade,-0.425 +Pissbecken,-0.425 +Frontschwein,-0.425 +Saufbold,-0.425 +Rotzfahne,-0.425 +Bierschiss,-0.425 +Pennbruder,-0.425 +turbogeil,-0.425 +Scheißarbeit,-0.425 +zusammengeschissen,-0.425 +Fettsack,-0.425 +Drecksgesindel,-0.425 +zugeschissen,-0.425 +blasfreudig,-0.425 +Schwuler,-0.425 +oberaffengeil,-0.425 +vollgekotzt,-0.425 +Balg,-0.425 +Zuhälter,-0.425 +Nillengier,-0.425 +Gurkentruppe,-0.425 +Abzocker,-0.425 +Schrulle,-0.425 +Speichellecker,-0.425 +busenficken,-0.425 +Arschbacke,-0.425 +Verleumderscheiß,-0.425 +Schleimscheißer,-0.425 +Klugscheißerei,-0.425 +Nazischeiß,-0.425 +Drecksack,-0.425 +shit,-0.425 +Bumslokal,-0.425 +Scheißfilm,-0.425 +Nillenzupfer,-0.425 +Scheißding,-0.425 +vergeilen,-0.425 +strunzdumm,-0.425 +angaffen,-0.425 +Krümelkacker,-0.425 +Klatschvieh,-0.425 +Saubeutel,-0.425 +Stiefellecker,-0.425 +Muschkote,-0.425 +strunzdoof,-0.425 +Gesindel,-0.450 +Schwuchtel,-0.450 +Kotzbomber,-0.450 +fickbar,-0.450 +Rotze,-0.450 +obergeil,-0.450 +pinkeln,-0.450 +arschkalt,-0.450 +abpimmeln,-0.450 +Japse,-0.450 +Naturtitten,-0.450 +Backpfeifengesicht,-0.450 +Verarsche,-0.450 +Pisser,-0.450 +Arsch,-0.450 +abgewichst,-0.450 +Pornobalken,-0.450 +Pimmelmann,-0.450 +scheiße,-0.450 +Scheißer,-0.450 +Schlangenfraß,-0.450 +Drecksland,-0.450 +Bi-Luder,-0.450 +verscheißert,-0.450 +Hühnerscheiße,-0.450 +Scheißhaus,-0.450 +Zicke,-0.450 +Pornofoto,-0.450 +Sesselfurzer,-0.450 +Drecksstaat,-0.450 +angekotzt,-0.450 +Hurerei,-0.450 +assig,-0.450 +Scheißklavier,-0.450 +Kundenverarsche,-0.450 +bepissen,-0.450 +Sexfilm,-0.450 +arschgeil,-0.450 +Dorftrottel,-0.450 +Interracialsex,-0.450 +Blasehase,-0.450 +Pinkelbude,-0.450 +befummelt,-0.450 +Drecksjustiz,-0.450 +scheißfreundlich,-0.475 +zusammenscheißen,-0.475 +Fut,-0.475 +Drecksarsch,-0.475 +Dreckszeug,-0.475 +Raubgesindel,-0.475 +Scheißverein,-0.475 +Schießprügel,-0.475 +Hobbyhure,-0.475 +Pfeifenwichs,-0.475 +Hackfresse,-0.475 +Kackerin,-0.475 +Dreckschreiber,-0.475 +Geilerich,-0.475 +Miststück,-0.475 +Drecksbande,-0.475 +Hosenscheißer,-0.475 +Spinner,-0.475 +Scheißsender,-0.475 +abgekackt,-0.475 +Jud,-0.475 +gekotzt,-0.475 +Fetzenschädel,-0.475 +Flitzekacke,-0.475 +vollgeschissen,-0.475 +Tipferlscheißer,-0.475 +abnippeln,-0.475 +beschissen,-0.475 +arschlos,-0.475 +Kinderkacke,-0.475 +Bückstücke,-0.475 +angeschissen,-0.475 +Altweibergeschwätz,-0.475 +Nillenbläser,-0.475 +kotzbrockig,-0.475 +verkackt,-0.475 +Schnepfe,-0.475 +rallig,-0.475 +auskotzen,-0.475 +Jungluder,-0.475 +ausgekotzt,-0.475 +Tunte,-0.475 +Dreckschänke,-0.475 +Dreckspartei,-0.475 +Jungflittchen,-0.475 +Fisting,-0.500 +Sexspiele,-0.500 +kotzend,-0.500 +Schiss,-0.500 +nuttig,-0.500 +schlampig,-0.500 +Camfick,-0.500 +Schlitzauge,-0.500 +Drecksfilm,-0.500 +Dreckstöhle,-0.500 +Drecksvolk,-0.500 +Verpisser,-0.500 +slutty,-0.500 +abwursten,-0.500 +Nazidreck,-0.500 +Sexsklave,-0.500 +Fatzke,-0.500 +Weibsperson,-0.500 +Schweinepriester,-0.500 +Scheißkerl,-0.500 +rammeln,-0.500 +Genderscheiße,-0.500 +Vierersex,-0.500 +Kanake,-0.500 +verscheißen,-0.500 +Tucke,-0.500 +fickrig,-0.500 +Sexsklavin,-0.500 +Spermalieferant,-0.500 +Genderscheiß,-0.500 +schiffen,-0.500 +bescheißen,-0.500 +Bimbo,-0.500 +pissig,-0.500 +Voyeursex,-0.500 +rumhuren,-0.500 +Selbstfick,-0.525 +Hausfrauensex,-0.525 +Scheißladen,-0.525 +Dreckssau,-0.525 +Hühnerkacke,-0.525 +Arbeiterstrich,-0.525 +ausscheißen,-0.525 +Venusspalte,-0.525 +Gosche,-0.525 +Fickgeschichten,-0.525 +scheißeteuer,-0.525 +Schlampenpanzer,-0.525 +Dickwanst,-0.525 +Assi,-0.525 +Cumshot,-0.525 +Transe,-0.525 +Sackhalter,-0.525 +Spaghettifresser,-0.525 +Negerin,-0.525 +Negerkuss,-0.525 +Kacker,-0.525 +Scheiß,-0.525 +Russenliebchen,-0.525 +Bullenschwein,-0.525 +sauhässlich,-0.525 +Drecksviech,-0.525 +Scheißabend,-0.525 +wichsen,-0.525 +Sexvideo,-0.525 +Dreckspenner,-0.525 +Zipfeldoktor,-0.525 +poppen,-0.525 +Sextreffen,-0.525 +Gummischwanz,-0.525 +kriegsgeil,-0.525 +Miefquirl,-0.525 +verreckt,-0.525 +abgepisst,-0.525 +Affenarsch,-0.525 +Bratze,-0.525 +pissen,-0.550 +gefickt,-0.550 +pimpern,-0.550 +Verleumderscheiße,-0.550 +Dreckspack,-0.550 +Monsterschwanz,-0.550 +Mietrammler,-0.550 +vollwichsen,-0.550 +Dünnschiss,-0.550 +Mistkuh,-0.550 +Pornoluder,-0.550 +wichsend,-0.550 +Flachwichser,-0.550 +Klöten,-0.550 +Ficker,-0.550 +vollscheißen,-0.550 +Asylschmarotzer,-0.550 +Poolfick,-0.550 +Spasti,-0.550 +Drecksau,-0.550 +Sackratte,-0.550 +abgefuckt,-0.550 +Schwuli,-0.550 +Girlfick,-0.550 +bumsen,-0.550 +Fettarsch,-0.550 +Blowjob,-0.550 +Creampie,-0.550 +Penner,-0.550 +Gangbang,-0.550 +Kümmeltürke,-0.550 +zuscheißen,-0.550 +Schweinescheiße,-0.550 +Arschvignette,-0.550 +Minipimmel,-0.550 +Natursekt,-0.550 +gebumst,-0.550 +Drecksarbeit,-0.550 +huren,-0.550 +Kackbratze,-0.550 +Hundescheiße,-0.550 +Bastard,-0.550 +Scheißstaat,-0.550 +schwanzhungrig,-0.550 +Sucker,-0.550 +Rosettensex,-0.550 +Arschloch,-0.550 +Pissnelke,-0.550 +immergeil,-0.550 +Wichsanleitung,-0.550 +arschig,-0.550 +Blondinenflittchen,-0.550 +onanieren,-0.550 +Nillenstriegler,-0.550 +Edelnutte,-0.575 +Scheißdeutsche,-0.575 +Milf,-0.575 +Pfeifenwichser,-0.575 +Itaker,-0.575 +pimmeln,-0.575 +Geldscheißer,-0.575 +Gevögel,-0.575 +scheißen,-0.575 +ausgeschissen,-0.575 +befummeln,-0.575 +Drecksnazi,-0.575 +Scheißgrünen,-0.575 +Arschkriecher,-0.575 +Schweinebacke,-0.575 +Abschaum,-0.575 +Pimmel,-0.575 +Cumshots,-0.575 +Gangbangsex,-0.575 +Bierarsch,-0.575 +Spast,-0.575 +Teenluder,-0.575 +Scheißerei,-0.575 +durchgevögelt,-0.575 +Lustgreis,-0.575 +Geschiss,-0.575 +Urnenpöbel,-0.575 +Partyluder,-0.575 +Vollidiot,-0.600 +Arschlecken,-0.600 +Amateurflittchen,-0.600 +Kackscheiße,-0.600 +Verpissertum,-0.600 +Drecksgene,-0.600 +Tittchen,-0.600 +Scheißthese,-0.600 +Nutte,-0.600 +durchgerammelt,-0.600 +untervögelt,-0.600 +anwichsen,-0.600 +Sexschlampe,-0.600 +gekackt,-0.600 +Sexgirl,-0.600 +Eichelkäse,-0.600 +Ehehure,-0.600 +Wichser,-0.600 +Wichsvorlage,-0.600 +Scheißhaufen,-0.600 +Tittenspiele,-0.600 +Drecksloch,-0.600 +Titte,-0.600 +Monstertitten,-0.600 +Drecksstute,-0.600 +Blasmaus,-0.600 +Schwanzlutscher,-0.600 +Drecksfaschist,-0.600 +Flittchen,-0.600 +Amateurfick,-0.600 +Teentitten,-0.600 +Sauhund,-0.600 +Drecksmaul,-0.600 +Hobbynutte,-0.600 +Drecksmoloch,-0.600 +Schlappschwanz,-0.600 +Deutschsex,-0.600 +Transensex,-0.600 +Schlampe,-0.625 +hinkacken,-0.625 +Busensex,-0.625 +speichellecken,-0.625 +Nillenlutscher,-0.625 +Stalkerscheiß,-0.625 +einscheißen,-0.625 +Dreckspresse,-0.625 +begeilen,-0.625 +Drecksbuch,-0.625 +Schnellfick,-0.625 +Vibratorfick,-0.625 +Drecksstall,-0.625 +kackendreist,-0.625 +Drecksbauer,-0.625 +durchrammeln,-0.625 +Tittenblondine,-0.625 +kotzen,-0.625 +Dildosex,-0.625 +Busenfick,-0.625 +vollpissen,-0.625 +Flitzkacke,-0.625 +fremdficken,-0.625 +fickend,-0.625 +analsexwillig,-0.625 +Muschi,-0.625 +faustficken,-0.625 +Medienhure,-0.625 +fickerig,-0.625 +Kotzbrocken,-0.625 +Deepthroat,-0.625 +angekackt,-0.625 +Teensex,-0.625 +Nylonsex,-0.625 +Kackwurst,-0.650 +Lümmeltüte,-0.650 +schwanzfixiert,-0.650 +Dildofick,-0.650 +gepoppt,-0.650 +dauergeil,-0.650 +Scheißdreck,-0.650 +Fotze,-0.650 +befotzt,-0.650 +Stalkerscheiße,-0.650 +Hurensohn,-0.650 +Kacke,-0.650 +Kackstelze,-0.650 +Tittenchat,-0.650 +abkotzen,-0.650 +Bitch,-0.650 +Arschvotze,-0.650 +fotzen,-0.650 +Pissbude,-0.650 +naturgeil,-0.650 +Hartgeldnutte,-0.650 +Arschkriecherin,-0.650 +verpissen,-0.650 +Fickszene,-0.650 +Prachtschwanz,-0.650 +Arschgesicht,-0.650 +Hinterfotzigkeit,-0.650 +Puffbrause,-0.650 +pissend,-0.650 +durchbumsen,-0.675 +pimmellutschen,-0.675 +anscheißen,-0.675 +Riesendrecksau,-0.675 +Pofick,-0.675 +Sextreff,-0.675 +Kack,-0.675 +Titties,-0.675 +Tittenbilder,-0.675 +ungefickt,-0.675 +Extremfick,-0.675 +durchgebumst,-0.675 +Hängetitte,-0.675 +Dorfmatratze,-0.675 +Kanacke,-0.675 +arschbumsen,-0.675 +Stehpisser,-0.675 +anpissen,-0.675 +bitchy,-0.675 +Kackstuhl,-0.675 +Teenflittchen,-0.675 +Bauerntrampel,-0.675 +kacken,-0.675 +Maulhure,-0.675 +abgefickt,-0.675 +Teenfick,-0.675 +sexgeil,-0.675 +Drecksideologie,-0.675 +abkacken,-0.675 +Kanakendeutsch,-0.675 +Faustfick,-0.675 +Dreckspiste,-0.675 +Hardcoresex,-0.675 +durchvögeln,-0.675 +Weibsstück,-0.675 +Neger,-0.675 +Lesbenfick,-0.675 +Negersklave,-0.675 +Minititten,-0.675 +Amateurnutte,-0.675 +gewichst,-0.675 +Fotzenloch,-0.675 +Scheißhauspapier,-0.700 +Ficksuche,-0.700 +Gruppenfick,-0.700 +Gefick,-0.700 +Urlaubsfick,-0.700 +Fötzchen,-0.700 +Sozialschmarotzer,-0.700 +Kehlenfick,-0.700 +Pottsau,-0.700 +Interracialfick,-0.700 +Missgeburt,-0.700 +Gayfick,-0.700 +herumhuren,-0.700 +Fickmaus,-0.700 +Schluchtenscheißer,-0.700 +Pissfotze,-0.700 +Pussy,-0.700 +Drecksding,-0.700 +abficken,-0.700 +Schwanzlutscherin,-0.700 +Telefonfick,-0.700 +Scheißausländer,-0.700 +Dreckstück,-0.700 +Autofick,-0.700 +spermageil,-0.700 +Geficke,-0.700 +Riesenschwanz,-0.700 +Bumsloch,-0.700 +Muschifick,-0.700 +Sofafick,-0.700 +Straponfick,-0.700 +Fickstücke,-0.700 +Maschinenfick,-0.725 +durchficken,-0.725 +Sackgesicht,-0.725 +Fotzensex,-0.725 +Fotzenlecker,-0.725 +Biertitte,-0.725 +Schwulenpest,-0.725 +Asiaflittchen,-0.725 +Jungfotze,-0.725 +durchfickt,-0.725 +Reisfresser,-0.725 +Tittensex,-0.725 +mösengeil,-0.725 +Flittchenschlampe,-0.725 +Dreilochstute,-0.725 +Transenfick,-0.725 +Wichse,-0.725 +Ficksex,-0.725 +Tittenfick,-0.725 +Möse,-0.725 +Dreckspropaganda,-0.725 +Teenhure,-0.725 +Scheißland,-0.725 +Couchfick,-0.750 +ficken,-0.750 +Judensau,-0.750 +Milchtitten,-0.750 +arschgefickt,-0.750 +Spermaladung,-0.750 +Hurenbock,-0.750 +schwanzgeil,-0.750 +Pisse,-0.750 +abwichsen,-0.750 +Frauenfick,-0.750 +Arschfick,-0.750 +fisten,-0.750 +Fickanzeige,-0.750 +Tittencam,-0.750 +Hängetittensex,-0.750 +Livefick,-0.750 +Dreckschwein,-0.750 +Krüppel,-0.750 +Rachenfick,-0.750 +Fotzenstrip,-0.750 +Ehefotze,-0.750 +Teenyfotze,-0.750 +Nigger,-0.750 +Titten,-0.750 +Vaginalfick,-0.750 +Oralfick,-0.750 +teenficken,-0.750 +unterfickt,-0.750 +Doppelfick,-0.775 +vollkotzen,-0.775 +angewichst,-0.775 +Fickstute,-0.775 +Ficksahne,-0.775 +Fotzloch,-0.775 +Spermaschlampe,-0.775 +Sandwichfick,-0.775 +Laberarsch,-0.775 +Tittenmassage,-0.775 +zerfickt,-0.775 +Dreckskommunist,-0.775 +Nazidrecksau,-0.775 +Hure,-0.775 +fotzenficken,-0.775 +verhuren,-0.775 +Sausack,-0.775 +Scheiße,-0.775 +Fick,-0.775 +Ehenutte,-0.775 +Drecksschlampe,-0.775 +Fickverhältnis,-0.775 +verfickt,-0.775 +Schwanzmädchen,-0.775 +Schwulenfick,-0.775 +arschkriechen,-0.800 +Doggyfick,-0.800 +fickwillig,-0.800 +vollgewichst,-0.800 +Maulfick,-0.800 +verficken,-0.800 +notgeil,-0.800 +Hardcorefick,-0.800 +Arschsex,-0.800 +Fickschlampe,-0.800 +Zungenfick,-0.800 +Fickteen,-0.800 +schwanzlutschen,-0.800 +Polacke,-0.800 +Votze,-0.800 +Fickloch,-0.825 +Schlampenstempel,-0.825 +Outdoorfick,-0.825 +Fußfick,-0.825 +dicktittig,-0.825 +fickbereit,-0.825 +Fingerfick,-0.825 +Tittenschlampe,-0.825 +fickgeil,-0.825 +Fickbeziehung,-0.825 +Analfick,-0.825 +Muschisaft,-0.825 +Pornoschlampe,-0.825 +Küchenfick,-0.850 +weggefickt,-0.850 +Mösenfick,-0.850 +Rudelfick,-0.850 +Tittenbesamung,-0.850 +Kinderficker,-0.850 +durchgefickt,-0.875 +Fotzenfick,-0.875 +Fickabenteuer,-0.875 +Ficksau,-0.875 +Motherfucker,-0.875 +Arschficker,-0.875 +Nigga,-0.875 +Negertitten,-0.875 +pissgeil,-0.875 +Schreibtischfick,-0.875 +arschficken,-0.900 +Fickificki,-0.900 +Arschfotze,-0.900 +Negerschwanz,-0.900 +Omafotze,-0.900 +Rosettenfick,-0.925 +tittenficken,-0.925 diff --git a/quaxa/__init__.py b/quaxa/__init__.py index ea3c612..e16e01b 100644 --- a/quaxa/__init__.py +++ b/quaxa/__init__.py @@ -1,19 +1,291 @@ -__version__ = '0.1.1' - -from .quaxa import ( - total_score, - isa_knockout_criteria, - factor_gradual_criteria, - has_finite_verb_and_subject, - is_misparsed, - has_illegal_chars, - has_blacklist_words, BLACKLIST_WORDS_DE, - factor_rarechars, RARE_CHARS_DE, ORD_RARE_CHARS_DE, - factor_notkeyboardchar, QWERTZ_DE, ORDS_QWERTZ_DE, - factor_graylist_words, - factor_named_entity, - deixis_space, DEFAULT_SPACE_DEIXIS_TERMS, - deixis_time, DEFAULT_TIME_DEIXIS_TERMS, - deixis_person, - optimal_interval +import csv +from dataclasses import dataclass, field +from pathlib import Path +from typing import Callable, Set + +from spacy.tokens.doc import Doc +from spacy.tokens.span import Span +from spacy.tokens.token import Token + +_DEFAULT_ILLEGAL_CHARS = "<>|[]/\\^@" +_DEFAULT_RARE_CHARS = "0123456789')(-" + +Span.set_extension("quaxa", default=True) + + +@dataclass +class SentenceScorer: + illegal_chars: Set[str] = field( + default_factory=lambda: set(_DEFAULT_ILLEGAL_CHARS), repr=False + ) + keyboard_chars: Set[str] = field(default_factory=set, repr=False) + rare_chars: Set[str] = field( + default_factory=lambda: set(_DEFAULT_RARE_CHARS), repr=False + ) + + has_finite_verb_and_subject: Callable[[Span], bool] = lambda sent: True + is_misparsed: Callable[[Span], bool] = lambda sent: False + is_deixis: Callable[[Token], bool] = lambda token: False + + blacklist: Set[str] = field(default_factory=set, repr=False) + + optimal_min_len: int = 10 + optimal_max_len: int = 20 + + penalty_blacklist: float = 0.067 + penalty_rare_char: float = 0.125 + penalty_named_entity: float = 0.1667 + penalty_deixis: float = 0.034 + + def score_sentence(self, sent: Span, headword=None) -> float: + """Rule-based sentence scoring formula + + float + Score if a sentence example is suitable as dictionary example. + """ + score = 0.5 * self.has_a_knockout_criterion(sent) + score += 0.5 * self.factor_gradual_criteria(sent, headword) + return score + + def __call__(self, doc: Doc, headword=None) -> Doc: + for sent in doc.sents: + sent._.quaxa = self.score_sentence(sent, headword) + return doc + + def has_a_knockout_criterion(self, sent): + if self.has_illegal_chars(sent): + return False + if self.is_misparsed(sent): + return False + if not self.has_finite_verb_and_subject(sent): + return False + return True + + def factor_gradual_criteria(self, sent, headword): + factor = 1.0 + if self.penalty_blacklist is not None: + factor *= self.factor_blacklist(sent, headword) + if self.penalty_rare_char is not None: + factor *= self.factor_rarechars(sent) + if len(self.keyboard_chars) > 0: + factor *= self.factor_notkeyboardchar(sent) + if self.penalty_named_entity is not None: + factor *= self.factor_named_entities(sent) + if self.optimal_min_len is not None and self.optimal_max_len is not None: + factor *= self.factor_optimal_interval(sent) + if self.penalty_deixis is not None: + factor *= self.factor_deixis(sent, headword) + return factor + + def has_illegal_chars(self, sent: Span): + """Blacklist of illegal characters + + Rules: + ------ + - ASCII/Unicode control characters, ID 0-31 + - `<>/` XML/HTML tags + - `|` pipe symbol or OR operator + - `[]` square brackets, e.g. Markdown links + - slash escape characters, Windows paths + - `@` email addresses + - caret regular expressions + - ... + + Returns: + -------- + flag : bool + True if the sentence contains illegal characters + """ + for c in sent.text: + if ord(c) < 32: + # any ASCII/Unicode control characers, e.g. newline \n + return True + if c in self.illegal_chars: + return True + return False + + def factor_rarechars(self, sent: Span): + """Penalize rare characters""" + num_matches = len([c for c in sent.text if c in self.rare_chars]) + return max(0.0, 1.0 - self.penalty_rare_char * num_matches) + + def factor_notkeyboardchar(self, sent: Span): + """Computes the percentage of characters not typable on a German keyboard.""" + txt = sent.text + return sum((1 for c in txt if c in self.keyboard_chars)) / len(txt) + + def factor_named_entities(self, sent: Span): + """Named Enity / Proper Noun penality""" + return max(0.0, 1.0 - self.penalty_named_entity * len(sent.ents)) + + def factor_tokens( + self, + sent: Span, + headword: str, + pred: Callable[[Token], bool], + penalty_factor: float, + ) -> float: + num_matches = sum((1 for t in sent if t.lemma_ != headword and pred(t))) + return max(0.0, 1.0 - penalty_factor * num_matches) + + def factor_blacklist(self, sent: Span, headword: str): + return self.factor_tokens( + sent, headword, lambda t: t.lemma_ in self.blacklist, self.penalty_blacklist + ) + + def factor_optimal_interval(self, sent: Span) -> float: + """Optimal sentence length by the number of word tokens + + Returns: + -------- + factor : float + Number between 0.0 and 1.0 + 0.0 (=sentence length bad), 1.0 (=sentence length ok) + """ + low = self.optimal_min_len + high = self.optimal_max_len + num_tokens = len(sent) + + if low <= num_tokens <= high: + return 1.0 + elif num_tokens < low: + if num_tokens < low / 2.0: + return 0.0 + else: + diff = low - num_tokens + return 1 - diff * (1.0 / (low / 2.0)) + else: + if num_tokens > (2 * high): + return 0.0 + diff = (2 * high) - num_tokens + return diff / high + + def factor_deixis(self, sent: Span, headword: str): + return self.factor_tokens(sent, headword, self.is_deixis, self.penalty_deixis) + + +def _de_core_has_finite_verb_and_subject(sent: Span) -> bool: + """Has finite verb as root and subject as one of its children. + + It is a knockout criterion. + """ + for root in sent: + if root.dep_ != "ROOT": + continue + for finite_verb in [root] + list(root.children): + if finite_verb.pos_ not in {"AUX", "VERB"}: + continue + if "Fin" not in finite_verb.morph.get( + "VerbForm", [] + ) and not finite_verb.tag_.endswith("FIN"): + continue + for subject in finite_verb.children: + if subject.dep_ == "sb" and subject.pos_ in {"NOUN", "PROPN", "PRON"}: + return True + return False + + +def _de_core_is_misparsed(sent: Span) -> bool: + """Misparsed strings + + Rules: + ------ + - The first character is lowercase + - The first character is a whitespace + - The first character is a punctuation mark + - The last character is not a punctuation mark + + Parameters: + ----------- + txt : str + The sentence as plain text + + Returns: + -------- + flag : bool + True if the sentence is misparsed + """ + tokens = list(sent) + + first_token = tokens[0] + if first_token.pos_ == "PUNCT": + return True + + first_token_text = first_token.text + if first_token_text.isspace() or first_token_text.islower(): + return True + + last_token = tokens[-1] + if last_token.pos_ != "PUNCT": + return True + + return False + + +_DE_SPACE_DEIXIS_TERMS = { + "hier", + "dort", + "über", + "da", + "vor", + "hinter", + "links", + "von", + "rechts", + "oben", + "unten", +} + +_DE_TIME_DEIXIS_TERMS = { + "jetzt", + "heute", + "gestern", + "morgen", + "dann", + "damals", + "bald", + "kürzlich", +} + +_DE_PERSON_DEIXIS_PRON_TYPES = {"Prs", "Dem", "Ind", "Neg", "Tot"} + + +def _de_core_is_deixis(token: Token) -> bool: + if ( + token.pos_ == "PRON" + and token.morph.get("PronType", [""])[0] in _DE_PERSON_DEIXIS_PRON_TYPES + ): + return True + if token.lemma_ in _DE_SPACE_DEIXIS_TERMS: + return True + if token.lemma_ in _DE_TIME_DEIXIS_TERMS: + return True + return False + + +_QWERTZ_DE = set( + ( + "^1234567890ß'qwertzuiopü+asdfghjklöä#YXCVBNM;:_′¹²³¼½¬{[]}\\¸@ł€¶ŧ←↓→øþ\"" + "~æſðđŋħ̣ĸł˝^’|»«¢„“”µ·…–″¡⅛£¤⅜⅝⅞™±°¿˛ΩŁ€®Ŧ¥↑ıØÞ°¯ÆẞЪŊĦ˙&Ł̣̣˘›‹©‚‘’º×÷— " + ) +) + +_de_vulger_file = (Path(__file__) / ".." / "VulGer.csv").resolve() +_de_vulger_blacklist = set() + +with _de_vulger_file.open(encoding="utf-8") as vulger: + for n, (word, score) in enumerate(csv.reader(vulger)): + if n == 0: + continue + if float(score) > 0: + continue + _de_vulger_blacklist.add(word) + +de_core = SentenceScorer( + has_finite_verb_and_subject=_de_core_has_finite_verb_and_subject, + is_misparsed=_de_core_is_misparsed, + is_deixis=_de_core_is_deixis, + keyboard_chars=_QWERTZ_DE, + blacklist=_de_vulger_blacklist, ) diff --git a/quaxa/quaxa.py b/quaxa/quaxa.py deleted file mode 100644 index 3840e22..0000000 --- a/quaxa/quaxa.py +++ /dev/null @@ -1,523 +0,0 @@ -from typing import List - - -def total_score(**kwargs) -> float: - """ Rule-based sentence scoring formula - - Parameters: - ----------- - **kwargs : Dict (named input arguments) - txt=sent, - annotation=tree, - headword=headword, - [others ...] - - Returns: - -------- - float - Score if a sentence example is suitable as dictionary example. - """ - score = .5 * isa_knockout_criteria(**kwargs) - score += .5 * factor_gradual_criteria(**kwargs) - return score - - -def isa_knockout_criteria(**kwargs): - # read input arguments - headword = kwargs.get('headword') - txt = kwargs.get('txt') - annotation = kwargs.get('annotation') - blacklist = kwargs.get('blacklist') # optional - # prepare variables - lemmas = [t.get('lemma') for t in annotation] - # compute factor - if not has_finite_verb_and_subject(annotation): - return False - if is_misparsed(txt): - return False - if has_illegal_chars(txt): - return False - if has_blacklist_words(headword, lemmas, blacklist_words=blacklist): - return False - return True - - -def factor_gradual_criteria(**kwargs): - # read input arguments - headword = kwargs.get('headword') - txt = kwargs.get('txt') - annotation = kwargs.get('annotation') - graylist = kwargs.get('graylist') # optional - # prepare variables - lemmas = [t.get('lemma') for t in annotation] - num_tokens = len(annotation) - # penalties - penalty_rarechars = kwargs.get('penalty_rarechars', 0.125) - penalty_notkeyboardchar = kwargs.get('penalty_notkeyboardchar', True) - penalty_graylist_words = kwargs.get('penalty_graylist_words', 0.075) - penalty_named_entity = kwargs.get('penalty_named_entity', 0.1667) - penalty_interval = kwargs.get('penalty_interval', True) - optimal_interval_low = kwargs.get('optimal_interval_low', 10) - optimal_interval_high = kwargs.get('optimal_interval_high', 20) - penalty_space_deixis = kwargs.get('penalty_space_deixis', 0.034) - penalty_time_deixis = kwargs.get('penalty_time_deixis', 0.034) - penalty_person_deixis = kwargs.get('penalty_person_deixis', 0.034) - # compute factor - factor = 1.0 - if penalty_rarechars >= 0.0: - factor *= factor_rarechars(txt, penalty_factor=penalty_rarechars) - if penalty_notkeyboardchar: - factor *= factor_notkeyboardchar(txt) - if penalty_graylist_words >= 0.0: - factor *= factor_graylist_words( - headword, lemmas, graylist, penalty_factor=penalty_graylist_words) - if penalty_named_entity >= 0.0: - factor *= factor_named_entity( - headword, annotation, penalty_factor=penalty_named_entity) - if penalty_interval: - factor *= optimal_interval( - num_tokens, low=optimal_interval_low, high=optimal_interval_high) - if penalty_space_deixis >= 0.0: - factor *= deixis_space( - headword, lemmas, penalty_factor=penalty_space_deixis) - if penalty_time_deixis >= 0.0: - factor *= deixis_time( - headword, lemmas, penalty_factor=penalty_time_deixis) - if penalty_person_deixis >= 0.0: - factor *= deixis_person( - headword, annotation, penalty_factor=penalty_person_deixis) - # done - return factor - - -def has_finite_verb_and_subject(annotation: List[dict]) -> bool: - """Has finite verb as root and subject as one of its children. - - It is a knockout criterion. - """ - # find the root of the dependency tree - root = [token for token in annotation if token['deprel'].lower() == 'root'] - if len(root) != 1: - return False - root = root[0] - root_id = root['id'] - - # find finite verb - def is_finite_verb(tok): - if tok.get('upos', '') in {'AUX', 'VERB'}: - flag = tok.get('feats', '').get('VerbForm', '') == 'Fin' - return flag or tok.get('xpos', '').endswith('FIN') - return False - # find finite verb that are a) root, or b) child of root - verb = [ - tok for tok in annotation - if is_finite_verb(tok) and ( - tok['id'] == root_id or tok.get('head', '') == root_id) - ] - if len(verb) == 0: - return False - - # find subject that are a) root, or b) child of root - subj = [ - tok for tok in annotation - if (tok['upos'] in {'NOUN', 'PROPN', 'PRON'}) and ( - tok['id'] == root_id or tok.get('head', '') == root_id) - ] - if len(subj) == 0: - return False - # done - return True - - -def is_misparsed(txt: str): - """Misparsed strings - - Rules: - ------ - - The first character is lowercase - - The first character is a whitespace - - The first character is a punctuation mark - - The last character is not a punctuation mark - - Parameters: - ----------- - txt : str - The sentence as plain text - - Returns: - -------- - flag : bool - True if the sentence is misparsed - """ - conditions = [ - txt[0].islower(), - txt[0].isspace(), - txt[0] in ',.?!()/&%-_:;#+*~<>|^°', - txt[-1] not in '?!.' - ] - return any(conditions) - - -def has_illegal_chars(txt: str, illegal_chars='<>|[]/\\^@'): - """Blacklist of illegal characters - - Rules: - ------ - - ASCII/Unicode control characters, ID 0-31 - - `<>/` XML/HTML tags - - `|` pipe symbol or OR operator - - `[]` square brackets, e.g. Markdown links - - slash escape characters, Windows paths - - `@` email addresses - - caret regular expressions - - ... - - Parameters: - ----------- - txt : str - The sentence as plain text - - illegal_chars : str (Default) - The list of illegal characters - - Returns: - -------- - flag : bool - True if the sentence contains illegal characters - """ - # any ASCII/Unicode control characers, e.g. newline \n - if len([c for c in txt if ord(c) < 32]) > 0: # 0 =< ord(c) =< 31 - return True - # other illegal characters - return len([c for c in txt if c in illegal_chars]) > 0 - - -BLACKLIST_WORDS_DE = [ - 'negroid', - 'Zigeunerbande', - 'Mischling', - 'Zigeunerleben', - 'Zigeunerkind', - 'durchvögeln', - 'durchficken', - 'durchbumsen', - 'Idiot', - 'Polenböller', - 'geisteskrank', - 'Neger', - 'Zigeuner', - 'Nigger', - 'Schwuchtel', - 'Herrenrasse', - 'Negersklave', - 'Negerin', - 'Negerblut', - 'Negerkind', - 'Negerstamm' -] - - -def has_blacklist_words(headword: str, - lemmas: List[str], - blacklist_words: List[str] = BLACKLIST_WORDS_DE): - if blacklist_words is None: - blacklist_words = BLACKLIST_WORDS_DE - a = set(lemmas) - b = set([w for w in blacklist_words if w != headword]) - return len(a.intersection(b)) > 0 - - -RARE_CHARS_DE = '0123456789\'.,!?)(;:-' - -ORD_RARE_CHARS_DE = [ord(c) for c in RARE_CHARS_DE] - - -def factor_rarechars(txt: str, - rare_chars: List[int] = ORD_RARE_CHARS_DE, - penalty_factor: float = 0.1): - """Penalize rare characters - - Parameters: - ----------- - txt : str - The sentence as plain text - - rare_chars : List (Default ORD_RARE_CHARS_DE) - List of characters. Use the ASCII/Unicode IDs, see `ord(c)` - - Returns: - -------- - factor : float - Number between 0.0 and 1.0 - """ - num_matches = len([c for c in txt if ord(c) in rare_chars]) - return max(0.0, 1.0 - penalty_factor * num_matches) - - -QWERTZ_DE = [ - '^', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'ß', "'", - 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 'ü', '+', - 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'ö', 'ä', '#', - '<', 'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '-', - '°', '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '`', - 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 'Ü', '*', - 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Ö', 'Ä', "'", - '>', 'Y', 'X', 'C', 'V', 'B', 'N', 'M', ';', ':', '_', - '′', '¹', '²', '³', '¼', '½', '¬', '{', '[', ']', '}', '\\', '¸', - '@', 'ł', '€', '¶', 'ŧ', '←', '↓', '→', 'ø', 'þ', '"', '~', - 'æ', 'ſ', 'ð', 'đ', 'ŋ', 'ħ', '̣', 'ĸ', 'ł', '˝', '^', '’', - '|', '»', '«', '¢', '„', '“', '”', 'µ', '·', '…', '–', - '″', '¡', '⅛', '£', '¤', '⅜', '⅝', '⅞', '™', '±', '°', '¿', '˛', - 'Ω', 'Ł', '€', '®', 'Ŧ', '¥', '↑', 'ı', 'Ø', 'Þ', '°', '¯', - 'Æ', 'ẞ', 'Ð', 'ª', 'Ŋ', 'Ħ', '˙', '&', 'Ł', '̣', '̣', '˘', - '', '›', '‹', '©', '‚', '‘', '’', 'º', '×', '÷', '—', - ' ' -] - -ORDS_QWERTZ_DE = sorted([ord(c) for c in QWERTZ_DE if c]) - - -def factor_notkeyboardchar( - txt: str, eligible: List[int] = ORDS_QWERTZ_DE): - """Computes the percentage of characters not typable on a German keyboard. - - Parameters: - ----------- - txt : str - The sentence to evaluate - - eligible : List[int] (Default ORDS_QWERTZ_DE) - The list of eligible characters (ordinals) that are typable on a - German keyboard. Use the ASCII/Unicode IDs, see `ord(c)` - - Returns: - -------- - factor : float - Percentage of characters that are typable on a German keyboard. - """ - return len([c for c in txt if ord(c) in eligible]) / len(txt) - - -def factor_graylist_words(headword: str, - lemmas: List[str], - graylist_words: List[str], - penalty_factor: float = 0.1): - """Penalize graylist words""" - if graylist_words is None: - return 1.0 # no default list - num_matches = len([ - lem for lem in lemmas - if lem != headword and lem in graylist_words]) - return max(0.0, 1.0 - penalty_factor * num_matches) - - -def factor_named_entity(headword: str, - annotation: List[dict], - penalty_factor: float = 0.15): - """Named Enity / Proper Noun penality - - If the headword is a named entity, we want to avoid that the sentence. - - UPOS=PROPN - see https://universaldependencies.org/u/pos/PROPN.html - - XPOS=NE - https://universaldependencies.org/tagset-conversion/de-stts-uposf.html - - Parameters: - ----------- - headword : str - The headword (lemma) to evaluate in combination with the sentence. - - annotation : List[dict] - The linguistic annoations of the sentence - - penality_factor : float (Default 0.15) - The penality factor for each named entity occurence - - Returns: - -------- - factors : float - Number between 0.0 and 1.0 - """ - num_matches = 0 - for tok in annotation: - if tok.get('lemma', '') == headword: - if (tok.get('upos', '') == 'PROPN') or (tok.get('xpos') == 'NE'): - num_matches += 1 - return max(0.0, 1.0 - penalty_factor * num_matches) - - -def _deixis(headword: str, - lemmas: List[str], - deixis_terms: List[str], - penalty_factor: float = 0.1): - """Deixis factor function - - Utility function used for deixis_space and deixis_time. - """ - num_matches = len([ - lem for lem in lemmas - if lem != headword and lem in deixis_terms]) - return max(0.0, 1.0 - penalty_factor * num_matches) - - -DEFAULT_SPACE_DEIXIS_TERMS = [ - 'hier', 'dort', 'über', 'da', 'vor', 'hinter', 'links', 'von', 'rechts', - 'von', 'oben', 'unten'] - - -def deixis_space(headword: str, - lemmas: List[str], - space_deixis_terms: List[str] = DEFAULT_SPACE_DEIXIS_TERMS, - penalty_factor: float = 0.1) -> float: - """Space deixis penality - - Parameters: - ----------- - headword : str - The headword (lemma) to evaluate in combination with the sentence. - The headword is excluded from the count. - - lemmas : List[str] - All lemmas of the sentence - - space_deixis_terms : List[str] (Default DEFAULT_SPACE_DEIXIS_TERMS) - The space deixis terms to look for in the sentence - - penalty_factor : float (Default 0.1) - The penality factor for each space deixis occurence - - Returns: - -------- - factors : float - Number between 0.0 and 1.0 - - - Information: - ------------ - https://gsw.phil-fak.uni-duesseldorf.de/diskurslinguistik/index.php?title=Deiktischer_Ausdruck - """ - return _deixis(headword=headword, - lemmas=lemmas, - deixis_terms=space_deixis_terms, - penalty_factor=penalty_factor) - - -DEFAULT_TIME_DEIXIS_TERMS = [ - 'jetzt', 'heute', 'gestern', 'morgen', 'dann', 'damals', 'bald', - 'kürzlich'] - - -def deixis_time(headword: str, - lemmas: List[str], - time_deixis_terms: List[str] = DEFAULT_TIME_DEIXIS_TERMS, - penalty_factor: float = 0.1) -> float: - """Time deixis penality - - Parameters: - ----------- - headword : str - The headword (lemma) to evaluate in combination with the sentence. - The headword is excluded from the count. - - lemmas : List[str] - All lemmas of the sentence - - time_deixis_terms : List[str] (Default DEFAULT_TIME_DEIXIS_TERMS) - The time deixis terms to look for in the sentence - - penalty_factor : float (Default 0.1) - The penality factor for each time deixis occurence - in the sentence. - - Returns: - -------- - factors : float - Number between 0.0 and 1.0 - - Information: - ------------ - https://gsw.phil-fak.uni-duesseldorf.de/diskurslinguistik/index.php?title=Deiktischer_Ausdruck - """ - return _deixis(headword=headword, - lemmas=lemmas, - deixis_terms=time_deixis_terms, - penalty_factor=penalty_factor) - - -def deixis_person(headword: str, - annotation: List[dict], - penalty_factor: float = 0.1) -> float: - """Personal deixis penality - - We use UD's UPOS and features as filter criteria. The following - pronoums are substituting: - - PDS (PRON + Dem): das, dies, die, diese, der - - PIS (PRON + Ind,Neg,Tot): man, allem, nichts, alles, mehr - - PPER (PRON + Prs): es, sie, er, wir, ich - - PPOSS (PRON + Prs): ihren, Seinen, seinem, unsrigen, meiner - see https://universaldependencies.org/tagset-conversion/de-stts-uposf.html - see https://universaldependencies.org/en/feat/PronType.html - - Parameters: - ----------- - headword : str - The headword (lemma) to evaluate in combination with the sentence. - The headword is excluded from the count. - - annotation : List[dict] - The linguistic annoations of the sentence - - penality_factor : float (Default 0.1) - The penality factor for each personal deixis occurence - in the sentence. - - Returns: - -------- - factors : float - Number between 0.0 and 1.0 - """ - PTyp = {'Prs', 'Dem', 'Ind', 'Neg', 'Tot'} - num_matches = 0 - for t in annotation: - if t['lemma'] != headword: - if t.get('upos', '') == 'PRON': - if t.get('feats', {}).get('PronType', '') in PTyp: - num_matches += 1 - return max(0.0, 1.0 - penalty_factor * num_matches) - - -def optimal_interval(num_tokens: int, low: int = 10, high: int = 20) -> float: - """Optimal sentence length by the number of word tokens - - Parameters: - ----------- - num_tokens : int - Number of word tokens in the sentence - - low : int (Default 10) - Lower bound of the optimal interval - - high : int (Default 20) - Upper bound of the optimal interval - - Returns: - -------- - factor : float - Number between 0.0 and 1.0 - 0.0 (=sentence length bad), 1.0 (=sentence length ok) - """ - if low <= num_tokens <= high: - return 1. - elif num_tokens < low: - if num_tokens < low / 2.: - return 0. - else: - diff = low - num_tokens - return 1 - diff * (1. / (low / 2.)) - else: - if num_tokens > (2 * high): - return 0. - diff = (2 * high) - num_tokens - return diff / high diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 8f95515..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,7 +0,0 @@ -# publish -setuptools>=56.0.0 -twine==3.3.0 -wheel>=0.31.0 -# syntax check, unit test, profiling -flake8>=3.8.4 -pytest>=6.2.1 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 3522ee8..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -# public packages (see setup.py) -conllu>=4.5.3 diff --git a/setup.py b/setup.py deleted file mode 100644 index 18da362..0000000 --- a/setup.py +++ /dev/null @@ -1,37 +0,0 @@ -import setuptools -import os - - -def read(fname): - with open(os.path.join(os.path.dirname(__file__), fname)) as fp: - s = fp.read() - return s - - -def get_version(path): - with open(path, "r") as fp: - lines = fp.read() - for line in lines.split("\n"): - if line.startswith('__version__'): - delim = '"' if '"' in line else "'" - return line.split(delim)[1] - raise RuntimeError("Unable to find version string.") - - -setuptools.setup( - name='quaxa', - version=get_version("quaxa/__init__.py"), - description='QUAlity of sentence eXAmples scoring', - long_description=read('README.md'), - long_description_content_type='text/markdown', - url='http://github.com/ulf1/quaxa', - author='Ulf Hamster', - author_email='554c46@gmail.com', - license='Apache License 2.0', - packages=['quaxa'], - install_requires=[ - "conllu>=4.5.3" - ], - python_requires='>=3.7', - zip_safe=True -) diff --git a/test/test_quaxa.py b/test/test_quaxa.py deleted file mode 100644 index 51b1120..0000000 --- a/test/test_quaxa.py +++ /dev/null @@ -1,664 +0,0 @@ -import unittest -import quaxa - - -SENTS = [ - "Manasse ist ein einzigartiger Parfümeur.", - "Ich hatte Gelegenheit eines seiner Seminare zu besuchen.", - ( - "7 Tage Erholung im Ferienhaus am Müritz See in einer idyllischen " - "Landschaft inmitten der Mecklenburgischen Seenplatte.") -] - - -ANNOTS = [ - [ - { - "id": 1, - "text": "Manasse", - "lemma": "Manasse", - "upos": "PROPN", - "feats": { - "Case": "Nom", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 5, - "deprel": "nsubj" - }, - { - "id": 2, - "text": "ist", - "lemma": "sein", - "upos": "AUX", - "feats": { - "Mood": "Ind", - "Number": "Sing", - "Person": "3", - "Tense": "Pres", - "VerbForm": "Fin" - }, - "head": 5, - "deprel": "cop" - }, - { - "id": 3, - "text": "ein", - "lemma": "ein", - "upos": "DET", - "feats": { - "Case": "Nom", - "Definite": "Ind", - "Gender": "Masc", - "Number": "Sing", - "NumType": "Card", - "PronType": "Art" - }, - "head": 5, - "deprel": "det" - }, - { - "id": 4, - "text": "einzigartiger", - "lemma": "einzigartig", - "upos": "ADJ", - "feats": { - "Case": "Nom", - "Degree": "Pos", - "Gender": "Masc", - "Number": "Sing" - }, - "head": 5, - "deprel": "amod" - }, - { - "id": 5, - "text": "Parfümeur", - "lemma": "Parfümeur", - "upos": "NOUN", - "feats": { - "Case": "Nom", - "Gender": "Masc", - "Number": "Sing" - }, - "head": 0, - "deprel": "root" - }, - { - "id": 6, - "text": ".", - "lemma": ".", - "upos": "PUNCT", - "head": 5, - "deprel": "punct" - } - ], - [ - { - "id": 1, - "text": "Ich", - "lemma": "ich", - "upos": "PRON", - "feats": { - "Case": "Nom", - "Number": "Sing", - "Person": "1", - "PronType": "Prs" - }, - "head": 2, - "deprel": "nsubj" - }, - { - "id": 2, - "text": "hatte", - "lemma": "haben", - "upos": "VERB", - "feats": { - "Mood": "Ind", - "Number": "Sing", - "Person": "1", - "Tense": "Past", - "VerbForm": "Fin" - }, - "head": 0, - "deprel": "root" - }, - { - "id": 3, - "text": "Gelegenheit", - "lemma": "Gelegenheit", - "upos": "NOUN", - "feats": { - "Case": "Acc", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 2, - "deprel": "obj" - }, - { - "id": 4, - "text": "eines", - "lemma": "ein", - "upos": "DET", - "feats": { - "Case": "Acc", - "Definite": "Ind", - "Gender": "Neut", - "Number": "Sing", - "NumType": "Card", - "PronType": "Art" - }, - "head": 6, - "deprel": "det" - }, - { - "id": 5, - "text": "seiner", - "lemma": "sein", - "upos": "DET", - "feats": { - "Case": "Gen", - "Gender": "Neut", - "Gender[psor]": "Masc,Neut", - "Number": "Plur", - "Number[psor]": "Sing", - "Person": "3", - "Poss": "Yes", - "PronType": "Prs" - }, - "head": 6, - "deprel": "det:poss" - }, - { - "id": 6, - "text": "Seminare", - "lemma": "Seminar", - "upos": "NOUN", - "feats": { - "Case": "Gen", - "Gender": "Neut", - "Number": "Plur" - }, - "head": 8, - "deprel": "obj" - }, - { - "id": 7, - "text": "zu", - "lemma": "zu", - "upos": "PART", - "head": 8, - "deprel": "mark" - }, - { - "id": 8, - "text": "besuchen", - "lemma": "besuchen", - "upos": "VERB", - "feats": { - "VerbForm": "Inf" - }, - "head": 3, - "deprel": "xcomp" - }, - { - "id": 9, - "text": ".", - "lemma": ".", - "upos": "PUNCT", - "head": 2, - "deprel": "punct" - } - ], - [ - { - "id": 1, - "text": "7", - "lemma": "7", - "upos": "NUM", - "feats": { - "NumType": "Card" - }, - "head": 2, - "deprel": "nummod" - }, - { - "id": 2, - "text": "Tage", - "lemma": "Tag", - "upos": "NOUN", - "feats": { - "Case": "Nom", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 3, - "deprel": "nmod" - }, - { - "id": 3, - "text": "Erholung", - "lemma": "Erholung", - "upos": "NOUN", - "feats": { - "Case": "Acc", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 0, - "deprel": "root" - }, - { - "id": (4, "-", 5), - "text": "im", - "lemma": "_", - "upos": "_", - "deprel": "_" - }, - { - "id": 4, - "text": "in", - "lemma": "in", - "upos": "ADP", - "head": 6, - "deprel": "case" - }, - { - "id": 5, - "text": "dem", - "lemma": "der", - "upos": "DET", - "feats": { - "Case": "Dat", - "Definite": "Def", - "Gender": "Neut", - "Number": "Sing", - "PronType": "Art" - }, - "head": 6, - "deprel": "det" - }, - { - "id": 6, - "text": "Ferienhaus", - "lemma": "Ferienhaus", - "upos": "NOUN", - "feats": { - "Case": "Dat", - "Gender": "Neut", - "Number": "Sing" - }, - "head": 3, - "deprel": "nmod" - }, - { - "id": (7, "-", 8), - "text": "am", - "lemma": "_", - "upos": "_", - "deprel": "_" - }, - { - "id": 7, - "text": "an", - "lemma": "an", - "upos": "ADP", - "head": 9, - "deprel": "case" - }, - { - "id": 8, - "text": "dem", - "lemma": "der", - "upos": "DET", - "feats": { - "Case": "Dat", - "Definite": "Def", - "Gender": "Masc", - "Number": "Sing", - "PronType": "Art" - }, - "head": 9, - "deprel": "det" - }, - { - "id": 9, - "text": "Müritz", - "lemma": "Müritz", - "upos": "PROPN", - "feats": { - "Case": "Dat", - "Gender": "Masc", - "Number": "Sing" - }, - "head": 6, - "deprel": "nmod" - }, - { - "id": 10, - "text": "See", - "lemma": "See", - "upos": "PROPN", - "feats": { - "Case": "Dat", - "Gender": "Masc", - "Number": "Sing" - }, - "head": 9, - "deprel": "flat" - }, - { - "id": 11, - "text": "in", - "lemma": "in", - "upos": "ADP", - "head": 14, - "deprel": "case" - }, - { - "id": 12, - "text": "einer", - "lemma": "ein", - "upos": "DET", - "feats": { - "Case": "Dat", - "Definite": "Ind", - "Gender": "Fem", - "Number": "Sing", - "NumType": "Card", - "PronType": "Art" - }, - "head": 14, - "deprel": "det" - }, - { - "id": 13, - "text": "idyllischen", - "lemma": "idyllisch", - "upos": "ADJ", - "feats": { - "Case": "Dat", - "Degree": "Pos", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 14, - "deprel": "amod" - }, - { - "id": 14, - "text": "Landschaft", - "lemma": "Landschaft", - "upos": "NOUN", - "feats": { - "Case": "Dat", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 9, - "deprel": "nmod" - }, - { - "id": 15, - "text": "inmitten", - "lemma": "inmitten", - "upos": "ADP", - "head": 18, - "deprel": "case" - }, - { - "id": 16, - "text": "der", - "lemma": "der", - "upos": "DET", - "feats": { - "Case": "Dat", - "Definite": "Def", - "Gender": "Fem", - "Number": "Sing", - "PronType": "Art" - }, - "head": 18, - "deprel": "det" - }, - { - "id": 17, - "text": "Mecklenburgischen", - "lemma": "Mecklenburgischen", - "upos": "PROPN", - "feats": { - "Case": "Dat", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 18, - "deprel": "amod" - }, - { - "id": 18, - "text": "Seenplatte", - "lemma": "Seenplatte", - "upos": "PROPN", - "feats": { - "Case": "Dat", - "Gender": "Fem", - "Number": "Sing" - }, - "head": 9, - "deprel": "nmod" - }, - { - "id": 19, - "text": ".", - "lemma": ".", - "upos": "PUNCT", - "head": 3, - "deprel": "punct" - } - ] -] - - -class QuaxTester(unittest.TestCase): - def setUp(self): - self.sents = SENTS - self.annots = ANNOTS - self.lemmata = [ - [tok.get('lemma') for tok in tree] for tree in self.annots] - - def test_total_score(self): - for txt, annot in zip(self.sents, self.annots): - for tok in annot: - if tok.get('upos', '') in {'NOUN', 'VERB', 'ADJ'}: - headword = tok['lemma'] - factor = quaxa.total_score( - headword=headword, txt=txt, annotation=annot) - print(( - "total_score:" - f"{factor: 7.4f} | {headword} | {txt[:20]} ...")) - self.assertGreaterEqual(factor, 0.) - self.assertLessEqual(factor, 1.) - - def test_isa_knockout_criteria(self): - for txt, annot in zip(self.sents, self.annots): - for tok in annot: - if tok.get('upos', '') in {'NOUN', 'VERB', 'ADJ'}: - headword = tok['lemma'] - flag = quaxa.isa_knockout_criteria( - headword=headword, txt=txt, annotation=annot) - print(( - "isa_knockout_criteria:" - f"{flag} | {headword} | {txt[:20]} ...")) - self.assertIs(flag is True or flag is False, True) - - def test_factor_gradual_criteria(self): - for txt, annot in zip(self.sents, self.annots): - for tok in annot: - if tok.get('upos', '') in {'NOUN', 'VERB', 'ADJ'}: - headword = tok['lemma'] - factor = quaxa.factor_gradual_criteria( - headword=headword, txt=txt, annotation=annot) - print(( - "factor_gradual_criteria:" - f"{factor:7.4f} | {headword} | {txt[:20]} ...")) - self.assertGreaterEqual(factor, 0.) - self.assertLessEqual(factor, 1.) - - def test_has_finite_verb_and_subject(self): - target = [True, True, False] - for i, annot in enumerate(self.annots): - res = quaxa.has_finite_verb_and_subject(annot) - self.assertEqual(res, target[i]) - - def test_is_misparsed(self): - for sent in self.sents: - res = quaxa.is_misparsed(sent) - self.assertFalse(res) - - res = quaxa.is_misparsed('Das ist ein Beispieltext.') - self.assertFalse(res) - - res = quaxa.is_misparsed('Das ist ein Beispieltext') - self.assertTrue(res) - - res = quaxa.is_misparsed('das ist ein Beispieltext.') - self.assertTrue(res) - - res = quaxa.is_misparsed('\tDas ist ein Beispieltext.') - self.assertTrue(res) - - def test_has_illegal_chars(self): - for sent in self.sents: - res = quaxa.has_illegal_chars(sent) - self.assertFalse(res) - - res = quaxa.has_illegal_chars('https://somerandomurl.com') - self.assertTrue(res) - - res = quaxa.has_illegal_chars('name@mail.com') - self.assertTrue(res) - - res = quaxa.has_illegal_chars('my test\rnew windows paragraph') - self.assertTrue(res) - - def test_has_blacklist_words(self): - for annot in self.annots: - lemmas = [tok.get('lemma') for tok in annot] - for tok in annot: - headword = tok['lemma'] - res = quaxa.has_blacklist_words( - headword=headword, lemmas=lemmas) - self.assertFalse(res) - - res = quaxa.has_blacklist_words('Beispielsatz', [ - 'und', 'der', 'sein', 'ein', 'Beispielsatz', 'mit', 'Idiot', '--']) - self.assertTrue(res) - - res = quaxa.has_blacklist_words('Idiot', [ - 'und', 'der', 'sein', 'ein', 'Beispielsatz', 'mit', 'Idiot', '--']) - self.assertFalse(res) - - def test_factor_graylist_rarechars(self): - target = [0.9, 0.9, 0.8] - for i, sent in enumerate(self.sents): - res = quaxa.factor_rarechars(sent) - self.assertEqual(res, target[i]) - - res = quaxa.factor_rarechars("\'\'..??") - self.assertAlmostEqual(res, 0.4) # rounding error - - def test_factor_graylist_notkeyboardchar(self): - for sent in self.sents: - res = quaxa.factor_notkeyboardchar(sent) - self.assertEqual(res, 1.) - - res = quaxa.factor_notkeyboardchar('ßÄÖÜäöü') - self.assertEqual(res, 1.) - - res = quaxa.factor_notkeyboardchar( - 'À la carte, s\'il vous plaît\n') - self.assertLess(res, 1.0) - - def test_factor_graylist_words(self): - GRAYLIST = ['Seminar'] - target = [1.0, 0.9, 1.0] - for i, annot in enumerate(self.annots): - lemmas = [tok.get('lemma') for tok in annot] - for tok in annot: - headword = tok['lemma'] - res = quaxa.factor_graylist_words( - headword=headword, lemmas=lemmas, graylist_words=GRAYLIST) - if headword in GRAYLIST: - self.assertEqual(res, target[i] + 0.1) - else: - self.assertEqual(res, target[i]) - - def test_factor_named_entity(self): - for annot in self.annots: - for tok in annot: - headword = tok['lemma'] - res = quaxa.factor_named_entity( - headword=headword, annotation=annot, penalty_factor=0.15) - flag = tok.get('upos', '') == 'PROPN' - flag = flag or tok.get('xpos', '') == 'NE' - if flag: - self.assertEqual(res, 0.85) - else: - self.assertEqual(res, 1.0) - - def test_deixis(self): - lemmas = ['heute', 'hier', '--', 'morgen', 'dort', '--'] - result2 = [quaxa.deixis_space('heute', lemmas), - quaxa.deixis_time('heute', lemmas)] - self.assertEqual(result2, [.8, .9]) - - result3 = [quaxa.deixis_space('hier', lemmas), - quaxa.deixis_time('hier', lemmas)] - self.assertEqual(result3, [.9, .8]) - - def test_deixis_person(self): - target = [1.0, 0.9, 1.0] - for i, annot in enumerate(self.annots): - for tok in annot: - headword = tok['lemma'] - res = quaxa.deixis_person( - headword=headword, annotation=annot) - flag = tok.get('upos', '') == 'PRON' - flag = flag and tok.get('feats', {}).get('PronType', '') in [ - 'Prs', 'Dem', 'Ind', 'Neg', 'Tot'] - if flag: - self.assertEqual(res, target[i] + 0.1) - else: - self.assertEqual(res, target[i]) - - def test_optimal_interval(self): - for annot in self.annots: - num_tokens = len(annot) - res = quaxa.optimal_interval( - num_tokens=num_tokens, - low=num_tokens * 2, - high=num_tokens * 3) - self.assertLess(res, 1.) - res = quaxa.optimal_interval( - num_tokens=num_tokens, - low=num_tokens // 2, - high=num_tokens * 2) - self.assertEqual(res, 1.) - - num_tokens = len(( - "Das ist ein Beispielsatz mit optimaler Länge von über 10 Tokens." - ).split(" ")) - result2 = quaxa.optimal_interval(num_tokens=num_tokens) - self.assertEqual(result2, 1.) - - num_tokens = len('Viel zu kurz.'.split(" ")) - result3 = quaxa.optimal_interval(num_tokens=num_tokens) - self.assertEqual(result3, 0.) - - num_tokens = len(( - "Dieser hingegen ist leider zu lang. Das macht ihn weniger " - "angenehm zu lesen. Daher ist der zurückgegebene Wert kleiner " - "als 1, schade.").split(" ")) - result4 = quaxa.optimal_interval(num_tokens=num_tokens) - self.assertLess(result4, 1.) diff --git a/test/__init__.py b/tests/__init__.py similarity index 100% rename from test/__init__.py rename to tests/__init__.py diff --git a/tests/test_quaxa.py b/tests/test_quaxa.py new file mode 100644 index 0000000..ab8742d --- /dev/null +++ b/tests/test_quaxa.py @@ -0,0 +1,92 @@ +import spacy + +import quaxa + +nlp = spacy.load("de_core_news_sm") + + +def score(s): + return quaxa.de_core(nlp(s)) + + +def assert_knockout(s): + for sent in score(s).sents: + assert sent._.quaxa <= 0.5 + + +def assert_penalty(factor_method, s, headword=None): + doc = nlp(s) + for sent in doc.sents: + if headword is not None: + assert factor_method(quaxa.de_core, sent, headword) < 1.0 + else: + assert factor_method(quaxa.de_core, sent) < 1.0 + + +def test_scoring(): + doc = " ".join( + ( + "Manasse ist ein einzigartiger Parfümeur.", + "Ich hatte Gelegenheit eines seiner Seminare zu besuchen.", + ( + "7 Tage Erholung im Ferienhaus am Müritz See in einer idyllischen " + "Landschaft inmitten der Mecklenburgischen Seenplatte." + ), + ) + ) + doc = quaxa.de_core(nlp(doc)) + for sent in doc.sents: + assert sent._.quaxa >= 0.0 and sent._.quaxa <= 1.0 + + +def test_illegal_chars(): + assert_knockout("Das ist ein Satz mit unzulässigen Zeichen [1].") + assert_knockout("Gleiches gilt für diesen Satz mit test@test.de.") + assert_knockout("Gleiches gilt für Sonderzeichen wie\nZeilenumbrüche.") + + +def test_misparsed(): + assert_knockout("Ein Satz ohne Satzzeichen") + assert_knockout("ein Satz, der mit Kleinbuchstaben beginnt.") + assert_knockout(": Ein Satz mit Interpunktion am Anfang.") + + +def test_finite_verb_and_subject(): + assert_knockout("Achtung!") + assert_knockout("Jetzt kaufen!") + assert_knockout("Über uns.") + + +def test_rarechars(): + factor_method = quaxa.SentenceScorer.factor_rarechars + assert_penalty(factor_method, "1. Aufzählungen und Zahlen mögen wir nicht.") + assert_penalty(factor_method, "Worte in Klammern (Paranthese) sind schlecht.") + + +def test_notkeyboardchar(): + factor_method = quaxa.SentenceScorer.factor_notkeyboardchar + assert_penalty(factor_method, "Gute Medizin schmeckt, 良药苦口。") + + +def test_named_entities(): + factor_method = quaxa.SentenceScorer.factor_named_entities + assert_penalty(factor_method, "Beispiele aus Berlin brauchen wir nicht.") + + +def test_blacklist(): + factor_method = quaxa.SentenceScorer.factor_blacklist + assert_penalty(factor_method, "Manche Sätze sind Scheiße.", "Satz") + + +def test_optimal_interval(): + factor_method = quaxa.SentenceScorer.factor_optimal_interval + assert_penalty(factor_method, "Kurz ist doof!") + assert_penalty(factor_method, "Lang ist auch doof, " * 5 + ", wirklich!") + assert_penalty(factor_method, "Lang ist auch doof, " * 10 + ", ehrlich!") + + +def test_deixis(): + factor_method = quaxa.SentenceScorer.factor_deixis + assert_penalty(factor_method, "Hier ist es schlecht!", "schlecht") + assert_penalty(factor_method, "Unten und oben ist es auch schlecht!", "schlecht") + assert_penalty(factor_method, "Jetzt bitte nicht!", "bitte")