GO = 0
PAD = 1
EOS = 2
UNK = 3

tanya_list = [
    'kenapa',
    'bila',
    'siapa',
    'mengapa',
    'apa',
    'bagaimana',
    'berapa',
    'mana',
]
perintah_list = ['jangan', 'sila', 'tolong', 'harap', 'usah', 'jemput', 'minta']
pangkal_list = [
    'maka',
    'alkisah',
    'arakian',
    'syahdah',
    'adapun',
    'bermula',
    'kalakian',
]
bantu_list = [
    'akan',
    'telah',
    'boleh',
    'mesti',
    'belum',
    'sudah',
    'dapat',
    'masih',
    'harus',
    'hendak',
]
penguat_list = [
    'paling',
    'agak',
    'sungguh',
    'amat',
    'terlalu',
    'nian',
    'benar',
    'paling',
]
penegas_list = ['jua', 'juga', 'sahaja', 'hanya', 'memang', 'lagi', 'pun']
nafi_list = ['bukan', 'tidak', 'tak', 'tiada', 'tidaklah', 'tidakkah']
pemeri_list = ['ialah', 'adalah']
sendi_list = [
    'akan',
    'kepada',
    'terhadap',
    'bagi',
    'untuk',
    'dari',
    'daripada',
    'di',
    'dengan',
    'hingga',
    'sampai',
    'ke',
    'kepada',
    'oleh',
    'pada',
    'sejak',
    'seperti',
    'umpama',
    'bak',
    'tentang',
    'laksanabagai',
    'semenjak',
    'dalam',
    'antara',
]
pembenar_list = ['ya', 'benar', 'betul']
nombor_list = [
    'satu',
    'dua',
    'tiga',
    'empat',
    'lima',
    'enam',
    'tujuh',
    'lapan',
    'sembilan',
    'kosong',
]
suku_bilangan_list = ['per', 'suku', 'setengah', 'separuh', 'tiga suku']
pisahan_list = ['setiap', 'tiap']
keterangan_list = [
    'begitu',
    'begini',
    'demikian',
    'perlahan',
    'cepat',
    'lena',
    'akan',
    'sedang',
    'belum',
    'telah',
    'sekarang',
    'sebentar',
    'semalam',
    'mungkin',
    'agak',
    'barangkali',
    'pasti',
    'tentu',
    'sudah',
    'selalu',
    'kadang',
    'acapkali',
    'sesekali',
    'yang',
]
arah_list = [
    'atas',
    'bawah',
    'tepi',
    'antara',
    'hadapan',
    'utara',
    'sisi',
    'luar',
]
hubung_list = [
    'agar',
    'apabila',
    'atau',
    'bahawa',
    'dan',
    'hingga',
    'jika',
    'jikalau',
    'kecuali',
    'kerana',
    'lalu',
    'manakala',
    'sambil',
    'serta',
    'semenjak',
    'sementara',
    'sungguhpun',
    'supaya',
    'walaupun',
    'tetapi',
    'berkenan',
    'berkenaan',
]
gantinama_list = [
    'aku',
    'saya',
    'hamba',
    'patik',
    'beta',
    'kami',
    'kita',
    'anda',
    'awak',
    'engkau',
    'tuanku',
    'kalian',
    'kamu',
    'baginda',
    'beliau',
    'mereka',
    'ini',
    'itu',
    'sini',
    'situ',
    'sana',
    'kini',
    'dia',
    'rm',
]

permulaan = [
    'bel',
    'se',
    'see',
    'ter',
    'terr',
    'men',
    'menn',
    'meng',
    'mengg',
    'mem',
    'memper',
    'di',
    'ddi',
    'pe',
    'ppe',
    'me',
    'mme',
    'ke',
    'kee',
    'ber',
    'berr',
    'pen',
    'penn',
    'per',
    'perr',
]

hujung = [
    'kan',
    'kann',
    'kah',
    'kahh',
    'lah',
    'lahh',
    'tah',
    'tahh',
    'nya',
    'nyaa',
    'an',
    'ann',
    'wan',
    'wann',
    'wati',
    'watii',
    'ita',
    'itaa',
    'nye',
    'nyee',
    'nyo',
    'nyoo',
    'loh',
    'lohh',
]

hujung_malaysian = ['lah', 'la', 'ler']

alphabet = 'qwertyuiopasdfghjklzxcvbnm'
consonants = 'bcdfghjklmnpqrstvwxyz'
vowels = 'aeiou'

sounds = {
    'x': 'tidak',
    'y': 'kenapa',
    'n': 'dan',
    'g': 'pergi',
    's': 'seperti',
    'd': 'di',
    'k': 'ok',
    'u': 'awak',
    't': 'nanti',
    'p': 'pergi',
    'wai': 'kenapa',
    'i': 'saya',
}

tatabahasa_dict = {
    'KT': tanya_list,
    'KP': perintah_list,
    'KPA': pangkal_list,
    'KB': bantu_list,
    'KPENGUAT': penguat_list,
    'KPENEGAS': penegas_list,
    'NAFI': nafi_list,
    'KPEMERI': pemeri_list,
    'KS': sendi_list,
    'KPEMBENAR': pembenar_list,
    'NO': nombor_list,
    'SUKU': suku_bilangan_list,
    'PISAHAN': pisahan_list,
    'KETERANGAN': keterangan_list,
    'ARAH': arah_list,
    'KH': hubung_list,
    'GN': gantinama_list,
}

stopword_tatabahasa = list(
    set(
        tanya_list
        + perintah_list
        + pangkal_list
        + bantu_list
        + penguat_list
        + penegas_list
        + nafi_list
        + pemeri_list
        + sendi_list
        + pembenar_list
        + nombor_list
        + suku_bilangan_list
        + pisahan_list
        + keterangan_list
        + arah_list
        + hubung_list
        + gantinama_list
    )
)

rules_normalizer = {
    'experience': 'pengalaman',
    'bagasi': 'bagasi',
    'kg': 'kampung',
    'kilo': 'kilogram',
    'g': 'pergi',
    'grm': 'gram',
    'k': 'okay',
    'abgkat': 'abang dekat',
    'abis': 'habis',
    'ade': 'ada',
    'adoi': 'aduh',
    'adoii': 'aduhh',
    'aerodarat': 'kapal darat',
    'agkt': 'angkat',
    'ahh': 'ah',
    'ailior': 'air liur',
    'airasia': 'air asia x',
    'airasiax': 'penerbangan',
    'airline': 'penerbangan',
    'airlines': 'penerbangan',
    'airport': 'lapangan terbang',
    'airpot': 'lapangan terbang',
    'aje': 'sahaja',
    'ajelah': 'sahajalah',
    'ajer': 'sahaja',
    'ak': 'aku',
    'aq': 'aku',
    'all': 'semua',
    'ambik': 'ambil',
    'amek': 'ambil',
    'amer': 'amir',
    'amik': 'ambil',
    'ana': 'saya',
    'angkt': 'angkat',
    'anual': 'tahunan',
    'apapun': 'apa pun',
    'ape': 'apa',
    'arab': 'arab',
    'area': 'kawasan',
    'aritu': 'hari itu',
    'ask': 'tanya',
    'astro': 'astro',
    'at': 'pada',
    'attitude': 'sikap',
    'babi': 'khinzir',
    'back': 'belakang',
    'bag': 'beg',
    'bang': 'abang',
    'bangla': 'bangladesh',
    'banyk': 'banyak',
    'bard': 'pujangga',
    'bargasi': 'bagasi',
    'bawak': 'bawa',
    'bawanges': 'bawang',
    'be': 'jadi',
    'behave': 'berkelakuan baik',
    'belagak': 'berlagak',
    'berdisiplin': 'berdisplin',
    'berenti': 'berhenti',
    'beskal': 'basikal',
    'bff': 'rakan karib',
    'bg': 'bagi',
    'bgi': 'bagi',
    'biase': 'biasa',
    'big': 'besar',
    'bike': 'basikal',
    'bile': 'bila',
    'binawe': 'binatang',
    'bini': 'isteri',
    'bkn': 'bukan',
    'bla': 'bila',
    'blom': 'belum',
    'bnyak': 'banyak',
    'body': 'tubuh',
    'bole': 'boleh',
    'boss': 'bos',
    'bowling': 'boling',
    'bpe': 'berapa',
    'brand': 'jenama',
    'brg': 'barang',
    'briefing': 'taklimat',
    'brng': 'barang',
    'bro': 'abang',
    'bru': 'baru',
    'bruntung': 'beruntung',
    'bsikal': 'basikal',
    'btnggjwb': 'bertanggungjawab',
    'btul': 'betul',
    'buatlh': 'buatlah',
    'buh': 'letak',
    'buka': 'buka',
    'but': 'tetapi',
    'bwk': 'bawa',
    'by': 'dengan',
    'byr': 'bayar',
    'bz': 'sibuk',
    'camera': 'kamera',
    'camni': 'macam ini',
    'cane': 'macam mana',
    'cant': 'tak boleh',
    'carakerja': 'cara kerja',
    'care': 'jaga',
    'cargo': 'kargo',
    'cctv': 'kamera litar tertutup',
    'celako': 'celaka',
    'cer': 'cerita',
    'cheap': 'murah',
    'check': 'semak',
    'ciput': 'sedikit',
    'cite': 'cerita',
    'citer': 'cerita',
    'ckit': 'sikit',
    'cikit': 'sikit',
    'ckp': 'cakap',
    'class': 'kelas',
    'cm': 'macam',
    'cmni': 'macam ini',
    'cmpak': 'campak',
    'committed': 'komited',
    'company': 'syarikat',
    'complain': 'aduan',
    'corn': 'jagung',
    'couldnt': 'tak boleh',
    'cr': 'cari',
    'crew': 'krew',
    'cube': 'cuba',
    'cuma': 'cuma',
    'curinyaa': 'curinya',
    'cust': 'pelanggan',
    'customer': 'pelanggan',
    'd': 'di',
    'da': 'dah',
    'dn': 'dan',
    'dahh': 'dah',
    'damaged': 'rosak',
    'dapek': 'dapat',
    'day': 'hari',
    'dazrin': 'dazrin',
    'dbalingnya': 'dibalingnya',
    'de': 'ada',
    'deep': 'dalam',
    'deliberately': 'sengaja',
    'depa': 'mereka',
    'dessa': 'desa',
    'dgn': 'dengan',
    'dh': 'dah',
    'didunia': 'di dunia',
    'diorang': 'mereka',
    'diorng': 'mereka',
    'direct': 'secara terus',
    'diving': 'junam',
    'dkt': 'dekat',
    'dlempar': 'dilempar',
    'dlm': 'dalam',
    'dlt': 'padam',
    'dlu': 'dulu',
    'done': 'siap',
    'dont': 'jangan',
    'dorg': 'mereka',
    'dpermudhkn': 'dipermudahkan',
    'dpt': 'dapat',
    'dri': 'dari',
    'dsb': 'dan sebagainya',
    'dy': 'dia',
    'educate': 'mendidik',
    'ensure': 'memastikan',
    'everything': 'semua',
    'ewahh': 'wah',
    'expect': 'sangka',
    'fb': 'facebook',
    'fired': 'pecat',
    'first': 'pertama',
    'fkr': 'fikir',
    'flight': 'kapal terbang',
    'for': 'untuk',
    'free': 'percuma',
    'friend': 'kawan',
    'fyi': 'untuk pengetahuan anda',
    'gantila': 'gantilah',
    'gantirugi': 'ganti rugi',
    'gentlemen': 'lelaki budiman',
    'gerenti': 'jaminan',
    'gile': 'gila',
    'gk': 'juga',
    'gnti': 'ganti',
    'go': 'pergi',
    'gomen': 'kerajaan',
    'goment': 'kerajaan',
    'good': 'baik',
    'ground': 'tanah',
    'guarno': 'macam mana',
    'hampa': 'mereka',
    'hampeh': 'teruk',
    'hanat': 'jahanam',
    'handle': 'kawal',
    'handling': 'kawalan',
    'hanta': 'hantar',
    'haritu': 'hari itu',
    'harini': 'hari ini',
    'hate': 'benci',
    'have': 'ada',
    'hawau': 'celaka',
    'henpon': 'telefon',
    'heran': 'hairan',
    'him': 'dia',
    'his': 'dia',
    'hmpa': 'mereka',
    'hntr': 'hantar',
    'hotak': 'otak',
    'hr': 'hari',
    'i': 'saya',
    'hrga': 'harga',
    'hrp': 'harap',
    'hu': 'sedih',
    'humble': 'merendah diri',
    'ibon': 'ikon',
    'ichi': 'inci',
    'idung': 'hidung',
    'if': 'jika',
    'ig': 'instagram',
    'iklas': 'ikhlas',
    'improve': 'menambah baik',
    'in': 'masuk',
    'isn t': 'tidak',
    'isyaallah': 'insyallah',
    'ja': 'sahaja',
    'japan': 'jepun',
    'jd': 'jadi',
    'je': 'saja',
    'jee': 'saja',
    'jek': 'saja',
    'jepun': 'jepun',
    'jer': 'saja',
    'jerr': 'saja',
    'jez': 'saja',
    'jg': 'juga',
    'jgk': 'juga',
    'jgn': 'jangan',
    'jgnla': 'janganlah',
    'jibake': 'celaka',
    'jjur': 'jujur',
    'job': 'kerja',
    'jobscope': 'skop kerja',
    'jogja': 'jogjakarta',
    'jpam': 'jpam',
    'jth': 'jatuh',
    'jugak': 'juga',
    'ka': 'ke',
    'kalo': 'kalau',
    'kalu': 'kalau',
    'kang': 'nanti',
    'kantoi': 'temberang',
    'kasi': 'beri',
    'kat': 'dekat',
    'kbye': 'ok bye',
    'kearah': 'ke arah',
    'kecik': 'kecil',
    'keja': 'kerja',
    'keje': 'kerja',
    'kejo': 'kerja',
    'keksongan': 'kekosongan',
    'kemana': 'ke mana',
    'kene': 'kena',
    'kenekan': 'kenakan',
    'kesah': 'kisah',
    'ketempat': 'ke tempat',
    'kije': 'kerja',
    'kijo': 'kerja',
    'kiss': 'cium',
    'kite': 'kita',
    'kito': 'kita',
    'kje': 'kerja',
    'kjr': 'kerja',
    'kk': 'okay',
    'kmi': 'kami',
    'kt': 'kat',
    'tlg': 'tolong',
    'kl': 'kuala lumpur',
    'klai': 'kalau',
    'klau': 'kalau',
    'klia': 'klia',
    'klo': 'kalau',
    'klu': 'kalau',
    'kn': 'kan',
    'knapa': 'kenapa',
    'kne': 'kena',
    'ko': 'kau',
    'kompom': 'sah',
    'korang': 'kamu semua',
    'korea': 'korea',
    'korg': 'kamu semua',
    'kot': 'mungkin',
    'krja': 'kerja',
    'ksalahan': 'kesalahan',
    'kta': 'kita',
    'kuar': 'keluar',
    'kut': 'mungkin',
    'la': 'lah',
    'laa': 'lah',
    'lahabau': 'celaka',
    'lahanat': 'celaka',
    'lainda': 'lain dah',
    'lak': 'pula',
    'last': 'akhir',
    'le': 'lah',
    'leader': 'ketua',
    'leave': 'pergi',
    'ler': 'lah',
    'less': 'kurang',
    'letter': 'surat',
    'lg': 'lagi',
    'lgi': 'lagi',
    'lngsong': 'langsung',
    'lol': 'hehe',
    'lorr': 'lah',
    'low': 'rendah',
    'lps': 'lepas',
    'luggage': 'bagasi',
    'lumbe': 'lumba',
    'lyak': 'layak',
    'maap': 'maaf',
    'maapkan': 'maafkan',
    'mahai': 'mahal',
    'mampos': 'mampus',
    'mart': 'kedai',
    'mau': 'mahu',
    'mcm': 'macam',
    'mcmtu': 'macam itu',
    'memerlukn': 'memerlukan',
    'mengembirakan': 'menggembirakan',
    'mengmbilnyer': 'mengambilnya',
    'mengtasi': 'mengatasi',
    'mg': 'memang',
    'mihak': 'memihak',
    'min': 'admin',
    'mingu': 'minggu',
    'mintak': 'minta',
    'mjtuhkn': 'menjatuhkan',
    'mkyong': 'mak yong',
    'mlibatkn': 'melibatkan',
    'mmg': 'memang',
    'mmnjang': 'memanjang',
    'mmpos': 'mampus',
    'mn': 'mana',
    'mna': 'mana',
    'mntak': 'minta',
    'mntk': 'minta',
    'mnyusun': 'menyusun',
    'mood': 'suasana',
    'most': 'paling',
    'mr': 'tuan',
    'msa': 'masa',
    'msia': 'malaysia',
    'mst': 'mesti',
    'mu': 'awak',
    'much': 'banyak',
    'muko': 'muka',
    'mum': 'emak',
    'n': 'dan',
    'nah': 'nah',
    'nanny': 'nenek',
    'napo': 'kenapa',
    'nati': 'nanti',
    'ngan': 'dengan',
    'ngn': 'dengan',
    'ni': 'ini',
    'nie': 'ini',
    'nii': 'ini',
    'nk': 'nak',
    'nmpk': 'nampak',
    'nye': 'nya',
    'ofis': 'pejabat',
    'ohh': 'oh',
    'oii': 'hoi',
    'one': 'satu',
    'online': 'dalam talian',
    'or': 'atau',
    'org': 'orang',
    'orng': 'orang',
    'otek': 'otak',
    'p': 'pergi',
    'paid': 'dah bayar',
    'palabana': 'kepala otak',
    'pasni': 'lepas ini',
    'passengers': 'penumpang',
    'passengger': 'penumpang',
    'pastu': 'lepas itu',
    'pd': 'pada',
    'pegi': 'pergi',
    'pekerje': 'pekerja',
    'pekrja': 'pekerja',
    'perabih': 'perabis',
    'perkerja': 'pekerja',
    'pg': 'pergi',
    'phuii': 'puih',
    'pikir': 'fikir',
    'pilot': 'juruterbang',
    'pk': 'fikir',
    'pkerja': 'pekerja',
    'pkerjaan': 'pekerjaan',
    'pki': 'pakai',
    'please': 'tolong',
    'pls': 'tolong',
    'pn': 'pun',
    'pnh': 'pernah',
    'pnt': 'penat',
    'pnya': 'punya',
    'pon': 'pun',
    'priority': 'keutamaan',
    'properties': 'harta benda',
    'ptugas': 'petugas',
    'pub': 'kelab malam',
    'pulak': 'pula',
    'puye': 'punya',
    'pwrcuma': 'percuma',
    'pyahnya': 'payahnya',
    'quality': 'kualiti',
    'quit': 'keluar',
    'ramly': 'ramly',
    'rege': 'harga',
    'reger': 'harga',
    'report': 'laporan',
    'resigned': 'meletakkan jawatan',
    'respect': 'hormat',
    'rizal': 'rizal',
    'rosak': 'rosak',
    'rosok': 'rosak',
    'rse': 'rasa',
    'sacked': 'buang',
    'sado': 'tegap',
    'salute': 'sanjung',
    'sam': 'sama',
    'same': 'sama',
    'samp': 'sampah',
    'sbb': 'sebab',
    'sbgai': 'sebagai',
    'sblm': 'sebelum',
    'sblum': 'sebelum',
    'sbnarnya': 'sebenarnya',
    'sbum': 'sebelum',
    'sdg': 'sedang',
    'sebb': 'sebab',
    'sebijik': 'sebiji',
    'see': 'lihat',
    'seen': 'dilihat',
    'selangor': 'selangor',
    'selfie': 'swafoto',
    'sempoi': 'cantik',
    'senaraihitam': 'senarai hitam',
    'seorg': 'seorang',
    'service': 'perkhidmatan',
    'sgt': 'sangat',
    'shared': 'kongsi',
    'shirt': 'kemeja',
    'shut': 'tutup',
    'sib': 'nasib',
    'skali': 'sekali',
    'sket': 'sikit',
    'sma': 'sama',
    'smoga': 'semoga',
    'smpoi': 'cantik',
    'sndiri': 'sendiri',
    'sndr': 'sendiri',
    'sndri': 'sendiri',
    'sne': 'sana',
    'so': 'jadi',
    'sop': 'tatacara pengendalian piawai',
    'sorang': 'seorang',
    'spoting': 'pembintikan',
    'sronok': 'seronok',
    'ssh': 'susah',
    'staff': 'staf',
    'standing': 'berdiri',
    'start': 'mula',
    'steady': 'mantap',
    'stiap': 'setiap',
    'stress': 'stres',
    'student': 'pelajar',
    'study': 'belajar',
    'studycase': 'kajian kes',
    'sure': 'pasti',
    'sykt': 'syarikat',
    'tah': 'entah',
    'taik': 'tahi',
    'takan': 'tak akan',
    'takat': 'setakat',
    'takde': 'tak ada',
    'takkan': 'tak akan',
    'taknak': 'tak nak',
    'tang': 'tentang',
    'tanggungjawab': 'bertanggungjawab',
    'taraa': 'sementara',
    'tau': 'tahu',
    'tbabit': 'terbabit',
    'team': 'pasukan',
    'terbaekk': 'terbaik',
    'teruknye': 'teruknya',
    'tgk': 'tengok',
    'that': 'itu',
    'thinking': 'fikir',
    'those': 'itu',
    'time': 'masa',
    'tk': 'tak',
    'tnggongjwb': 'tanggungjawab',
    'tngok': 'tengok',
    'tngu': 'tunggu',
    'to': 'kepada',
    'tosak': 'rosak',
    'tp': 'tapi',
    'tpi': 'tapi',
    'tpon': 'telefon',
    'transfer': 'pindah',
    'trgelak': 'tergelak',
    'ts': 'tan sri',
    'tstony': 'tan sri tony',
    'tu': 'itu',
    'tuh': 'itu',
    'tula': 'itulah',
    'umeno': 'umno',
    'unfortunately': 'malangnya',
    'unhappy': 'tidak gembira',
    'up': 'naik',
    'upkan': 'naikkan',
    'ur': 'awak',
    'utk': 'untuk',
    'very': 'sangat',
    'viral': 'tular',
    'vote': 'undi',
    'warning': 'amaran',
    'warranty': 'waranti',
    'wassap': 'whatsapp',
    'wat': 'apa',
    'weii': 'wei',
    'well': 'maklumlah',
    'win': 'menang',
    'with': 'dengan',
    'wt': 'buat',
    'x': 'tak',
    'tw': 'tahu',
    'ye': 'ya',
    'yee': 'ya',
    'yg': 'yang',
    'yng': 'yang',
    'you': 'awak',
    'your': 'awak',
    'sakai': 'selekeh',
    'rmb': 'billion ringgit',
    'rmj': 'juta ringgit',
    'rmk': 'ribu ringgit',
    'rm': 'ringgit',
    ':*': '<kiss>',
    ':-*': '<kiss>',
    ':x': '<kiss>',
    ':-)': '<happy>',
    ':-))': '<happy>',
    ':-)))': '<happy>',
    ':-))))': '<happy>',
    ':-)))))': '<happy>',
    ':-))))))': '<happy>',
    ':)': '<happy>',
    ':))': '<happy>',
    ':)))': '<happy>',
    ':))))': '<happy>',
    ':)))))': '<happy>',
    ':))))))': '<happy>',
    ':)))))))': '<happy>',
    ':o)': '<happy>',
    ':]': '<happy>',
    ':3': '<happy>',
    ':c)': '<happy>',
    ':>': '<happy>',
    '=]': '<happy>',
    '8)': '<happy>',
    '=)': '<happy>',
    ':}': '<happy>',
    ':^)': '<happy>',
    '|;-)': '<happy>',
    ":'-)": '<happy>',
    ":')": '<happy>',
    '\o/': '<happy>',
    '*\\0/*': '<happy>',
    ':-D': '<laugh>',
    ':D': '<laugh>',
    '8-D': '<laugh>',
    '8D': '<laugh>',
    'x-D': '<laugh>',
    'xD': '<laugh>',
    'X-D': '<laugh>',
    'XD': '<laugh>',
    '=-D': '<laugh>',
    '=D': '<laugh>',
    '=-3': '<laugh>',
    '=3': '<laugh>',
    'B^D': '<laugh>',
    '>:[': '<sad>',
    ':-(': '<sad>',
    ':-((': '<sad>',
    ':-(((': '<sad>',
    ':-((((': '<sad>',
    ':-(((((': '<sad>',
    ':-((((((': '<sad>',
    ':-(((((((': '<sad>',
    ':(': '<sad>',
    ':((': '<sad>',
    ':(((': '<sad>',
    ':((((': '<sad>',
    ':(((((': '<sad>',
    ':((((((': '<sad>',
    ':(((((((': '<sad>',
    ':((((((((': '<sad>',
    ':-c': '<sad>',
    ':c': '<sad>',
    ':-<': '<sad>',
    ':<': '<sad>',
    ':-[': '<sad>',
    ':[': '<sad>',
    ':{': '<sad>',
    ':-||': '<sad>',
    ':@': '<sad>',
    ":'-(": '<sad>',
    ":'(": '<sad>',
    'D:<': '<sad>',
    'D:': '<sad>',
    'D8': '<sad>',
    'D;': '<sad>',
    'D=': '<sad>',
    'DX': '<sad>',
    'v.v': '<sad>',
    "D-':": '<sad>',
    '(>_<)': '<sad>',
    ':|': '<sad>',
    '>:O': '<surprise>',
    ':-O': '<surprise>',
    ':-o': '<surprise>',
    ':O': '<surprise>',
    '°o°': '<surprise>',
    'o_O': '<surprise>',
    'o_0': '<surprise>',
    'o.O': '<surprise>',
    'o-o': '<surprise>',
    '8-0': '<surprise>',
    '|-O': '<surprise>',
    ';-)': '<wink>',
    ';)': '<wink>',
    '*-)': '<wink>',
    '*)': '<wink>',
    ';-]': '<wink>',
    ';]': '<wink>',
    ';D': '<wink>',
    ';^)': '<wink>',
    ':-,': '<wink>',
    '>:P': '<tong>',
    ':-P': '<tong>',
    ':P': '<tong>',
    'X-P': '<tong>',
    'x-p': '<tong>',
    'xp': '<tong>',
    'XP': '<tong>',
    ':-p': '<tong>',
    ':p': '<tong>',
    '=p': '<tong>',
    ':-Þ': '<tong>',
    ':Þ': '<tong>',
    ':-b': '<tong>',
    ':b': '<tong>',
    ':-&': '<tong>',
    '>:\\': '<annoyed>',
    '>:/': '<annoyed>',
    ':-/': '<annoyed>',
    ':-.': '<annoyed>',
    ':/': '<annoyed>',
    ':\\': '<annoyed>',
    '=/': '<annoyed>',
    '=\\': '<annoyed>',
    ':L': '<annoyed>',
    '=L': '<annoyed>',
    ':S': '<annoyed>',
    '>.<': '<annoyed>',
    ':-|': '<annoyed>',
    '<:-|': '<annoyed>',
    ':-X': '<seallips>',
    ':X': '<seallips>',
    ':-#': '<seallips>',
    ':#': '<seallips>',
    'O:-)': '<angel>',
    '0:-3': '<angel>',
    '0:3': '<angel>',
    '0:-)': '<angel>',
    '0:)': '<angel>',
    '0;^)': '<angel>',
    '>:)': '<devil>',
    '>:D': '<devil>',
    '>:-D': '<devil>',
    '>;)': '<devil>',
    '>:-)': '<devil>',
    '}:-)': '<devil>',
    '}:)': '<devil>',
    '3:-)': '<devil>',
    '3:)': '<devil>',
    'o/\o': '<highfive>',
    '^5': '<highfive>',
    '>_>^': '<highfive>',
    '^<_<': '<highfive>',
    '<3': '<heart>',
}
stopwords_calon = [
    'datuk',
    'bin',
    'hj',
    'haji',
    'bn',
    'bnt',
    'prof',
    'binti',
    'dr',
    'ustaz',
    'mejar',
    'ir',
    'md',
    'tuan',
    'puan',
    'yb',
    'ustazah',
    'cikgu',
    'dato',
    'dsp',
]

calon_dictionary = {
    'dr': 'Doktor',
    'yb': 'Yang Berhormat',
    'hj': 'Haji',
    'ybm': 'Yang Berhormat Mulia',
    'tyt': 'Tuan Yang Terutama',
    'yab': 'Yang Berhormat',
    'ybm': 'Yang Berhormat Mulia',
    'yabhg': 'Yang Amat Berbahagia',
    'ybhg': 'Yang Berbahagia',
    'miss': 'Cik',
}
stopwords = [
    'ada',
    'inikah',
    'sampai',
    'adakah',
    'inilah',
    'sana',
    'adakan',
    'itu',
    'sangat',
    'adalah',
    'itukah',
    'sangatlah',
    'adanya',
    'itulah',
    'saya',
    'adapun',
    'jadi',
    'se',
    'agak',
    'jangan',
    'seandainya',
    'agar',
    'namun',
    'janganlah',
    'sebab',
    'akan',
    'cer',
    'jika',
    'sebagai',
    'aku',
    'usahlah',
    'begitu',
    'cuba',
    'jikalau',
    'sebagaimana',
    'akulah',
    'jua',
    'sebanyak',
    'akupun',
    'juapun',
    'dpt',
    'sebelum',
    'al',
    'juga',
    'sebelummu',
    'alangkah',
    'kalau',
    'sebelumnya',
    'allah',
    'kami',
    'sebenarnya',
    'amat',
    'tengku',
    'kamikah',
    'ckp',
    'mmg',
    'secara',
    'antara',
    'justeru',
    'kamipun',
    'sedang',
    'antaramu',
    'bin',
    'binti',
    'datuk',
    'dato',
    'jumlah',
    'kamu',
    'sedangkan',
    'antaranya',
    'kamukah',
    'sedikit',
    'apa',
    'kamupun',
    'sedikitpun',
    'apa-apa',
    'katakan',
    'segala',
    'dgn',
    'apabila',
    'ke',
    'takde',
    'kat',
    'takda',
    'sehingga',
    'apakah',
    'kecuali',
    'sejak',
    'apapun',
    'kelak',
    'sekalian',
    'atas',
    'tadi',
    'cer',
    'kembali',
    'sekalipun',
    'atasmu',
    'kemudian',
    'sekarang',
    'atasnya',
    'kepada',
    'sekitar',
    'atau',
    'kepadaku',
    'selain',
    'ataukah',
    'kepadakulah',
    'selalu',
    'ataupun',
    'kepadamu',
    'selama',
    'bagaimana',
    'kepadanya',
    'selama-lamanya',
    'bagaimanakah',
    'kepadanyalah',
    'seluruh',
    'bagi',
    'kerana',
    'seluruhnya',
    'bagimu',
    'kerananya',
    'sementara',
    'baginya',
    'kesan',
    'byk',
    'semua',
    'bahawa',
    'ketika',
    'semuanya',
    'bahawasanya',
    'wdir',
    'met',
    'dew',
    'kini',
    'haram',
    'haramm',
    'harem',
    'haremm',
    'semula',
    'bahkan',
    'manakala',
    'selepas',
    'kita',
    'senantiasa',
    'bahwa',
    'ku',
    'sendiri',
    'banyak',
    'kurang',
    'sentiasa',
    'banyaknya',
    'lagi',
    'seolah',
    'barangsiapa',
    'lain',
    'seolah-olah',
    'bawah',
    'lalu',
    'seorangpun',
    'beberapa',
    'ever',
    'got',
    'sane',
    'let',
    'eng',
    'dont',
    "'ve",
    'even',
    'lamanya',
    'separuh',
    'begitu',
    'langsung',
    'sepatutnya',
    'begitupun',
    'lebih',
    'seperti',
    'belaka',
    'maha',
    'seraya',
    'belum',
    'mahu',
    'sering',
    'belumkah',
    'mahukah',
    'pagi',
    'malam',
    'petang',
    'siang',
    'lepas',
    'awak',
    'serta',
    'berada',
    'mahupun',
    'seseorang',
    'berapa',
    'maka',
    'sesiapa',
    'berikan',
    'malah',
    'sesuatu',
    'beriman',
    'wasalam',
    'wsalam',
    'assalamualaikum',
    'salam',
    'assalam',
    'asalam',
    'waalaikumussalam',
    'mana',
    'sesudah',
    'berkenaan',
    'manakah',
    'satu',
    'dua',
    'tiga',
    'empat',
    'lima',
    'enam',
    'tujuh',
    'lapan',
    'sebilan',
    'sepuluh',
    'sebelas',
    'belas',
    'puluh',
    'ratus',
    'seratus',
    'seribu',
    'sejuta',
    'juta',
    'masa',
    'sesudahnya',
    'berupa',
    'manapun',
    'sesungguhnya',
    'beserta',
    'masih',
    'sesungguhnyakah',
    'biarpun',
    'masing',
    'guna',
    'setelah',
    'bila',
    'masing-masing',
    'setiap',
    'bilakah',
    'melainkan',
    'nk',
    'siapa',
    'meh',
    'bilamana',
    'memang',
    'siapakah',
    'lol',
    'macam',
    'tgh',
    'tengah',
    'atas',
    'bawah',
    'perghh',
    'pergh',
    'kiri',
    'buat',
    'leh',
    'kanan',
    'mcm',
    'bisa',
    'mempunyai',
    'sini',
    'boleh',
    'mendapat',
    'situ',
    'bukan',
    'mendapati',
    'situlah',
    'bukankah',
    'mendapatkan',
    'suatu',
    'as',
    'yg',
    'kpd',
    'bukanlah',
    'mengadakan',
    'sudah',
    'dahulu',
    'mengapa',
    'sudahkah',
    'dalam',
    'dlm',
    'mengapakah',
    'sungguh',
    'dalamnya',
    'mengenai',
    'sungguhpun',
    'dan',
    'menjadi',
    'supaya',
    'bole',
    'blum',
    'dapat',
    'menyebabkan',
    'tadinya',
    'dapati',
    'menyebabkannya',
    'tahukah',
    'dapatkah',
    'mereka',
    'jgn',
    'tak',
    'dapatlah',
    'kau',
    'merekalah',
    'tahun',
    'tanpa',
    'dari',
    'merekapun',
    'tanya',
    'daripada',
    'meskipun',
    'tanyakanlah',
    'daripadaku',
    'mu',
    'tapi',
    'daripadamu',
    'nescaya',
    'telah',
    'daripadanya',
    'niscaya',
    'tentang',
    'demi',
    'nya',
    'tentu',
    'demikian',
    'olah',
    'terdapat',
    'demikianlah',
    'oleh',
    'terhadap',
    'dengan',
    'orang',
    'terhadapmu',
    'dengannya',
    'pada',
    'dah',
    'den',
    'hoi',
    'huih',
    'jom',
    'joom',
    'tok',
    'bang',
    'abang',
    'kak',
    'kakak',
    'int',
    'jd',
    'atuk',
    'nenek',
    'ayah',
    'mak',
    'mama',
    'baba',
    'gg',
    'termasuk',
    'di',
    'padahal',
    'terpaksa',
    'dia',
    'padamu',
    'tertentu',
    'dialah',
    'padanya',
    'tetapi',
    'didapat',
    'paling',
    'tiada',
    'xkan',
    'xleh',
    'xtahu',
    'tahu',
    'helai',
    'ketul',
    'biar',
    'keb',
    'ust',
    'dorang',
    'ehh',
    'tetap',
    'tryna',
    'shit',
    'xda',
    'xde',
    'didapati',
    'para',
    'tiadakah',
    'dimanakah',
    'xkira',
    'bul',
    'pasti',
    'tiadalah',
    'engkau',
    'patut',
    'tiap',
    'engkaukah',
    'nak',
    'saja',
    'saje',
    'keje',
    'pastu',
    'pon',
    'pun',
    'keja',
    'patutkah',
    'tiap-tiap',
    'engkaulah',
    'per',
    'tidak',
    'disebabkan',
    'sebab',
    'engkaupun',
    'pergilah',
    'tidakkah',
    'hai',
    'perkara',
    'tidaklah',
    'hampir',
    'perkaranya',
    'turut',
    'hampir-hampir',
    'perlu',
    'bt',
    'bn',
    'tun',
    'haji',
    'untuk',
    'hanya',
    'pernah',
    "'s",
    'org',
    'untukmu',
    'hanyalah',
    'pertama',
    'wahai',
    'hendak',
    'woi',
    'wui',
    'pula',
    'hj',
    'photo',
    'video',
    'ir',
    'tuan',
    'yb',
    'puan',
    'walau',
    'prof',
    'hendaklah',
    'pun',
    'walaupun',
    'hingga',
    'sahaja',
    'keb',
    'bir',
    'tetap',
    'utk',
    'nah',
    'bar',
    'last',
    'ya',
    'tan',
    'wan',
    'sri',
    'dr',
    'ia',
    'sebaliknya',
    'adalah',
    'saja',
    'yaini',
    'iaitu',
    'saling',
    'yaitu',
    'ialah',
    'sama',
    'yakni',
    'ianya',
    'sama-sama',
    'yang',
    'inginkah',
    'samakah',
    'ini',
    'sambil',
    'beliau',
    'ada',
    'adalah',
    'adanya',
    'adapun',
    'agak',
    'agaknya',
    'agar',
    'akan',
    'akankah',
    'akhir',
    'akhiri',
    'akhirnya',
    'aku',
    'akulah',
    'amat',
    'amatlah',
    'anda',
    'andalah',
    'antar',
    'antara',
    'antaranya',
    'apa',
    'apaan',
    'apabila',
    'apakah',
    'apalagi',
    'apatah',
    'artinya',
    'asal',
    'asalkan',
    'atas',
    'atau',
    'ataukah',
    'ataupun',
    'awal',
    'awalnya',
    'bagai',
    'bagaikan',
    'bagaimana',
    'bagaimanakah',
    'bagaimanapun',
    'bagi',
    'bagian',
    'bahkan',
    'bahwa',
    'bahwasanya',
    'baik',
    'bakal',
    'bakalan',
    'balik',
    'banyak',
    'bapak',
    'baru',
    'bawah',
    'beberapa',
    'begini',
    'beginian',
    'beginikah',
    'beginilah',
    'begitu',
    'begitukah',
    'begitulah',
    'begitupun',
    'bekerja',
    'belakang',
    'belakangan',
    'belum',
    'belumlah',
    'benar',
    'benarkah',
    'benarlah',
    'berada',
    'berakhir',
    'berakhirlah',
    'berakhirnya',
    'berapa',
    'berapakah',
    'berapalah',
    'berapapun',
    'berarti',
    'berawal',
    'berbagai',
    'berdatangan',
    'beri',
    'berikan',
    'berikut',
    'berikutnya',
    'berjumlah',
    'berkali-kali',
    'berkata',
    'berkehendak',
    'berkeinginan',
    'berkenaan',
    'berlainan',
    'berlalu',
    'berlangsung',
    'berlebihan',
    'bermacam',
    'bermacam-macam',
    'bermaksud',
    'bermula',
    'bersama',
    'bersama-sama',
    'bersiap',
    'bersiap-siap',
    'bertanya',
    'bertanya-tanya',
    'berturut',
    'berturut-turut',
    'bertutur',
    'berujar',
    'berupa',
    'besar',
    'betul',
    'betulkah',
    'biasa',
    'biasanya',
    'bila',
    'bilakah',
    'bisa',
    'bisakah',
    'boleh',
    'bolehkah',
    'bolehlah',
    'buat',
    'bukan',
    'bukankah',
    'bukanlah',
    'bukannya',
    'bulan',
    'bung',
    'cara',
    'caranya',
    'cukup',
    'cukupkah',
    'cukuplah',
    'cuma',
    'dahulu',
    'dalam',
    'dan',
    'dapat',
    'dari',
    'daripada',
    'datang',
    'dekat',
    'demi',
    'demikian',
    'demikianlah',
    'dengan',
    'depan',
    'di',
    'dia',
    'diakhiri',
    'diakhirinya',
    'dialah',
    'diantara',
    'diantaranya',
    'diberi',
    'diberikan',
    'diberikannya',
    'dibuat',
    'dibuatnya',
    'didapat',
    'didatangkan',
    'digunakan',
    'diibaratkan',
    'diibaratkannya',
    'diingat',
    'diingatkan',
    'diinginkan',
    'dijawab',
    'dijelaskan',
    'dijelaskannya',
    'dikarenakan',
    'dikatakan',
    'dikatakannya',
    'dikerjakan',
    'diketahui',
    'diketahuinya',
    'dikira',
    'dilakukan',
    'dilalui',
    'dilihat',
    'dimaksud',
    'dimaksudkan',
    'dimaksudkannya',
    'dimaksudnya',
    'diminta',
    'dimintai',
    'dimisalkan',
    'dimulai',
    'dimulailah',
    'dimulainya',
    'dimungkinkan',
    'dini',
    'dipastikan',
    'diperbuat',
    'diperbuatnya',
    'dipergunakan',
    'diperkirakan',
    'diperlihatkan',
    'diperlukan',
    'diperlukannya',
    'dipersoalkan',
    'dipertanyakan',
    'dipunyai',
    'diri',
    'dirinya',
    'disampaikan',
    'disebut',
    'disebutkan',
    'disebutkannya',
    'disini',
    'disinilah',
    'ditambahkan',
    'ditandaskan',
    'ditanya',
    'ditanyai',
    'ditanyakan',
    'ditegaskan',
    'ditujukan',
    'ditunjuk',
    'ditunjuki',
    'ditunjukkan',
    'ditunjukkannya',
    'ditunjuknya',
    'dituturkan',
    'dituturkannya',
    'diucapkan',
    'diucapkannya',
    'diungkapkan',
    'dong',
    'dua',
    'dulu',
    'empat',
    'enggak',
    'enggaknya',
    'entah',
    'entahlah',
    'guna',
    'gunakan',
    'hal',
    'hampir',
    'hanya',
    'hanyalah',
    'hari',
    'harus',
    'haruslah',
    'harusnya',
    'hendak',
    'hendaklah',
    'hendaknya',
    'hingga',
    'ia',
    'ialah',
    'ibarat',
    'ibaratkan',
    'ibaratnya',
    'ibu',
    'ikut',
    'ingat',
    'ingat-ingat',
    'ingin',
    'inginkah',
    'inginkan',
    'ini',
    'inikah',
    'inilah',
    'itu',
    'itukah',
    'itulah',
    'jadi',
    'jadilah',
    'jadinya',
    'jangan',
    'jangankan',
    'janganlah',
    'jauh',
    'jawab',
    'jawaban',
    'jawabnya',
    'jelas',
    'jelaskan',
    'jelaslah',
    'jelasnya',
    'jika',
    'jikalau',
    'juga',
    'jumlah',
    'jumlahnya',
    'justru',
    'kala',
    'kalau',
    'kalaulah',
    'kalaupun',
    'kalian',
    'kami',
    'kamilah',
    'kamu',
    'kamulah',
    'kan',
    'kapan',
    'kapankah',
    'kapanpun',
    'karena',
    'karenanya',
    'kasus',
    'kata',
    'katakan',
    'katakanlah',
    'katanya',
    'ke',
    'keadaan',
    'kebetulan',
    'kecil',
    'kedua',
    'keduanya',
    'keinginan',
    'kelamaan',
    'kelihatan',
    'kelihatannya',
    'kelima',
    'keluar',
    'kembali',
    'kemudian',
    'kemungkinan',
    'kemungkinannya',
    'kenapa',
    'kepada',
    'kepadanya',
    'kesampaian',
    'keseluruhan',
    'keseluruhannya',
    'keterlaluan',
    'ketika',
    'khususnya',
    'kini',
    'kinilah',
    'kira',
    'kira-kira',
    'kiranya',
    'kita',
    'kitalah',
    'kok',
    'kurang',
    'lagi',
    'lagian',
    'lah',
    'lain',
    'lainnya',
    'lalu',
    'lama',
    'lamanya',
    'lanjut',
    'lanjutnya',
    'lebih',
    'lewat',
    'lima',
    'luar',
    'macam',
    'maka',
    'makanya',
    'makin',
    'malah',
    'malahan',
    'mampu',
    'mampukah',
    'mana',
    'manakala',
    'manalagi',
    'masa',
    'masalah',
    'masalahnya',
    'masih',
    'masihkah',
    'masing',
    'masing-masing',
    'mau',
    'maupun',
    'melainkan',
    'melakukan',
    'melalui',
    'melihat',
    'melihatnya',
    'memang',
    'memastikan',
    'memberi',
    'memberikan',
    'membuat',
    'memerlukan',
    'memihak',
    'meminta',
    'memintakan',
    'memisalkan',
    'memperbuat',
    'mempergunakan',
    'memperkirakan',
    'memperlihatkan',
    'mempersiapkan',
    'mempersoalkan',
    'mempertanyakan',
    'mempunyai',
    'memulai',
    'memungkinkan',
    'menaiki',
    'menambahkan',
    'menandaskan',
    'menanti',
    'menanti-nanti',
    'menantikan',
    'menanya',
    'menanyai',
    'menanyakan',
    'mendapat',
    'mendapatkan',
    'mendatang',
    'mendatangi',
    'mendatangkan',
    'menegaskan',
    'mengakhiri',
    'mengapa',
    'mengatakan',
    'mengatakannya',
    'mengenai',
    'mengerjakan',
    'mengetahui',
    'menggunakan',
    'menghendaki',
    'mengibaratkan',
    'mengibaratkannya',
    'mengingat',
    'mengingatkan',
    'menginginkan',
    'mengira',
    'mengucapkan',
    'mengucapkannya',
    'mengungkapkan',
    'menjadi',
    'menjawab',
    'menjelaskan',
    'menuju',
    'menunjuk',
    'menunjuki',
    'menunjukkan',
    'menunjuknya',
    'menurut',
    'menuturkan',
    'menyampaikan',
    'menyangkut',
    'menyatakan',
    'menyebutkan',
    'menyeluruh',
    'menyiapkan',
    'merasa',
    'mereka',
    'merekalah',
    'merupakan',
    'meski',
    'meskipun',
    'meyakini',
    'meyakinkan',
    'minta',
    'mirip',
    'misal',
    'misalkan',
    'misalnya',
    'mula',
    'mulai',
    'mulailah',
    'mulanya',
    'mungkin',
    'mungkinkah',
    'nah',
    'naik',
    'namun',
    'nanti',
    'nantinya',
    'nyaris',
    'nyatanya',
    'oleh',
    'olehnya',
    'pada',
    'padahal',
    'padanya',
    'pak',
    'paling',
    'panjang',
    'pantas',
    'para',
    'pasti',
    'pastilah',
    'penting',
    'pentingnya',
    'per',
    'percuma',
    'perlu',
    'perlukah',
    'perlunya',
    'pernah',
    'persoalan',
    'pertama',
    'pertama-tama',
    'pertanyaan',
    'pertanyakan',
    'pihak',
    'pihaknya',
    'pukul',
    'pula',
    'pun',
    'punya',
    'rasa',
    'rasanya',
    'rata',
    'rupanya',
    'saat',
    'saatnya',
    'saja',
    'sajalah',
    'saling',
    'sama',
    'sama-sama',
    'sambil',
    'sampai',
    'sampai-sampai',
    'sampaikan',
    'sana',
    'sangat',
    'sangatlah',
    'satu',
    'saya',
    'sayalah',
    'se',
    'sebab',
    'sebabnya',
    'sebagai',
    'sebagaimana',
    'sebagainya',
    'sebagian',
    'sebaik',
    'sebaik-baiknya',
    'sebaiknya',
    'sebaliknya',
    'sebanyak',
    'sebegini',
    'sebegitu',
    'sebelum',
    'sebelumnya',
    'sebenarnya',
    'seberapa',
    'sebesar',
    'sebetulnya',
    'sebisanya',
    'sebuah',
    'sebut',
    'sebutlah',
    'sebutnya',
    'secara',
    'secukupnya',
    'sedang',
    'sedangkan',
    'sedemikian',
    'sedikit',
    'sedikitnya',
    'seenaknya',
    'segala',
    'segalanya',
    'segera',
    'seharusnya',
    'sehingga',
    'seingat',
    'sejak',
    'sejauh',
    'sejenak',
    'sejumlah',
    'sekadar',
    'sekadarnya',
    'sekali',
    'sekali-kali',
    'sekalian',
    'sekaligus',
    'sekalipun',
    'sekarang',
    'sekarang',
    'sekecil',
    'seketika',
    'sekiranya',
    'sekitar',
    'sekitarnya',
    'sekurang-kurangnya',
    'sekurangnya',
    'sela',
    'selain',
    'selaku',
    'selalu',
    'selama',
    'selama-lamanya',
    'selamanya',
    'selanjutnya',
    'seluruh',
    'seluruhnya',
    'semacam',
    'semakin',
    'semampu',
    'semampunya',
    'semasa',
    'semasih',
    'semata',
    'semata-mata',
    'semaunya',
    'sementara',
    'semisal',
    'semisalnya',
    'sempat',
    'semua',
    'semuanya',
    'semula',
    'sendiri',
    'sendirian',
    'sendirinya',
    'seolah',
    'seolah-olah',
    'seorang',
    'sepanjang',
    'sepantasnya',
    'sepantasnyalah',
    'seperlunya',
    'seperti',
    'sepertinya',
    'sepihak',
    'sering',
    'seringnya',
    'serta',
    'serupa',
    'sesaat',
    'sesama',
    'sesampai',
    'sesegera',
    'sesekali',
    'seseorang',
    'sesuatu',
    'sesuatunya',
    'sesudah',
    'sesudahnya',
    'setelah',
    'setempat',
    'setengah',
    'seterusnya',
    'setiap',
    'setiba',
    'setibanya',
    'setidak-tidaknya',
    'setidaknya',
    'setinggi',
    'seusai',
    'sewaktu',
    'siap',
    'siapa',
    'siapakah',
    'siapapun',
    'sini',
    'sinilah',
    'soal',
    'soalnya',
    'suatu',
    'sudah',
    'sudahkah',
    'sudahlah',
    'supaya',
    'tadi',
    'tadinya',
    'tahu',
    'tahun',
    'tak',
    'tambah',
    'tambahnya',
    'tampak',
    'tampaknya',
    'tandas',
    'tandasnya',
    'tanpa',
    'tanya',
    'tanyakan',
    'tanyanya',
    'tapi',
    'tegas',
    'tegasnya',
    'telah',
    'tempat',
    'tengah',
    'tentang',
    'tentu',
    'tentulah',
    'tentunya',
    'tepat',
    'terakhir',
    'terasa',
    'terbanyak',
    'terdahulu',
    'terdapat',
    'terdiri',
    'terhadap',
    'terhadapnya',
    'teringat',
    'teringat-ingat',
    'terjadi',
    'terjadilah',
    'terjadinya',
    'terkira',
    'terlalu',
    'terlebih',
    'terlihat',
    'termasuk',
    'ternyata',
    'tersampaikan',
    'tersebut',
    'tersebutlah',
    'tertentu',
    'tertuju',
    'terus',
    'terutama',
    'tetap',
    'tetapi',
    'tiap',
    'tiba',
    'tiba-tiba',
    'tidak',
    'tidakkah',
    'tidaklah',
    'tiga',
    'tinggi',
    'toh',
    'tunjuk',
    'turut',
    'tutur',
    'tuturnya',
    'ucap',
    'ucapnya',
    'ujar',
    'ujarnya',
    'umum',
    'umumnya',
    'ungkap',
    'ungkapnya',
    'untuk',
    'usah',
    'usai',
    'waduh',
    'wah',
    'wahai',
    'waktu',
    'waktunya',
    'walau',
    'walaupun',
    'wong',
    'yaitu',
    'yakin',
    'yakni',
    'yang',
]

_ltr_emoticon = [
    # optional hat
    r'(?:(?<![a-zA-Z])[DPO]|(?<!\d)[03]|[|}><=])?',
    # eyes
    r'(?:(?<![a-zA-Z\(])[xXB](?![a-ce-oq-zA-CE-OQ-Z,\.\/])|(?<![:])[:=|](?![\.])|(?<![%#\d])[%#](?![%#\d])|(?<![\d\$])[$](?![\d\.,\$])|[;](?!\()|(?<![\d\(\-\+])8(?![\da-ce-zA-CE-Z\\/])|\*(?![\*\d,.]))',
    # optional tears
    r"(?:['\",])?",
    # optional nose
    r'(?:(?<![\w*])[oc](?![a-zA-Z])|(?:[-‑^]))?',
    # mouth
    r'(?:[(){}\[\]<>|/\\]+|[Þ×þ]|(?<!\d)[30](?!\d)|(?<![\d\*])[*,.@#&](?![\*\d,.])|(?<![\d\$])[$](?![\d\.,\$])|[DOosSJLxXpPbc](?![a-zA-Z]))',
]

_rtl_emoticon = [
    r'(?<![\w])',
    r'(?:[(){}\[\]<>|/\\]+|(?<![\d\.\,])[0](?![\d\.])|(?![\d\*,.@#&])[*,.@#&]|[$]|(?<![a-zA-Z])[DOosSxX])',
    # mouth
    r'(?:[-‑^])?',  # optional nose
    r"(?:['\",])?",  # optional tears
    r'(?:[xX]|[:=|]|[%#]|[$8](?![\d\.])|[;]|\*)',  # eyes
    r'(?:[O]|[0]|[|{><=])?',  # optional hat
    r'(?![a-zA-Z])',
]

_LTR_FACE = ''.join(_ltr_emoticon)
_RTL_FACE = ''.join(_rtl_emoticon)

_short_date = r'(?:\b(?<!\d\.)(?:(?:(?:[0123]?[0-9][\.\-\/])?[0123]?[0-9][\.\-\/][12][0-9]{3})|(?:[0123]?[0-9][\.\-\/][0123]?[0-9][\.\-\/][12]?[0-9]{2,3}))(?!\.\d)\b)'
_full_date_parts = [
    # prefix
    r'(?:(?<!:)\b\'?\d{1,4},? ?)',
    r'\b(?:[Jj]an(?:uari)?|[Ff]eb(?:ruari)?|[Mm]a(?:c)?|[Aa]pr(?:il)?|Mei|[Jj]u(?:n)?|[Jj]ula(?:i)?|[Aa]ug(?:ust)?|[Ss]ept?(?:ember)?|[Oo]kt(?:ober)?|[Nn]ov(?:ember)?|[Dd]is(?:ember)?)\b',
    r'(?:(?:,? ?\'?)?\d{1,4}(?:st|nd|rd|n?th)?\b(?:[,\/]? ?\'?\d{2,4}[a-zA-Z]*)?(?: ?- ?\d{2,4}[a-zA-Z]*)?(?!:\d{1,4})\b)',
]
_fd1 = '(?:{})'.format(
    ''.join(
        [_full_date_parts[0] + '?', _full_date_parts[1], _full_date_parts[2]]
    )
)
_fd2 = '(?:{})'.format(
    ''.join(
        [_full_date_parts[0], _full_date_parts[1], _full_date_parts[2] + '?']
    )
)
_date = '(?:' + '(?:' + _fd1 + '|' + _fd2 + ')' + '|' + _short_date + ')'

_number = r"\b\d+(?:[\.,']\d+)?\b"
_percentage = _number + '%'
_money = r"(?:(?:[$€£¢]|RM|rm)\d+(?:[\.,']\d+)?(?:[MmKkBb](?:n|(?:il(?:lion)?))?)?)|(?:\d+(?:[\.,']\d+)?(?:[$€£¢]|sen))"

_expressions = {
    'hashtag': r'\#\b[\w\-\_]+\b',
    'cashtag': r'(?<![A-Z])\$[A-Z]+\b',
    'tag': r'<[\/]?\w+[\/]?>',
    'user': r'\@\w+',
    'emphasis': r'(?:\*\b\w+\b\*)',
    'censored': r'(?:\b\w+\*+\w+\b)',
    'acronym': r'\b(?:[A-Z]\.)(?:[A-Z]\.)+(?:\.(?!\.))?(?:[A-Z]\b)?',
    'elongated': r'\b[A-Za-z]*([a-zA-Z])\1\1[A-Za-z]*\b',
    'rtl_face': _RTL_FACE,
    'ltr_face': _LTR_FACE,
    'eastern_emoticons': r'(?<![\w])(?:(?:[<>]?[\^;][\W_m][\;^][;<>]?)|(?:[^\s()]?m?[\(][\W_oTOJ]{1,3}[\s]?[\W_oTOJ]{1,3}[)]m?[^\s()]?)|(?:\*?[v>\-\/\\][o0O\_\.][v\-<\/\\]\*?)|(?:[oO0>][\-_\/oO\.\\]{1,2}[oO0>])|(?:\^\^))(?![\w])',
    'rest_emoticons': r'(?<![A-Za-z0-9/()])(?:(?:\^5)|(?:\<3))(?![[A-Za-z0-9/()])',
    # from https://github.com/mathiasbynens/emoji-regex/blob/master/text.js
    'emoji': r'(?:\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]\uFE0F|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDD1-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])?|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])\uFE0F?)',
    # "EMOJI": r"(?:[\u00A9\u00AE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9-\u21AA\u231A-\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA-\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614-\u2615\u2618\u261D\u2620\u2622-\u2623\u2626\u262A\u262E-\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665-\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B-\u269C\u26A0-\u26A1\u26AA-\u26AB\u26B0-\u26B1\u26BD-\u26BE\u26C4-\u26C5\u26C8\u26CE-\u26CF\u26D1\u26D3-\u26D4\u26E9-\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733-\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763-\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934-\u2935\u2B05-\u2B07\u2B1B-\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|(?:\uD83C[\uDC04\uDCCF\uDD70-\uDD71\uDD7E-\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01-\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50-\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96-\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F-\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95-\uDD96\uDDA4-\uDDA5\uDDA8\uDDB1-\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB-\uDEEC\uDEF0\uDEF3-\uDEF6]|\uD83E[\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]))",
    'quotes': r'\"(\\.|[^\"]){2,}\"',
    'percent': _percentage,
    'repeat_puncts': r'([!?.]){2,}',
    'money': _money,
    'email': r'(?:^|(?<=[^\w@.)]))(?:[\w+-](?:\.(?!\.))?)*?[\w+-]@(?:\w-?)*?\w+(?:\.(?:[a-z]{2,})){1,3}(?:$|(?=\b))',
    'phone': r'(?<![0-9])(?:\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}(?![0-9])',
    'number': _number,
    'allcaps': r'(?<![#@$])\b([A-Z][A-Z ]{1,}[A-Z])\b',
    'url': r'(?:https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})',
    'date': _date,
    'time': r'(?:(?:\d+)?\.?\d+(?:AM|PM|am|pm|a\.m\.|p\.m\.))|(?:(?:[0-2]?[0-9]|[2][0-3]):(?:[0-5][0-9])(?::(?:[0-5][0-9]))?(?: ?(?:AM|PM|am|pm|a\.m\.|p\.m\.))?)',
    # "CAMEL_SPLIT": '((?<=[a-z])[A-Z]|(?<!\A)[A-Z](?=[a-z]))',
    # r'((?<=[a-z])[A-Z]|(?<=[A-Z][A-Z])[a-z]|(?<!^)(?<![A-Z])[A-Z](?=[a-z])|[0-9]+|(?<=[0-9\-\_])[A-Za-z]|[\-\_])',
    'camel_split': r'((?<=[a-z])[A-Z]|(?<!^)[A-Z](?=[a-z])|[0-9]+|(?<=[0-9\-\_])[A-Za-z]|[\-\_])',
    # REGEX_NORMALIZE_ELONG = '(.)\1+')
    'normalize_elong': r'(.)\1{2,}',
    'word': r'(?:[\w_]+)',
}
