Spaces:
Running
Running
from modules.m_parser import Parser, Tense | |
from difflib import ndiff | |
from typing import List, Tuple, Dict | |
class ActiveVoice(Parser): | |
def __init__( | |
self | |
) -> None: | |
Parser.__init__(self) | |
def __check_errors( | |
self, | |
sentence: str, | |
debug: bool = False | |
) -> Dict: | |
sentence = sentence.strip() | |
if sentence == "": | |
raise RuntimeError( | |
f"Error: The sentence can not be empty!" | |
) | |
subj_data, subj_str = self.get_a_subj(sentence) | |
if debug: print(subj_data) | |
if subj_str == "": | |
raise RuntimeError( | |
f"Error: The subject of the sentence was not found or the sentence is not in the correct format!" | |
) | |
verb_data, verb_str = self.get_a_verb(sentence) | |
if debug: print(verb_data) | |
if verb_str == "": | |
raise RuntimeError( | |
f"Error: The verbs of the sentence were not found or the sentence is not in the correct format!" | |
) | |
dobj_data, dobj_str = self.get_a_dobj(sentence) | |
if debug: print(dobj_data) | |
if dobj_str == "": | |
raise RuntimeError( | |
f"Error: The direct object of the sentence was not found or the sentence is not in the correct format!" | |
) | |
compl_str = self.get_a_compl(subj_str, verb_str, dobj_str, sentence) | |
if debug: print(compl_str) | |
return { | |
'subj': [subj_data, subj_str], | |
'verb': [verb_data, verb_str], | |
'dobj': [dobj_data, dobj_str], | |
'compl': compl_str, | |
} | |
def __create_p_subj( | |
self, | |
a_dobj: str | |
) -> str: | |
return a_dobj | |
def __create_p_verb( | |
self, | |
a_verb_data: List[Tuple[str,str,str,int]], | |
a_dobj_data: List[Tuple[str,str,str]], | |
debug: bool = False | |
) -> Tuple[str, str]: | |
# know verbal tense | |
verbal_tense = self.get_verbal_tense(a_verb_data) | |
if debug: print(verbal_tense) | |
if verbal_tense is None: | |
raise RuntimeError( | |
f"Error: The sentence is not in the correct format or the verbal tense has not been implemented yet!" | |
) | |
# Know if sentence is in afirmative or negative | |
_, neg_data, main_data = a_verb_data | |
neg = " not" if len(neg_data) > 0 else "" | |
# know if noun is plural or singular | |
gramatical_number = self.get_gramatical_number(a_dobj_data) | |
if debug: print(gramatical_number) | |
# Form to be verb | |
tobe = Tense[verbal_tense].value['tobe'][gramatical_number] | |
tobe = tobe.format(neg) | |
if debug: print(tobe) | |
# Know participle | |
participle = self.verb2participle(main_data[0][0].text) | |
if debug: print(participle) | |
return tobe, participle | |
def __create_p_agent( | |
self, | |
a_subj_data: List[Tuple[str,str,str]], | |
debug: bool = False | |
) -> str: | |
agent = [] | |
for tk,_,tag in a_subj_data: | |
word = tk.text | |
if tag == 'PRP': | |
word = self.subj2obj(word) | |
agent.append(word) | |
return ' '.join(agent).strip() | |
def get_a_subj( | |
self, | |
sentence: str, | |
) -> Tuple[ List[Tuple[str,str,str]], str]: | |
out_data = [] | |
for tk in self.parser(sentence): | |
if "subj" in tk.dep_: | |
out_data = [(t,t.dep_,t.tag_) for t in tk.subtree] | |
break | |
out_str = ' '.join([t.text for t,_,_ in out_data]) | |
return out_data, out_str | |
def get_a_verb( | |
self, | |
sentence: str, | |
) -> Tuple[ List[List[Tuple[str,str,str,int]]], str]: | |
main_data = [] | |
aux_data = [] | |
neg_data = [] | |
out_data = [] | |
for tk in self.parser(sentence): | |
if "ROOT" in tk.dep_: | |
main_data = [ (tk,tk.dep_,tk.tag_,tk.i)] | |
aux_data = [(t,t.dep_,t.tag_,t.i) for t in tk.children if t.dep_ == "aux"] | |
neg_data = [(t,t.dep_,t.tag_,t.i) for t in tk.children if t.dep_ == "neg"] | |
out_data = [aux_data, neg_data, main_data] | |
break | |
out_str = sorted([tup for list_ in out_data for tup in list_], key=lambda x: x[3]) | |
out_str = ' '.join([t.text for t,_,_,_ in out_str]) | |
return out_data, out_str | |
def get_a_dobj( | |
self, | |
sentence: str, | |
) -> Tuple[ List[Tuple[str,str,str]], str]: | |
out_data = [] | |
for tk in self.parser(sentence): | |
if "dobj" in tk.dep_: | |
out_data = [(t,t.dep_,t.tag_)for t in tk.subtree] | |
break | |
out_str = ' '.join([t.text for t,_,_ in out_data]) | |
return out_data, out_str | |
def get_a_compl( | |
self, | |
subj: str, | |
verb: str, | |
dobj: str, | |
full_sentence: str, | |
) -> str: | |
concat_sentence = subj + ' ' + verb + ' ' + dobj | |
diff = "" | |
for tk in ndiff(concat_sentence.split(), full_sentence.split()): | |
mark, word = tk[0], tk[2:] | |
if mark == '+': | |
diff += word + " " | |
return diff.strip() | |
def to_passive( | |
self, | |
sentence: str, | |
debug: bool=False | |
) -> Dict[str, str]: | |
outputs = self.__check_errors(sentence, debug) | |
subj_data, subj_str = outputs['subj'] | |
verb_data, verb_str = outputs['verb'] | |
dobj_data, dobj_str = outputs['dobj'] | |
p_compl = outputs['compl'] | |
# Create passive subject | |
p_subj = self.__create_p_subj( | |
dobj_str | |
) | |
# Create passive verb | |
p_tobe, p_participle = self.__create_p_verb( | |
verb_data, dobj_data, debug | |
) | |
# Create passive agent | |
p_agent = self.__create_p_agent( | |
subj_data, debug | |
) | |
return { | |
'subj': p_subj.capitalize(), | |
'tobe':p_tobe, | |
'participle': p_participle, | |
'agent': 'by '+ p_agent[0].lower() + p_agent[1:].strip(), | |
'compl': p_compl | |
} |