File size: 3,551 Bytes
349b2ad
 
7ea68d8
 
349b2ad
77f184e
9caae98
349b2ad
 
 
 
c7de0f6
 
 
 
77f184e
349b2ad
 
 
e5a3778
77f184e
e5a3778
 
 
 
 
 
 
 
 
 
349b2ad
77f184e
349b2ad
 
 
 
 
 
 
 
 
 
 
 
 
c010ef4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c7f3351
c010ef4
 
 
 
77f184e
c010ef4
 
12ee3cc
 
 
349b2ad
c7de0f6
c010ef4
 
 
e5a3778
77f184e
 
 
 
 
 
 
 
 
 
 
e5a3778
77f184e
 
 
 
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
import num2words
import re
from .stress import sentence_to_stress, stress_dict
from .stress_with_model import stress_with_model


def preprocess_text(text, use_autostress_model=False):
    # currencies
    text = text.replace("$", "долар")
    text = text.replace("₴", "гривня")
    text = text.replace("€", "євро")
    # replace apostrophe
    text = text.replace("`", "'")
    text = text.replace("ʼ", "'")
    # numbers
    text = re.sub(r"(\d)\s+(\d)", r"\1\2", text)

    def detect_num_and_convert(word):
        numbers = "0123456789,."
        result = []
        parts = word.split("-")  # for handling complex words
        for part in parts:
            is_number = all(map(lambda x: x in numbers, part))
            if is_number:
                try:
                    result.append(num2words.num2words(part, lang="uk"))
                except:
                    result.append(part)
            else:
                result.append(part)
        return "-".join(result)

    # print([detect_num_and_convert(word) for word in text.split(" ")])
    text = " ".join([detect_num_and_convert(word) for word in text.split(" ")])

    # fallback numbers
    text = text.replace("1", "один ")
    text = text.replace("2", "два ")
    text = text.replace("3", "три ")
    text = text.replace("4", "чотири ")
    text = text.replace("5", "п'ять ")
    text = text.replace("6", "шість ")
    text = text.replace("7", "сім ")
    text = text.replace("8", "вісім ")
    text = text.replace("9", "дев'ять ")
    text = text.replace("0", "нуль ")
    # speak english alphabet using brute force transliteration
    english = {
        "a": "а",
        "b": "б",
        "c": "ц",
        "d": "д",
        "e": "е",
        "f": "ф",
        "g": "ґ",
        "h": "г",
        "i": "і",
        "j": "дж",
        "k": "к",
        "l": "л",
        "m": "м",
        "n": "н",
        "o": "о",
        "p": "п",
        "q": "кв",
        "r": "р",
        "s": "с",
        "t": "т",
        "u": "ю",
        "v": "в",
        "w": "в",
        "x": "кс",
        "y": "і",
        "z": "з",
    }
    for english_char in english.keys():
        # uppercase
        text = text.replace(english_char.upper(), english[english_char].upper())
        text = text.replace(english_char, english[english_char])

    text = sentence_to_stress(
        text, stress_with_model if use_autostress_model else stress_dict
    )

    return text


if __name__ == "__main__":
    assert preprocess_text("Quality of life update") == "КВюаліті оф ліфе юпдате"
    assert (
        preprocess_text("Він украв 20000000 $") == "Він украв двадцять мільйонів долар"
    )
    assert (
        preprocess_text("111 000 000 000 доларів державного боргу.")
        == "сто одинадцять мільярдів доларів державного боргу."
    )
    assert (
        preprocess_text("11100000001 доларів державного боргу.")
        == "одинадцять мільярдів сто мільйонів одна доларів державного боргу."
    )
    assert preprocess_text("це 19-річне вино.") == "це дев'ятнадцять-річне вино."
    assert (
        preprocess_text("10-30-40-50-5-9-5")
        == "десять-тридцять-сорок-п'ятдесят-п'ять-дев'ять-п'ять"
    )