Spaces:
Sleeping
Sleeping
File size: 3,833 Bytes
703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 d316e6d 80c77a7 d316e6d 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 80c77a7 703bf01 d316e6d 703bf01 d316e6d 703bf01 80c77a7 703bf01 d316e6d 703bf01 80c77a7 703bf01 80c77a7 703bf01 d316e6d ac9b8fe 80c77a7 703bf01 d316e6d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
import subprocess
import spacy
import pyinflect
import pandas as pd
from typing import Tuple, Union, Any
class Parser:
def __init__(
self
) -> None:
self.parser = self.__init_parser("en_core_web_sm")
self.__overrides = self.__load_overrides("data/overrides.csv")
def __load_overrides(
self,
file_path: str
) -> Any:
dic = pd.read_csv(file_path).set_index('VB').to_dict()
fun = lambda verb, tag: dic[tag].get(verb, False)
return fun
def __init_parser(
self,
model: str
) -> spacy.language:
parser = None
try:
parser = spacy.load(model)
except:
print(f"* Downloading {model} model...")
_ = subprocess.Popen(
f"python -m spacy download {model}",
stdout=subprocess.PIPE,
shell=True
).communicate()
parser = spacy.load(model)
return parser
def __format_error(
self,
error: str
) -> str:
template = """
<center>
<div class="alert alert-warning" role="alert">
<h6><b>{}</b></h6>
</div>
</center>
"""
return template.format(error)
def __format_output(
self,
infinitive: str,
past: str,
participle: str,
) -> str:
template = """
|Infinitive| Simple Past | Past Participle |
| :----: | :----: | :----: |
|{} | {}| {}|
"""
return template.format(infinitive, past, participle)
def is_in_overrides(
self,
verb: str,
tense: str
) -> Tuple[str, bool]:
res = self.__overrides(verb, tense)
if isinstance(res, bool):
return res, ""
return True, res
def __get_inflections(
self,
infinitive: spacy.tokens.token.Token,
tense: str
) -> Union[str, None]:
# Check if verb is in overrides file
res, inflections = self.is_in_overrides(infinitive.text, tense)
if not res:
form1 = infinitive._.inflect(tense, form_num=0)
form2 = infinitive._.inflect(tense, form_num=1)
inflections = list(set([form1, form2]))
if len(inflections) == 1 and inflections[0] == None:
return None
inflections = '/'.join(inflections)
return inflections
def __getAllTenses(
self,
tk_verb: spacy.tokens.token.Token
) -> Tuple[str,str,str,str]:
infinitive = tk_verb._.inflect('VB')
past = self.__get_inflections(tk_verb, 'VBD')
participle = self.__get_inflections(tk_verb, 'VBN')
return infinitive, past, participle
def __tokenizer(
self,
verb: str
) -> spacy.tokens.token.Token:
return self.parser(verb)[0]
def get(
self,
verb: str
) -> Tuple[str,str]:
verb = verb.strip().lower()
error, output = "", ""
if verb == "":
error = self.__format_error(
f"Error: The Verb field can not be empty!"
)
return error, output
tk_verb = self.__tokenizer(verb)
infinitive, past, participle = self.__getAllTenses(tk_verb)
if infinitive is None or past is None or participle is None:
error = self.__format_error(
f"Error: The verb '<b>{verb}</b>' has not been found or not spelled correctly!"
)
return error, output
print(f"{verb} -> {infinitive},{past},{participle}")
output = self.__format_output(infinitive, past, participle)
return error, output |