Source code for prepars.verb

import re
from pathlib import Path

ROOT = Path(__file__).parents[0]

HALF_SPACE = "\u200c"
SPACE = " "
SPACE_OR_HALF = f"[{HALF_SPACE}{SPACE}]*"
WORD_BOUNDARY = f"[{SPACE}\W{HALF_SPACE}]"


[docs]class verbProcessing:
[docs] def fixVerbs(self, text): """ This method fixes all verb half-space and space problems. Args: text: input text Returns: corrected text """ text = " " + text + " " all_verbs = Path.read_text( ROOT / "PVC/Data/TXT/all_verbs.txt", encoding="utf-8" ).split("\n") # text = self.remove_double_space(text) for item in all_verbs: if not item: continue verb, tag1, tag2, tag3 = item.split(",") # todo: fix آ کلاه دار contains = verb.replace(" ", "") in text.replace(" ", "").replace( HALF_SPACE, "" ) if not contains: continue # this will match all verbs even if there is no space between characters fixed_verb = verb.replace(" ", SPACE_OR_HALF) regex = f"{WORD_BOUNDARY}{fixed_verb}{WORD_BOUNDARY}" for item in re.finditer(regex, text): start, end = item.start(), item.end() result = text[start:end] if tag1 == "PAST" and tag2 == "INDICATIVE": # آزردم آزردی آزرد if tag3 == "SIMPLE": continue # می آزردم if tag3 == "IMPERFECTIVE": result = re.sub( f"(نمی|می){SPACE_OR_HALF}(\w+)", r"\1" + HALF_SPACE + r"\2", text[start:end], ) if tag3 == "PROGRESSIVE": # داشتم نمی رفتم result = re.sub( f"(داشت)(یم|ید|ند|ی|م)?{SPACE_OR_HALF}(نمی|می){SPACE_OR_HALF}(\w+)", r"\1\2 \3" + HALF_SPACE + r"\4", text[start:end], ) if tag3 == "NARRATIVE": # رفته ام result = re.sub( f"(\w+){SPACE_OR_HALF}(ایم|اید|اند|ام|ای|است)", r"\1" + HALF_SPACE + r"\2", text[start:end], ) if tag3 == "NARRATIVE_IMPERFECTIVE": # نمی رفته ام result = re.sub( f"(نمی|می)(\w+)(ایم|اید|اند|ام|ای|است)", r"\1" + HALF_SPACE + r"\2" + HALF_SPACE + r"\3", text[start:end], ) if tag3 == "NARRATIVE_PROGRESSIVE": # داشته ام می رفته ام result = re.sub( f"(داشته){SPACE_OR_HALF}(ایم|اید|اند|ام|ای|است)?{SPACE_OR_HALF}(نمی|می){SPACE_OR_HALF}(\w+){SPACE_OR_HALF}(ایم|اید|اند|ام|ای|است)?", r"\1" + HALF_SPACE + r"\2 \3" + HALF_SPACE + r"\4" + HALF_SPACE + r"\5", text[start:end], ) if tag3 == "PRECEDENT": # رفته بودم result = re.sub( f"(\w+){SPACE_OR_HALF}(بود)(ند|ید|یم|ی|م)?", r"\1" + HALF_SPACE + r"\2\3", text[start:end], ) if tag3 == "PRECEDENT_IMPERFECTIVE": # نمی رفته بودیم result = re.sub( f"(نمی|می){SPACE_OR_HALF}(\w+)(بود)(ند|ید|یم|ی|م)?", r"\1" + HALF_SPACE + r"\2" + HALF_SPACE + r"\3\4", text[start:end], ) if tag3 == "PRECEDENT_PROGRESSIVE": # داشتم می رفته بودم result = re.sub( f"(داشت)(یم|ید|ند|ی|م)?{SPACE_OR_HALF}(نمی|می){SPACE_OR_HALF}(\w+){SPACE_OR_HALF}(بود)(ند|ید|یم|ی|م)?", r"\1\2 \3" + HALF_SPACE + r"\4" + HALF_SPACE + r"\5\6", text[start:end], ) if tag3 == "PRECEDENT_NARRATIVE": # رفته بوده ام result = re.sub( f"(\w+){SPACE_OR_HALF}(بوده){SPACE_OR_HALF}(ایم|اید|اند|ام|ای|است)", r"\1" + HALF_SPACE + r"\2" + HALF_SPACE + r"\3", text[start:end], ) if tag3 == "PRECEDENT_NARRATIVE_IMPERFECTIVE": # می رفته بوده ام result = re.sub( f"(نمی|می){SPACE_OR_HALF}(\w+){SPACE_OR_HALF}(بوده){SPACE_OR_HALF}(ایم|اید|اند|ام|ای|است)", r"\1" + HALF_SPACE + r"\2" + HALF_SPACE + r"\3" + HALF_SPACE + r"\4", text[start:end], ) if tag3 == "PRECEDENT_NARRATIVE_PROGRESSIVE": # داشته ایم می رفته بوده ایم result = re.sub( f"(داشته){SPACE_OR_HALF}(ایم|اید|اند|ام|ای|است)?{SPACE_OR_HALF}(نمی|می){SPACE_OR_HALF}(\w+){SPACE_OR_HALF}(بوده){SPACE_OR_HALF}(ایم|اید|اند|ام|ای|است)?", r"\1" + HALF_SPACE + r"\2 \3" + HALF_SPACE + r"\4" + HALF_SPACE + r"\5" + HALF_SPACE + r"\6", text[start:end], ) if tag1 == "PRESENT" and tag2 == "INDICATIVE": if tag3 == "SIMPLE": continue if tag3 == "IMPERFECTIVE": # می روبم result = re.sub( f"(نمی|می){SPACE_OR_HALF}(\w+)", r"\1" + HALF_SPACE + r"\2", text[start:end], ) if tag3 == "PROGRESSIVE": # دارد نمی روبد result = re.sub( f"(دار)(یم|ید|ند|ی|م|د){SPACE_OR_HALF}(نمی|می){SPACE_OR_HALF}(\w+)", r"\1\2 \3" + HALF_SPACE + r"\4", text[start:end], ) if tag1 == "FUTURE" and tag2 == "INDICATIVE" and tag3 == "SIMPLE": # خواهم رفت result = re.sub( f"(ن)?(خواه)(یم|ید|ند|ی|م|د){SPACE_OR_HALF}(\w+)", r"\1\2\3 \4", text[start:end], ) if ( tag1 == "PRESENT" and (tag2 == "SUBJUNCTIVE" or tag2 == "IMPERATIVE") and tag3 == "SIMPLE" ): # نرویم continue if tag1 == "PAST" and (tag2 == "SUBJUNCTIVE" or tag2 == "IMPERATIVE"): if tag3 == "NARRATIVE": # رفته باشم result = re.sub( f"(\w+){SPACE_OR_HALF}(باش)(یم|ید|ند|ی|م|د)", r"\1" + HALF_SPACE + r"\2\3", text[start:end], ) if tag3 == "NARRATIVE_IMPERFECTIVE": # می رفته باشم result = re.sub( f"(نمی|می){SPACE_OR_HALF}(\w+){SPACE_OR_HALF}(باش)(یم|ید|ند|ی|م|د)", r"\1" + HALF_SPACE + r"\2" + HALF_SPACE + r"\3\4", text[start:end], ) if tag3 == "PRECEDENT_NARRATIVE": # نرفته بوده باشد result = re.sub( f"(\w+){SPACE_OR_HALF}(بوده){SPACE_OR_HALF}(باش)(یم|ید|ند|ی|م|د)", r"\1" + HALF_SPACE + r"\2" + HALF_SPACE + r"\3\4", text[start:end], ) if tag3 == "PRECEDENT_NARRATIVE_IMPERFECTIVE": # می رفته بوده باشد result = re.sub( f"(نمی|می){SPACE_OR_HALF}(\w+){SPACE_OR_HALF}(بوده){SPACE_OR_HALF}(باش)(یم|ید|ند|ی|م|د)", r"\1" + HALF_SPACE + r"\2" + HALF_SPACE + r"\3" + HALF_SPACE + r"\4\5", text[start:end], ) text = text[:start] + result + text[end:] return text.strip()