From 89504de930e5d111f27249e9e5fb7412bcbb4eee Mon Sep 17 00:00:00 2001 From: FernanOrtega Date: Thu, 5 Mar 2020 20:25:39 +0100 Subject: [PATCH 1/4] First commit with basic structure and basic algorithm implemented. --- .gitignore | 3 + requirements.txt | 4 + sentimentanalysis/analizer.py | 117 + sentimentanalysis/api.py | 63 + sentimentanalysis/dataloader.py | 21 + sentimentanalysis/resources/es/boosters.csv | 6 + sentimentanalysis/resources/es/negations.csv | 8 + .../resources/es/sentiment_words.csv | 2852 +++++++++++++++++ test/__init__.py | 0 9 files changed, 3074 insertions(+) create mode 100644 requirements.txt create mode 100644 sentimentanalysis/analizer.py create mode 100644 sentimentanalysis/api.py create mode 100644 sentimentanalysis/dataloader.py create mode 100644 sentimentanalysis/resources/es/boosters.csv create mode 100644 sentimentanalysis/resources/es/negations.csv create mode 100644 sentimentanalysis/resources/es/sentiment_words.csv create mode 100644 test/__init__.py diff --git a/.gitignore b/.gitignore index b6e4761..4b492eb 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +# PyCharm +.idea \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..81135e4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +SpaCy==2.2.3 +Flask==1.1.1 +gunicorn==20.0.4 +numpy==1.18.1 \ No newline at end of file diff --git a/sentimentanalysis/analizer.py b/sentimentanalysis/analizer.py new file mode 100644 index 0000000..cbb1448 --- /dev/null +++ b/sentimentanalysis/analizer.py @@ -0,0 +1,117 @@ +from typing import Dict + +import spacy + +from spacy.tokens.doc import Doc +from spacy.tokens.span import Span +from spacy.tokens.token import Token +from itertools import groupby + +from sentimentanalysis.dataloader import load_dict + + +class SentimentAnalysis: + def __init__(self, language: str = "es"): + self.__sentiment_words = load_dict(language, "sentiment_words.csv") + self.__boosters = load_dict(language, "boosters.csv") + self.__negations = load_dict(language, "negations.csv") + self.__nlp = spacy.load("es_core_news_sm") + Span.set_extension("sentiment_weight", default=0.0, force=True) + Span.set_extension("negation_weight", default=0.0, force=True) + Span.set_extension("booster_weight", default=0.0, force=True) + Token.set_extension("sentiment_weight", default=0.0, force=True) + Token.set_extension("negation_weight", default=0.0, force=True) + Token.set_extension("booster_weight", default=0.0, force=True) + + def get_sentiment(self, text: str) -> Dict: + result = {} + doc = self.__nlp(text) + self.__annotate_sentiment_words(doc) + self.__annotate_negations_and_boosters(doc) + # map(lambda sent: self.__annotate_doc(sent), [sent for sent in doc.sents]) + + result["per_sentence_sentiment"] = self.__compute_per_sentence_sentiment(doc) + result["global_sentiment"] = self.__compute_global_sentiment(doc) + + return result + + def __annotate_sentiment_words(self, doc: Doc) -> None: + for token in doc: + if token.pos_ == "ADJ" and not token.is_stop: + sentiment_weight = self.__sentiment_words.get(token.lemma_, 0.0) + if sentiment_weight != 0.0: + token._.booster_weight = self.__get_self_boosters(token) + + def __annotate_negations_and_boosters(self, doc: Doc) -> None: + for sentence in doc.sents: + for i, token in enumerate(sentence): + if token in self.__negations: + influenced_token = self.__get_influenced_token(sentence, i) + if influenced_token: + influenced_token._.negation_weight = self.__negations.get(token) * -1 + elif token in self.__boosters: + influenced_token = self.__get_influenced_token(sentence, i) + if influenced_token: + influenced_token._.booster_weight += self.__boosters.get(token) + + def __get_influenced_token(self, sentence: Span, influencer_index: int) -> Token: + + result = None + for i in range(1, len(sentence)): + for j in [-1, 1]: + candidate_index = influencer_index + i * j + if 0 <= candidate_index < len(sentence): + candidate = sentence[candidate_index] + + if candidate._.sentiment_weight != 0.0: + result = candidate + break + + return result + + def __compute_per_sentence_sentiment(self, doc: Doc) -> Dict: + + result = {} + + for i, sent in enumerate(doc.sents): + max_score = 0.0 + min_score = 0.0 + + for token in sent: + score = token._.sentiment_weight * token._.negation_weight + if score > 0: + score = max(1.0, score + token._.booster_weight) + if score > max_score: + max_score = max + elif score < 0: + score = min(-1.0, score - token._.booster_weight) + if score < min_score: + min_score = score + + sentence_score = max_score + min_score + sent._.sentiment_weight = sentence_score + result[i] = sentence_score + + return result + + def __compute_global_sentiment(self, doc: Doc) -> float: + + max_score = 0.0 + min_score = 0.0 + + for sent in doc.sents: + if sent._.sentiment_weight > max_score: + max_score = sent._.sentiment_weight + elif sent._.sentiment_weight < min_score: + min_score = sent._.sentiment_weight + + return max_score + min_score + + def __get_self_boosters(self, token: Token) -> float: + + return 1.0 if (token.shape_.count("X") / len(token)) > 0.8 or self.max_rep_letters(token) >= 3 else 0.0 + + def max_rep_letters(self, token): + + return sorted([(letter, len(list(group))) for letter, group in groupby(token)], key=lambda i: i[1], + reverse=True)[0][1] diff --git a/sentimentanalysis/api.py b/sentimentanalysis/api.py new file mode 100644 index 0000000..ac96266 --- /dev/null +++ b/sentimentanalysis/api.py @@ -0,0 +1,63 @@ +import json +from flask import Flask, request, Response +from werkzeug.exceptions import HTTPException, InternalServerError + + +def get_response(body, status=200): + json_body = { + ("value" if status == 200 else "error"): body + } + + return Response(json.dumps(json_body), status, mimetype='application/json') + + +def handle_method_not_allowed(): + message = "The method is not allowed for the requested URL." + status_code = 405 + + return get_response(message, status_code) + + +app = Flask(__name__) + + +@app.errorhandler(Exception) +def handle_exception(e): + # pass through HTTP errors + if isinstance(e, HTTPException): + return e + + # now you're handling non-HTTP exceptions only + return get_response(f"500. HTTP Exception. Exception: {e}", 500) + + +@app.errorhandler(InternalServerError) +def handle_500(e): + original = getattr(e, "original_exception", None) + + if original is None: + return get_response("500. Unhandled Internal Server Error", 500) + + # wrapped unhandled error + return get_response(f"500. Handled Internal Server Error: {original}", 500) + + +@app.route("/sentimentanalysis", methods=["POST"]) +def get_sentiment_analysis(): + if not request.is_json: + message = "Incorrect mimetype, must be 'application/json'." + status_code = 415 + else: + message = "Ok" + status_code = 200 + + return get_response(message, status=status_code) + + +@app.route("/") +def root(): + return "Everything is working fine" + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000) diff --git a/sentimentanalysis/dataloader.py b/sentimentanalysis/dataloader.py new file mode 100644 index 0000000..4c7e79c --- /dev/null +++ b/sentimentanalysis/dataloader.py @@ -0,0 +1,21 @@ +import csv +import os +from typing import Dict, List + +BASE_URL = f"{os.path.dirname(os.path.realpath(__file__))}/resources" + + +def load_dict(language: str, file_name: str) -> Dict: + + with open(os.path.join(BASE_URL, language, file_name)) as csvfile: + csv_reader = csv.reader(csvfile) + result = {row[0]: row[1] for row in csv_reader} + + return result + + +def load_string_file(language: str, file_name: str) -> List: + with open(os.path.join(BASE_URL, language, file_name)) as str_file: + result = [line.replace("\n", "") for line in str_file] + + return result diff --git a/sentimentanalysis/resources/es/boosters.csv b/sentimentanalysis/resources/es/boosters.csv new file mode 100644 index 0000000..954170e --- /dev/null +++ b/sentimentanalysis/resources/es/boosters.csv @@ -0,0 +1,6 @@ +muy,1.0 +mucho,1.0 +bastante,1.0 +demasiado,1.0 +mas,1.0 +gran,1.0 \ No newline at end of file diff --git a/sentimentanalysis/resources/es/negations.csv b/sentimentanalysis/resources/es/negations.csv new file mode 100644 index 0000000..f060a70 --- /dev/null +++ b/sentimentanalysis/resources/es/negations.csv @@ -0,0 +1,8 @@ +nunca,1.0 +jamás,1.0 +no,1.0 +poco,1.0 +sin,1.0 +sin,embargo,1.0 +nada,de,1.0 +no significa que,1.0 \ No newline at end of file diff --git a/sentimentanalysis/resources/es/sentiment_words.csv b/sentimentanalysis/resources/es/sentiment_words.csv new file mode 100644 index 0000000..c661c52 --- /dev/null +++ b/sentimentanalysis/resources/es/sentiment_words.csv @@ -0,0 +1,2852 @@ +abaj,0.0 +abal,1.0 +abandon,-2.0 +abat,-1.0 +abertur,1.0 +abland,0.0 +abochorn,-3.0 +abol,0.0 +abon,1.0 +abord,0.0 +aborrec,-3.0 +aborrecedor,-3.0 +abras,-1.0 +abraz,2.0 +abrig,0.0 +abrog,0.0 +abrum,-1.0 +absolut,1.0 +absuelt,0.0 +absurd,-2.0 +abund,1.0 +aburr,-3.0 +abus,-4.0 +acalor,-3.0 +acap,3.0 +acarici,3.0 +acaudal,2.0 +accesori,1.0 +accident,2.0 +accionari,1.0 +acent,-2.0 +acentu,-2.0 +acept,2.0 +acerb,2.0 +acert,3.0 +achac,-2.0 +acicat,-3.0 +aclar,2.0 +acobard,-1.0 +acog,-3.0 +acogedor,2.0 +acomet,-3.0 +acometedor,-3.0 +acomod,2.0 +acongoj,-4.0 +acopl,1.0 +acoraz,-4.0 +acord,-2.0 +acos,-3.0 +acost,-3.0 +acre,-2.0 +acrecent,1.0 +activ,2.0 +actu,2.0 +acuci,-2.0 +acuerd,1.0 +acus,-2.0 +acuset,-2.0 +acuson,-2.0 +adehal,1.0 +adelant,2.0 +adherent,1.0 +adhesion,1.0 +adicional,2.0 +adin,2.0 +adivin,2.0 +adivinatori,2.0 +adjud,1.0 +adjudic,1.0 +administr,2.0 +admir,3.0 +admit,2.0 +ador,2.0 +adormec,-2.0 +adorn,4.0 +adqu,2.0 +adust,-3.0 +adustez,-3.0 +adven,1.0 +advers,-2.0 +adversari,-2.0 +adversion,-3.0 +aech,1.0 +afabil,2.0 +afabl,2.0 +afe,-3.0 +afeccion,3.0 +afectu,3.0 +afeit,-4.0 +afelp,-3.0 +afemin,3.0 +afianz,1.0 +aficion,3.0 +afil,1.0 +afirm,3.0 +afliccion,-2.0 +aflict,-3.0 +aflig,-3.0 +afloj,3.0 +afortun,3.0 +afrent,-3.0 +afront,-3.0 +agit,-2.0 +agitadament,-2.0 +agobi,-2.0 +agon,-4.0 +agot,-2.0 +agraci,3.0 +agrad,3.0 +agradec,2.0 +agrav,-3.0 +agravi,-3.0 +agred,-3.0 +agres,-3.0 +agresion,-3.0 +agresor,-3.0 +agrest,-1.0 +agri,2.0 +agridulc,-2.0 +aguant,-4.0 +agud,2.0 +agudec,1.0 +agudez,3.0 +aguijon,-3.0 +aguj,-3.0 +aguz,-3.0 +ahog,-2.0 +ahorr,2.0 +ahum,-3.0 +ahuyent,-1.0 +air,3.0 +aisl,-2.0 +aislacion,-2.0 +aislador,-2.0 +aislamient,-2.0 +ajust,1.0 +alab,3.0 +alacr,1.0 +alar,-4.0 +alarm,-3.0 +alberg,3.0 +alborot,-1.0 +alboroz,2.0 +alcanz,1.0 +alegr,2.0 +alel,-1.0 +alent,2.0 +alfeñiqu,-2.0 +alfil,2.0 +alient,2.0 +alig,2.0 +alij,3.0 +aliment,1.0 +alin,1.0 +alis,-2.0 +alivi,1.0 +aljib,2.0 +almir,3.0 +aloc,-1.0 +alquil,1.0 +alter,-3.0 +altivez,2.0 +alucin,-2.0 +alzaprim,3.0 +alzars,-2.0 +ama,3.0 +amabil,2.0 +amabl,1.0 +amad,2.0 +amamant,0.0 +amant,4.0 +amar,3.0 +amarg,-2.0 +amargur,-2.0 +amazon,3.0 +ambigu,-2.0 +amedrent,-3.0 +amen,1.0 +amenaz,-3.0 +amerit,2.0 +amig,2.0 +amiguit,1.0 +amil,-2.0 +amist,1.0 +amonest,-4.0 +amor,3.0 +amoral,2.0 +amorf,2.0 +amortigu,-2.0 +amortiz,2.0 +amovil,-1.0 +ampar,2.0 +ampli,2.0 +amplif,4.0 +amulet,2.0 +analfabet,-3.0 +analiz,2.0 +angusti,-4.0 +anhel,-2.0 +anim,2.0 +anon,-3.0 +ansi,-2.0 +antagon,-2.0 +antagoniz,-2.0 +antaoniz,-2.0 +antigu,2.0 +antipat,-3.0 +antoj,-4.0 +antojadiz,-2.0 +antolog,2.0 +anul,-1.0 +apac,1.0 +apacigu,2.0 +apag,-2.0 +apalabr,1.0 +apar,2.0 +aparc,1.0 +apart,-2.0 +apasion,3.0 +apat,-2.0 +apeg,1.0 +apen,-3.0 +apesadumbr,-4.0 +apest,-3.0 +apetit,2.0 +aplast,-3.0 +aplaud,3.0 +aplaus,2.0 +apolog,-1.0 +apost,-1.0 +apostat,-2.0 +apoy,2.0 +apreci,2.0 +aprehension,1.0 +apremi,-2.0 +aprens,-3.0 +aprension,-3.0 +apret,-3.0 +apretuj,3.0 +apretur,-2.0 +apriet,-2.0 +aprision,2.0 +aprob,1.0 +aprovech,-3.0 +apur,-3.0 +aquiet,2.0 +arbitri,3.0 +arder,-3.0 +ardient,1.0 +ardor,-4.0 +ardu,-2.0 +arenisc,-3.0 +argu,-2.0 +argument,-2.0 +arma,-1.0 +armament,-1.0 +armas,-1.0 +armon,2.0 +armoni,2.0 +armoniz,2.0 +arnes,2.0 +arpi,-2.0 +arraig,2.0 +arranqu,-3.0 +arras,-3.0 +arrebat,-4.0 +arregl,1.0 +arrepent,-2.0 +arri,-2.0 +arriesg,-2.0 +arrog,-3.0 +arroj,-3.0 +arroll,-3.0 +arrostr,3.0 +arrug,-3.0 +arruin,-2.0 +art,2.0 +asalt,-3.0 +ascend,-2.0 +asco,-4.0 +ase,1.0 +asegur,2.0 +asemej,2.0 +asesin,-4.0 +asesinat,-4.0 +asfixi,-2.0 +asist,2.0 +asistent,1.0 +asol,-3.0 +asombr,3.0 +asper,-3.0 +aspir,-2.0 +asqu,-4.0 +astronom,2.0 +astuci,-2.0 +astut,-2.0 +asust,-4.0 +asustadiz,-3.0 +atac,-3.0 +atadur,1.0 +ataqu,-3.0 +atasc,-3.0 +atavi,-2.0 +atemoriz,-3.0 +atemp,-1.0 +atencion,2.0 +atent,2.0 +atenu,2.0 +aterr,-4.0 +aterroriz,-3.0 +atesor,3.0 +atestigu,2.0 +atolondr,-2.0 +atonit,-2.0 +atont,-2.0 +atorment,-4.0 +atornill,-3.0 +atra,2.0 +atraccion,2.0 +atract,2.0 +atractor,2.0 +atrev,-3.0 +atribu,1.0 +atroc,-3.0 +atropell,-2.0 +atroz,-3.0 +atud,-2.0 +aturd,-2.0 +aturrull,-2.0 +aturull,-1.0 +august,-4.0 +ausent,-2.0 +aust,-2.0 +auxili,1.0 +avalu,2.0 +avar,-3.0 +avarici,-3.0 +avarient,-3.0 +avasall,-4.0 +avenrur,1.0 +avent,1.0 +aventaj,2.0 +aventur,1.0 +avergonz,-3.0 +avers,-3.0 +aversion,-3.0 +avetor,-2.0 +avi,-2.0 +avilantez,-3.0 +avinagr,-3.0 +avisap,-2.0 +aviv,1.0 +axiom,2.0 +ayud,2.0 +azor,-3.0 +bab,-3.0 +baj,-2.0 +bajisim,-2.0 +bajon,-1.0 +balanc,2.0 +balbuc,-2.0 +balbucent,-1.0 +ball,4.0 +baluart,1.0 +banal,-2.0 +bancarrot,-2.0 +barandill,2.0 +barb,-3.0 +barbari,-3.0 +barr,-2.0 +bast,2.0 +bastard,-3.0 +bastardizacion,-3.0 +bastion,1.0 +basur,-1.0 +bat,-3.0 +batall,-3.0 +baz,-2.0 +bazofi,-4.0 +beb,2.0 +belic,-3.0 +bell,3.0 +bellac,-3.0 +bellez,3.0 +bendec,3.0 +bendicion,3.0 +bendit,2.0 +beneficent,2.0 +benefici,3.0 +beneficiari,3.0 +benevolent,2.0 +benign,3.0 +berr,-4.0 +berrinch,-3.0 +bes,2.0 +besador,3.0 +besti,-3.0 +besuc,3.0 +bien,2.0 +bienam,2.0 +bienaventur,2.0 +bienest,2.0 +bienhabl,2.0 +bienintencion,2.0 +biennac,2.0 +bienv,2.0 +bizarr,2.0 +bland,3.0 +bob,-2.0 +bochorn,-3.0 +bog,-4.0 +boludec,-3.0 +bonachon,2.0 +bond,2.0 +bonif,1.0 +bonit,3.0 +boquiabiert,-1.0 +boreal,-2.0 +borrasc,-4.0 +bot,0.0 +both,-1.0 +bram,-4.0 +brav,3.0 +bravat,3.0 +bravonel,3.0 +breg,-2.0 +bribon,-3.0 +brill,2.0 +brillant,3.0 +brillantez,3.0 +brinc,2.0 +brizn,-2.0 +brom,2.0 +bromist,3.0 +brot,2.0 +bruj,-1.0 +brut,-3.0 +brutal,-3.0 +brutaliz,-3.0 +buc,2.0 +buen,2.0 +bufon,-2.0 +buitr,-3.0 +bul,-3.0 +bullebull,2.0 +buqu,0.0 +burdel,-3.0 +buril,-3.0 +burl,-3.0 +burlador,-3.0 +burlesc,-3.0 +burlon,-3.0 +cañon,2.0 +cabal,2.0 +caballet,1.0 +caballit,0.0 +cabez,0.0 +cabron,-3.0 +cabroncet,-1.0 +caer,0.0 +caid,-3.0 +caimient,-1.0 +cal,1.0 +calam,-3.0 +calav,-3.0 +calent,1.0 +calibr,-2.0 +calient,1.0 +calm,1.0 +calmant,2.0 +calur,1.0 +cam,-2.0 +camorr,-1.0 +campeon,2.0 +camposant,-3.0 +canaliz,2.0 +cand,-2.0 +canij,-2.0 +cans,-3.0 +cansanci,-3.0 +caos,-2.0 +caprich,-2.0 +carñ,3.0 +caract,3.0 +caramel,2.0 +carcaj,2.0 +card,-3.0 +carec,-3.0 +carenci,-1.0 +carg,-1.0 +cari,-1.0 +cariñ,3.0 +carici,1.0 +cartel,0.0 +cascaj,-3.0 +cascarrabi,-2.0 +cast,1.0 +castig,-2.0 +casuch,-1.0 +catastrof,-1.0 +catet,-2.0 +caudill,-3.0 +caus,-3.0 +cautel,0.0 +cauteriz,-3.0 +cautiv,3.0 +ceñud,-3.0 +ced,-2.0 +cedaz,-2.0 +cel,-3.0 +celebr,3.0 +celest,2.0 +celestial,2.0 +cen,2.0 +censur,-2.0 +cerc,3.0 +cercion,-3.0 +cert,2.0 +chach,-4.0 +chanc,2.0 +chanz,2.0 +charact,1.0 +charl,-1.0 +charladur,-1.0 +charqu,-3.0 +chasc,-2.0 +chasqu,-3.0 +chev,2.0 +chifl,-3.0 +chil,2.0 +chill,-4.0 +chim,2.0 +chirl,-4.0 +chism,-1.0 +chismeador,0.0 +chismograf,-1.0 +chismorr,-1.0 +chist,1.0 +chiv,0.0 +chivat,-2.0 +choc,-3.0 +chocarr,-2.0 +choqu,-3.0 +chorr,-2.0 +chup,-2.0 +chupador,-2.0 +chupapoll,-2.0 +chupa-poll,-2.0 +chupi,3.0 +chupon,-2.0 +cicat,-3.0 +cicatriz,-4.0 +ciel,2.0 +ciert,2.0 +cifr,-2.0 +cincel,-3.0 +cinic,-2.0 +cinism,-2.0 +cinturon,2.0 +circunspect,-3.0 +cit,1.0 +civil,1.0 +clamor,4.0 +clandestin,-3.0 +clar,1.0 +clas,2.0 +clemenci,2.0 +clement,2.0 +cloqu,3.0 +coaccion,-2.0 +coart,-2.0 +cobard,-2.0 +coc,-3.0 +cocador,2.0 +coctel,-2.0 +codici,-3.0 +cofund,-1.0 +cog,-3.0 +cohib,-2.0 +coj,-3.0 +col,-2.0 +colador,-2.0 +color,1.0 +column,2.0 +colz,-4.0 +comadr,-1.0 +combat,-3.0 +combatient,-3.0 +combustion,-3.0 +comedi,1.0 +comic,1.0 +comod,1.0 +comodin,2.0 +compañ,2.0 +compadec,-3.0 +compadr,-1.0 +compart,1.0 +compasion,2.0 +competent,-3.0 +complac,3.0 +complacent,3.0 +complic,-2.0 +comprens,3.0 +comprension,2.0 +compresion,-4.0 +comprim,-3.0 +compromet,1.0 +compromis,1.0 +compulsion,-2.0 +compuncion,-2.0 +comput,-2.0 +conc,1.0 +concentr,1.0 +concert,2.0 +concesion,1.0 +concili,1.0 +concord,2.0 +concusion,-2.0 +cond,0.0 +condecor,2.0 +condenatori,-1.0 +condicion,-1.0 +condiment,-1.0 +conduc,2.0 +conf,2.0 +confi,2.0 +confiabil,2.0 +confiabiliadd,2.0 +confiabl,2.0 +confianz,2.0 +confident,2.0 +confirm,1.0 +confisc,2.0 +conflict,-3.0 +conform,-2.0 +confort,1.0 +confront,-3.0 +confrontacion,-3.0 +confund,-2.0 +confundidor,-2.0 +confus,-2.0 +confusedness,-2.0 +confusion,-2.0 +confut,-3.0 +congestion,1.0 +congoj,-3.0 +congratul,3.0 +conjetur,-2.0 +conjunt,2.0 +conjur,-1.0 +conmocion,-2.0 +conmov,1.0 +conmovedor,3.0 +conoc,2.0 +conquist,1.0 +cons,2.0 +consagr,3.0 +consegu,2.0 +consiguient,3.0 +consist,-3.0 +consistent,1.0 +consol,1.0 +constanci,2.0 +constern,-3.0 +constreñ,-2.0 +constrist,-4.0 +consuel,2.0 +consum,-2.0 +contend,-2.0 +contenidod,-2.0 +content,2.0 +contiend,-2.0 +contingent,-2.0 +contorsion,-2.0 +contr,-1.0 +contrab,-2.0 +contraband,-2.0 +contraccion,-3.0 +contradec,-2.0 +contradiccion,-2.0 +contradich,-2.0 +contradictori,-2.0 +contrari,-2.0 +contrasent,-2.0 +contrat,1.0 +contratiemp,-3.0 +contribu,2.0 +contrist,-2.0 +contumaci,-2.0 +contumaz,-2.0 +contundent,1.0 +contusion,-3.0 +conv,2.0 +convenient,2.0 +convincent,1.0 +coñaz,-2.0 +copi,-3.0 +coquet,2.0 +coraj,3.0 +cordial,2.0 +cornud,-3.0 +corr,-2.0 +corral,1.0 +correct,2.0 +correg,2.0 +correspond,2.0 +corret,2.0 +corrobor,1.0 +corromp,-2.0 +corrupcion,-2.0 +corrupt,-3.0 +corruption,-2.0 +cortej,4.0 +cost,2.0 +cotej,-3.0 +cotill,-1.0 +courag,3.0 +credul,-2.0 +creenci,2.0 +creibl,3.0 +cri,1.0 +crianz,1.0 +criatur,2.0 +crim,-4.0 +criminal,-4.0 +crisis,-4.0 +critic,-2.0 +crudez,-2.0 +cruel,-3.0 +crueld,-4.0 +cruelment,-3.0 +cuac,-2.0 +cubil,-3.0 +cuc,2.0 +cucharadit,-3.0 +cucharill,-3.0 +cucharit,-3.0 +cuest,2.0 +cuid,2.0 +cul,-3.0 +culp,-2.0 +culpabil,-4.0 +culpabl,-3.0 +cult,2.0 +cultiv,2.0 +culturiz,2.0 +cumpl,2.0 +cumpliment,2.0 +cumplimient,2.0 +cuot,1.0 +dañ,-3.0 +dañin,-2.0 +dadiv,2.0 +damnif,-1.0 +dar,1.0 +debil,-3.0 +debilit,-2.0 +debiluch,-3.0 +decadent,-1.0 +decepcion,-2.0 +decis,1.0 +decision,1.0 +decl,-2.0 +declin,-1.0 +decliv,2.0 +decor,1.0 +dedic,3.0 +defeccion,-1.0 +defect,-1.0 +defectu,-2.0 +defend,2.0 +defens,2.0 +defensor,2.0 +deficient,-2.0 +defin,1.0 +deflacion,-2.0 +deform,-3.0 +defraud,-3.0 +deg,-2.0 +degr,-2.0 +dej,-2.0 +dejadez,-1.0 +del,-1.0 +deleit,3.0 +delg,-2.0 +delic,3.0 +delici,3.0 +delincuent,-3.0 +delinqu,-3.0 +deliqui,-3.0 +delit,-2.0 +demand,-2.0 +demenci,-1.0 +dement,-1.0 +democraci,2.0 +demol,-3.0 +demoni,-1.0 +demoniac,-1.0 +demostr,2.0 +deneg,-2.0 +denod,-3.0 +denost,-3.0 +denuest,-3.0 +depend,-3.0 +deplor,-2.0 +deport,0.0 +deposicion,-2.0 +depositari,2.0 +depr,-4.0 +deprav,-3.0 +depravation,-2.0 +depreci,2.0 +depresion,-4.0 +deprevis,-4.0 +deprim,-4.0 +depriment,-4.0 +derech,-4.0 +derret,2.0 +derrot,-1.0 +des,2.0 +desabr,-3.0 +desacert,-2.0 +desafi,3.0 +desafil,-2.0 +desafortun,-3.0 +desagr,-3.0 +desagradec,-3.0 +desagravi,-2.0 +desahog,2.0 +desalent,-1.0 +desalient,-1.0 +desam,-3.0 +desamor,-3.0 +desamp,-2.0 +desanim,-1.0 +desaparec,-2.0 +desaprob,-1.0 +desarm,-3.0 +desarregl,-3.0 +desarroll,3.0 +desasoseg,-2.0 +desasosieg,-2.0 +desastr,-1.0 +desat,3.0 +desatend,-1.0 +desatornill,-3.0 +desazon,-3.0 +desbarat,-3.0 +desc,-3.0 +descaec,-1.0 +descans,3.0 +descarg,-3.0 +descart,-2.0 +descerebr,-2.0 +descompon,-1.0 +descomposicion,-1.0 +desconcert,-3.0 +desconciert,-3.0 +desconfi,-2.0 +desconsol,-3.0 +desconsuel,-2.0 +descontent,-2.0 +descorazon,-1.0 +descu,-1.0 +desdeñ,-1.0 +desdich,-3.0 +desech,-2.0 +desembaraz,1.0 +desempat,1.0 +desencant,-2.0 +desercion,-1.0 +desert,-1.0 +desertor,-1.0 +desesp,-4.0 +desesperanz,-4.0 +desestim,-2.0 +desfavor,-3.0 +desfavorec,-1.0 +desfigur,-4.0 +desg,-2.0 +desgarb,-3.0 +desgarr,-4.0 +desgobiern,-2.0 +desgraci,-3.0 +deshac,-1.0 +deshonr,-3.0 +desilusion,-2.0 +desinform,-2.0 +desl,2.0 +deslealt,2.0 +desliz,-2.0 +desluc,-2.0 +deslumbr,-2.0 +deslustr,-2.0 +desm,-2.0 +desmañ,-2.0 +desmay,-3.0 +desment,-2.0 +desnaturaliz,-2.0 +desobedec,-4.0 +desobedient,-1.0 +desocup,-1.0 +desord,-1.0 +desorient,-2.0 +desp,-3.0 +despabil,2.0 +despaci,2.0 +despech,-4.0 +despedaz,-3.0 +despeg,2.0 +despej,2.0 +despens,2.0 +desperdici,-3.0 +desperfect,-2.0 +despi,-1.0 +despic,-3.0 +despiert,2.0 +despiqu,-2.0 +desplom,-1.0 +despoj,-1.0 +despreci,-3.0 +desquit,-2.0 +destac,2.0 +destin,-2.0 +destitu,2.0 +destornill,-3.0 +destroz,-4.0 +destru,-3.0 +destruccion,-3.0 +destruct,-1.0 +destructor,-3.0 +destruibl,-3.0 +destruidor,-3.0 +desuell,-3.0 +desunion,-2.0 +desus,-1.0 +desvanec,-2.0 +desvel,-2.0 +desventaj,-3.0 +desventur,-3.0 +desvergüenz,-3.0 +desvergonz,-3.0 +det,-2.0 +detall,2.0 +deterior,-1.0 +detest,-4.0 +detriment,-3.0 +deud,-3.0 +deudor,2.0 +devast,-3.0 +devocion,3.0 +devolv,-3.0 +devot,3.0 +diabl,-1.0 +diablur,-1.0 +diabol,-1.0 +dich,3.0 +dicharach,2.0 +dient,3.0 +diestr,2.0 +dif,-1.0 +dificil,-2.0 +dificult,-1.0 +dign,2.0 +dignatari,2.0 +dignific,2.0 +dilat,-1.0 +dimit,-2.0 +dinam,1.0 +dinamit,1.0 +director,2.0 +discordi,-1.0 +discusion,-2.0 +discut,-2.0 +disension,-2.0 +disfraz,-2.0 +disfrut,3.0 +disgust,-3.0 +disip,-2.0 +disminu,-2.0 +disord,-2.0 +disp,-3.0 +disparat,-2.0 +displicent,-3.0 +disposicion,3.0 +dispuest,-2.0 +disput,-2.0 +distr,-1.0 +distraccion,-1.0 +distribu,1.0 +disturbi,-1.0 +distut,-2.0 +disu,-1.0 +div,0.0 +diversion,2.0 +divert,2.0 +dividend,1.0 +divin,2.0 +divis,2.0 +dol,-3.0 +dolient,-3.0 +dolor,-4.0 +domin,-3.0 +don,3.0 +dos,-2.0 +dramaturg,1.0 +drog,-3.0 +drogu,-3.0 +dron,-2.0 +dubit,-2.0 +dud,-2.0 +duel,-3.0 +duelist,-3.0 +dulc,2.0 +dulcement,2.0 +dulzur,3.0 +dur,-2.0 +durabl,2.0 +durez,-4.0 +echad,-3.0 +echar,-1.0 +echars,-3.0 +edif,2.0 +edredon,1.0 +educ,1.0 +efect,2.0 +eficaci,1.0 +eficaz,2.0 +egocentr,-3.0 +egoism,-4.0 +egoist,-4.0 +egot,-3.0 +eleg,2.0 +elev,2.0 +elogi,3.0 +embadurn,-2.0 +embaraz,-3.0 +embarg,-3.0 +embarr,-2.0 +embauc,-2.0 +embellec,3.0 +embest,-3.0 +embob,-1.0 +embot,-2.0 +embravec,-4.0 +embrom,-3.0 +embud,2.0 +embust,-3.0 +emocion,3.0 +emocional,-2.0 +empañ,-2.0 +empach,-3.0 +empalag,-3.0 +empeñ,1.0 +empeor,-3.0 +emple,1.0 +empobrec,-2.0 +emponzoñ,-3.0 +empres,2.0 +enamor,3.0 +enardec,-3.0 +encant,3.0 +encapot,-2.0 +encar,3.0 +encarec,2.0 +encariñ,1.0 +encerr,2.0 +encog,-3.0 +encoj,-3.0 +encoleriz,-4.0 +encomend,2.0 +encomi,3.0 +encontr,0.0 +encresp,-4.0 +endebl,-3.0 +endeblez,-2.0 +endiabl,-1.0 +endurec,-2.0 +enemig,-3.0 +enemist,-2.0 +energ,1.0 +energiz,1.0 +enfad,-3.0 +enfadadiz,-3.0 +enfasis,-2.0 +enfat,3.0 +enferm,-4.0 +enfermiz,-2.0 +enfervoriz,1.0 +enflaquec,-2.0 +enfrent,-3.0 +enfurec,-4.0 +engañ,-2.0 +engañabob,-3.0 +engorr,-1.0 +engran,1.0 +enlac,0.0 +enloquec,-1.0 +enmarañ,-3.0 +enmend,2.0 +enmiend,2.0 +enoj,-3.0 +enorgullec,2.0 +enorm,2.0 +enred,-3.0 +ensalz,3.0 +ensombrec,-4.0 +ensordec,-2.0 +ensuci,-3.0 +entend,2.0 +enter,2.0 +enterez,1.0 +enternec,3.0 +enternecedor,-3.0 +enterr,-3.0 +entid,0.0 +entontec,-2.0 +entorpec,-2.0 +entramp,-3.0 +entrecort,-2.0 +entreg,-2.0 +entret,2.0 +entreti,2.0 +entristec,-4.0 +entumec,-2.0 +enturbi,-2.0 +entusiasm,3.0 +entusiast,3.0 +enven,-3.0 +envi,0.0 +envidi,-3.0 +envilec,-2.0 +equilibr,2.0 +equivoc,-2.0 +erari,2.0 +errar,-3.0 +erron,-2.0 +error,-2.0 +escabull,-2.0 +escalofri,-4.0 +escampavi,3.0 +escandal,-3.0 +escandaliz,-3.0 +escap,-2.0 +escarnec,-3.0 +escarnecedor,-3.0 +escarni,-3.0 +escas,2.0 +escasez,-3.0 +escept,-2.0 +esceptic,-2.0 +esclav,-3.0 +escobaj,-4.0 +escoc,2.0 +escog,3.0 +escoll,2.0 +escolt,2.0 +escori,-3.0 +escozor,2.0 +escrit,3.0 +escrupul,-2.0 +escudriñ,1.0 +escultor,-3.0 +escurr,-2.0 +esencial,1.0 +esforz,3.0 +esfuerz,-2.0 +esguinc,-2.0 +esnob,-3.0 +espabil,2.0 +espant,-4.0 +espantaj,-4.0 +esparc,3.0 +espasm,-3.0 +especi,2.0 +especial,2.0 +especif,1.0 +espect,2.0 +espectacul,1.0 +especul,3.0 +espelezn,-4.0 +esper,2.0 +esperanz,2.0 +esperpent,-4.0 +espin,-3.0 +espionaj,2.0 +esplend,3.0 +esplendor,3.0 +esponsal,1.0 +esponsoriz,2.0 +espum,-3.0 +espuri,-3.0 +esquilm,-3.0 +esquiv,-3.0 +establ,2.0 +estaf,-3.0 +estamp,-1.0 +estetic,3.0 +estil,-2.0 +estim,2.0 +estimul,2.0 +estir,-2.0 +estiron,-2.0 +estirp,-2.0 +estol,-2.0 +estorb,-3.0 +estrag,-2.0 +estrambot,-1.0 +estravag,4.0 +estrech,-3.0 +estremec,4.0 +estres,-2.0 +estribill,-1.0 +estrop,-3.0 +estropaj,-2.0 +estruj,-3.0 +estup,-2.0 +estupend,3.0 +estupidec,-3.0 +estupidez,-2.0 +estupr,-4.0 +evacu,-2.0 +evas,-3.0 +exact,2.0 +exactitud,2.0 +exag,1.0 +exalt,2.0 +examin,1.0 +exasp,-3.0 +excelent,2.0 +excellent,3.0 +excentr,-3.0 +exces,2.0 +excit,3.0 +exclu,-1.0 +excrement,-2.0 +excus,4.0 +exhal,-3.0 +exhib,2.0 +exit,3.0 +exitaz,3.0 +explicit,3.0 +explot,3.0 +expoli,-4.0 +expres,1.0 +expuls,-2.0 +expulsion,-2.0 +extasi,4.0 +extasis,4.0 +extens,2.0 +extenu,-4.0 +extermin,-1.0 +extingu,-2.0 +extrañ,-2.0 +extravag,-2.0 +extravi,-2.0 +extrem,-2.0 +extrovert,1.0 +fabul,3.0 +fach,-3.0 +facil,1.0 +facilit,1.0 +faen,-3.0 +fall,-2.0 +fallec,-2.0 +fals,-2.0 +falsific,-2.0 +falt,-2.0 +fam,1.0 +fan,2.0 +fanat,-3.0 +fanfarron,3.0 +fant,3.0 +fantast,3.0 +fantastic,2.0 +farfull,-2.0 +fars,-3.0 +fascin,2.0 +fascist,-2.0 +fastidi,-3.0 +fatal,-3.0 +fatig,-3.0 +fatu,-2.0 +favor,2.0 +favorec,2.0 +favorecedor,2.0 +favorit,2.0 +fe,2.0 +feald,-3.0 +felic,3.0 +felicit,2.0 +feliz,2.0 +fenomenal,3.0 +feo,-3.0 +feroc,-2.0 +feroz,-3.0 +fertil,1.0 +festiv,1.0 +festival,1.0 +fet,-3.0 +fetal,-3.0 +feud,-2.0 +feudal,-2.0 +feudalist,-2.0 +feudist,-2.0 +fiador,1.0 +fianz,1.0 +fiars,2.0 +fiasc,-3.0 +ficcion,4.0 +fictici,-3.0 +fidedign,2.0 +fideicomis,2.0 +fideicomisari,2.0 +fidel,2.0 +fiel,2.0 +fielment,2.0 +fiest,1.0 +figur,3.0 +filtr,-2.0 +fin,2.0 +finez,2.0 +fing,-3.0 +firm,1.0 +firmement,2.0 +firmez,1.0 +flac,-2.0 +flam,-3.0 +flaquez,-2.0 +flexibil,1.0 +flexibl,3.0 +flip,-2.0 +flirt,2.0 +floj,-2.0 +flot,2.0 +fobi,-3.0 +foll,-3.0 +foment,2.0 +forcej,-2.0 +form,0.0 +formal,2.0 +forn,2.0 +fortalec,1.0 +fortalez,1.0 +fortific,1.0 +forz,-2.0 +forzud,1.0 +fosfor,2.0 +frac,-2.0 +fragant,2.0 +fragil,-2.0 +franc,2.0 +franquez,1.0 +fras,2.0 +fraud,-3.0 +fren,-1.0 +frenet,-1.0 +frent,1.0 +fresc,1.0 +fri,-3.0 +friald,-1.0 +frivol,-2.0 +fruicion,3.0 +frunc,-3.0 +frust,-1.0 +frustr,-3.0 +frustracion,-3.0 +frustrant,-3.0 +fueg,-3.0 +fuent,2.0 +fuert,1.0 +fuertement,1.0 +fuerz,1.0 +full,-3.0 +fumant,-4.0 +funcion,3.0 +fundament,2.0 +fundamental,1.0 +funest,-3.0 +furi,-4.0 +furibund,-4.0 +furor,-4.0 +furtiv,-2.0 +gal,4.0 +galant,3.0 +galardon,3.0 +gallard,2.0 +galop,-3.0 +gan,1.0 +ganabl,1.0 +ganador,1.0 +gananci,3.0 +ganch,3.0 +gans,-1.0 +garant,1.0 +garantiz,2.0 +garb,3.0 +garr,-1.0 +garrapat,-1.0 +garz,3.0 +gast,-2.0 +gat,-2.0 +gem,-3.0 +geni,3.0 +genial,2.0 +gentilez,2.0 +genuin,2.0 +gesticul,2.0 +gigantesc,2.0 +gilipoll,-1.0 +gilipollec,-3.0 +gimot,-3.0 +gir,-3.0 +glori,2.0 +glorif,2.0 +glorific,2.0 +glutin,-2.0 +goc,3.0 +gol,-3.0 +golosin,2.0 +golp,-3.0 +gom,2.0 +gordur,-2.0 +got,-2.0 +goz,3.0 +gozador,3.0 +grab,2.0 +grabador,-3.0 +graci,2.0 +graciabl,2.0 +gran,3.0 +grand,2.0 +grandez,2.0 +grandi,2.0 +granj,2.0 +grat,2.0 +gratif,2.0 +gratis,2.0 +gratitud,2.0 +gratuit,2.0 +grav,-3.0 +gravement,-3.0 +griet,-2.0 +grim,-3.0 +gris,-2.0 +grisac,-2.0 +grit,-4.0 +gros,-2.0 +gruñon,-2.0 +guap,2.0 +guard,3.0 +guardi,-3.0 +guay,3.0 +guerr,-3.0 +guij,-3.0 +gul,-3.0 +gust,3.0 +habil,2.0 +habit,0.0 +hacin,-3.0 +hack,-2.0 +had,-2.0 +halag,3.0 +hallaz,2.0 +hambr,-2.0 +hambrient,-2.0 +happy,3.0 +hart,-4.0 +hazañ,-3.0 +hazmerr,-2.0 +hechic,2.0 +hechiz,2.0 +hed,-3.0 +hediond,-3.0 +hediondez,-3.0 +hedor,-3.0 +helic,-3.0 +hend,-2.0 +her,-3.0 +herm,3.0 +hermosur,2.0 +herod,3.0 +heroic,3.0 +heroin,3.0 +heroism,3.0 +herv,-1.0 +hesit,-1.0 +hied,-3.0 +higi,2.0 +hijoput,-2.0 +hijodeput,-2.0 +hir,-3.0 +histeri,-2.0 +hocic,-3.0 +hombrecill,2.0 +hondon,-4.0 +honest,1.0 +honor,1.0 +honorari,1.0 +honorif,1.0 +honr,1.0 +honradez,1.0 +hormig,-3.0 +horrend,-4.0 +horribl,-4.0 +horripil,-4.0 +horror,-4.0 +horroriz,-4.0 +hostig,-3.0 +hostil,-3.0 +huell,2.0 +huev,-3.0 +huevon,-1.0 +huid,3.0 +humanitari,3.0 +humeant,-4.0 +humild,2.0 +humill,-4.0 +humor,3.0 +hurañ,-3.0 +hurr,3.0 +hurt,-2.0 +hurtadill,-2.0 +husmeador,-2.0 +ideal,2.0 +idiot,-3.0 +idolatr,2.0 +ignomini,-3.0 +ignor,-3.0 +ilegal,-2.0 +ilegitim,-3.0 +iles,2.0 +ilustr,3.0 +imbecil,-2.0 +impacient,-2.0 +impact,-3.0 +impec,2.0 +imped,-2.0 +impediment,-3.0 +impel,-3.0 +imper,3.0 +imperd,2.0 +imperfeccion,-1.0 +imperfect,-3.0 +imperici,-2.0 +impersonal,-1.0 +impertinent,-1.0 +impetu,-2.0 +implac,-3.0 +implic,-2.0 +imponent,2.0 +impopul,-3.0 +import,2.0 +importun,-4.0 +impos,-4.0 +impostor,-2.0 +impostur,-3.0 +impotent,-2.0 +impres,2.0 +impresion,2.0 +imprevist,-3.0 +imprim,2.0 +improb,4.0 +improvis,-2.0 +impudent,-3.0 +impuls,2.0 +inact,-2.0 +inadecu,-2.0 +incapac,-3.0 +incapacit,-3.0 +incapaz,-2.0 +incendi,-3.0 +incent,2.0 +incertidumbr,-1.0 +inciert,-1.0 +incomod,-2.0 +incompetent,-2.0 +incomplet,-2.0 +inconcluyent,-2.0 +inconfort,-3.0 +incongruent,-2.0 +inconst,-2.0 +incontrol,-2.0 +incorrect,-2.0 +incredul,-2.0 +increibl,3.0 +inculp,-2.0 +incult,-3.0 +incultur,-2.0 +incumpl,-1.0 +incur,-4.0 +indecent,-3.0 +indecis,-2.0 +indecision,-2.0 +indefens,-3.0 +indefension,-1.0 +indes,-3.0 +indi,-1.0 +indiferent,-2.0 +indigent,-2.0 +indign,-3.0 +indispuest,-3.0 +indol,3.0 +indubit,-2.0 +indud,2.0 +indulgent,3.0 +industri,-4.0 +ineficaci,-2.0 +ineficaz,-2.0 +inept,-3.0 +ineptitud,-2.0 +inesp,-1.0 +inest,-2.0 +inexor,-3.0 +inexplic,-2.0 +infal,1.0 +infaust,-3.0 +infel,-3.0 +infeliz,-2.0 +inferior,-2.0 +infernal,-3.0 +infidel,2.0 +infiel,2.0 +infiern,-2.0 +infim,-2.0 +inflam,-3.0 +inflex,-3.0 +influ,2.0 +influenci,-2.0 +influj,2.0 +inform,2.0 +infortun,-2.0 +infortuni,-3.0 +infraccion,-2.0 +infructu,-3.0 +ingeni,2.0 +ingobern,-2.0 +ingrat,-3.0 +inhabit,-3.0 +inherent,3.0 +inhib,-2.0 +inhibicion,-2.0 +inhibidor,-2.0 +inhibitori,-2.0 +inhospit,-3.0 +inhum,-3.0 +inicu,3.0 +injuri,-3.0 +injust,-2.0 +injustici,-2.0 +inmens,2.0 +inmoral,-3.0 +inmovil,-1.0 +inmun,2.0 +inmut,1.0 +innocu,2.0 +innum,-2.0 +inocent,2.0 +inofens,3.0 +inoportun,-3.0 +inquiet,-2.0 +inquietud,-2.0 +insatisfac,-2.0 +insatisfaccion,-2.0 +insatisfactori,-2.0 +insatisfech,-2.0 +insegur,-2.0 +insens,-2.0 +insensat,-2.0 +insensibil,-2.0 +insignif,-2.0 +insip,-2.0 +insolent,-3.0 +insomn,-2.0 +insomni,-2.0 +inspir,3.0 +instant,-2.0 +instig,3.0 +instru,2.0 +instruccion,2.0 +insuficient,-2.0 +insufr,-2.0 +insuls,-2.0 +insult,-3.0 +intach,-2.0 +intact,2.0 +integr,1.0 +intelect,2.0 +intelectual,2.0 +intelig,2.0 +inteligent,2.0 +inteligibil,2.0 +intensific,2.0 +inter,2.0 +intercambi,1.0 +intermision,-2.0 +interposicion,-2.0 +interpret,2.0 +interrump,-2.0 +interrumpibil,-2.0 +interrupcion,-2.0 +intim,-4.0 +intol,-2.0 +intrat,-3.0 +intrep,3.0 +intrepidez,2.0 +intuicion,2.0 +inund,-3.0 +inutil,-3.0 +invasion,-3.0 +ira,-4.0 +irracional,-3.0 +irreflex,-2.0 +irremedi,-2.0 +irresist,-3.0 +irresolu,-1.0 +irrisori,2.0 +irrit,-3.0 +ja,-1.0 +jac,-2.0 +jakemat,2.0 +jamelg,-2.0 +jied,-3.0 +joc,2.0 +jod,-3.0 +jorob,-1.0 +jorobon,-2.0 +jov,0.0 +jovial,3.0 +joystick,3.0 +jubil,3.0 +jueg,2.0 +jug,1.0 +jugarret,-2.0 +juguet,2.0 +jugueton,2.0 +juici,-2.0 +justif,-1.0 +justific,2.0 +juzg,-2.0 +ladron,-3.0 +lagrim,-3.0 +lambon,-2.0 +lament,-3.0 +langu,-2.0 +languag,4.0 +languidec,3.0 +lanud,-3.0 +lanz,-3.0 +lasciv,2.0 +lastim,-3.0 +lat,-2.0 +lax,3.0 +leal,2.0 +lealment,2.0 +lealt,2.0 +leavings,2.0 +lech,-2.0 +legitim,2.0 +leid,2.0 +len,3.0 +lent,-2.0 +lerd,-2.0 +letr,-2.0 +lev,2.0 +levant,-2.0 +lib,2.0 +liberal,2.0 +libert,1.0 +libr,2.0 +licit,3.0 +lid,-1.0 +lig,2.0 +ligerez,2.0 +limpiez,1.0 +linaj,-2.0 +lind,3.0 +lio,-3.0 +lisi,-3.0 +lisonj,2.0 +list,2.0 +listill,-1.0 +llant,-3.0 +llor,-3.0 +lloriqu,-3.0 +lloron,-3.0 +loa,3.0 +loabl,3.0 +loar,3.0 +lobreguez,-3.0 +loc,-3.0 +localiz,-1.0 +locur,-1.0 +logr,3.0 +luc,2.0 +luch,-2.0 +luchador,-3.0 +lucr,3.0 +lucrat,3.0 +lugubr,-3.0 +luj,1.0 +lumbr,-3.0 +lupul,2.0 +lustr,2.0 +lut,-3.0 +mad,-3.0 +madiador,1.0 +madrin,-1.0 +magnanim,1.0 +magnif,4.0 +magnificent,3.0 +maj,-2.0 +majaret,-2.0 +majestu,-3.0 +majigat,3.0 +mal,-3.0 +mald,-3.0 +maldec,-1.0 +maldicion,-1.0 +maldit,-1.0 +malef,-3.0 +malest,-2.0 +malevolent,-3.0 +malgast,-2.0 +malhechor,-3.0 +malhumor,-3.0 +malici,-3.0 +malign,-3.0 +malintencion,-3.0 +malogr,-2.0 +malolient,-3.0 +maltrat,-4.0 +malv,-3.0 +margin,-2.0 +mam,-2.0 +mananatial,2.0 +manceb,-3.0 +mand,-2.0 +manej,3.0 +maniac,-3.0 +maniat,-3.0 +manifest,-2.0 +manipul,1.0 +manometr,-2.0 +mant,2.0 +maquinill,2.0 +maravill,3.0 +marc,2.0 +marchit,-1.0 +marginal,-3.0 +maric,-2.0 +maricon,-2.0 +marr,-3.0 +masoqu,-3.0 +masoquist,-3.0 +mat,-2.0 +matador,-2.0 +matanz,-2.0 +maton,-2.0 +matoncet,-2.0 +matoncit,-2.0 +matut,-2.0 +maul,-2.0 +mec,2.0 +medr,2.0 +mejor,2.0 +melancol,-4.0 +melancoliz,-4.0 +mell,2.0 +melod,2.0 +men,-2.0 +mengu,-2.0 +menor,-1.0 +menoscab,-3.0 +menospreci,-1.0 +mens,-2.0 +ment,0.0 +mental,2.0 +mentecat,-2.0 +mentecatez,-2.0 +merc,2.0 +merec,2.0 +merit,2.0 +meritocraci,2.0 +meritocrat,2.0 +meritori,2.0 +mesur,-2.0 +metedor,-2.0 +mezquin,-3.0 +mied,-3.0 +mient,-3.0 +mierd,-2.0 +mimic,-3.0 +minimiz,1.0 +minor,-2.0 +minoritari,-2.0 +mis,-3.0 +miseri,-3.0 +misteri,-2.0 +mitig,2.0 +mod,2.0 +modest,-2.0 +mof,-3.0 +mofador,-3.0 +mol,3.0 +molest,-1.0 +molesti,-1.0 +moliend,-2.0 +molon,2.0 +moment,-3.0 +mon,2.0 +monstru,-2.0 +mor,-3.0 +moral,3.0 +mordaz,-3.0 +mordient,2.0 +mortal,-3.0 +mortif,-3.0 +mortific,-2.0 +mot,2.0 +mud,0.0 +mudabl,-2.0 +mudez,-1.0 +muec,-1.0 +muert,-2.0 +mug,-2.0 +mugr,-3.0 +mugrient,-3.0 +mult,3.0 +multitud,-2.0 +murmur,-3.0 +murri,-2.0 +mutil,-4.0 +nabin,-4.0 +nauseabund,-4.0 +naveg,3.0 +nebul,-2.0 +nec,-2.0 +necesit,0.0 +neci,-2.0 +neg,-2.0 +negligent,-1.0 +negoci,0.0 +nervi,-3.0 +neurot,-3.0 +nimi,-2.0 +nivel,2.0 +nobl,3.0 +nociv,-3.0 +northern,-2.0 +nostalg,-3.0 +nostalgi,-3.0 +notici,2.0 +nov,1.0 +novat,3.0 +novelesc,4.0 +novi,3.0 +noviazg,1.0 +nubl,-3.0 +nul,-3.0 +nutr,1.0 +obedient,2.0 +oblig,-1.0 +obra,1.0 +obscur,-3.0 +obscurec,-2.0 +obsequi,2.0 +obses,-3.0 +obsesion,-3.0 +obstacul,-2.0 +obstin,-3.0 +obstru,-2.0 +obten,2.0 +obtus,-2.0 +ocasion,1.0 +ocult,-2.0 +ocup,1.0 +odi,-4.0 +ofend,-3.0 +ofens,-3.0 +ofensor,-3.0 +ofert,3.0 +ofrec,3.0 +ofusc,-2.0 +ojiv,-3.0 +oler,-3.0 +olvid,-1.0 +omision,-2.0 +omit,-3.0 +onde,2.0 +ondul,2.0 +opac,-2.0 +opon,-2.0 +oportun,1.0 +oportunist,1.0 +oposicion,-3.0 +opres,-3.0 +opresion,-2.0 +oprim,-3.0 +oprobi,-3.0 +optim,1.0 +optimiz,1.0 +opulent,1.0 +oracion,3.0 +orden,2.0 +orgull,2.0 +orig,2.0 +original,1.0 +originari,1.0 +orin,2.0 +ornament,1.0 +osad,1.0 +oscul,3.0 +oscur,-2.0 +oscurec,-3.0 +otorg,1.0 +ovacion,2.0 +pacienci,2.0 +pacient,-4.0 +pacif,1.0 +padec,-4.0 +padrin,-1.0 +padrisim,2.0 +pag,2.0 +pal,0.0 +palanc,3.0 +pali,2.0 +palurd,-2.0 +panic,-3.0 +pantomim,-3.0 +papel,-2.0 +parais,2.0 +paraliz,-2.0 +paranoi,-3.0 +parcial,-3.0 +parej,2.0 +parl,-1.0 +parlot,-1.0 +parodi,-3.0 +parqu,1.0 +particip,1.0 +particul,-1.0 +partidari,3.0 +pasador,-2.0 +pasatiemp,2.0 +pasion,3.0 +pasiv,-3.0 +pasm,-1.0 +past,-1.0 +pasu,-1.0 +patach,3.0 +patet,-3.0 +pati,2.0 +patrañ,-3.0 +patrocin,2.0 +patrocini,2.0 +patron,2.0 +paus,2.0 +pavor,-4.0 +paz,1.0 +peñasc,-4.0 +pec,-3.0 +pech,-3.0 +peculi,-1.0 +peg,-2.0 +pel,-1.0 +peligr,-1.0 +pelm,-2.0 +pelmaz,-2.0 +pen,-3.0 +pendej,-3.0 +penetr,1.0 +penitent,-3.0 +pensat,-2.0 +penumbr,-3.0 +penuri,-1.0 +peor,-3.0 +pequeñez,-2.0 +perd,-2.0 +perdedor,-3.0 +perdicion,-2.0 +perdon,2.0 +perec,-2.0 +perez,-2.0 +perfeccion,2.0 +perfect,2.0 +perfectibil,2.0 +perfor,-2.0 +periquet,-2.0 +perit,2.0 +perjudic,-3.0 +perjudicial,-3.0 +perjuici,-3.0 +permit,0.0 +pernici,-3.0 +perplej,-1.0 +perr,-2.0 +persecu,-4.0 +perseguidor,-3.0 +persistent,-2.0 +person,0.0 +perspicaci,1.0 +perspicaz,1.0 +persu,1.0 +perturb,-1.0 +pervers,-2.0 +perverseness,-2.0 +perversion,-2.0 +pervert,-2.0 +pes,-2.0 +pesadill,-3.0 +pesadumbr,-4.0 +pesam,-2.0 +pesim,-3.0 +petard,-3.0 +petimetr,2.0 +petrif,-4.0 +petrific,-4.0 +petul,2.0 +pian,2.0 +pic,-3.0 +picadur,-3.0 +picaj,-3.0 +picant,2.0 +picor,-3.0 +picot,-1.0 +pied,-3.0 +piedr,2.0 +pierd,-2.0 +piez,1.0 +pilot,2.0 +pinch,-3.0 +pinchaz,-3.0 +pintur,-3.0 +pioj,-3.0 +piquet,-3.0 +pist,-3.0 +pizc,-2.0 +plañ,-3.0 +plac,3.0 +placent,3.0 +planch,3.0 +platud,2.0 +plaz,1.0 +plic,3.0 +plom,-2.0 +pobr,-3.0 +pobrez,-1.0 +pod,1.0 +podr,-3.0 +podredumbr,-1.0 +pol,3.0 +poll,-3.0 +polv,-2.0 +pomp,3.0 +pony,-2.0 +popul,3.0 +populariz,3.0 +pormet,2.0 +porrist,2.0 +pos,3.0 +posit,3.0 +positiv,3.0 +poz,2.0 +practic,2.0 +precalent,1.0 +precaucion,2.0 +precav,-3.0 +precept,-4.0 +preci,2.0 +precipit,-3.0 +precis,1.0 +predic,2.0 +predilect,2.0 +predispon,-3.0 +preestr,-2.0 +preferent,3.0 +prejudicial,-3.0 +prejuici,-3.0 +premi,2.0 +prend,2.0 +prensadur,-2.0 +preocup,-4.0 +prep,1.0 +prerrog,2.0 +pres,1.0 +present,1.0 +presion,-2.0 +presum,-2.0 +presuncion,-3.0 +presuntu,-3.0 +presuriz,-2.0 +prevalec,1.0 +prevencion,-3.0 +prim,1.0 +primari,3.0 +primit,1.0 +primor,2.0 +primordial,3.0 +principal,3.0 +pris,-2.0 +priv,0 +privacion,-1.0 +privilegi,0 +prob,0 +probabl,0 +problem,-1.0 +problemat,-2.0 +proc,-1.0 +produc,1.0 +product,1.0 +prof,-4.0 +profetiz,2.0 +profiterol,3.0 +profund,1.0 +progr,2.0 +prohib,-1.0 +prohibicion,-2.0 +prohibit,-1.0 +prom,2.0 +promet,2.0 +prometedor,2.0 +prominenc,2.0 +promiscu,2.0 +promisori,2.0 +promov,2.0 +pronost,2.0 +pronostic,2.0 +prontitud,1.0 +pronunci,1.0 +propens,1.0 +propon,3.0 +proposit,2.0 +propuest,3.0 +prosp,2.0 +prostitu,-3.0 +prostitut,-3.0 +proteccion,2.0 +protector,2.0 +proteg,2.0 +protest,-2.0 +prototip,1.0 +prov,2.0 +provech,3.0 +providencial,2.0 +provoc,-3.0 +prudent,2.0 +prueb,-2.0 +pua,-3.0 +puñet,-2.0 +puas,-1.0 +pudient,2.0 +pudor,1.0 +pudr,-1.0 +puerc,-2.0 +pulcr,1.0 +pulcritud,1.0 +puls,-4.0 +pundonor,-3.0 +punibl,-2.0 +puntur,-3.0 +punz,-3.0 +punzant,2.0 +punzon,-3.0 +pusilanim,-3.0 +put,-3.0 +puteri,-2.0 +quebr,-2.0 +quebrant,-1.0 +quej,-2.0 +quejic,-2.0 +quem,-3.0 +quer,3.0 +querell,-2.0 +queridit,2.0 +quiebr,-2.0 +quit,-4.0 +rabi,-4.0 +rabiet,-3.0 +radiant,2.0 +radical,-3.0 +radiomacut,-1.0 +raj,-1.0 +ranci,-3.0 +rap,2.0 +rapiñ,-4.0 +rapt,-4.0 +rar,-2.0 +rarez,-2.0 +rasg,-1.0 +rastr,-3.0 +rastrill,-3.0 +rat,0.0 +raz,-2.0 +razon,0.0 +reñ,-3.0 +reafirm,1.0 +real,3.0 +realist,2.0 +reasegur,2.0 +reb,-2.0 +rebaj,-2.0 +rebat,-2.0 +rebel,-2.0 +rebeld,-2.0 +rebelion,-2.0 +recat,1.0 +recaud,-2.0 +recel,-2.0 +rechaz,-2.0 +rechin,-3.0 +recient,1.0 +recompens,2.0 +reconfort,3.0 +recr,3.0 +recrudec,-4.0 +rectific,2.0 +rectitud,1.0 +recus,-2.0 +red,2.0 +reduc,-4.0 +refin,3.0 +reflexion,2.0 +reform,2.0 +reforz,1.0 +refuerz,2.0 +refunfuñ,-2.0 +regañ,-1.0 +regal,2.0 +regocij,3.0 +regordet,-1.0 +rehus,-2.0 +reir,2.0 +reirs,2.0 +rej,2.0 +relaj,3.0 +relev,2.0 +rem,-3.0 +remedi,2.0 +remis,2.0 +remision,2.0 +remit,1.0 +remont,2.0 +remord,-3.0 +remun,2.0 +renc,-3.0 +rencor,-4.0 +rend,-2.0 +rendimient,-2.0 +reneg,-2.0 +renombr,3.0 +rent,3.0 +rentabil,3.0 +rentabl,3.0 +renunci,-2.0 +reo,-2.0 +repart,1.0 +repartidor,1.0 +repentin,-3.0 +repr,-2.0 +reprend,-4.0 +represent,2.0 +represion,-2.0 +reprim,-2.0 +reprob,-2.0 +reproch,-2.0 +republic,2.0 +repudi,-2.0 +repugn,-4.0 +repuls,-2.0 +repulsion,-3.0 +repus,-1.0 +reput,1.0 +requebr,3.0 +res,-3.0 +resarc,2.0 +resent,-3.0 +reserv,-3.0 +resguard,2.0 +resign,-2.0 +resistent,-2.0 +resolu,2.0 +resolubil,2.0 +resolv,2.0 +resolvent,2.0 +respald,2.0 +respet,2.0 +respetu,-2.0 +resping,-3.0 +resplandecient,3.0 +resplandor,3.0 +respons,-3.0 +resuelt,1.0 +ret,-1.0 +reticul,2.0 +retorc,-3.0 +retoz,2.0 +retr,-2.0 +retruc,3.0 +retruqu,3.0 +reun,2.0 +rev,-2.0 +revaloriz,2.0 +reverenci,2.0 +reverent,1.0 +revuelt,-2.0 +rezong,-2.0 +rezongon,-2.0 +riñ,-2.0 +ric,1.0 +ridicul,-2.0 +ridiculez,-2.0 +ridiculiz,-2.0 +riend,3.0 +riesg,-2.0 +rig,-2.0 +rigidez,-2.0 +rigidiz,-2.0 +rigur,-2.0 +riquez,1.0 +ris,2.0 +risibl,2.0 +risill,3.0 +risit,3.0 +risot,2.0 +rival,-1.0 +roñ,-3.0 +rob,-2.0 +robust,1.0 +robustez,1.0 +rom,0.0 +romanc,4.0 +romant,4.0 +romantic,4.0 +romantiz,4.0 +romanz,4.0 +romp,2.0 +rompecabez,-3.0 +rompecorazon,-4.0 +rot,-1.0 +roz,3.0 +rubor,-3.0 +ruboriz,-3.0 +rud,-3.0 +rudez,-3.0 +rug,-4.0 +ruin,-2.0 +ruinacion,-2.0 +sabelotod,-1.0 +sabi,1.0 +sabidur,1.0 +sabihond,2.0 +sabr,2.0 +sac,3.0 +saci,-3.0 +sacrific,-3.0 +sacud,-2.0 +sahum,-3.0 +salari,2.0 +salient,1.0 +salud,0.0 +salv,2.0 +salvaguard,2.0 +salvaguardi,2.0 +salvaj,-3.0 +san,2.0 +sancion,-2.0 +sandez,-1.0 +sanguinari,-4.0 +santon,3.0 +sarcasm,-3.0 +sarcast,-3.0 +sat,1.0 +satisfac,2.0 +satisfaccion,3.0 +satisfact,2.0 +satisfactori,2.0 +satisfech,2.0 +saturron,3.0 +señal,2.0 +señori,1.0 +señorit,-3.0 +sec,2.0 +secret,-2.0 +secuestr,-3.0 +sedient,-2.0 +segu,1.0 +seguidor,2.0 +segur,2.0 +segurisim,1.0 +semej,3.0 +semejanz,3.0 +sencill,1.0 +sencillez,2.0 +sensat,1.0 +sensibil,3.0 +sensibl,3.0 +sent,2.0 +sentenci,-2.0 +sentimental,3.0 +sentimient,-3.0 +sep,-2.0 +septentrional,-2.0 +sepultur,-3.0 +serpient,-2.0 +serpoll,-2.0 +servidumbr,-1.0 +sev,-2.0 +sexy,3.0 +sharew,1.0 +shock,-3.0 +sient,-2.0 +sigil,-3.0 +silenci,-2.0 +silvestr,-3.0 +simil,3.0 +simpat,3.0 +simpatiz,1.0 +simpl,2.0 +simul,-1.0 +sinc,1.0 +singul,-1.0 +siniestr,-1.0 +sinsabor,-3.0 +sinsont,-3.0 +sinvergüenz,-4.0 +siti,-3.0 +soñolient,-2.0 +soberbi,2.0 +sobrecarg,-1.0 +sobrecog,-2.0 +sobrepuj,2.0 +sobresal,2.0 +sobresalt,-3.0 +sobri,-2.0 +sociabil,2.0 +sociabl,2.0 +social,0.0 +socorr,2.0 +sofoc,-2.0 +solaz,3.0 +solemn,2.0 +solicit,3.0 +solicitud,2.0 +solitari,-2.0 +solloz,-4.0 +solt,-4.0 +soltur,1.0 +solubl,2.0 +solucion,2.0 +solut,2.0 +sombr,-3.0 +sombri,-3.0 +son,0.0 +sonor,1.0 +sonr,3.0 +sonrient,3.0 +sonris,3.0 +sons,-2.0 +sopap,-4.0 +sopl,1.0 +soplagait,-2.0 +soplon,-2.0 +soport,2.0 +sord,-2.0 +sorpr,1.0 +sorprend,1.0 +sorprendent,1.0 +sos,-2.0 +soseg,2.0 +sospech,-2.0 +sost,2.0 +sostenedor,2.0 +sostenient,2.0 +stress,-2.0 +suav,2.0 +suavement,3.0 +suaviz,1.0 +sub,2.0 +subaltern,-2.0 +subit,-3.0 +sublev,-2.0 +sublim,2.0 +subnormal,-4.0 +subordin,-2.0 +subordinat,-2.0 +subray,-2.0 +subreptici,-3.0 +subsiguient,3.0 +subsistent,2.0 +suc,3.0 +succion,-2.0 +sucesion,3.0 +sucesor,3.0 +suci,-3.0 +suculent,1.0 +sudac,-4.0 +suert,3.0 +suficient,2.0 +sufr,-4.0 +sufridor,-4.0 +sufrimient,-3.0 +sug,3.0 +sum,3.0 +sumis,-2.0 +sumision,-2.0 +suntu,3.0 +sup,2.0 +superintendent,3.0 +superior,3.0 +suplementari,2.0 +suprem,3.0 +supremac,3.0 +supresion,-2.0 +suprim,-2.0 +suscit,3.0 +susp,-4.0 +suspend,-2.0 +suspens,-2.0 +suspicaci,-2.0 +sust,-4.0 +sustent,2.0 +sustentacul,2.0 +sutil,1.0 +sutilez,2.0 +tañ,2.0 +tacañ,-3.0 +tach,-1.0 +taj,-2.0 +tajant,-3.0 +taladr,-2.0 +talent,2.0 +tard,-2.0 +tartamud,-2.0 +tas,3.0 +tasador,3.0 +tasaj,-3.0 +teatr,1.0 +tedi,-4.0 +telon,2.0 +tembl,-3.0 +temblant,-3.0 +temblor,-2.0 +temerari,-2.0 +temibl,-4.0 +temor,-3.0 +temp,-1.0 +temperament,-1.0 +templ,1.0 +tenac,1.0 +tenaz,2.0 +tenebr,-3.0 +tens,-3.0 +tension,-3.0 +teolog,2.0 +terc,-3.0 +tergivers,-2.0 +termin,1.0 +tern,-1.0 +ternur,3.0 +terqu,-2.0 +terribil,-4.0 +terribl,-4.0 +terror,-3.0 +terroriz,-4.0 +tertuli,1.0 +tes,-3.0 +tesor,2.0 +tetric,-3.0 +tibi,1.0 +tiembl,-3.0 +tiern,3.0 +tierr,-2.0 +ties,-3.0 +tim,-3.0 +timidez,-3.0 +tiniebl,-3.0 +tioviv,2.0 +tir,-3.0 +tirabuzon,-3.0 +tirant,-3.0 +tirantez,-3.0 +tiron,-1.0 +titub,-1.0 +titul,1.0 +tizn,-3.0 +tol,2.0 +tom,-3.0 +ton,-2.0 +tonif,2.0 +tont,-2.0 +toquet,1.0 +torc,-3.0 +torcedur,-2.0 +torcimient,-3.0 +torment,-4.0 +tornill,-3.0 +torniquet,-3.0 +torp,-2.0 +torpement,-2.0 +torpez,-2.0 +tortur,-4.0 +tosc,-2.0 +tozud,1.0 +tragedi,-3.0 +tragic,-3.0 +traidor,-3.0 +traj,-3.0 +tramp,-3.0 +trampist,-3.0 +tranquil,2.0 +tranquiliz,2.0 +transgresion,-3.0 +transgresor,-3.0 +trapac,-3.0 +traston,-3.0 +trastorn,-3.0 +traum,-4.0 +traumat,-4.0 +traumatiz,-4.0 +trav,2.0 +tremend,0.0 +tremul,-3.0 +trill,-3.0 +trin,-2.0 +trist,-3.0 +tristement,-3.0 +tristez,-3.0 +triunf,3.0 +triunfal,3.0 +triunfant,3.0 +trivial,-2.0 +trivializ,-2.0 +tropel,-3.0 +truc,-2.0 +trucaj,-2.0 +truh,-2.0 +tub,-2.0 +tumb,-3.0 +tumor,2.0 +tumult,-3.0 +turb,-3.0 +turbacion,-1.0 +turbi,-1.0 +turbulent,-2.0 +ultraj,-3.0 +uniform,2.0 +unir,1.0 +unmoral,2.0 +urgenci,-2.0 +usur,-3.0 +util,3.0 +vacacion,1.0 +vacant,-1.0 +vaci,-1.0 +vaciador,-1.0 +vacil,-1.0 +vacu,-1.0 +vagabund,-2.0 +vah,-3.0 +val,2.0 +vali,2.0 +validez,1.0 +valient,3.0 +valor,2.0 +valu,3.0 +valvul,2.0 +van,-3.0 +vapor,-3.0 +vapul,-2.0 +vast,2.0 +ved,-2.0 +vehement,-4.0 +vejacion,-2.0 +vejez,2.0 +venc,-1.0 +vencedor,1.0 +vencimient,-1.0 +veng,-2.0 +venganz,-2.0 +vengat,-2.0 +ventaj,3.0 +verac,2.0 +veraz,2.0 +verd,2.0 +verg,-3.0 +vergüenz,-1.0 +vergonz,-3.0 +verj,2.0 +verosimil,3.0 +vers,3.0 +vert,-1.0 +vibr,-3.0 +vibracion,-2.0 +vici,-2.0 +victim,-3.0 +victimiz,-3.0 +victori,3.0 +vidri,-3.0 +viej,-1.0 +vigor,1.0 +vigoriz,2.0 +vil,-2.0 +vilez,-3.0 +vill,-2.0 +vilment,-2.0 +vindic,-1.0 +viol,-4.0 +violacion,-4.0 +violador,-4.0 +violenci,-3.0 +violent,-3.0 +virtu,3.0 +virtud,3.0 +virulent,-3.0 +visc,-2.0 +vision,-2.0 +vist,1.0 +vital,1.0 +vitaliz,1.0 +vitor,2.0 +vitup,-2.0 +viv,2.0 +vivac,2.0 +vivarach,2.0 +vivaz,2.0 +vivez,1.0 +viviend,-1.0 +voc,-4.0 +vol,-3.0 +volc,-3.0 +voltag,-3.0 +volunt,1.0 +volv,2.0 +vomit,-3.0 +vorac,-3.0 +voraz,-3.0 +vot,1.0 +vuel,2.0 +vuelc,-3.0 +vuelt,-3.0 +vulg,-2.0 +vuln,-3.0 +yac,-1.0 +yonki,-2.0 +yerr,-2.0 +zafi,-2.0 +zonz,-2.0 +zopenc,-2.0 +zorr,-2.0 +zozobr,2.0 +zurr,1.0 \ No newline at end of file diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 From 1bd8280d901696ae3fd5ad6c40d30ec97d12e939 Mon Sep 17 00:00:00 2001 From: FernanOrtega Date: Mon, 9 Mar 2020 19:29:50 +0100 Subject: [PATCH 2/4] Added stemming from snowballstemmer package. Fixed some implementation problems to the algorithm. --- requirements.txt | 3 +- sentimentanalysis/analizer.py | 142 +++++++++++------- sentimentanalysis/api.py | 6 +- sentimentanalysis/dataloader.py | 2 +- sentimentanalysis/resources/es/boosters.csv | 6 +- sentimentanalysis/resources/es/negations.csv | 12 +- .../resources/es/sentiment_words.csv | 1 + 7 files changed, 103 insertions(+), 69 deletions(-) diff --git a/requirements.txt b/requirements.txt index 81135e4..22ee1a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ SpaCy==2.2.3 Flask==1.1.1 gunicorn==20.0.4 -numpy==1.18.1 \ No newline at end of file +numpy==1.18.1 +snowballstemmer==2.0.0 \ No newline at end of file diff --git a/sentimentanalysis/analizer.py b/sentimentanalysis/analizer.py index cbb1448..d08557c 100644 --- a/sentimentanalysis/analizer.py +++ b/sentimentanalysis/analizer.py @@ -1,5 +1,6 @@ from typing import Dict +import snowballstemmer import spacy from spacy.tokens.doc import Doc @@ -10,65 +11,24 @@ from sentimentanalysis.dataloader import load_dict -class SentimentAnalysis: - def __init__(self, language: str = "es"): - self.__sentiment_words = load_dict(language, "sentiment_words.csv") - self.__boosters = load_dict(language, "boosters.csv") - self.__negations = load_dict(language, "negations.csv") - self.__nlp = spacy.load("es_core_news_sm") - Span.set_extension("sentiment_weight", default=0.0, force=True) - Span.set_extension("negation_weight", default=0.0, force=True) - Span.set_extension("booster_weight", default=0.0, force=True) - Token.set_extension("sentiment_weight", default=0.0, force=True) - Token.set_extension("negation_weight", default=0.0, force=True) - Token.set_extension("booster_weight", default=0.0, force=True) +class SentimentAnalysis(object): + def __init__(self, language="es"): + self.__nlp = spacy.load("es_core_news_md") + stemmer = StemmerPipe(language) + annotator = SentimentAnnotatorPipe(language) + + self.__nlp.add_pipe(stemmer) + self.__nlp.add_pipe(annotator) - def get_sentiment(self, text: str) -> Dict: + def compute_sentiment(self, text: str, language="es") -> Dict: result = {} doc = self.__nlp(text) - self.__annotate_sentiment_words(doc) - self.__annotate_negations_and_boosters(doc) - # map(lambda sent: self.__annotate_doc(sent), [sent for sent in doc.sents]) result["per_sentence_sentiment"] = self.__compute_per_sentence_sentiment(doc) result["global_sentiment"] = self.__compute_global_sentiment(doc) return result - def __annotate_sentiment_words(self, doc: Doc) -> None: - for token in doc: - if token.pos_ == "ADJ" and not token.is_stop: - sentiment_weight = self.__sentiment_words.get(token.lemma_, 0.0) - if sentiment_weight != 0.0: - token._.booster_weight = self.__get_self_boosters(token) - - def __annotate_negations_and_boosters(self, doc: Doc) -> None: - for sentence in doc.sents: - for i, token in enumerate(sentence): - if token in self.__negations: - influenced_token = self.__get_influenced_token(sentence, i) - if influenced_token: - influenced_token._.negation_weight = self.__negations.get(token) * -1 - elif token in self.__boosters: - influenced_token = self.__get_influenced_token(sentence, i) - if influenced_token: - influenced_token._.booster_weight += self.__boosters.get(token) - - def __get_influenced_token(self, sentence: Span, influencer_index: int) -> Token: - - result = None - for i in range(1, len(sentence)): - for j in [-1, 1]: - candidate_index = influencer_index + i * j - if 0 <= candidate_index < len(sentence): - candidate = sentence[candidate_index] - - if candidate._.sentiment_weight != 0.0: - result = candidate - break - - return result - def __compute_per_sentence_sentiment(self, doc: Doc) -> Dict: result = {} @@ -107,11 +67,85 @@ def __compute_global_sentiment(self, doc: Doc) -> float: return max_score + min_score + +class SentimentAnnotatorPipe(object): + def __init__(self, language: str = "es"): + self.__sentiment_words = load_dict(language, "sentiment_words.csv") + self.__boosters = load_dict(language, "boosters.csv") + self.__negations = load_dict(language, "negations.csv") + Span.set_extension("sentiment_weight", default=0.0, force=True) + Token.set_extension("sentiment_weight", default=0.0, force=True) + Token.set_extension("negation_weight", default=1.0, force=True) + Token.set_extension("booster_weight", default=0.0, force=True) + + def __call__(self, doc: Doc) -> Doc: + self.__annotate_sentiment_words(doc) + self.__annotate_negations_and_boosters(doc) + + return doc + + def __annotate_sentiment_words(self, doc: Doc) -> None: + for token in doc: + if token.pos_ == "ADJ" and not token.is_stop: + sentiment_weight = self.__sentiment_words.get(token._.stem, 0.0) + if sentiment_weight != 0.0: + token._.booster_weight = self.__get_self_boosters(token) + token._.sentiment_weight = sentiment_weight + + def __annotate_negations_and_boosters(self, doc: Doc) -> None: + for sentence in doc.sents: + for i, token in enumerate(sentence): + if token in self.__negations: + influenced_token = self.__get_influenced_token(sentence, i) + if influenced_token: + influenced_token._.negation_weight = ( + self.__negations.get(token) * -1 + ) + elif token in self.__boosters: + influenced_token = self.__get_influenced_token(sentence, i) + if influenced_token: + influenced_token._.booster_weight += self.__boosters.get(token) + + def __get_influenced_token(self, sentence: Span, influencer_index: int) -> Token: + + result = None + for i in range(1, len(sentence)): + for j in [-1, 1]: + candidate_index = influencer_index + i * j + if 0 <= candidate_index < len(sentence): + candidate = sentence[candidate_index] + + if candidate._.sentiment_weight != 0.0: + result = candidate + break + + return result + def __get_self_boosters(self, token: Token) -> float: - return 1.0 if (token.shape_.count("X") / len(token)) > 0.8 or self.max_rep_letters(token) >= 3 else 0.0 + return ( + 1.0 + if (token.shape_.count("X") / len(token)) > 0.8 + or self.__max_rep_letters(token) >= 3 + else 0.0 + ) - def max_rep_letters(self, token): + def __max_rep_letters(self, token: Token) -> int: + + return sorted( + [(letter, len(list(group))) for letter, group in groupby(token.lower_)], + key=lambda i: i[1], + reverse=True, + )[0][1] + + +class StemmerPipe(object): + def __init__(self, language="es"): + self.__stemmer = snowballstemmer.stemmer("spanish") + Token.set_extension("stem", default="") + + def __call__(self, doc: Doc) -> Doc: + for token in doc: + token._.stem = self.__stemmer.stemWord(token.lemma_) - return sorted([(letter, len(list(group))) for letter, group in groupby(token)], key=lambda i: i[1], - reverse=True)[0][1] + return doc diff --git a/sentimentanalysis/api.py b/sentimentanalysis/api.py index ac96266..d962c3b 100644 --- a/sentimentanalysis/api.py +++ b/sentimentanalysis/api.py @@ -4,11 +4,9 @@ def get_response(body, status=200): - json_body = { - ("value" if status == 200 else "error"): body - } + json_body = {("value" if status == 200 else "error"): body} - return Response(json.dumps(json_body), status, mimetype='application/json') + return Response(json.dumps(json_body), status, mimetype="application/json") def handle_method_not_allowed(): diff --git a/sentimentanalysis/dataloader.py b/sentimentanalysis/dataloader.py index 4c7e79c..1783bb8 100644 --- a/sentimentanalysis/dataloader.py +++ b/sentimentanalysis/dataloader.py @@ -9,7 +9,7 @@ def load_dict(language: str, file_name: str) -> Dict: with open(os.path.join(BASE_URL, language, file_name)) as csvfile: csv_reader = csv.reader(csvfile) - result = {row[0]: row[1] for row in csv_reader} + result = {row[0]: float(row[1]) for row in csv_reader} return result diff --git a/sentimentanalysis/resources/es/boosters.csv b/sentimentanalysis/resources/es/boosters.csv index 954170e..719763b 100644 --- a/sentimentanalysis/resources/es/boosters.csv +++ b/sentimentanalysis/resources/es/boosters.csv @@ -1,6 +1,6 @@ muy,1.0 -mucho,1.0 -bastante,1.0 -demasiado,1.0 +much,1.0 +bastant,1.0 +demasi,1.0 mas,1.0 gran,1.0 \ No newline at end of file diff --git a/sentimentanalysis/resources/es/negations.csv b/sentimentanalysis/resources/es/negations.csv index f060a70..d65a88d 100644 --- a/sentimentanalysis/resources/es/negations.csv +++ b/sentimentanalysis/resources/es/negations.csv @@ -1,8 +1,8 @@ -nunca,1.0 -jamás,1.0 +nunc,1.0 +jamas,1.0 no,1.0 -poco,1.0 +poc,1.0 sin,1.0 -sin,embargo,1.0 -nada,de,1.0 -no significa que,1.0 \ No newline at end of file +sin embarg,1.0 +nad de,1.0 +no signif que,1.0 \ No newline at end of file diff --git a/sentimentanalysis/resources/es/sentiment_words.csv b/sentimentanalysis/resources/es/sentiment_words.csv index c661c52..8bf2c52 100644 --- a/sentimentanalysis/resources/es/sentiment_words.csv +++ b/sentimentanalysis/resources/es/sentiment_words.csv @@ -1939,6 +1939,7 @@ nec,-2.0 necesit,0.0 neci,-2.0 neg,-2.0 +negat,-2.0 negligent,-1.0 negoci,0.0 nervi,-3.0 From 9cdaad5bfebcf02e07a62f02431f074298ead114 Mon Sep 17 00:00:00 2001 From: FernanOrtega Date: Thu, 12 Mar 2020 16:47:38 +0100 Subject: [PATCH 3/4] SentenceAnalysis now results raw sentences in results. Complete API integration with the SentimentAnalysis code. --- sentimentanalysis/analizer.py | 2 +- sentimentanalysis/api.py | 30 +++++++++++++++++------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/sentimentanalysis/analizer.py b/sentimentanalysis/analizer.py index d08557c..2e1666f 100644 --- a/sentimentanalysis/analizer.py +++ b/sentimentanalysis/analizer.py @@ -50,7 +50,7 @@ def __compute_per_sentence_sentiment(self, doc: Doc) -> Dict: sentence_score = max_score + min_score sent._.sentiment_weight = sentence_score - result[i] = sentence_score + result[str(sent)] = sentence_score return result diff --git a/sentimentanalysis/api.py b/sentimentanalysis/api.py index d962c3b..4e5c65a 100644 --- a/sentimentanalysis/api.py +++ b/sentimentanalysis/api.py @@ -1,22 +1,20 @@ import json +from typing import Union + from flask import Flask, request, Response from werkzeug.exceptions import HTTPException, InternalServerError - -def get_response(body, status=200): - json_body = {("value" if status == 200 else "error"): body} - - return Response(json.dumps(json_body), status, mimetype="application/json") +from sentimentanalysis.analizer import SentimentAnalysis -def handle_method_not_allowed(): - message = "The method is not allowed for the requested URL." - status_code = 405 +def get_response(body: Union[str, dict], status: int = 200, message_as_json: bool=False): + json_body = {("result" if status == 200 else "error"): body} - return get_response(message, status_code) + return Response(json.dumps(json_body), status, mimetype="application/json") app = Flask(__name__) +sent_analysis = SentimentAnalysis() @app.errorhandler(Exception) @@ -46,10 +44,16 @@ def get_sentiment_analysis(): message = "Incorrect mimetype, must be 'application/json'." status_code = 415 else: - message = "Ok" - status_code = 200 - - return get_response(message, status=status_code) + request_body = request.get_json() + if "text" not in request_body: + message = "'text' attribute not present in request body" + status_code = 422 + else: + text = request_body["text"] + status_code = 200 + message = sent_analysis.compute_sentiment(text) + + return get_response(message, status_code, message_as_json=True) @app.route("/") From d45ff7fb834cb518a33b4e9a90448289726d469e Mon Sep 17 00:00:00 2001 From: FernanOrtega Date: Thu, 12 Mar 2020 16:50:18 +0100 Subject: [PATCH 4/4] Black formatting. --- sentimentanalysis/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentimentanalysis/api.py b/sentimentanalysis/api.py index 4e5c65a..1900cc2 100644 --- a/sentimentanalysis/api.py +++ b/sentimentanalysis/api.py @@ -7,7 +7,7 @@ from sentimentanalysis.analizer import SentimentAnalysis -def get_response(body: Union[str, dict], status: int = 200, message_as_json: bool=False): +def get_response(body: Union[str, dict], status: int = 200): json_body = {("result" if status == 200 else "error"): body} return Response(json.dumps(json_body), status, mimetype="application/json")