Skip to content

Commit

Permalink
Merge pull request #46 from olikelly00/main
Browse files Browse the repository at this point in the history
making hamrony multilingual - Team Cheemu
  • Loading branch information
woodthom2 committed Jun 5, 2024
2 parents f8b4482 + 62be37a commit 7a32d86
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 4 deletions.
99 changes: 96 additions & 3 deletions src/harmony/matching/negator.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,13 @@ def get_change_en(doc) -> dict:
if tok.text.lower() in {"always", "rather", "really", "very", "totally", "utterly", "absolutely", "completely",
"frequently", "often", "sometimes", "generally", "usually"}:
return {tok.i: ("replace", "never")}
# Team Cheemu: added these if statements to handle negative contractions (eg. can't, won't, shan't)
if tok.text.lower() == "ca" and doc[tok.i + 1].text.lower() == "n't":
return {tok.i: ("replace", "can"), tok.i + 1: ("replace", "")}
if tok.text.lower() == "wo" and doc[tok.i + 1].text.lower() == "n't":
return {tok.i: ("replace", "will"), tok.i + 1: ("replace", "")}
if tok.text.lower() == "sha" and doc[tok.i + 1].text.lower() == "n't":
return {tok.i: ("replace", "shall"), tok.i + 1: ("replace", "")}
if tok.text.lower() in {"never", "not", "n't"}:
return {tok.i: ("replace", "")}
if tok.text.lower() in {"cannot"}:
Expand Down Expand Up @@ -103,20 +110,106 @@ def get_change_fr(doc) -> dict:
return negate_french_sentence(doc)


def get_change_es(doc) -> dict:
"""
# Team Cheemu: Identify how to change a Spanish sentence from positive to negative or vice versa.
:param doc:
:return:
"""
for tok in doc:
if tok.text.lower() in {"siempre", "bastante", "realmente", "muy", "mucho", "totalmente", "totalmente", "absolutamente",
"completamente",
"frecuentemente", "frequentemente", "veces"}:
return {tok.i: ("replace", "nunca")}
if tok.text.lower() in {"nunca", "jamás", "ni", "no"}:
return {tok.i: ("replace", "")}
result = {}
if len(result) > 0:
return result
return {0: ("insert_before", "no")}



def get_change_it(doc) -> dict:
"""
# Team Cheemu: Identify how to change an Italian sentence from positive to negative or vice versa.
:param doc:
:return:
"""
for tok in doc:
if tok.text.lower() in {"sempre", "abbastanza", "realmente", "davvero", "veramente", "molto", "molta", "molti", "molte", "totalmente", "assolutamente",
"completamente",
"frequentemente", "qualche volta", "a volte", "ogni tanto"}:
return {tok.i: ("replace", "mai")}
if tok.text.lower() in {"mai", "né", "non", "nessuno", "nulla", "niente"}:
return {tok.i: ("replace", "")}
result = {}
for tok in doc:
if tok.text.lower() in {"è", "sono", "ero", "erano", "avevano", "avevo", "ho avuto", "sono stato", "sono stata", "sono stati", "siamo stati", "sono state"}:
result[tok.i] = "insert_before", "non"
if len(result) > 0:
return result
return {0: ("insert_before", "non")}

def get_change_de(doc) -> dict:
"""
# Team Cheemu: Identify how to change a German sentence from positive to negative or vice versa.
:param doc:
:return:
"""
for tok in doc:
if tok.text.lower() in {"immer", "ziemlich", "wirklich", "sehr", "viel", "total", "absolut",
"vollständig",
"häufig", "manchmal"}:
return {tok.i: ("replace", "nie")}
if tok.text.lower() in {"nie", "niemals", "weder", "nicht"}:
return {tok.i: ("replace", "")}
result = {}
if len(result) > 0:
return result
return {0: ("insert_before", "nicht")}
# if we had time: add functionality to handle german word order using Spacy


def get_change_fr(doc) -> dict:
"""
# Team Cheemu: Identify how to change a French sentence from positive to negative or vice versa.
:param doc:
:return:
"""
for tok in doc:
if tok.text.lower() in {"toujours", "assez", "vraiment", "très", "beaucoup de", "totalement", "absolumment",
"complètement", "plus", "trop de", "plein de",
"souvent", "de temps en temps"}:
return {tok.i: ("replace", "nie")}
if tok.text.lower() in {"personne", "jamais", "ni", "rien", "pas", "non", "ne", "n'", "nulle", "aucun", "aucune", "guère"}:
return {tok.i: ("replace", "")}
result = {}
if len(result) > 0:
return result
return {0: ("insert_before", "ne pas")}

def negate(text: str, language: str) -> str:
"""
Converts negative sentences to pos and vice versa.
Converts negative sentences to positive and vice versa.
Not meant to generate 100% accurate natural language, it's to go into transformer model and is not shown to a human.
:param text:
:param language: "en" or "pt"
:param language:
"en" for English, "pt" for Portuguese, "es" for Spanish, "it" for Italian, "de" for German, "fr" for French.
:return: the sentence negated
"""
doc = nlp(text)

if language == "pt":
changes = get_change_pt(doc)
elif language == "es":
changes = get_change_es(doc)
elif language == "it":
changes = get_change_it(doc)
elif language == "fr":
return get_change_fr(text)
changes = get_change_fr(doc)
elif language == "de":
changes = get_change_de(doc)
else:
changes = get_change_en(doc)

Expand Down
41 changes: 40 additions & 1 deletion tests/test_negator.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,55 @@ class TestNegation(unittest.TestCase):

def test_simple_example(self):
text = "I never feel depressed"
print(negate(text, "en"))
self.assertEqual("I feel depressed", negate(text, "en"))

def test_simple_example_neg(self):
text = "I feel depressed"
print(negate(text, "en"))
self.assertEqual("never I feel depressed", negate(text, "en"))

def test_verb_can_negation_en(self):
text = "I can't feel happy"
self.assertEqual("I can feel happy", negate(text, "en"))

def test_verb_will_negation_en(self):
text = "I won't feel happy"
self.assertEqual("I will feel happy", negate(text, "en"))

def test_verb_shall_negation_en(self):
text = "I shan't feel happy"
self.assertEqual("I shall feel happy", negate(text, "en"))

def test_simple_example_pt(self):
text = "eu me sinto deprimido"
self.assertEqual("não eu me sinto deprimido", negate(text, "pt"))

def test_simple_example_pt_neg(self):
text = "não eu me sinto deprimido"
self.assertEqual(" eu me sinto deprimido", negate(text, "pt"))
def test_simple_example_es(self):
text = "mi siento deprimido"
self.assertEqual("no mi siento deprimido", negate(text, "es"))

def test_simple_example_de(self):
text = "Ich fühle mich nicht deprimiert"
self.assertEqual("Ich fühle mich deprimiert", negate(text, "de"))

def test_simple_example_de_neg(self):
text = "Ich fühle mich deprimiert"
self.assertEqual("nicht Ich fühle mich deprimiert", negate(text, "de"))

def test_simple_example_it(self):
text = "mi sento depresso"
self.assertEqual("non mi sento depresso", negate(text, "it"))

def test_simple_example_fr(self):
text = "je me sens deprimé"
self.assertEqual("ne pas je me sens deprimé", negate(text, "fr"))
def test_simple_example_fr(self):
text = "Je suis content"
self.assertEqual("Je ne suis pas content", negate(text, "fr"))


if __name__ == '__main__':
unittest.main()

0 comments on commit 7a32d86

Please sign in to comment.