hoang1007 commited on
Commit
44db343
1 Parent(s): 5ada341

Upload 69 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitignore +3 -0
  2. __init__.py +0 -0
  3. __pycache__/params.cpython-310.pyc +0 -0
  4. app.py +62 -0
  5. correct.py +69 -0
  6. data/binhvq/binhvq.vocab.pkl +3 -0
  7. data/binhvq/sentences.txt +0 -0
  8. data/checkpoints/tfmwtr/binhvq.weights.pth +3 -0
  9. dataset/__init__.py +0 -0
  10. dataset/__pycache__/__init__.cpython-310.pyc +0 -0
  11. dataset/__pycache__/autocorrect_dataset.cpython-310.pyc +0 -0
  12. dataset/__pycache__/noise.cpython-310.pyc +0 -0
  13. dataset/__pycache__/vocab.cpython-310.pyc +0 -0
  14. dataset/autocorrect_dataset.py +16 -0
  15. dataset/cleandata.sh +28 -0
  16. dataset/data_generation/all-vietnamese-syllables.txt +0 -0
  17. dataset/data_generation/all_nguyen_am_ba.py +44 -0
  18. dataset/data_generation/all_nguyen_am_don.py +26 -0
  19. dataset/data_generation/all_nguyen_am_hai.py +47 -0
  20. dataset/data_generation/all_phu_am_daucuoi.py +78 -0
  21. dataset/data_generation/common-vietnamese-syllables.txt +7184 -0
  22. dataset/data_generation/confusion_set.py +262 -0
  23. dataset/data_generation/keyboard_neighbor.py +79 -0
  24. dataset/data_generation/normalize.py +183 -0
  25. dataset/data_generation/typing_error_gen.py +13 -0
  26. dataset/log/prepare_data.log +0 -0
  27. dataset/noise.py +655 -0
  28. dataset/noising_resources/accents.json +498 -0
  29. dataset/noising_resources/confusion_set.json +0 -0
  30. dataset/noising_resources/homo_leter.json +27 -0
  31. dataset/noising_resources/kieu_go_dau_cu_moi.txt +78 -0
  32. dataset/noising_resources/typo.json +650 -0
  33. dataset/prepare_dataset.py +310 -0
  34. dataset/prepare_vsec.py +46 -0
  35. dataset/util.py +128 -0
  36. dataset/vocab.py +188 -0
  37. models/__init__.py +0 -0
  38. models/__pycache__/__init__.cpython-310.pyc +0 -0
  39. models/__pycache__/collator.cpython-310.pyc +0 -0
  40. models/__pycache__/corrector.cpython-310.pyc +0 -0
  41. models/__pycache__/model.cpython-310.pyc +0 -0
  42. models/__pycache__/sampler.cpython-310.pyc +0 -0
  43. models/__pycache__/tokenizer.cpython-310.pyc +0 -0
  44. models/__pycache__/transformer.cpython-310.pyc +0 -0
  45. models/__pycache__/util.cpython-310.pyc +0 -0
  46. models/collator.py +78 -0
  47. models/corrector.py +170 -0
  48. models/model.py +22 -0
  49. models/sampler.py +99 -0
  50. models/tokenizer.py +55 -0
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ data
2
+ __pycache__
3
+ log
__init__.py ADDED
File without changes
__pycache__/params.cpython-310.pyc ADDED
Binary file (539 Bytes). View file
 
app.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Union
2
+
3
+ import sys
4
+ sys.path.append("..")
5
+ from params import *
6
+ from dataset.vocab import Vocab
7
+ from models.corrector import Corrector
8
+ from models.model import ModelWrapper
9
+ from models.util import load_weights
10
+ from dataset.noise import SynthesizeData
11
+ from utils.api_utils import correctFunction, postprocessing_result
12
+
13
+
14
+ model_name = "tfmwtr"
15
+ dataset = "binhvq"
16
+ vocab_path = f'data/{dataset}/{dataset}.vocab.pkl'
17
+ weight_path = f'data/checkpoints/tfmwtr/{dataset}.weights.pth'
18
+ vocab = Vocab("vi")
19
+ vocab.load_vocab_dict(vocab_path)
20
+ noiser = SynthesizeData(vocab)
21
+ model_wrapper = ModelWrapper(f"{model_name}", vocab)
22
+ corrector = Corrector(model_wrapper)
23
+ load_weights(corrector.model, weight_path)
24
+
25
+ def correct(string: str):
26
+ out = correctFunction(string, corrector)
27
+ result = postprocessing_result(out)
28
+
29
+ ret = []
30
+ for r in result:
31
+ r = [s.strip() for s in r if isinstance(s, str)]
32
+
33
+ if len(r) == 2:
34
+ ret.append((r[0], r[1]))
35
+ else:
36
+ ret.append((r[0], None))
37
+ ret.append((" ", None))
38
+ ret.pop()
39
+ print(ret, "RET")
40
+ return ret
41
+
42
+ import gradio as gr
43
+ if __name__ == "__main__":
44
+ css = """
45
+ #output {
46
+ .label {
47
+ background-color: green !important;
48
+ }
49
+ }
50
+ """
51
+ gr.Interface(
52
+ correct,
53
+ inputs=gr.Textbox(label="Input", placeholder="Enter text to be corrected here..."),
54
+ outputs=gr.HighlightedText(
55
+ label="Output",
56
+ combine_adjacent=True,
57
+ show_label=True,
58
+ elem_id="output"
59
+ ),
60
+ theme=gr.themes.Default(),
61
+ css=css
62
+ ).launch()
correct.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from params import *
3
+ from dataset.vocab import Vocab
4
+ from dataset.util import load_dataset, load_vsec_dataset
5
+
6
+ if __name__ == "__main__":
7
+ import argparse
8
+
9
+ description = '''
10
+ Corrector:
11
+
12
+ Usage: python corrector.py --model tfmwtr --data_path ./data --dataset binhvq
13
+
14
+ Params:
15
+ --model
16
+ tfmwtr - Transformer with Tokenization Repair
17
+ --data_path: default to ./data
18
+ --dataset: default to 'binhvq'
19
+
20
+ '''
21
+ parser = argparse.ArgumentParser(description=description)
22
+ parser.add_argument('--model', type=str, default='tfmwtr')
23
+ parser.add_argument('--data_path', type=str, default='./data')
24
+ parser.add_argument('--dataset', type=str, default='binhvq')
25
+ parser.add_argument('--test_dataset', type=str, default='binhvq')
26
+ parser.add_argument("--beams", type=int, default=2)
27
+ parser.add_argument("--fraction", type=float, default= 1.0)
28
+ parser.add_argument('--text', type=str, default='Bình mnh ơi day ch ưa, café xáng vớitôi dược không?')
29
+ args = parser.parse_args()
30
+
31
+ dataset_path = os.path.join(args.data_path, f'{args.test_dataset}')
32
+
33
+ weight_ext = 'pth'
34
+
35
+ checkpoint_dir = os.path.join(args.data_path, f'checkpoints/{args.model}')
36
+
37
+ weight_path = os.path.join(checkpoint_dir, f'{args.dataset}.weights.{weight_ext}')
38
+ vocab_path = os.path.join(args.data_path, f'binhvq/binhvq.vocab.pkl')
39
+
40
+ correct_file = f'{args.test_dataset}.test'
41
+ incorrect_file = f'{args.test_dataset}.test.noise'
42
+ length_file = f'{args.dataset}.length.test'
43
+
44
+ if args.test_dataset != "vsec":
45
+ test_data = load_dataset(base_path=dataset_path, corr_file=correct_file, incorr_file=incorrect_file,
46
+ length_file=length_file)
47
+ else:
48
+ test_data = load_vsec_dataset(base_path=dataset_path, corr_file=correct_file, incorr_file=incorrect_file)
49
+
50
+ length_of_data = len(test_data)
51
+ test_data = test_data[0 : int(args.fraction * length_of_data) ]
52
+
53
+ vocab = Vocab()
54
+ vocab.load_vocab_dict(vocab_path)
55
+
56
+ from dataset.autocorrect_dataset import SpellCorrectDataset
57
+ from models.corrector import Corrector
58
+ from models.model import ModelWrapper
59
+ from models.util import load_weights
60
+
61
+ test_dataset = SpellCorrectDataset(dataset=test_data)
62
+
63
+ model_wrapper = ModelWrapper(args.model, vocab)
64
+
65
+ corrector = Corrector(model_wrapper)
66
+
67
+ load_weights(corrector.model, weight_path)
68
+
69
+ corrector.evaluate(test_dataset, beams = args.beams)
data/binhvq/binhvq.vocab.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3f2d12d2fe63b67c7f8138c5a1e2a19c90c06bc8f0df4da127a3d1b1a0a5bece
3
+ size 2155566
data/binhvq/sentences.txt ADDED
The diff for this file is too large to render. See raw diff
 
data/checkpoints/tfmwtr/binhvq.weights.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a64a21d18d2faf349e84cea71ea045d9698a6520bf5fdee6aefb559848693401
3
+ size 600250423
dataset/__init__.py ADDED
File without changes
dataset/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (163 Bytes). View file
 
dataset/__pycache__/autocorrect_dataset.cpython-310.pyc ADDED
Binary file (1.2 kB). View file
 
dataset/__pycache__/noise.cpython-310.pyc ADDED
Binary file (18.1 kB). View file
 
dataset/__pycache__/vocab.cpython-310.pyc ADDED
Binary file (6.53 kB). View file
 
dataset/autocorrect_dataset.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import numpy as np
3
+
4
+ class SpellCorrectDataset(torch.utils.data.Dataset):
5
+ def __init__(self, dataset):
6
+ self.dataset = dataset
7
+
8
+ def __getitem__(self, idx):
9
+ return self.dataset[idx]
10
+
11
+ def __len__(self):
12
+ return len(self.dataset)
13
+
14
+ def take(self, n = 1):
15
+ indies = np.random.choice(len(self.dataset), n)
16
+ return [self.dataset[idx] for idx in indies]
dataset/cleandata.sh ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ corpus=$1
3
+ root=../data/$1/
4
+ echo "Clean corpus $1"
5
+ cat $root$corpus.train[0-9]* > $root$corpus.train
6
+ rm -r $root$corpus.train[0-9]*
7
+ cat $root$corpus.test[0-9]* > $root$corpus.test
8
+ rm -r $root$corpus.test[0-9]*
9
+ cat $root$corpus.train.noise[0-9]* > $root$corpus.train.noise
10
+ rm -r $root$corpus.train.noise[0-9]*
11
+ cat $root$corpus.test.noise[0-9]* > $root$corpus.test.noise
12
+ rm -r $root$corpus.test.noise[0-9]*
13
+ cat $root$corpus.length.train[0-9]* > $root$corpus.length.train
14
+ rm -r $root$corpus.length.train[0-9]*
15
+ cat $root$corpus.length.test[0-9]* > $root$corpus.length.test
16
+ rm -r $root$corpus.length.test[0-9]*
17
+ cat $root$corpus.valid.noise[0-9]* > $root$corpus.valid.noise
18
+ rm -r $root$corpus.valid.noise[0-9]*
19
+ cat $root$corpus.length.valid[0-9]* > $root$corpus.length.valid
20
+ rm -r $root$corpus.length.valid[0-9]*
21
+ cat $root$corpus.valid[0-9]* > $root$corpus.valid
22
+ rm -r $root$corpus.valid[0-9]*
23
+ cat $root$corpus.onehot.test[0-9]* > $root$corpus.onehot.test
24
+ rm -r $root$corpus.onehot.test[0-9]*
25
+ cat $root$corpus.onehot.train[0-9]* > $root$corpus.onehot.train
26
+ rm -r $root$corpus.onehot.train[0-9]*
27
+ cat $root$corpus.onehot.valid[0-9]* > $root$corpus.onehot.valid
28
+ rm -r $root$corpus.onehot.valid[0-9]*
dataset/data_generation/all-vietnamese-syllables.txt ADDED
The diff for this file is too large to render. See raw diff
 
dataset/data_generation/all_nguyen_am_ba.py ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from normalize import chuan_hoa_dau_tu_tieng_viet
3
+ import numpy as np
4
+ from keyboard_neighbor import getKeyboardNeighbors
5
+
6
+ with open("common-vietnamese-syllables.txt", "r") as file:
7
+ vi_syllables = [line.strip("\n") for line in file.readlines()]
8
+
9
+ vi_syllables_new = []
10
+ for syllable in vi_syllables:
11
+ normalized = chuan_hoa_dau_tu_tieng_viet(syllable)
12
+ vi_syllables_new.append(normalized)
13
+
14
+ nguyen_am_ba = 'oai|oao|uao|oeo|iêu|yêu|uôi|ươu|uyu|uyê|ươi|oay|uây|ươi|uya'
15
+
16
+ keyboardNeighbors = getKeyboardNeighbors()
17
+ for key in keyboardNeighbors.keys():
18
+ keyboardNeighbors[key] = keyboardNeighbors[key][0][np.argmax(keyboardNeighbors[key][1])]
19
+
20
+ result = set()
21
+ for am_ba in nguyen_am_ba.split("|"):
22
+ result.add(am_ba)
23
+ if am_ba == "uyê":
24
+ for candidate in keyboardNeighbors[am_ba[2]]:
25
+ result.add(am_ba[0] + am_ba[1] + candidate)
26
+ else:
27
+ for candidate in keyboardNeighbors[am_ba[1]]:
28
+ result.add(am_ba[0] + candidate + am_ba[2])
29
+
30
+ remove_list = set()
31
+ for syllable in result:
32
+ for idx in range(len(vi_syllables_new)):
33
+ if syllable in vi_syllables_new[idx]:
34
+ break
35
+
36
+ if idx == len(vi_syllables_new) - 1:
37
+ remove_list.add(syllable)
38
+
39
+ for el in remove_list:
40
+ result.discard(el)
41
+
42
+ print("|".join(result))
43
+
44
+
dataset/data_generation/all_nguyen_am_don.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from normalize import chuan_hoa_dau_tu_tieng_viet
3
+ from keyboard_neighbor import getKeyboardNeighbors
4
+ import numpy as np
5
+
6
+ with open("common-vietnamese-syllables.txt", "r") as file:
7
+ vi_syllables = [line.strip("\n") for line in file.readlines()]
8
+
9
+ vi_syllables_new = []
10
+ for syllable in vi_syllables:
11
+ normalized = chuan_hoa_dau_tu_tieng_viet(syllable)
12
+ vi_syllables_new.append(normalized)
13
+
14
+ nguyen_am_don = 'a|ă|â|e|ê|i|y|o|ô|ơ|u|ư'
15
+
16
+ keyboardNeighbors = getKeyboardNeighbors()
17
+ for key in keyboardNeighbors.keys():
18
+ keyboardNeighbors[key] = keyboardNeighbors[key][0][np.argmax(keyboardNeighbors[key][1])]
19
+
20
+ result = set()
21
+ for am_don in nguyen_am_don.split("|"):
22
+ result.add(am_don)
23
+ for candidate in keyboardNeighbors[am_don]:
24
+ result.add(candidate)
25
+
26
+ print("|".join(result))
dataset/data_generation/all_nguyen_am_hai.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from normalize import chuan_hoa_dau_tu_tieng_viet
3
+ from keyboard_neighbor import getKeyboardNeighbors
4
+ import numpy as np
5
+
6
+ with open("common-vietnamese-syllables.txt", "r") as file:
7
+ vi_syllables = [line.strip("\n") for line in file.readlines()]
8
+
9
+ vi_syllables_new = []
10
+ for syllable in vi_syllables:
11
+ normalized = chuan_hoa_dau_tu_tieng_viet(syllable)
12
+ vi_syllables_new.append(normalized)
13
+
14
+ nguyen_am_doi = 'ai|ao|au|ay|âu|ây|êu|eo|ia|iê|yê|iu|oă|oa|oi|oe|oo|ôô|ơi|uă|uâ|ue|ua|ui|ưi|uo|ươ|ưu|uơ|uy|ưa|ôi|uô|uê'
15
+
16
+ no_end_phu_am = 'ưu|ưi|ui|ưa|ơi|ôi|oi|iu|ia|êu|eo|ây|ay|âu|au|ao|ai'
17
+ must_end_phu_am = "yê|ươ|uô|uâ|iê|â"
18
+
19
+ keyboardNeighbors = getKeyboardNeighbors()
20
+ for key in keyboardNeighbors.keys():
21
+ keyboardNeighbors[key] = keyboardNeighbors[key][0][np.argmax(keyboardNeighbors[key][1])]
22
+
23
+
24
+ result = set()
25
+ for am_doi in nguyen_am_doi.split("|"):
26
+ result.add(am_doi)
27
+ if am_doi not in must_end_phu_am:
28
+ for candidate in keyboardNeighbors[am_doi[0]]:
29
+ result.add(candidate + am_doi[1])
30
+ if am_doi not in no_end_phu_am:
31
+ for candidate in keyboardNeighbors[am_doi[1]]:
32
+ result.add(am_doi[0] + candidate)
33
+
34
+
35
+ remove_list = set()
36
+ for syllable in result:
37
+ for idx in range(len(vi_syllables_new)):
38
+ if syllable in vi_syllables_new[idx]:
39
+ break
40
+
41
+ if idx == len(vi_syllables_new) - 1:
42
+ remove_list.add(syllable)
43
+
44
+ for el in remove_list:
45
+ result.discard(el)
46
+
47
+ print("|".join(result))
dataset/data_generation/all_phu_am_daucuoi.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from normalize import chuan_hoa_dau_tu_tieng_viet
3
+ import numpy as np
4
+
5
+ with open("common-vietnamese-syllables.txt", "r") as file:
6
+ vi_syllables = [line.strip("\n") for line in file.readlines()]
7
+
8
+
9
+ vi_syllables_new = []
10
+ for syllable in vi_syllables:
11
+ normalized = chuan_hoa_dau_tu_tieng_viet(syllable)
12
+ vi_syllables_new.append(normalized)
13
+
14
+ regex_am_ba = "ười|oeo|uyễ|uồi|ươi|uyê|uôi|ướu|oải|uyệ|oẹo|ưới|iễu|uối|yếu|oại|ưỡi|iêu|ưởi|oèo|uya|oáy|uổi|uỷu|uyế|uyể|ượu|uội|uao|uầy|uào|uẫy|ươu|yểu|oai|uyề|oài|uậy|iều|uỵu|iếu|oay|yều|uấy|oái|iểu|uẩy|yêu|uỗi|iệu|uây|ượi"
15
+ regex_am_hai = "áo|ay|ùy|ại|ậu|ỡi|èo|ọi|ào|ao|uấ|ãy|uề|uy|ảu|oạ|iê|ái|ảy|ội|ựa|ẻo|ời|ôi|iệ|oỏ|ủi|ía|oẻ|uệ|ọe|ẫy|ơi|ồi|uẹ|ũy|ấy|ủa|ùa|ỗi|ượ|uý|eo|ấu|ễu|iề|ướ|ưu|ụi|ụy|iễ|uỗ|âu|uồ|ửi|uã|ạo|ây|ia|ìa|àu|ểu|uả|oả|oo|ếu|ĩa|ué|ẽo|oà|uộ|ue|oẹ|uâ|ịu|uố|íu|yể|òe|uằ|uẳ|ùi|au|uo|iu|ựu|iể|uẽ|uở|õi|éo|ão|ới|uậ|uỹ|ìu|yệ|oặ|ui|ầy|yế|áu|óa|yê|ợi|oe|oè|ẫu|uơ|oó|uá|ửu|úa|uầ|ưở|ỏe|ĩu|oé|uể|ậy|úi|ỏi|uà|ủy|oằ|ữa|oã|ửa|uớ|oă|ổi|oò|uă|uắ|uờ|ườ|úy|ữu|ối|uó|oi|ừu|oá|ởi|ừa|ũi|ải|yề|ỉa|uặ|ưa|òa|òi|ệu|ạy|uổ|ịa|uê|ạu|ụa|ãi|oọ|ài|oẳ|uỷ|ưỡ|ẩy|uỳ|iế|ọa|uế|ua|ũa|óe|uẩ|oắ|ẩu|uẻ|ai|ỉu|ói|ầu|ươ|uè|ều|ảo|yễ|êu|uẫ|oa|ứu|ày|uỵ|oẵ|áy|ứa|ỏa|uô|õa|uạ|ẹo"
16
+ regex_am_don = "ề|e|a|ầ|è|ơ|ồ|ú|ỵ|ả|ắ|ỷ|ố|ẩ|ặ|ừ|ữ|ủ|ụ|é|ợ|ằ|á|ỉ|ỗ|ê|ờ|ạ|õ|o|y|ì|ỳ|ự|ấ|ế|ý|ẽ|ó|u|ể|ễ|i|â|ẻ|ẹ|ỏ|ớ|ẳ|ẵ|ỹ|à|ẫ|ị|ù|ư|ứ|ở|ộ|ỡ|ũ|ô|í|ổ|ệ|ò|ĩ|ọ|ã|ậ|ử|ă"
17
+
18
+ all_phu_am_dau = set()
19
+ all_phu_am_cuoi = set()
20
+ special_list = set()
21
+ for syllable in vi_syllables_new:
22
+ if syllable[0:2] in ["qu", "gi"]:
23
+ special_list.add(syllable)
24
+ continue
25
+
26
+ if len(result:=re.findall(regex_am_ba, syllable)) != 0:
27
+ nguyen_am = result[0]
28
+ elif len(result:=re.findall(regex_am_hai, syllable)) != 0:
29
+ nguyen_am = result[0]
30
+ elif len(result:=re.findall(regex_am_don, syllable)) != 0:
31
+ nguyen_am = result[0]
32
+ else:
33
+ raise Exception("Khong co nguyen am")
34
+ phu_am_dau, phu_am_cuoi = "", ""
35
+ if len(result:=re.findall(f"(.+){nguyen_am}", syllable)) !=0 :
36
+ phu_am_dau = result[0]
37
+ if len(result:=re.findall(f"{nguyen_am}(.+)", syllable)) !=0 :
38
+ phu_am_cuoi = result[0]
39
+
40
+ all_phu_am_dau.add(phu_am_dau)
41
+ all_phu_am_cuoi.add(phu_am_cuoi)
42
+
43
+ assert "".join([phu_am_dau, nguyen_am, phu_am_cuoi]) == syllable
44
+
45
+
46
+ for syllable in special_list:
47
+
48
+ if len(result:=re.findall(regex_am_don, syllable)) > 1:
49
+ phu_am_dau = syllable[0:2]
50
+ remained = syllable[2:]
51
+ else:
52
+ phu_am_dau = syllable[0]
53
+ remained = syllable[1:]
54
+
55
+
56
+ if len(result:=re.findall(regex_am_ba, remained)) != 0:
57
+ nguyen_am = result[0]
58
+ elif len(result:=re.findall(regex_am_hai, remained)) != 0:
59
+ nguyen_am = result[0]
60
+ elif len(result:=re.findall(regex_am_don, remained)) != 0:
61
+ nguyen_am = result[0]
62
+ else:
63
+ nguyen_am, phu_am_cuoi = "", ""
64
+
65
+ phu_am_cuoi = ""
66
+
67
+ if nguyen_am != "" and len(result:=re.findall(f"{nguyen_am}(.+)", remained)) !=0 :
68
+ phu_am_cuoi = result[0]
69
+
70
+ all_phu_am_dau.add(phu_am_dau)
71
+ all_phu_am_cuoi.add(phu_am_cuoi)
72
+
73
+ assert "".join([phu_am_dau, nguyen_am, phu_am_cuoi]) == syllable
74
+
75
+ print("Tất cả phụ âm đầu: ")
76
+ print(all_phu_am_dau)
77
+ print("Tất cả phụ âm cuối: ")
78
+ print(all_phu_am_cuoi)
dataset/data_generation/common-vietnamese-syllables.txt ADDED
@@ -0,0 +1,7184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ của
3
+
4
+ các
5
+
6
+ được
7
+ trong
8
+ cho
9
+ không
10
+ người
11
+ với
12
+ một
13
+ đã
14
+ công
15
+ để
16
+ những
17
+ khi
18
+ đến
19
+ về
20
+ này
21
+ tại
22
+
23
+ cũng
24
+ tôi
25
+ ra
26
+ năm
27
+ nhiều
28
+ từ
29
+ việc
30
+ đồng
31
+ nhà
32
+ làm
33
+ đó
34
+ hiện
35
+ ông
36
+ vào
37
+ học
38
+ bị
39
+ trên
40
+ thể
41
+ theo
42
+ trường
43
+ như
44
+ ngày
45
+ anh
46
+ đầu
47
+ nước
48
+ phải
49
+ thành
50
+ định
51
+ bộ
52
+ nhân
53
+ sẽ
54
+ gia
55
+ quan
56
+ sự
57
+ nam
58
+ lại
59
+ chỉ
60
+ số
61
+ hàng
62
+ con
63
+ sinh
64
+ động
65
+ sau
66
+ điều
67
+ chính
68
+ dân
69
+
70
+ nhưng
71
+ việt
72
+ đi
73
+ quốc
74
+ thì
75
+ còn
76
+ biết
77
+ hội
78
+ hơn
79
+ thời
80
+ thông
81
+ an
82
+ trung
83
+ vụ
84
+ giá
85
+ viên
86
+ thực
87
+
88
+ phát
89
+ nên
90
+ nhận
91
+ hành
92
+ nhất
93
+ chủ
94
+ hợp
95
+ rất
96
+ mình
97
+ đang
98
+ qua
99
+ xe
100
+ văn
101
+ trước
102
+ do
103
+ cao
104
+ mới
105
+ trình
106
+ cùng
107
+
108
+ đại
109
+
110
+ bạn
111
+ thế
112
+ thị
113
+ sản
114
+ em
115
+ đây
116
+ tế
117
+ đường
118
+ cả
119
+ đối
120
+ bệnh
121
+ hai
122
+ án
123
+ nói
124
+ thi
125
+ tiếp
126
+ chức
127
+
128
+ hình
129
+ nghiệp
130
+ nội
131
+ tình
132
+
133
+ nguyễn
134
+ tiền
135
+ dự
136
+ lượng
137
+ lên
138
+ tin
139
+ điểm
140
+ bình
141
+ cấp
142
+ báo
143
+ kinh
144
+ đề
145
+ tác
146
+ dụng
147
+ bảo
148
+
149
+ tâm
150
+ xuất
151
+ tỉnh
152
+
153
+ nay
154
+ thanh
155
+
156
+ tài
157
+ kết
158
+ tuổi
159
+ cách
160
+ vẫn
161
+ thu
162
+ khác
163
+ đình
164
+ cầu
165
+ tăng
166
+ toàn
167
+ năng
168
+ phương
169
+ phòng
170
+ chúng
171
+ thấy
172
+ tra
173
+ tháng
174
+ doanh
175
+ giải
176
+ cần
177
+ khách
178
+ thương
179
+ tự
180
+ bản
181
+ thường
182
+ chị
183
+ chưa
184
+ ảnh
185
+ ngoài
186
+ tới
187
+ sở
188
+ quy
189
+ giao
190
+ lớn
191
+ diễn
192
+ tổ
193
+ ý
194
+ yêu
195
+ liên
196
+ lực
197
+ pháp
198
+ ăn
199
+ gian
200
+ tập
201
+ khu
202
+ ban
203
+ cuộc
204
+ sống
205
+ quyết
206
+ phạm
207
+
208
+ hoá
209
+ mặt
210
+ triển
211
+ triệu
212
+ nào
213
+ phần
214
+ trẻ
215
+ hay
216
+ lần
217
+ bằng
218
+ chất
219
+ minh
220
+ độ
221
+ nếu
222
+ trưởng
223
+ rằng
224
+ giới
225
+ tạo
226
+ quả
227
+ nhiên
228
+ trọng
229
+ vị
230
+ quá
231
+ mẹ
232
+ bán
233
+ thủ
234
+ trị
235
+ địa
236
+ đưa
237
+ khoảng
238
+ họ
239
+ đạo
240
+ tục
241
+ tổng
242
+ tiêu
243
+ ty
244
+ thức
245
+ viện
246
+ tham
247
+ điện
248
+ tính
249
+ sử
250
+ mua
251
+ gần
252
+ cảm
253
+ huyện
254
+ hiệu
255
+ phẩm
256
+ cảnh
257
+ hệ
258
+ bên
259
+ luật
260
+ máy
261
+ sáng
262
+ kỳ
263
+ nguyên
264
+ cứu
265
+ vực
266
+ giáo
267
+ giờ
268
+ mỹ
269
+ hoạt
270
+ bắt
271
+ vậy
272
+ kiến
273
+ kiểm
274
+ đổi
275
+ xây
276
+ đất
277
+ vừa
278
+ sát
279
+ khó
280
+ nghệ
281
+ tỷ
282
+ trở
283
+ gây
284
+ hoàn
285
+ vấn
286
+ tuy
287
+ đơn
288
+ khai
289
+ tốt
290
+ mạnh
291
+ giảm
292
+ biệt
293
+ nhiệm
294
+ dựng
295
+ thống
296
+ lúc
297
+ bất
298
+ trang
299
+ vi
300
+ thứ
301
+ rồi
302
+ phố
303
+ nghị
304
+ tiếng
305
+ đều
306
+ đặc
307
+ chồng
308
+ cáo
309
+ hồ
310
+ mức
311
+ chí
312
+ chế
313
+ xử
314
+ tượng
315
+ mỗi
316
+ nhau
317
+ ta
318
+
319
+ giúp
320
+ nữ
321
+ chuyển
322
+ thêm
323
+ đánh
324
+ loại
325
+ trí
326
+ tiến
327
+ khiến
328
+ chi
329
+ tìm
330
+ muốn
331
+ phụ
332
+
333
+ thân
334
+ chuyện
335
+ đoàn
336
+ quyền
337
+ vợ
338
+ quản
339
+ đông
340
+ bố
341
+ chia
342
+ hoặc
343
+ sách
344
+ tích
345
+ phim
346
+ mang
347
+ sức
348
+ hoa
349
+ lời
350
+ dùng
351
+ ngân
352
+ chương
353
+ giám
354
+ nhập
355
+ ngành
356
+ từng
357
+ nạn
358
+ hết
359
+ diện
360
+ chuyên
361
+ tay
362
+ tịch
363
+ ngay
364
+ nơi
365
+ khoa
366
+ dịch
367
+ lập
368
+ giữ
369
+ lợi
370
+ chứng
371
+ hải
372
+ hộ
373
+ thiết
374
+ hướng
375
+ phó
376
+ tiên
377
+ phục
378
+ mọi
379
+ bao
380
+ xét
381
+ dẫn
382
+ truyền
383
+ biểu
384
+ phí
385
+ ca
386
+ biển
387
+ thư
388
+
389
+ bỏ
390
+ lịch
391
+ trần
392
+ chung
393
+ xác
394
+ vật
395
+
396
+ giữa
397
+ giả
398
+ bài
399
+ sao
400
+ cái
401
+ y
402
+ du
403
+ ứng
404
+ tử
405
+ đẹp
406
+ xem
407
+ hoàng
408
+ hoà
409
+
410
+ trả
411
+ sẻ
412
+ chiếc
413
+ đủ
414
+ dài
415
+ kiện
416
+ cổ
417
+ vàng
418
+ thay
419
+ đạt
420
+ thuộc
421
+ kế
422
+ gái
423
+ trợ
424
+
425
+ ba
426
+ nhỏ
427
+
428
+ chọn
429
+ chiến
430
+ câu
431
+ thuật
432
+ sơn
433
+ mất
434
+ hỏi
435
+ gặp
436
+ thái
437
+ chiều
438
+ biến
439
+ lấy
440
+ vệ
441
+ bàn
442
+ luôn
443
+ tên
444
+ phủ
445
+ xảy
446
+ danh
447
+ quận
448
+ đức
449
+ đúng
450
+ thích
451
+ dục
452
+ đảm
453
+ bởi
454
+ ấy
455
+ tiết
456
+ bác
457
+ hạn
458
+ hậu
459
+ đời
460
+ quân
461
+ ai
462
+ hưởng
463
+ cây
464
+ quảng
465
+ tranh
466
+ so
467
+ sang
468
+ đội
469
+ tố
470
+ cửa
471
+ vùng
472
+ kể
473
+ nguồn
474
+ trạng
475
+ vốn
476
+ nhóm
477
+ căn
478
+ phân
479
+ xuống
480
+ cuối
481
+ tất
482
+ cứ
483
+ bay
484
+ nghiệm
485
+ thí
486
+ chuẩn
487
+ cố
488
+ tàu
489
+ lao
490
+ mở
491
+ liệu
492
+ nữa
493
+ tướng
494
+ tối
495
+ uỷ
496
+ lưu
497
+ đăng
498
+ ít
499
+ nhạc
500
+ mắt
501
+ lãnh
502
+ ngọc
503
+ đoạn
504
+ xin
505
+ đốc
506
+ trực
507
+ đặt
508
+ trách
509
+ bắc
510
+ tuyển
511
+ vận
512
+ dương
513
+ riêng
514
+ ngoại
515
+ luận
516
+ mạng
517
+ cụ
518
+
519
+ đa
520
+ phía
521
+ đóng
522
+ tương
523
+ nông
524
+ yếu
525
+ ninh
526
+ tội
527
+ khăn
528
+ xuân
529
+ mục
530
+ nghĩa
531
+ cạnh
532
+ cháu
533
+ lớp
534
+ đào
535
+ hoạch
536
+ khẩu
537
+ long
538
+ phong
539
+
540
+ phú
541
+ nghĩ
542
+ môi
543
+ thiếu
544
+ thật
545
+ hiểu
546
+ nổi
547
+ chạy
548
+ trái
549
+ cán
550
+ thuốc
551
+ kỹ
552
+ hữu
553
+ cục
554
+ áp
555
+ cộng
556
+ thuận
557
+ tinh
558
+ nhật
559
+ chân
560
+ lòng
561
+ càng
562
+ dưới
563
+
564
+ nhìn
565
+ đêm
566
+ quang
567
+ nhanh
568
+ nghiên
569
+ gửi
570
+ hỗ
571
+ châu
572
+ khá
573
+ phúc
574
+ phép
575
+ trai
576
+ tải
577
+ đảng
578
+ chơi
579
+ chết
580
+ gọi
581
+ đàn
582
+ môn
583
+ tuần
584
+ lễ
585
+ dung
586
+ góp
587
+ huy
588
+ tân
589
+ khả
590
+ hồi
591
+ hôm
592
+ biên
593
+ lan
594
+ độc
595
+ linh
596
+ cung
597
+ toán
598
+ giấy
599
+ cường
600
+ đáng
601
+ tai
602
+ tuyến
603
+ nằm
604
+ gồm
605
+ xúc
606
+ duy
607
+ sắc
608
+ giang
609
+ trao
610
+ lo
611
+
612
+ buổi
613
+ thần
614
+ sân
615
+ đồ
616
+ thuỷ
617
+ cử
618
+ tây
619
+ khoẻ
620
+ nghe
621
+ rộng
622
+ vui
623
+ toà
624
+ hồng
625
+ dành
626
+ phối
627
+ kim
628
+ khoản
629
+ tấn
630
+ vai
631
+ chống
632
+ lệ
633
+ khí
634
+
635
+ lương
636
+ dễ
637
+ đầy
638
+
639
+ nặng
640
+ mai
641
+ trò
642
+ hương
643
+ nguy
644
+ hại
645
+ thảo
646
+ đảo
647
+ thiện
648
+ nuôi
649
+ ghi
650
+ quán
651
+ chịu
652
+ tưởng
653
+ phường
654
+ niên
655
+ tết
656
+ mong
657
+ lộ
658
+ cực
659
+ vài
660
+ bước
661
+ đô
662
+ nghiêm
663
+ đà
664
+ chấp
665
+ thuế
666
+ thoại
667
+ đứng
668
+ đôi
669
+ di
670
+ uống
671
+ phản
672
+ nghề
673
+ vọng
674
+ thấp
675
+ âm
676
+ tiện
677
+ lĩnh
678
+ thẩm
679
+ dầu
680
+ khám
681
+ màu
682
+ hát
683
+ đau
684
+ xa
685
+ hiểm
686
+ lâu
687
+
688
+ kiếm
689
+ mặc
690
+ nghỉ
691
+ viết
692
+ phù
693
+ nhằm
694
+ xuyên
695
+ kỷ
696
+ ngờ
697
+ yên
698
+ mưa
699
+ hạ
700
+ nghi
701
+ kéo
702
+ khởi
703
+ ương
704
+ nâng
705
+ khẳng
706
+
707
+ mẫu
708
+ trương
709
+ quý
710
+ mại
711
+ phá
712
+ chú
713
+ sai
714
+ ô
715
+ chăm
716
+ hùng
717
+ suất
718
+ sâu
719
+ tuấn
720
+ bức
721
+ đọc
722
+ lâm
723
+ nợ
724
+ khỏi
725
+ phạt
726
+ tín
727
+ vượt
728
+ đấu
729
+ thiên
730
+ thưởng
731
+ sông
732
+ sớm
733
+ dạy
734
+ cha
735
+ bổ
736
+ cải
737
+ tuyên
738
+ chỗ
739
+ áo
740
+ hạnh
741
+ tầng
742
+ da
743
+ tạm
744
+ đẩy
745
+ dưỡng
746
+ chữa
747
+ vòng
748
+ phiên
749
+ đá
750
+ mùa
751
+ vay
752
+ hôn
753
+ đâu
754
+ chứ
755
+ xanh
756
+ quê
757
+ hút
758
+ máu
759
+ hiệp
760
+ nhờ
761
+ thăm
762
+ trú
763
+ thuê
764
+ tránh
765
+ khán
766
+ chẳng
767
+ tiểu
768
+ ánh
769
+ quay
770
+ soát
771
+ nhiệt
772
+ ngôi
773
+ thắng
774
+ dũng
775
+ món
776
+ thừa
777
+ ung
778
+ cháy
779
+ khắc
780
+ ngồi
781
+ phê
782
+ họp
783
+ trì
784
+
785
+ quen
786
+ vinh
787
+ miền
788
+ chợ
789
+ nhu
790
+ chắc
791
+ nền
792
+ giống
793
+ nga
794
+ nóng
795
+ thôn
796
+ phút
797
+ giai
798
+ ổn
799
+ bầu
800
+ ưu
801
+ thầy
802
+ nhớ
803
+ mắc
804
+ dấu
805
+ sóc
806
+ quanh
807
+ trời
808
+ mối
809
+
810
+ tỉ
811
+ thậm
812
+ chờ
813
+ chỉnh
814
+ khánh
815
+ ma
816
+ thúc
817
+ lai
818
+ ngủ
819
+ siêu
820
+ thịt
821
+ chiếm
822
+ tức
823
+ đứa
824
+ may
825
+ nẵng
826
+ thơ
827
+ bày
828
+ song
829
+ nhiễm
830
+ hãy
831
+ đón
832
+ ấn
833
+ chuyến
834
+ khảo
835
+ phóng
836
+ can
837
+ bánh
838
+ suy
839
+ cân
840
+ đáp
841
+ vẻ
842
+ khoá
843
+ lựa
844
+ hưng
845
+ trải
846
+ truy
847
+ lái
848
+ sợ
849
+ trồng
850
+ thú
851
+ kịp
852
+ dòng
853
+ ích
854
+ lạc
855
+ tỏ
856
+ hàn
857
+ khối
858
+ tặng
859
+ suốt
860
+ khuyến
861
+ đổ
862
+ á
863
+ đỏ
864
+ phan
865
+ rút
866
+ tái
867
+ mấy
868
+
869
+ rau
870
+ nghèo
871
+ mời
872
+ gắn
873
+ thụ
874
+ cầm
875
+ tờ
876
+ tốc
877
+ buộc
878
+ cam
879
+ ước
880
+
881
+ biện
882
+ quần
883
+ tim
884
+ phi
885
+ thất
886
+ thai
887
+ vong
888
+ bạc
889
+ lãi
890
+ tắc
891
+ the
892
+ khúc
893
+ sài
894
+ giác
895
+ ngữ
896
+ cắt
897
+ hài
898
+
899
+ phiếu
900
+ niệm
901
+ sửa
902
+ dừng
903
+ la
904
+ thiệt
905
+ xếp
906
+ tận
907
+ tĩnh
908
+ sung
909
+ thử
910
+ đài
911
+ thẳng
912
+ to
913
+ dịp
914
+ thôi
915
+ trăm
916
+ chở
917
+ vĩnh
918
+ nhẹ
919
+ sữa
920
+ nguyện
921
+ nêu
922
+ trắng
923
+ sạch
924
+ tộc
925
+ cận
926
+ bóng
927
+ chục
928
+ ly
929
+ dần
930
+ phổ
931
+
932
+ thác
933
+ sỹ
934
+ xong
935
+ lỗi
936
+ chóng
937
+ niềm
938
+ tri
939
+ gốc
940
+ đỡ
941
+ nhi
942
+ thoát
943
+ chặt
944
+
945
+ a
946
+ sẵn
947
+ hãng
948
+ làng
949
+ loạt
950
+ gió
951
+ cười
952
+ vân
953
+ dạng
954
+ gòn
955
+ cưới
956
+ vững
957
+
958
+ dây
959
+ hấp
960
+ nhắc
961
+ nộp
962
+ coi
963
+ liệt
964
+ nối
965
+ đỗ
966
+ kém
967
+
968
+ luyện
969
+ lẽ
970
+ sắp
971
+ bến
972
+ rừng
973
+ nhấn
974
+ lạnh
975
+ hầu
976
+ tôn
977
+ huynh
978
+ cậu
979
+ cấu
980
+ chứa
981
+ cập
982
+ đám
983
+ xấu
984
+ kiên
985
+
986
+ thiệu
987
+ lắng
988
+ lạ
989
+ lắm
990
+ sa
991
+ lửa
992
+ dao
993
+ sắt
994
+ sóng
995
+ tạp
996
+ đột
997
+
998
+ chụp
999
+
1000
+ giảng
1001
+ gắng
1002
+ hoạ
1003
+ cánh
1004
+ ngăn
1005
+ giàu
1006
+ trụ
1007
+ huyết
1008
+ quỹ
1009
+ đương
1010
+ cuốn
1011
+ tầm
1012
+ ngại
1013
+
1014
+ giản
1015
+ đòi
1016
+ xăng
1017
+ cướp
1018
+ lộc
1019
+ thượng
1020
+ kích
1021
+ mật
1022
+ kịch
1023
+ ủng
1024
+ rơi
1025
+ tuý
1026
+ cặp
1027
+ núi
1028
+ dinh
1029
+ xung
1030
+ liền
1031
+ tồn
1032
+ trấn
1033
+ bào
1034
+ đích
1035
+ tuyệt
1036
+ buồn
1037
+ bồi
1038
+ hạng
1039
+ giết
1040
+ ngắn
1041
+ đợt
1042
+ vườn
1043
+ chắn
1044
+ thải
1045
+ cấm
1046
+ miễn
1047
+ phước
1048
+ quà
1049
+ trận
1050
+ nắng
1051
+ mái
1052
+ mạch
1053
+ bạch
1054
+ bãi
1055
+ trà
1056
+
1057
+ nắm
1058
+ chữ
1059
+ phẫu
1060
+ rượu
1061
+ buôn
1062
+ phận
1063
+ hơi
1064
+ hy
1065
+ hào
1066
+ đem
1067
+ nửa
1068
+ trưng
1069
+ mừng
1070
+ khổ
1071
+ tươi
1072
+ trinh
1073
+ khấu
1074
+ ngã
1075
+ băng
1076
+ bây
1077
+ đen
1078
+ nổ
1079
+ huế
1080
+ xế
1081
+ trúng
1082
+ hoang
1083
+ kêu
1084
+ bữa
1085
+ tùng
1086
+ vết
1087
+ dõi
1088
+ bờ
1089
+ chiếu
1090
+ lượt
1091
+ lào
1092
+ thăng
1093
+ chút
1094
+ cơm
1095
+ kháng
1096
+ tấm
1097
+ chậm
1098
+ thoả
1099
+ trộm
1100
+ sàng
1101
+
1102
+ ơn
1103
+ ngụ
1104
+ nghìn
1105
+ sạn
1106
+ hằng
1107
+ nỗi
1108
+ ngô
1109
+ âu
1110
+ gương
1111
+ chàng
1112
+ trúc
1113
+ vương
1114
+ ngược
1115
+ cơn
1116
+ kẻ
1117
+ bật
1118
+ đinh
1119
+ ngập
1120
+ khóc
1121
+ nỗ
1122
+ hạt
1123
+ đoạt
1124
+ ngàn
1125
+ thao
1126
+ kính
1127
+ ràng
1128
+
1129
+ chào
1130
+
1131
+ nhuận
1132
+ huỳnh
1133
+
1134
+ cảng
1135
+ hoài
1136
+ bùi
1137
+ thọ
1138
+ trạm
1139
+ đừng
1140
+ đâm
1141
+ cát
1142
+ hiếu
1143
+ lừa
1144
+ lược
1145
+ mộ
1146
+ kiểu
1147
+ tệ
1148
+ khắp
1149
+ giam
1150
+ kia
1151
+ đàm
1152
+ trùng
1153
+ bậc
1154
+ túi
1155
+ mãi
1156
+ màn
1157
+ đẳng
1158
+ xóm
1159
+ giật
1160
+ đuổi
1161
+ khủng
1162
+ kênh
1163
+ tóc
1164
+ đậu
1165
+ đợi
1166
+ lẫn
1167
+ ngũ
1168
+ thách
1169
+ kiều
1170
+ giỏi
1171
+ dị
1172
+
1173
+ dựa
1174
+ đoán
1175
+ kiệm
1176
+ viêm
1177
+ thuyết
1178
+ bão
1179
+ trốn
1180
+ tang
1181
+ gấp
1182
+ binh
1183
+ ngang
1184
+ rối
1185
+ não
1186
+ khẩn
1187
+ nhiêu
1188
+ ngư
1189
+ ấm
1190
+ vỡ
1191
+ lành
1192
+ thận
1193
+ tường
1194
+ gói
1195
+ xu
1196
+ khiển
1197
+ ngọt
1198
+ ho
1199
+ dàng
1200
+ gạo
1201
+ giọng
1202
+ hẹn
1203
+ sốt
1204
+ già
1205
+ ngon
1206
+ mùi
1207
+ hiến
1208
+ chảy
1209
+ thẻ
1210
+ hiền
1211
+ hề
1212
+ lệnh
1213
+ duyên
1214
+ trại
1215
+ rác
1216
+ trưa
1217
+ thuyền
1218
+ chánh
1219
+ bụng
1220
+ mổ
1221
+ giành
1222
+ ngôn
1223
+ ha
1224
+ lối
1225
+ chấn
1226
+ gỗ
1227
+ xương
1228
+ sứ
1229
+ quên
1230
+ mắn
1231
+ nấu
1232
+ loạn
1233
+ ga
1234
+ chấm
1235
+ nha
1236
+ trừ
1237
+ ruột
1238
+ trật
1239
+ dáng
1240
+ mẽ
1241
+ súng
1242
+ mũi
1243
+ uy
1244
+ bảng
1245
+ kèm
1246
+ đặng
1247
+ dám
1248
+ dược
1249
+ lẻ
1250
+ miệng
1251
+ rời
1252
+ hứng
1253
+ lục
1254
+ in
1255
+ chu
1256
+ nhũng
1257
+ đập
1258
+ ép
1259
+ chặn
1260
+ hung
1261
+ thở
1262
+ đèn
1263
+ béo
1264
+ túc
1265
+ cương
1266
+ hàm
1267
+ huyền
1268
+ huỷ
1269
+ khích
1270
+ bền
1271
+ khô
1272
+ dụ
1273
+ duyệt
1274
+ phức
1275
+ sàn
1276
+ sổ
1277
+ khen
1278
+ chúc
1279
+ thầu
1280
+ non
1281
+ thuý
1282
+ dâu
1283
+
1284
+ tuỳ
1285
+ nai
1286
+ khuôn
1287
+ le
1288
+ bia
1289
+ dữ
1290
+ hiếm
1291
+ đãi
1292
+ ôm
1293
+ tật
1294
+ làn
1295
+ tiêm
1296
+ trông
1297
+ bốn
1298
+ điển
1299
+ lỗ
1300
+ gỡ
1301
+ kín
1302
+ trứng
1303
+ phán
1304
+ mềm
1305
+
1306
+ dâm
1307
+ dày
1308
+ thập
1309
+ chăn
1310
+ bối
1311
+ ngừng
1312
+ rẻ
1313
+ thiểu
1314
+ nhắn
1315
+ nhảy
1316
+ dứt
1317
+ tổn
1318
+ phấn
1319
+ rào
1320
+ quỳnh
1321
+ góc
1322
+ táo
1323
+ ống
1324
+ mệt
1325
+ mạc
1326
+ dậy
1327
+ nhánh
1328
+ chạm
1329
+ mát
1330
+
1331
+ nét
1332
+ gan
1333
+ căng
1334
+
1335
+ kho
1336
+ hẳn
1337
+ thùng
1338
+ toả
1339
+ tiềm
1340
+ bột
1341
+ thang
1342
+ đồn
1343
+ cụm
1344
+ hỏng
1345
+ đam
1346
+ hảo
1347
+ khuyên
1348
+ rửa
1349
+ khoán
1350
+ tràn
1351
+ xinh
1352
+ tung
1353
+ van
1354
+
1355
+ thù
1356
+ ẩn
1357
+ ghế
1358
+ thổ
1359
+
1360
+
1361
+ tông
1362
+ chẽ
1363
+ bếp
1364
+ đáo
1365
+ đấy
1366
+ trịnh
1367
+ doạ
1368
+ tụ
1369
+ tháo
1370
+ trữ
1371
+ lãng
1372
+ tắm
1373
+ cãi
1374
+ xưa
1375
+ lúa
1376
+ mưu
1377
+ tôm
1378
+ ngoái
1379
+ canh
1380
+ hứa
1381
+ ái
1382
+ lắp
1383
+ thạch
1384
+ sắm
1385
+ xứ
1386
+ trầm
1387
+ mỏi
1388
+ loan
1389
+ bổng
1390
+ cựu
1391
+ đỉnh
1392
+ bắn
1393
+ cai
1394
+ tán
1395
+ đua
1396
+ thịnh
1397
+ xâm
1398
+ thảm
1399
+ tốn
1400
+ mỡ
1401
+ thự
1402
+ hộp
1403
+ tran
1404
+ ẩm
1405
+ thép
1406
+ tiếc
1407
+ tam
1408
+ yến
1409
+ trào
1410
+
1411
+ ngưỡng
1412
+ tan
1413
+ răng
1414
+ nàng
1415
+ nhãn
1416
+ khiếu
1417
+ hoảng
1418
+ mực
1419
+ giấu
1420
+ chối
1421
+ loài
1422
+ tàng
1423
+ cống
1424
+ chùa
1425
+ đền
1426
+ cổng
1427
+ chốt
1428
+ hoan
1429
+ lọc
1430
+ hoả
1431
+ giường
1432
+ hầm
1433
+ my
1434
+ cột
1435
+ bốc
1436
+ chín
1437
+ điệu
1438
+ đắt
1439
+ than
1440
+ thuẫn
1441
+ ro
1442
+ đe
1443
+ thạnh
1444
+ gợi
1445
+ rủi
1446
+ thơm
1447
+ niêm
1448
+ va
1449
+ mâu
1450
+ vũng
1451
+ củ
1452
+ dạ
1453
+ khống
1454
+ hồn
1455
+ thói
1456
+ sôi
1457
+ ven
1458
+ lưới
1459
+ trích
1460
+ tháp
1461
+ cản
1462
+ lang
1463
+ miếng
1464
+ cất
1465
+ lặng
1466
+ đạp
1467
+ điệp
1468
+ đốt
1469
+ pha
1470
+ bạo
1471
+ vỏ
1472
+ mầm
1473
+ khung
1474
+ cắp
1475
+ thờ
1476
+ treo
1477
+ huống
1478
+ chừng
1479
+ oan
1480
+ vả
1481
+ trọ
1482
+ lãm
1483
+ thoải
1484
+ lệch
1485
+ ấp
1486
+ lưng
1487
+ co
1488
+ bơi
1489
+ u
1490
+ ân
1491
+ mảnh
1492
+ ghép
1493
+ dàn
1494
+ lợn
1495
+ chai
1496
+ giấc
1497
+ cờ
1498
+ cẩm
1499
+ thua
1500
+ giáp
1501
+ xả
1502
+ đắk
1503
+ muối
1504
+ khuẩn
1505
+ váy
1506
+ lít
1507
+ huấn
1508
+ chủng
1509
+ trôi
1510
+ say
1511
+ heo
1512
+ ngực
1513
+ hối
1514
+ mau
1515
+ vẽ
1516
+ hâm
1517
+ ngừa
1518
+ khoe
1519
+ vất
1520
+ bỏng
1521
+ bớt
1522
+ i
1523
+ tuyết
1524
+ bận
1525
+ sót
1526
+ bát
1527
+ phỏng
1528
+ bông
1529
+ bang
1530
+ tuân
1531
+
1532
+ che
1533
+ khát
1534
+ chém
1535
+ đậm
1536
+ bại
1537
+ tiệc
1538
+ nhịp
1539
+ mệnh
1540
+ đống
1541
+ mặn
1542
+ săn
1543
+ bích
1544
+ đo
1545
+ mây
1546
+ móc
1547
+ xứng
1548
+ hong
1549
+ viễn
1550
+ chua
1551
+ thả
1552
+ lam
1553
+ đẻ
1554
+ cứng
1555
+ sáu
1556
+
1557
+ xoá
1558
+ vắng
1559
+ mãn
1560
+ triều
1561
+ cốt
1562
+ su
1563
+ giây
1564
+ nhung
1565
+ chó
1566
+ tiệm
1567
+ tròn
1568
+ khâu
1569
+ lậu
1570
+ chuỗi
1571
+ kiệt
1572
+ bám
1573
+ lạm
1574
+ bom
1575
+
1576
+ trân
1577
+ hưu
1578
+ vải
1579
+ trăng
1580
+ đựng
1581
+ dọc
1582
+ gánh
1583
+ cỏ
1584
+ thuỳ
1585
+ nghiện
1586
+ vở
1587
+ đắc
1588
+ ngộ
1589
+ tre
1590
+ nở
1591
+ ngãi
1592
+ cẩn
1593
+
1594
+ lầm
1595
+ tả
1596
+ trục
1597
+ dọn
1598
+ vội
1599
+ thiệp
1600
+ đai
1601
+ triệt
1602
+ sốc
1603
+ liêm
1604
+ mượn
1605
+ tắt
1606
+ tu
1607
+ bách
1608
+ truyện
1609
+ trống
1610
+ bọn
1611
+
1612
+ phượng
1613
+ dưa
1614
+ ngõ
1615
+ tủ
1616
+ dập
1617
+ muộn
1618
+ vời
1619
+ chẩn
1620
+ buýt
1621
+ huệ
1622
+ vu
1623
+ ùn
1624
+ tụng
1625
+ mét
1626
+ vang
1627
+ tiễn
1628
+ yết
1629
+ gọn
1630
+ sập
1631
+ nại
1632
+ chim
1633
+ hôi
1634
+ phổi
1635
+ thuỵ
1636
+
1637
+ nhàng
1638
+ vẹn
1639
+ vua
1640
+ giận
1641
+ chìm
1642
+ nhựa
1643
+ dường
1644
+ rạng
1645
+ ngọn
1646
+ chinh
1647
+ lở
1648
+ nề
1649
+ ngầm
1650
+ trộn
1651
+ pháo
1652
+ lân
1653
+ nhan
1654
+ tha
1655
+ nhậu
1656
+ nồng
1657
+ thợ
1658
+ pham
1659
+ trọn
1660
+ lăng
1661
+ thưa
1662
+ khuyết
1663
+ sánh
1664
+ mắm
1665
+ nhầm
1666
+ đạn
1667
+ chênh
1668
+ bảy
1669
+ lọt
1670
+ khôi
1671
+ xoay
1672
+ nụ
1673
+ hang
1674
+ toạ
1675
+ tách
1676
+ vướng
1677
+ múa
1678
+ bi
1679
+ e
1680
+ lão
1681
+
1682
+
1683
+ hi
1684
+ giày
1685
+ hẹp
1686
+ kẹt
1687
+ ốc
1688
+ ảo
1689
+ đắp
1690
+ dính
1691
+ nén
1692
+ ác
1693
+ hiển
1694
+ bề
1695
+ lồng
1696
+ mốc
1697
+ móng
1698
+ mạn
1699
+ ức
1700
+ suối
1701
+
1702
+
1703
+ cưỡng
1704
+ nướng
1705
+ bụi
1706
+ khói
1707
+ đói
1708
+
1709
+ kiêm
1710
+ mến
1711
+ nhơn
1712
+ tuệ
1713
+
1714
+ đeo
1715
+ khớp
1716
+ gãy
1717
+ vạn
1718
+ thước
1719
+ lấn
1720
+ trắc
1721
+ rèn
1722
+ xách
1723
+ điền
1724
+ mạo
1725
+ bơm
1726
+ sen
1727
+ phu
1728
+ khoáng
1729
+ gìn
1730
+ tàn
1731
+ nhạy
1732
+ nhượng
1733
+ nhẫn
1734
+ chán
1735
+ đớn
1736
+ lạng
1737
+ leo
1738
+
1739
+ tráng
1740
+ ném
1741
+ thoái
1742
+ soạn
1743
+ nảy
1744
+ khê
1745
+ lạt
1746
+ lây
1747
+ thuần
1748
+
1749
+ phật
1750
+ bàng
1751
+ com
1752
+ dỡ
1753
+ diệt
1754
+ ruộng
1755
+ diệu
1756
+ rạp
1757
+ phùng
1758
+ đĩa
1759
+ thô
1760
+ thắc
1761
+ tám
1762
+ tràng
1763
+ hổ
1764
+ quyên
1765
+ rét
1766
+ đành
1767
+ tảng
1768
+ thánh
1769
+ thuy
1770
+ nhé
1771
+ lấp
1772
+ vỉa
1773
+ mồ
1774
+ xạ
1775
+ lứa
1776
+ vươn
1777
+ mày
1778
+ xi
1779
+ sợi
1780
+ nhở
1781
+ bùng
1782
+ liều
1783
+ nguyệt
1784
+ tứ
1785
+ thạc
1786
+ san
1787
+ bế
1788
+ chiêu
1789
+ ám
1790
+ giãn
1791
+ dời
1792
+ mỏ
1793
+ đan
1794
+
1795
+ trâu
1796
+ thoáng
1797
+ oanh
1798
+ son
1799
+ thâm
1800
+ ngắm
1801
+ vịnh
1802
+ út
1803
+ liêu
1804
+ dắt
1805
+ rộn
1806
+ úc
1807
+ xưởng
1808
+ khổng
1809
+ khanh
1810
+ bẩn
1811
+ dông
1812
+ nát
1813
+ ngạc
1814
+ bể
1815
+ khang
1816
+ kem
1817
+ bút
1818
+ phái
1819
+ ôn
1820
+ bón
1821
+ rãi
1822
+ ngoan
1823
+ luồng
1824
+ lông
1825
+ tạ
1826
+ rẫy
1827
+ luân
1828
+ vấp
1829
+ sạt
1830
+ hắn
1831
+ rủ
1832
+ chửi
1833
+ mộc
1834
+ im
1835
+ đằng
1836
+ sâm
1837
+ thoảng
1838
+ nút
1839
+ gũi
1840
+ nấm
1841
+ ngâm
1842
+ lồ
1843
+ bội
1844
+ dừa
1845
+ chúa
1846
+ cua
1847
+ măng
1848
+
1849
+ quế
1850
+ củng
1851
+ o
1852
+ quyến
1853
+
1854
+ mảng
1855
+ chả
1856
+ ngào
1857
+ tím
1858
+ gom
1859
+ ốm
1860
+ đầm
1861
+ khơi
1862
+ băn
1863
+ men
1864
+ vây
1865
+ địch
1866
+ khoăn
1867
+ sưu
1868
+ hụt
1869
+ lắk
1870
+ bồ
1871
+ dở
1872
+
1873
+ trượt
1874
+ đùa
1875
+ ngạch
1876
+ dốc
1877
+ nhã
1878
+ gạch
1879
+ man
1880
+ mông
1881
+ bái
1882
+ bỗng
1883
+ soi
1884
+ mười
1885
+ khứ
1886
+ sương
1887
+
1888
+ khéo
1889
+ dồn
1890
+ lộn
1891
+ diễm
1892
+ lỏng
1893
+ khoảnh
1894
+
1895
+ cỡ
1896
+ gối
1897
+ manh
1898
+ ngơi
1899
+ cước
1900
+ bún
1901
+ hán
1902
+ hòn
1903
+ côn
1904
+ màng
1905
+ dâng
1906
+ ơi
1907
+ hận
1908
+ mẻ
1909
+ hở
1910
+ tựu
1911
+ dạo
1912
+ ngột
1913
+ hiếp
1914
+ hỗn
1915
+ lính
1916
+ thắn
1917
+ thắt
1918
+ trùm
1919
+ cay
1920
+ luỹ
1921
+ chanh
1922
+ đạm
1923
+ đồi
1924
+ ranh
1925
+ xao
1926
+ tạng
1927
+ chuột
1928
+ bọc
1929
+ ưa
1930
+ hố
1931
+ thầm
1932
+ voi
1933
+ cốc
1934
+ thấu
1935
+ mọc
1936
+ rể
1937
+ nhát
1938
+ ngón
1939
+ nhì
1940
+ sụt
1941
+ dịu
1942
+ dang
1943
+ phiền
1944
+ rạch
1945
+ thằng
1946
+ rắn
1947
+ lôi
1948
+ rỡ
1949
+ gắt
1950
+ xông
1951
+ ghen
1952
+
1953
+ hoại
1954
+ đứt
1955
+
1956
+ bắp
1957
+ nhí
1958
+ mờ
1959
+ chuyền
1960
+ dệt
1961
+ hãi
1962
+
1963
+ cắm
1964
+ nồi
1965
+ dối
1966
+ rải
1967
+ ớt
1968
+ ham
1969
+ chè
1970
+ cúng
1971
+ phụng
1972
+ nôn
1973
+ xót
1974
+ ngợi
1975
+ khoai
1976
+ chuối
1977
+ vành
1978
+ hoành
1979
+ nhặt
1980
+ nhĩ
1981
+
1982
+ đán
1983
+ cám
1984
+ trạch
1985
+ na
1986
+ lùi
1987
+ chê
1988
+ chôn
1989
+ lề
1990
+ cạn
1991
+ nếp
1992
+ đới
1993
+ đuôi
1994
+ dội
1995
+ vy
1996
+ đáy
1997
+ hân
1998
+ bưu
1999
+ rồng
2000
+ nho
2001
+ ồn
2002
+ no
2003
+ kíp
2004
+ mộng
2005
+ khe
2006
+ nhiếp
2007
+ mỏng
2008
+
2009
+
2010
+ ong
2011
+ lật
2012
+ lường
2013
+ giáng
2014
+ uyên
2015
+
2016
+ phun
2017
+ vắc
2018
+ xích
2019
+ vịt
2020
+ thỉnh
2021
+ khải
2022
+ cự
2023
+ dán
2024
+ quãng
2025
+ đúc
2026
+ hước
2027
+ phế
2028
+ lát
2029
+ hái
2030
+ lưỡng
2031
+ lăn
2032
+ cởi
2033
+
2034
+ tẩy
2035
+ ao
2036
+ bưởi
2037
+ be
2038
+ vóc
2039
+ quét
2040
+
2041
+ buồng
2042
+ hoãn
2043
+ châm
2044
+ chặng
2045
+ cửu
2046
+ xát
2047
+ tần
2048
+
2049
+ rịa
2050
+ cồn
2051
+ mi
2052
+ cậy
2053
+ cúc
2054
+ bồn
2055
+ lắc
2056
+ khoan
2057
+ thấm
2058
+ ghé
2059
+ buông
2060
+ nhạt
2061
+ đế
2062
+ dan
2063
+ vớt
2064
+
2065
+ phở
2066
+ chuộng
2067
+ dẹp
2068
+ vặt
2069
+ chiên
2070
+ chậu
2071
+ gục
2072
+ gay
2073
+ điên
2074
+ chật
2075
+ lùng
2076
+ rực
2077
+ xôi
2078
+ khiêm
2079
+ lặn
2080
+ ngất
2081
+ giọt
2082
+ chép
2083
+ giặt
2084
+ vượng
2085
+ chăng
2086
+ đôn
2087
+ kẹo
2088
+ khép
2089
+ láng
2090
+
2091
+ đọng
2092
+ dại
2093
+ đạc
2094
+ quái
2095
+ lụt
2096
+ đắn
2097
+ trễ
2098
+ cong
2099
+ kề
2100
+ xôn
2101
+ muỗi
2102
+ bộc
2103
+ dải
2104
+ ngưng
2105
+ thổi
2106
+ lỡ
2107
+ tỏi
2108
+ cáp
2109
+ phơi
2110
+ họng
2111
+ ào
2112
+ xỉ
2113
+ vứt
2114
+ bấy
2115
+ rắc
2116
+ cọc
2117
+ tui
2118
+ huân
2119
+ gác
2120
+ cóc
2121
+ hẻm
2122
+ ngựa
2123
+ giếng
2124
+ trăn
2125
+ nứt
2126
+ tưới
2127
+ cháo
2128
+ nốt
2129
+ tống
2130
+ dỗ
2131
+ khuất
2132
+ lữ
2133
+ mùng
2134
+ cành
2135
+ đuối
2136
+ qui
2137
+ sếp
2138
+ lận
2139
+ cẩu
2140
+ khuê
2141
+ văng
2142
+ khôn
2143
+ lau
2144
+ lốc
2145
+ khương
2146
+ mụn
2147
+ sướng
2148
+ quầy
2149
+ nhục
2150
+ quát
2151
+ diệp
2152
+ chui
2153
+ bấm
2154
+ giàn
2155
+ chen
2156
+ hóc
2157
+ cắn
2158
+ rẽ
2159
+ ê
2160
+
2161
+ trội
2162
+ thắm
2163
+ sáp
2164
+ khái
2165
+ dãy
2166
+ lội
2167
+ nhàn
2168
+ dặn
2169
+ đùi
2170
+ đếm
2171
+ me
2172
+ khuya
2173
+ nhị
2174
+ thối
2175
+ táng
2176
+ chiết
2177
+ lặp
2178
+ đắng
2179
+ kon
2180
+ bùn
2181
+ mòn
2182
+ nương
2183
+
2184
+ pa
2185
+ mèo
2186
+ lưỡi
2187
+ ập
2188
+ khoái
2189
+ súc
2190
+ ngỡ
2191
+ sút
2192
+ bôi
2193
+ phì
2194
+ trâm
2195
+ đê
2196
+
2197
+ thiêng
2198
+ hét
2199
+ lạp
2200
+ tóm
2201
+ xoài
2202
+ rong
2203
+ nghiêng
2204
+ túng
2205
+ mường
2206
+ tao
2207
+ gián
2208
+ đè
2209
+ khoác
2210
+ tum
2211
+ loa
2212
+ thắp
2213
+ dai
2214
+ đoan
2215
+ sọ
2216
+ nghịch
2217
+ léo
2218
+ xào
2219
+ lách
2220
+ dồi
2221
+ xen
2222
+ đặn
2223
+ mắng
2224
+ khao
2225
+ mác
2226
+
2227
+ đính
2228
+ chay
2229
+ bỉ
2230
+
2231
+ luộc
2232
+ bóc
2233
+ nhức
2234
+ nhắm
2235
+ rao
2236
+ dạn
2237
+ chèo
2238
+ nhường
2239
+ vo
2240
+ mía
2241
+ cuồng
2242
+ bẫy
2243
+ chau
2244
+ tấu
2245
+ sụp
2246
+ nạp
2247
+ chén
2248
+ bóp
2249
+ ướt
2250
+ đèo
2251
+ thám
2252
+ thiêu
2253
+ cấy
2254
+ hốt
2255
+
2256
+ viếng
2257
+ gấu
2258
+ tước
2259
+ tẩu
2260
+ thèm
2261
+ ghét
2262
+ dong
2263
+
2264
+ li
2265
+ eo
2266
+ xài
2267
+ báu
2268
+ xổ
2269
+ giông
2270
+ điêu
2271
+ lột
2272
+ kỉ
2273
+ hao
2274
+ thoa
2275
+ tựa
2276
+ nhọn
2277
+ tấp
2278
+ ben
2279
+ ráo
2280
+ lót
2281
+ đệ
2282
+ mẫn
2283
+ rùa
2284
+ bẩm
2285
+ khoang
2286
+ sưng
2287
+ bính
2288
+
2289
+ ngần
2290
+ khan
2291
+ hạch
2292
+ lầu
2293
+ xưng
2294
+ bạt
2295
+ quyển
2296
+ mâm
2297
+ chìa
2298
+ chuồng
2299
+ chiêm
2300
+ xuôi
2301
+ ti
2302
+ choáng
2303
+ tát
2304
+ bướu
2305
+ nghẹn
2306
+ chì
2307
+ đụng
2308
+
2309
+ bui
2310
+ tia
2311
+ quỵ
2312
+ rộ
2313
+
2314
+
2315
+ thửa
2316
+ bực
2317
+ gầy
2318
+ gai
2319
+ đục
2320
+ đệm
2321
+ rung
2322
+ thục
2323
+
2324
+ gậy
2325
+ giòn
2326
+ xăm
2327
+ chốn
2328
+ mồi
2329
+ đun
2330
+ ngặt
2331
+ sườn
2332
+ liễu
2333
+ dép
2334
+ quất
2335
+ de
2336
+ sành
2337
+ neo
2338
+ ủi
2339
+ ráp
2340
+ nghiệt
2341
+ nành
2342
+
2343
+ xay
2344
+ rụng
2345
+ nàn
2346
+ ngà
2347
+ gầm
2348
+ thới
2349
+ chiểu
2350
+ à
2351
+ rước
2352
+ rớt
2353
+ hoạn
2354
+ còi
2355
+ kiềm
2356
+ vạch
2357
+ mịn
2358
+ thìa
2359
+ vác
2360
+ lõi
2361
+ nản
2362
+ nhộn
2363
+ hoán
2364
+ nâu
2365
+ quỳ
2366
+ hường
2367
+ tảo
2368
+ nắp
2369
+ rách
2370
+ tom
2371
+ nang
2372
+ ướp
2373
+ phanh
2374
+ thản
2375
+ sầm
2376
+ nới
2377
+ bới
2378
+ khốc
2379
+ tụi
2380
+ vuông
2381
+ chưng
2382
+ bạ
2383
+ nan
2384
+ lọ
2385
+ nhịn
2386
+ đòn
2387
+ siết
2388
+ dẻo
2389
+ nghênh
2390
+ thòi
2391
+ mập
2392
+ khiếp
2393
+ ngài
2394
+ khỉ
2395
+ triết
2396
+ toa
2397
+ tuyền
2398
+ tịnh
2399
+ trơn
2400
+ sỏi
2401
+ ngo
2402
+
2403
+
2404
+ quạt
2405
+ nhăn
2406
+ tho
2407
+ run
2408
+ ngậm
2409
+ han
2410
+ xẻ
2411
+ vòi
2412
+ thuyên
2413
+ pin
2414
+ hấu
2415
+
2416
+ nọ
2417
+ gạt
2418
+ lún
2419
+ toan
2420
+ rốt
2421
+ hoi
2422
+ nấy
2423
+ kiêng
2424
+ ngạt
2425
+ dưng
2426
+ rệt
2427
+ rỉ
2428
+
2429
+ tụt
2430
+ khiêu
2431
+ chuông
2432
+
2433
+ nhược
2434
+ lui
2435
+ quách
2436
+ bong
2437
+ bìa
2438
+
2439
+ thính
2440
+ râu
2441
+ thiều
2442
+ mài
2443
+ xắn
2444
+ nức
2445
+ xướng
2446
+ đắm
2447
+ thon
2448
+ háo
2449
+ êm
2450
+
2451
+ thuột
2452
+ khốn
2453
+ vỗ
2454
+ sẹo
2455
+ quynh
2456
+ náo
2457
+ nuốt
2458
+ răn
2459
+ sun
2460
+ ròng
2461
+ côi
2462
+ lung
2463
+ rang
2464
+ nuối
2465
+ vọt
2466
+ ve
2467
+ óc
2468
+ bịt
2469
+ xoáy
2470
+ cúm
2471
+ nhủ
2472
+ cưng
2473
+ tồi
2474
+ thốn
2475
+ khoả
2476
+ cài
2477
+ doãn
2478
+ giò
2479
+ chích
2480
+ quật
2481
+ rễ
2482
+ tem
2483
+ lánh
2484
+ hanh
2485
+ biếu
2486
+ khía
2487
+ lẩn
2488
+ ạt
2489
+ ngây
2490
+ liêng
2491
+ lụa
2492
+ xoa
2493
+ nhuộm
2494
+ doan
2495
+ rảnh
2496
+ ki
2497
+ hít
2498
+ gừng
2499
+ ngẫu
2500
+ trêu
2501
+ ngỏ
2502
+ miếu
2503
+ ngứa
2504
+ lũng
2505
+ chọc
2506
+ nhồi
2507
+ mươi
2508
+ diễu
2509
+ rụi
2510
+ sét
2511
+ mít
2512
+ tòng
2513
+ sầu
2514
+ hông
2515
+ keo
2516
+ lộng
2517
+ nêm
2518
+ quấy
2519
+ hức
2520
+ khiếm
2521
+
2522
+ chọi
2523
+ chải
2524
+ vách
2525
+ thủng
2526
+ đàng
2527
+ sim
2528
+ đũa
2529
+ vắt
2530
+ cớ
2531
+ cày
2532
+ thốt
2533
+ phẳng
2534
+ dào
2535
+ trừng
2536
+ nhiễu
2537
+ oai
2538
+ cào
2539
+ tặc
2540
+ mạ
2541
+ úng
2542
+ mậu
2543
+ cuộn
2544
+ miện
2545
+ bén
2546
+ vờ
2547
+ ất
2548
+ kha
2549
+ kẽ
2550
+ sam
2551
+
2552
+ nể
2553
+
2554
+ bung
2555
+ trãi
2556
+
2557
+ xấp
2558
+ đò
2559
+ mương
2560
+ đu
2561
+ mìn
2562
+ dạt
2563
+ muôn
2564
+ đốn
2565
+ chảo
2566
+ võng
2567
+ miên
2568
+ lén
2569
+ ưng
2570
+ vỹ
2571
+ gặt
2572
+ dầm
2573
+ cọ
2574
+
2575
+ phô
2576
+
2577
+ nám
2578
+ trèo
2579
+ tẩm
2580
+ lười
2581
+ lanh
2582
+ phàn
2583
+ sừng
2584
+ ngàng
2585
+ chéo
2586
+ nhọc
2587
+ nghẽn
2588
+ lóc
2589
+ nhái
2590
+ ván
2591
+ cỗ
2592
+ xịt
2593
+ loét
2594
+ luỵ
2595
+ bồng
2596
+ nóc
2597
+ lẫy
2598
+ cưa
2599
+ nần
2600
+ ghe
2601
+ phác
2602
+ cúi
2603
+ phôi
2604
+
2605
+ gốm
2606
+ ẩu
2607
+ thạo
2608
+ đả
2609
+ ni
2610
+ gang
2611
+ len
2612
+ bênh
2613
+ ầm
2614
+ séc
2615
+ thà
2616
+ mỳ
2617
+ tủi
2618
+ nguội
2619
+ ngoạn
2620
+ rạn
2621
+ phiêu
2622
+ khiết
2623
+ miêu
2624
+ ngửa
2625
+ ách
2626
+ gieo
2627
+
2628
+ uốn
2629
+ nạ
2630
+ vét
2631
+ dẫu
2632
+ kìm
2633
+ két
2634
+ hủ
2635
+ tràm
2636
+
2637
+ kệ
2638
+ phao
2639
+ nạo
2640
+ xỉu
2641
+ tăm
2642
+ quấn
2643
+ búa
2644
+ sấu
2645
+ sào
2646
+ mu
2647
+ hen
2648
+ sờ
2649
+ loãng
2650
+ chèn
2651
+ day
2652
+ nón
2653
+ rập
2654
+ đấm
2655
+ am
2656
+ cụt
2657
+ xốp
2658
+ ư
2659
+ lướt
2660
+ miệt
2661
+ cừ
2662
+ chạp
2663
+ mận
2664
+ gam
2665
+ đái
2666
+ vôi
2667
+ tạt
2668
+ chùm
2669
+ lờ
2670
+ tốp
2671
+ tuỵ
2672
+ giềng
2673
+ ruồi
2674
+ giỏ
2675
+ bọt
2676
+ ghê
2677
+ ỏi
2678
+ giã
2679
+ khắt
2680
+ hiên
2681
+ giằng
2682
+ gân
2683
+ giỗ
2684
+ áng
2685
+ rán
2686
+ hả
2687
+ vun
2688
+ nhai
2689
+ xáo
2690
+ thiêm
2691
+ rưỡi
2692
+ rầm
2693
+ trù
2694
+ chợt
2695
+ cu
2696
+ hăng
2697
+ muỗng
2698
+ xảo
2699
+
2700
+ đăk
2701
+ xám
2702
+ ngả
2703
+ rỗi
2704
+ rơm
2705
+ tuỷ
2706
+ trói
2707
+ nhốt
2708
+ thuở
2709
+ cau
2710
+ vùi
2711
+ chan
2712
+ khoanh
2713
+ mốt
2714
+ roi
2715
+ bẻ
2716
+ lúng
2717
+ niệu
2718
+ ngán
2719
+ lẩu
2720
+ vung
2721
+
2722
+ diều
2723
+ ế
2724
+ nạc
2725
+ phả
2726
+ uất
2727
+ nhang
2728
+
2729
+ go
2730
+ phiến
2731
+ váng
2732
+ nhuyễn
2733
+ lựu
2734
+ quýt
2735
+ thâu
2736
+ gật
2737
+ lốp
2738
+ dằn
2739
+ trĩ
2740
+ on
2741
+ trán
2742
+ khử
2743
+ phà
2744
+ rót
2745
+ méo
2746
+ ngấm
2747
+ nếm
2748
+ ngóng
2749
+ xíu
2750
+ nem
2751
+ mứt
2752
+ sấy
2753
+ khoát
2754
+ mỉ
2755
+ rổ
2756
+ ấu
2757
+ nhào
2758
+ ngự
2759
+ thề
2760
+ uông
2761
+ vụn
2762
+ ten
2763
+ đao
2764
+ bọ
2765
+ nhổ
2766
+ gắm
2767
+ gươm
2768
+ ngùi
2769
+ chà
2770
+ trau
2771
+ kẽm
2772
+ lay
2773
+ hinh
2774
+ suýt
2775
+ mải
2776
+ trút
2777
+ mỉm
2778
+ năn
2779
+ súp
2780
+ xiếc
2781
+ thềm
2782
+ ray
2783
+ chót
2784
+ bầm
2785
+ nhét
2786
+ bừa
2787
+ gót
2788
+ cộ
2789
+ quỷ
2790
+ lu
2791
+ mãnh
2792
+ cối
2793
+ mủ
2794
+ trót
2795
+ bứt
2796
+ kẹp
2797
+ níu
2798
+ que
2799
+ tiệp
2800
+ sắn
2801
+
2802
+ sanh
2803
+ lích
2804
+ khâm
2805
+ cội
2806
+ sòng
2807
+ giơ
2808
+ sảnh
2809
+ trặc
2810
+ ngơ
2811
+ chập
2812
+ sum
2813
+ lán
2814
+ cúp
2815
+ mép
2816
+ ngắt
2817
+ chững
2818
+ ghềnh
2819
+ ươm
2820
+ toản
2821
+ đố
2822
+ giục
2823
+ nộ
2824
+ cuống
2825
+ quây
2826
+ nguỵ
2827
+ lon
2828
+ chốc
2829
+ si
2830
+ lượn
2831
+ thiền
2832
+ lừng
2833
+ hới
2834
+ bừng
2835
+ thung
2836
+ hãm
2837
+ giun
2838
+ muống
2839
+ tị
2840
+
2841
+ nập
2842
+ phồng
2843
+ trứ
2844
+ rưng
2845
+ kiếp
2846
+ tạc
2847
+ xước
2848
+ búp
2849
+ quẩn
2850
+ luyến
2851
+ vẫy
2852
+ ngừ
2853
+ chư
2854
+ trổ
2855
+ điểu
2856
+ lửng
2857
+
2858
+ kiêu
2859
+ củi
2860
+ sạp
2861
+ ngẫm
2862
+ chuộc
2863
+ gội
2864
+ cấn
2865
+ tuýp
2866
+ bo
2867
+ nặc
2868
+ kép
2869
+ tuông
2870
+ nhàm
2871
+ noi
2872
+ bèo
2873
+ nến
2874
+ ôi
2875
+ vàn
2876
+ pu
2877
+ se
2878
+ loay
2879
+ phượt
2880
+ hoay
2881
+ điếu
2882
+ giêng
2883
+ phẫn
2884
+ lều
2885
+ xua
2886
+ quăng
2887
+
2888
+ úp
2889
+ chòi
2890
+ toát
2891
+ băm
2892
+
2893
+ hất
2894
+ đãng
2895
+ ói
2896
+ duẩn
2897
+ đẫm
2898
+ teo
2899
+ lùm
2900
+ cáu
2901
+ gu
2902
+ chắt
2903
+ bửu
2904
+ hoằng
2905
+ giàng
2906
+ min
2907
+ nhạ
2908
+ xuồng
2909
+ tiếu
2910
+ mướn
2911
+ pho
2912
+ duệ
2913
+ giặc
2914
+ lươn
2915
+ cõi
2916
+ then
2917
+ ngó
2918
+ tỉa
2919
+ sưa
2920
+ ngoặt
2921
+ tòi
2922
+ gạc
2923
+ gào
2924
+ phách
2925
+ nghẹt
2926
+
2927
+ kỵ
2928
+ chớp
2929
+ thêu
2930
+ rát
2931
+ chát
2932
+ trơ
2933
+ nòng
2934
+ gọt
2935
+ biếng
2936
+ phai
2937
+ hệt
2938
+ hun
2939
+ bịch
2940
+ húc
2941
+ cồng
2942
+ vạ
2943
+ điềm
2944
+ ia
2945
+ trệ
2946
+ mẩn
2947
+
2948
+ vãn
2949
+
2950
+ ơ
2951
+ ngao
2952
+ trảng
2953
+ ếch
2954
+ nạt
2955
+ gàng
2956
+ tro
2957
+ nhích
2958
+ ru
2959
+ phe
2960
+ múc
2961
+ sưởi
2962
+ hãn
2963
+ rỗng
2964
+ đậy
2965
+ tản
2966
+ thy
2967
+ dặm
2968
+ xuyến
2969
+ xoang
2970
+ cạo
2971
+ nhóc
2972
+ nỉ
2973
+ cược
2974
+ ngổn
2975
+ vòm
2976
+ sảng
2977
+ huyên
2978
+ chằng
2979
+ quyện
2980
+ rãnh
2981
+ bin
2982
+ diên
2983
+ cang
2984
+ rốn
2985
+ gáy
2986
+ trọt
2987
+ khinh
2988
+
2989
+
2990
+ kiểng
2991
+ suôn
2992
+ rượt
2993
+ tỵ
2994
+ bon
2995
+ xiết
2996
+ phình
2997
+ mịt
2998
+ chước
2999
+ ngọ
3000
+ sỉ
3001
+ rằm
3002
+ còng
3003
+ tẻ
3004
+ chướng
3005
+ xùm
3006
+ diêm
3007
+ xộn
3008
+ ngách
3009
+ nậm
3010
+ cằm
3011
+ tớ
3012
+ xỉn
3013
+ ron
3014
+ nhậm
3015
+ ngời
3016
+ găng
3017
+ đực
3018
+ quậy
3019
+ mấu
3020
+ tít
3021
+ yếm
3022
+ lợp
3023
+ ngoãn
3024
+ sỡ
3025
+ thỏ
3026
+ nhúng
3027
+ nghiền
3028
+ ngan
3029
+ don
3030
+ chài
3031
+ tưng
3032
+ bục
3033
+ dìu
3034
+ nhôm
3035
+ rồ
3036
+ hắt
3037
+ nhỉ
3038
+ nghé
3039
+ hờ
3040
+ hễ
3041
+ dứa
3042
+ tơi
3043
+ trỗi
3044
+ mồng
3045
+ khay
3046
+ dụm
3047
+ kèn
3048
+ bỉnh
3049
+ ri
3050
+ vựa
3051
+ tuột
3052
+ sụn
3053
+ xệ
3054
+ sặc
3055
+ mẹo
3056
+ thệ
3057
+
3058
+ trũng
3059
+ khuấy
3060
+ sáo
3061
+ quẹt
3062
+ hổng
3063
+ nung
3064
+ ngói
3065
+ chắp
3066
+ hãnh
3067
+ sùng
3068
+ mách
3069
+ riết
3070
+ triền
3071
+ ngủi
3072
+ liu
3073
+ xít
3074
+ mượt
3075
+ dột
3076
+ quí
3077
+ ngáo
3078
+ cẳng
3079
+ ngùng
3080
+ hắc
3081
+ mớ
3082
+ khăng
3083
+
3084
+ sởi
3085
+ lim
3086
+ khóm
3087
+ đong
3088
+ chảnh
3089
+ bệ
3090
+ sửu
3091
+
3092
+ khét
3093
+ hằn
3094
+ rai
3095
+ chôm
3096
+ nấc
3097
+
3098
+ vựng
3099
+ vãi
3100
+ dậu
3101
+ gồng
3102
+ dăm
3103
+ dãi
3104
+ ngút
3105
+ ngu
3106
+ gượng
3107
+ bậy
3108
+ vuốt
3109
+ ổi
3110
+ hạm
3111
+ ngục
3112
+ trệt
3113
+ oán
3114
+ cặn
3115
+ ren
3116
+ dấn
3117
+
3118
+ nhâm
3119
+ dấy
3120
+ gắp
3121
+ vặn
3122
+ rêu
3123
+ túm
3124
+ gởi
3125
+ reo
3126
+ bai
3127
+ thê
3128
+
3129
+ chàm
3130
+ sục
3131
+ đản
3132
+ cõng
3133
+ vữa
3134
+ nách
3135
+ nhằn
3136
+ bời
3137
+ rành
3138
+ hốc
3139
+ lút
3140
+ vầy
3141
+ cốp
3142
+ thẳm
3143
+ rùng
3144
+ chao
3145
+ thét
3146
+ phen
3147
+ kiệu
3148
+ dơi
3149
+ cuốc
3150
+ lầy
3151
+ nham
3152
+ vợt
3153
+ sán
3154
+ múi
3155
+ kén
3156
+ bưng
3157
+ thừng
3158
+ hoai
3159
+ vơi
3160
+ trầy
3161
+ vảy
3162
+ ngạn
3163
+
3164
+ lem
3165
+ mênh
3166
+ tuồng
3167
+ giăng
3168
+ gớm
3169
+ giấm
3170
+ ráng
3171
+ dỏm
3172
+ đùng
3173
+ thán
3174
+ cừu
3175
+ tắn
3176
+ nhựt
3177
+ mẩu
3178
+ mồm
3179
+
3180
+ sùi
3181
+ phông
3182
+ hờn
3183
+ nhuần
3184
+ rình
3185
+
3186
+ ốt
3187
+ đoòng
3188
+ quai
3189
+ sảo
3190
+ von
3191
+ tanh
3192
+ lìa
3193
+ khuynh
3194
+ vụng
3195
+ thoai
3196
+ bộn
3197
+
3198
+ bỉm
3199
+ đẽ
3200
+ thìn
3201
+ mon
3202
+ nhẹn
3203
+ nhện
3204
+ nắn
3205
+ lượm
3206
+ lẻo
3207
+ vệt
3208
+ bàu
3209
+ nguyền
3210
+ ngòi
3211
+ dẫm
3212
+ mướt
3213
+ sạm
3214
+ độn
3215
+ giẽ
3216
+ rầu
3217
+ ruốc
3218
+ tróc
3219
+ hẫng
3220
+ nhưỡng
3221
+ nguôi
3222
+ tẩn
3223
+ chang
3224
+ đốm
3225
+ gập
3226
+ chỉn
3227
+ xịn
3228
+ xoắn
3229
+ nom
3230
+ sạc
3231
+ tày
3232
+ nhờn
3233
+ khoắn
3234
+ bịa
3235
+ vâng
3236
+ ngót
3237
+ đút
3238
+ miến
3239
+ tép
3240
+ kềnh
3241
+ oi
3242
+ ngửi
3243
+ át
3244
+ by
3245
+ giở
3246
+ chội
3247
+ nôi
3248
+ chần
3249
+ trá
3250
+ điếc
3251
+ quặng
3252
+ dẻ
3253
+ chơn
3254
+ giầy
3255
+ buốt
3256
+ hụi
3257
+ đỗi
3258
+ nhoáng
3259
+ lùn
3260
+ lẫm
3261
+ vạt
3262
+ sảy
3263
+ hạc
3264
+ cộm
3265
+ rợn
3266
+ lênh
3267
+ găm
3268
+ phớt
3269
+ thun
3270
+ thỏi
3271
+ gio
3272
+ buồm
3273
+ sả
3274
+ cóp
3275
+ ngợp
3276
+ cạp
3277
+
3278
+ nhớt
3279
+ hòm
3280
+ hăm
3281
+ lõm
3282
+ bỡ
3283
+ hổi
3284
+ rậm
3285
+ láo
3286
+ vỏn
3287
+ hàu
3288
+ thóc
3289
+ bẹp
3290
+ thớt
3291
+ hợi
3292
+ trớ
3293
+ râm
3294
+ xiêm
3295
+ cằn
3296
+ gỏi
3297
+ hùm
3298
+ chói
3299
+ xói
3300
+ sói
3301
+ rôn
3302
+ nheo
3303
+ nghia
3304
+ bấp
3305
+ khế
3306
+ siu
3307
+ nặn
3308
+ lức
3309
+ đóm
3310
+ căm
3311
+ uyển
3312
+ chông
3313
+ câm
3314
+ lăk
3315
+ vừng
3316
+ quàng
3317
+ núp
3318
+ đoá
3319
+ héo
3320
+ ắp
3321
+ lốt
3322
+ vớ
3323
+ nhút
3324
+ nhối
3325
+ trẻo
3326
+ thuấn
3327
+ thong
3328
+ ĩ
3329
+ hòng
3330
+ vén
3331
+ nong
3332
+ tột
3333
+ trọc
3334
+ nhác
3335
+ bợ
3336
+ bần
3337
+ gi
3338
+ trợn
3339
+ hon
3340
+ hởi
3341
+ bùa
3342
+ bẩy
3343
+ vần
3344
+ gộp
3345
+ hời
3346
+ dỗi
3347
+ nhuệ
3348
+ ngượng
3349
+ vụt
3350
+ bít
3351
+ nhỡ
3352
+ nháo
3353
+ sộ
3354
+ mích
3355
+ den
3356
+ lịm
3357
+ lăm
3358
+ rúng
3359
+ nghè
3360
+ ì
3361
+ nín
3362
+ phung
3363
+ tào
3364
+ luống
3365
+ sững
3366
+ tễ
3367
+ chổi
3368
+ đom
3369
+
3370
+ dẳng
3371
+
3372
+ ngốc
3373
+ bầy
3374
+ thỏm
3375
+ lạch
3376
+ hèn
3377
+ gỉ
3378
+ nhấp
3379
+ lậy
3380
+ vênh
3381
+ khoét
3382
+ giùm
3383
+ mào
3384
+ cút
3385
+ moi
3386
+ tuồn
3387
+ tợn
3388
+ ngẩn
3389
+ mị
3390
+
3391
+ mão
3392
+ he
3393
+ thinh
3394
+ trầu
3395
+ nhõm
3396
+ trồ
3397
+ giồng
3398
+ sủa
3399
+ phất
3400
+ chầu
3401
+ rườm
3402
+ cứa
3403
+ niu
3404
+ chừ
3405
+ ngưu
3406
+ seo
3407
+ nhũ
3408
+ nỡ
3409
+ gióng
3410
+
3411
+ vin
3412
+ phồn
3413
+ suyễn
3414
+ miu
3415
+ ảm
3416
+ cưỡi
3417
+
3418
+ choàng
3419
+ bổn
3420
+ đạ
3421
+ huyệt
3422
+ dùi
3423
+ tráo
3424
+ vãng
3425
+ vía
3426
+ ối
3427
+ nhấc
3428
+ tằm
3429
+ lép
3430
+ bim
3431
+ chạnh
3432
+ ốp
3433
+ nẻo
3434
+ bặm
3435
+ bướm
3436
+
3437
+ ngớt
3438
+ xẩm
3439
+ trĩu
3440
+ sệt
3441
+ hỷ
3442
+ gao
3443
+ nhầy
3444
+ tua
3445
+ gạ
3446
+ xui
3447
+ xén
3448
+ nôm
3449
+ mễ
3450
+ chiêng
3451
+ nậu
3452
+ vít
3453
+ cạy
3454
+ bành
3455
+ trác
3456
+ dượng
3457
+ ngợm
3458
+ ngậy
3459
+ xoè
3460
+ sần
3461
+ thiếp
3462
+ phím
3463
+ nhẹt
3464
+ hớn
3465
+ nao
3466
+ đéc
3467
+ nhọ
3468
+ sửng
3469
+ ghẹ
3470
+ lóng
3471
+ đấng
3472
+ nệm
3473
+ giời
3474
+ trướng
3475
+ vẹo
3476
+ tèo
3477
+ xở
3478
+ nghén
3479
+ dặt
3480
+
3481
+ nghĩnh
3482
+ éo
3483
+ bói
3484
+ rông
3485
+ hoóc
3486
+ chít
3487
+ hỉnh
3488
+ hớt
3489
+ thẹo
3490
+ nhô
3491
+ ải
3492
+ sải
3493
+ phộng
3494
+ khít
3495
+ pia
3496
+ lẳng
3497
+ lả
3498
+ giãi
3499
+ bủa
3500
+ chiềng
3501
+ hóm
3502
+ chùi
3503
+ đùm
3504
+ thoi
3505
+ hến
3506
+ mửa
3507
+ nghêu
3508
+ choi
3509
+ bươn
3510
+ om
3511
+ mút
3512
+ đổng
3513
+ đờn
3514
+ lỏi
3515
+ hột
3516
+ nháy
3517
+ lèo
3518
+ khơ
3519
+ ken
3520
+ trụi
3521
+ ùa
3522
+ lồi
3523
+ tuất
3524
+ vồng
3525
+ hoè
3526
+ vút
3527
+ bả
3528
+ thoạt
3529
+ lẻn
3530
+ lác
3531
+ én
3532
+ óng
3533
+ vế
3534
+ sẫm
3535
+ thía
3536
+ tấc
3537
+ mọng
3538
+ tram
3539
+ bảnh
3540
+ tề
3541
+ đay
3542
+ đát
3543
+ ngáy
3544
+
3545
+ mao
3546
+ thúng
3547
+ chồn
3548
+ viền
3549
+ vẹt
3550
+ lõng
3551
+ xới
3552
+ gấm
3553
+ chớ
3554
+ tong
3555
+ dát
3556
+
3557
+ luồn
3558
+ kèo
3559
+ xoan
3560
+ mướp
3561
+ mo
3562
+ cốm
3563
+ tỳ
3564
+ khuân
3565
+ loang
3566
+ xiêu
3567
+ xắt
3568
+ khẽ
3569
+ phèn
3570
+ ngoai
3571
+ thiu
3572
+ trắm
3573
+ xiên
3574
+ vót
3575
+
3576
+ khỉnh
3577
+ chây
3578
+ rụt
3579
+ vàm
3580
+ phết
3581
+ nhảm
3582
+ giẫm
3583
+ phiện
3584
+ xoăn
3585
+ nấp
3586
+ cọng
3587
+ diết
3588
+ quẫn
3589
+ khiêng
3590
+ càn
3591
+ hót
3592
+
3593
+ nực
3594
+ tươm
3595
+ gán
3596
+ cựa
3597
+ xèo
3598
+ nhếch
3599
+ nhả
3600
+ phào
3601
+ khờ
3602
+ rít
3603
+ ngác
3604
+ nài
3605
+ chuốt
3606
+ thụt
3607
+ cuông
3608
+ rôm
3609
+ chày
3610
+ sàm
3611
+ nhão
3612
+ toái
3613
+ um
3614
+
3615
+ ny
3616
+ mỗ
3617
+ đờm
3618
+ giũ
3619
+ bở
3620
+ lấm
3621
+ chun
3622
+ lùa
3623
+ tậu
3624
+ kháu
3625
+ mầu
3626
+ đần
3627
+ khùng
3628
+ cơi
3629
+ hươu
3630
+ sọc
3631
+ ẵm
3632
+ ruổi
3633
+ huê
3634
+ thò
3635
+ loà
3636
+ suông
3637
+ pan
3638
+ nhoà
3639
+ đáu
3640
+ bèn
3641
+ nhói
3642
+ răm
3643
+ oải
3644
+ ngẩm
3645
+ móp
3646
+ đẩu
3647
+ tròng
3648
+ chệch
3649
+ chạc
3650
+ sến
3651
+ quáng
3652
+ nải
3653
+ rèm
3654
+ cật
3655
+
3656
+ phăng
3657
+ giỡn
3658
+ chùng
3659
+ mả
3660
+ lố
3661
+ bêu
3662
+ vỉ
3663
+ lạy
3664
+ khoé
3665
+ nhừ
3666
+ cữu
3667
+ húng
3668
+ chuồn
3669
+ lặt
3670
+ nghiến
3671
+ truỵ
3672
+ lin
3673
+ tiệt
3674
+ tét
3675
+ quới
3676
+ giếm
3677
+
3678
+ dĩnh
3679
+ phìn
3680
+ nhợt
3681
+ luông
3682
+ un
3683
+ nghê
3684
+ nhún
3685
+ bốt
3686
+ mãng
3687
+ ngông
3688
+ lọi
3689
+ duỗi
3690
+ ngưởng
3691
+ kham
3692
+ hoe
3693
+ dĩa
3694
+ soái
3695
+ goá
3696
+ bệt
3697
+ thảnh
3698
+ ổng
3699
+ sứa
3700
+ ton
3701
+ khò
3702
+ hẻo
3703
+ đằm
3704
+ thót
3705
+
3706
+ rẩy
3707
+ víu
3708
+ xối
3709
+ toé
3710
+ rứa
3711
+ ngải
3712
+ dìm
3713
+ riêu
3714
+ thơi
3715
+ ngớ
3716
+ ky
3717
+ vạy
3718
+
3719
+ tía
3720
+ phui
3721
+ lài
3722
+ moóc
3723
+ thau
3724
+ nết
3725
+ đờ
3726
+ lâng
3727
+ xoong
3728
+ tuôn
3729
+ dấm
3730
+ him
3731
+ sủ
3732
+ ran
3733
+ nớt
3734
+ tóp
3735
+ gành
3736
+ bướng
3737
+ lặc
3738
+ cui
3739
+ bềnh
3740
+ miết
3741
+ lẽo
3742
+ náu
3743
+
3744
+ cáng
3745
+ banh
3746
+ rả
3747
+ quệt
3748
+ ngạo
3749
+ chằm
3750
+ quệ
3751
+
3752
+ chực
3753
+ hiu
3754
+ re
3755
+ khiên
3756
+ nọc
3757
+ bôn
3758
+ bết
3759
+
3760
+ bét
3761
+ mẩy
3762
+ loát
3763
+ chĩa
3764
+ nhá
3765
+ liếng
3766
+ sấp
3767
+ rinh
3768
+ hoắc
3769
+ ắt
3770
+ vẩy
3771
+ khất
3772
+ nấng
3773
+ nái
3774
+ nhẩm
3775
+ lảng
3776
+ sin
3777
+ cữ
3778
+ rục
3779
+ rìa
3780
+ nhăng
3781
+ liếc
3782
+ dền
3783
+ núm
3784
+ kẻo
3785
+ xúi
3786
+ mạt
3787
+ cưu
3788
+ khuỷu
3789
+ búi
3790
+ hích
3791
+ bu
3792
+ chíp
3793
+ nháp
3794
+ kỉnh
3795
+ đểu
3796
+ chong
3797
+ chịt
3798
+ vằn
3799
+ sấm
3800
+ nhổn
3801
+ nhen
3802
+ lừ
3803
+ nhỉnh
3804
+ chiu
3805
+ xóc
3806
+ rủa
3807
+ nộm
3808
+ phốt
3809
+ ngát
3810
+ héc
3811
+ đanh
3812
+ mia
3813
+ vồ
3814
+ dốt
3815
+ đềm
3816
+ sẩy
3817
+ lụng
3818
+ nẻ
3819
+ ganh
3820
+ chầm
3821
+ nơm
3822
+ mọt
3823
+
3824
+ riềng
3825
+ nịnh
3826
+ nhẽo
3827
+ dôi
3828
+ chừa
3829
+ tùm
3830
+ ngóc
3831
+ mún
3832
+ xỏ
3833
+ vát
3834
+ vẩn
3835
+ thặng
3836
+ hám
3837
+ gài
3838
+ loi
3839
+ chưởng
3840
+ nhại
3841
+ muội
3842
+ rạ
3843
+ hớ
3844
+ xẻo
3845
+ nòi
3846
+ luẩn
3847
+ líu
3848
+ xy
3849
+ máng
3850
+ tấy
3851
+ nhảnh
3852
+ gổ
3853
+ cụi
3854
+ ắng
3855
+ trê
3856
+ rớm
3857
+ hóng
3858
+ ú
3859
+ trỏ
3860
+ nép
3861
+ lụi
3862
+ cùi
3863
+ rứt
3864
+ pôn
3865
+ đỉa
3866
+
3867
+ đận
3868
+ choạng
3869
+ ngốn
3870
+ đoái
3871
+ diệm
3872
+ mền
3873
+ hợt
3874
+ siêng
3875
+ tánh
3876
+ nhấm
3877
+ đọ
3878
+ rựa
3879
+ ghẹo
3880
+ đênh
3881
+ sứt
3882
+ nít
3883
+ gẫy
3884
+ cỗi
3885
+ bịu
3886
+ loanh
3887
+ mánh
3888
+ lỉnh
3889
+ khư
3890
+ rết
3891
+ dế
3892
+ xâu
3893
+ nứa
3894
+ nhẽ
3895
+ diệc
3896
+ đác
3897
+ cợt
3898
+ nhím
3899
+ toại
3900
+ bặt
3901
+ cỏi
3902
+ xúm
3903
+ sính
3904
+ mói
3905
+ đùn
3906
+ tru
3907
+ đày
3908
+ xuýt
3909
+ thóp
3910
+ veo
3911
+ dúm
3912
+ cặm
3913
+ lỳ
3914
+ giẻ
3915
+ thỉ
3916
+ rịch
3917
+ phin
3918
+ mếu
3919
+ lự
3920
+ thố
3921
+ săm
3922
+ khảm
3923
+
3924
+ ghẻ
3925
+ hỉ
3926
+ chợp
3927
+ thảy
3928
+ quặc
3929
+ núc
3930
+ vạc
3931
+ thui
3932
+ thoắt
3933
+ ngỗng
3934
+ nớp
3935
+ mằn
3936
+ thuyển
3937
+ rọi
3938
+ trìu
3939
+ thẫn
3940
+ gặng
3941
+ khăm
3942
+ gianh
3943
+ guồng
3944
+ biếm
3945
+ nhúc
3946
+ khấn
3947
+ hấn
3948
+ thẹn
3949
+ quầng
3950
+
3951
+ bập
3952
+ ắc
3953
+ loạng
3954
+ thào
3955
+ ngò
3956
+ tiều
3957
+ phom
3958
+ mỵ
3959
+ chum
3960
+ gút
3961
+ xéo
3962
+ ứa
3963
+ tuộc
3964
+ trạc
3965
+ phùn
3966
+ phàng
3967
+ rúp
3968
+ ngoi
3969
+ chẻ
3970
+ nhọt
3971
+ inh
3972
+
3973
+ giễu
3974
+ rạc
3975
+ mịch
3976
+ lết
3977
+ cồ
3978
+ náy
3979
+ au
3980
+ đượm
3981
+ rầy
3982
+ phàm
3983
+ hửng
3984
+ ngầu
3985
+ nẹp
3986
+ phũ
3987
+
3988
+ quặn
3989
+ nán
3990
+ rộp
3991
+
3992
+ hững
3993
+ tành
3994
+ mân
3995
+ xập
3996
+ ù
3997
+ trồi
3998
+ trịa
3999
+ ngùn
4000
+ kìa
4001
+ xiển
4002
+ hên
4003
+ sậm
4004
+ mụ
4005
+ gặm
4006
+ dả
4007
+ ngụt
4008
+ mui
4009
+ bống
4010
+ dầy
4011
+ chườm
4012
+ sới
4013
+ ngẩng
4014
+ áy
4015
+ đĩnh
4016
+ lủi
4017
+ en
4018
+ giuộc
4019
+ rợ
4020
+ lẹ
4021
+ hẹ
4022
+ gáp
4023
+ phiệt
4024
+ ngước
4025
+ chòm
4026
+
4027
+ kình
4028
+ khàn
4029
+ nục
4030
+ mố
4031
+ trừu
4032
+ mỉa
4033
+ gả
4034
+ cọp
4035
+ ngấn
4036
+ nãy
4037
+ háng
4038
+ tót
4039
+ cộc
4040
+ chẵn
4041
+ beng
4042
+ vịn
4043
+ phuy
4044
+ cuồn
4045
+ táp
4046
+ nhứt
4047
+ miễu
4048
+ lắt
4049
+ khem
4050
+ cạm
4051
+ hùn
4052
+ lằn
4053
+ chùn
4054
+ bẹn
4055
+ xụp
4056
+ mề
4057
+ nua
4058
+ hục
4059
+ đẽo
4060
+ thổn
4061
+ hực
4062
+ nuông
4063
+ nu
4064
+ sình
4065
+ nhuế
4066
+ xém
4067
+ cheo
4068
+ viêng
4069
+ diêu
4070
+ hoen
4071
+ bẹ
4072
+ ngấy
4073
+
4074
+ xộc
4075
+ rượi
4076
+ hừng
4077
+ xuể
4078
+ thình
4079
+ gồ
4080
+ xẻng
4081
+ cún
4082
+ trám
4083
+ thướt
4084
+ oái
4085
+ vánh
4086
+ típ
4087
+ sy
4088
+ rươi
4089
+ nướu
4090
+ mơn
4091
+ móm
4092
+ chãi
4093
+ tộ
4094
+ thớ
4095
+ nhạn
4096
+ ngai
4097
+ chấu
4098
+
4099
+ rợp
4100
+ nhót
4101
+ ke
4102
+ chồi
4103
+ voọc
4104
+ uổng
4105
+ phiếm
4106
+ phèo
4107
+ đoài
4108
+ gãi
4109
+ uế
4110
+ khấm
4111
+ hộc
4112
+ xo
4113
+ mảy
4114
+ gấc
4115
+
4116
+ lòi
4117
+ xoà
4118
+ tắp
4119
+ vông
4120
+ trôm
4121
+ nin
4122
+
4123
+ bòn
4124
+ nhẵn
4125
+ chửa
4126
+ đước
4127
+ khui
4128
+ chới
4129
+ vèo
4130
+ thỉu
4131
+ te
4132
+ sên
4133
+ nhòm
4134
+ đìa
4135
+ dam
4136
+ phích
4137
+ đơ
4138
+ biền
4139
+ bẽ
4140
+ ó
4141
+ hạo
4142
+ chớm
4143
+ vón
4144
+ rói
4145
+ đuốc
4146
+ hau
4147
+
4148
+ thủi
4149
+ nhằng
4150
+ ạch
4151
+ bụt
4152
+ tửu
4153
+
4154
+ uẩn
4155
+ toác
4156
+ quỵt
4157
+ phờ
4158
+ bọng
4159
+ uể
4160
+ ráy
4161
+ đúp
4162
+ dúi
4163
+ díu
4164
+
4165
+ khè
4166
+ chóc
4167
+ beo
4168
+ tuốt
4169
+ hùa
4170
+ ngụm
4171
+ thày
4172
+ lụp
4173
+ chình
4174
+ soài
4175
+ rên
4176
+ bịp
4177
+ boong
4178
+ rìu
4179
+ nhản
4180
+ chóp
4181
+ cầy
4182
+ nhạo
4183
+ khoi
4184
+ giũa
4185
+ tĩu
4186
+ nhàu
4187
+ nghiễm
4188
+ nếnh
4189
+ nùng
4190
+ mót
4191
+ chột
4192
+ vắn
4193
+ mỏm
4194
+ bua
4195
+ ém
4196
+ rưới
4197
+ báng
4198
+ xốt
4199
+ rởm
4200
+ nườm
4201
+ niềng
4202
+ nghịt
4203
+ rảo
4204
+ lỵ
4205
+ bìu
4206
+ vừ
4207
+ truân
4208
+ quẩy
4209
+ nượp
4210
+ dẹt
4211
+ sắng
4212
+ rỗ
4213
+ rần
4214
+ vầng
4215
+ lể
4216
+ gờ
4217
+ đuông
4218
+ dấp
4219
+ tuýt
4220
+ them
4221
+ thẫm
4222
+ quẹo
4223
+ thít
4224
+ lổ
4225
+ yểu
4226
+
4227
+ lãn
4228
+ khoải
4229
+ loáng
4230
+ kịt
4231
+ bờm
4232
+ xẩy
4233
+ xẹp
4234
+ khập
4235
+ quằn
4236
+ mần
4237
+ loá
4238
+ nhoi
4239
+ diếp
4240
+ tăn
4241
+ kiển
4242
+ rặng
4243
+ quyệt
4244
+ sám
4245
+ sạ
4246
+ giặm
4247
+ bẵng
4248
+ sủi
4249
+ mống
4250
+ chử
4251
+ tầu
4252
+ tằn
4253
+ quánh
4254
+ nhộng
4255
+
4256
+ đoản
4257
+ ăng
4258
+ tếu
4259
+ muồi
4260
+ vái
4261
+ trát
4262
+ bấu
4263
+ lơi
4264
+ lẵng
4265
+ hách
4266
+ nhơ
4267
+ liếm
4268
+ toanh
4269
+ nhốn
4270
+ ngoa
4271
+ ròi
4272
+ biếc
4273
+ úa
4274
+ tưởi
4275
+
4276
+ ửng
4277
+ lợm
4278
+ lềnh
4279
+ tể
4280
+ ngươi
4281
+ yểm
4282
+
4283
+ nầm
4284
+ gẫm
4285
+ cảo
4286
+ sọt
4287
+ nhám
4288
+ nằng
4289
+ gáo
4290
+ chường
4291
+ ớn
4292
+ nhãng
4293
+ lủng
4294
+ túp
4295
+ nuột
4296
+ xốc
4297
+ thênh
4298
+ khiễng
4299
+ điếm
4300
+ đẵng
4301
+ chuân
4302
+ bun
4303
+ hui
4304
+ hói
4305
+ chộp
4306
+ chơ
4307
+ po
4308
+ loè
4309
+ hua
4310
+ gàu
4311
+ nhuốm
4312
+ nhoài
4313
+ khuếch
4314
+ quắt
4315
+ phảng
4316
+ luy
4317
+ húp
4318
+ cuội
4319
+ bẫm
4320
+ dật
4321
+ nhặn
4322
+ pao
4323
+ xáng
4324
+ khước
4325
+ đoạ
4326
+ bằm
4327
+ thủa
4328
+ quại
4329
+ lình
4330
+ huề
4331
+ voan
4332
+ nghinh
4333
+
4334
+ pay
4335
+ nhoè
4336
+ dằng
4337
+ bĩnh
4338
+ trấu
4339
+ nựng
4340
+ dau
4341
+
4342
+ vại
4343
+
4344
+ niêu
4345
+ lợ
4346
+ lêu
4347
+ rim
4348
+ ram
4349
+ oằn
4350
+ loăng
4351
+ dãn
4352
+ tởm
4353
+ nanh
4354
+ đơm
4355
+ búng
4356
+ hạp
4357
+ ghém
4358
+ ngáp
4359
+ giãy
4360
+ láy
4361
+ nồm
4362
+ lạn
4363
+ nhem
4364
+ nhài
4365
+ chồm
4366
+ bụ
4367
+ xép
4368
+ oăm
4369
+ gờm
4370
+ trề
4371
+ máo
4372
+ chờn
4373
+ trằn
4374
+ lũi
4375
+ liềm
4376
+ lải
4377
+ khạc
4378
+ gộc
4379
+ chọt
4380
+ ngọng
4381
+ khua
4382
+ xom
4383
+ ria
4384
+ ngòm
4385
+ ngoảnh
4386
+ ngoặc
4387
+ nẹt
4388
+ sìn
4389
+ chuốc
4390
+ toang
4391
+ sua
4392
+ nghía
4393
+ lẩm
4394
+ trịch
4395
+ quắp
4396
+ dượt
4397
+ tau
4398
+ ghề
4399
+ sủng
4400
+ dua
4401
+ tạnh
4402
+ sực
4403
+ bự
4404
+ tíu
4405
+ còm
4406
+ cạch
4407
+ mun
4408
+ tủa
4409
+ lứt
4410
+ kiềng
4411
+ gùi
4412
+ sề
4413
+ phập
4414
+ mùn
4415
+ loã
4416
+ guốc
4417
+ phúng
4418
+ hủi
4419
+ hỡi
4420
+ chác
4421
+ pi
4422
+
4423
+ mõm
4424
+ nhè
4425
+ mũm
4426
+ mĩm
4427
+ lẹt
4428
+ bõm
4429
+ tuế
4430
+
4431
+ gien
4432
+ quạnh
4433
+ hác
4434
+ thiếc
4435
+ riu
4436
+ nưa
4437
+ thảng
4438
+ noãn
4439
+ bâng
4440
+ soán
4441
+ nịch
4442
+ nhó
4443
+ thăn
4444
+ nũng
4445
+ giụa
4446
+ moong
4447
+ khêu
4448
+ kếch
4449
+ dòi
4450
+ nhũn
4451
+ vẻn
4452
+ nhữ
4453
+ cuỗm
4454
+ chửng
4455
+ ngăm
4456
+ boa
4457
+ ươn
4458
+ mớm
4459
+ quơ
4460
+ giương
4461
+ xổm
4462
+ lìm
4463
+ lèn
4464
+ điếng
4465
+ phớ
4466
+ gẫu
4467
+ phỉ
4468
+ ngổ
4469
+ loé
4470
+ diếm
4471
+ dậm
4472
+ đăm
4473
+ chin
4474
+ nhúm
4475
+ kị
4476
+ guy
4477
+ dửng
4478
+ trượng
4479
+ thẩn
4480
+ nhuỵ
4481
+ giập
4482
+ cói
4483
+ bỉu
4484
+ xơi
4485
+ thoăn
4486
+ phẩy
4487
+ nhiếc
4488
+ duật
4489
+ ríu
4490
+ hênh
4491
+ truồng
4492
+ nhum
4493
+ nhom
4494
+ nia
4495
+ gợn
4496
+ soa
4497
+ giòi
4498
+ tửng
4499
+ khuây
4500
+ kiếng
4501
+ dụi
4502
+ nệ
4503
+ liệm
4504
+ rọ
4505
+ nhú
4506
+ hiềm
4507
+ ghim
4508
+ thiển
4509
+ đồm
4510
+ khom
4511
+ dùm
4512
+ vối
4513
+
4514
+ khứa
4515
+ èo
4516
+ doi
4517
+ đoa
4518
+ mạp
4519
+ địu
4520
+ cở
4521
+ vạm
4522
+ thó
4523
+ tời
4524
+ miều
4525
+ lọng
4526
+ khèn
4527
+ rua
4528
+ quạ
4529
+ thược
4530
+ rắm
4531
+ ngụp
4532
+ trườn
4533
+ thím
4534
+ cộp
4535
+ thồ
4536
+ gằn
4537
+ bấn
4538
+ xị
4539
+ rớ
4540
+ huổi
4541
+ cùm
4542
+ phủi
4543
+ ngoằn
4544
+ khà
4545
+ hủa
4546
+ sổng
4547
+ peng
4548
+ nghèn
4549
+ xuề
4550
+ nghét
4551
+ lới
4552
+ khố
4553
+ xệch
4554
+ rữa
4555
+ nghếch
4556
+ rúm
4557
+ ngoạ
4558
+ quềnh
4559
+ mẫm
4560
+ khong
4561
+ ăm
4562
+ phò
4563
+ mấp
4564
+ kiết
4565
+ xình
4566
+
4567
+ gàn
4568
+ đảnh
4569
+ ậm
4570
+ trối
4571
+ nhăm
4572
+ nạng
4573
+ dòm
4574
+ chề
4575
+ xỉa
4576
+ rắp
4577
+ viển
4578
+ uột
4579
+ mợ
4580
+ bủn
4581
+ thằn
4582
+ phăn
4583
+ oánh
4584
+ lững
4585
+ lém
4586
+ gôn
4587
+ ang
4588
+ nạm
4589
+ kiền
4590
+ bân
4591
+
4592
+ ngoe
4593
+ lổng
4594
+
4595
+ vượn
4596
+ thoang
4597
+
4598
+ thòng
4599
+ som
4600
+ giậm
4601
+ réo
4602
+ nịu
4603
+ muốt
4604
+ lia
4605
+ ruồng
4606
+ hĩnh
4607
+ xum
4608
+ tráp
4609
+ toàng
4610
+ mành
4611
+ mòi
4612
+ lúm
4613
+
4614
+ xuyết
4615
+ phới
4616
+ chúi
4617
+ tàm
4618
+ sũng
4619
+ phên
4620
+ nhử
4621
+ rỏi
4622
+ hu
4623
+ trảm
4624
+ hập
4625
+ nhe
4626
+ meo
4627
+ gọng
4628
+ nhễ
4629
+ truông
4630
+ seng
4631
+ rủng
4632
+ vạng
4633
+ sền
4634
+ phầm
4635
+ xổi
4636
+ cũi
4637
+ trọi
4638
+ phia
4639
+ loẹt
4640
+ truất
4641
+ suý
4642
+ mởn
4643
+ giốc
4644
+ bứng
4645
+ vuột
4646
+ phay
4647
+
4648
+ khứu
4649
+ kệch
4650
+ xoã
4651
+ rỉnh
4652
+ nhép
4653
+ khản
4654
+ dổi
4655
+ chạng
4656
+ bẵm
4657
+ xồng
4658
+ phây
4659
+ mom
4660
+ lẽn
4661
+ bẽn
4662
+ vanh
4663
+ pen
4664
+ nhông
4665
+ nhẹm
4666
+ leng
4667
+ kền
4668
+ dề
4669
+
4670
+ lẩy
4671
+ rộc
4672
+ nỏ
4673
+ lởm
4674
+ tụm
4675
+ nõn
4676
+ ngố
4677
+ vẻo
4678
+ rích
4679
+ nhẻm
4680
+ ghiền
4681
+ đở
4682
+ cóng
4683
+ rặn
4684
+ rám
4685
+ oang
4686
+ nhành
4687
+ chứt
4688
+
4689
+ thốc
4690
+ thãi
4691
+ rường
4692
+ luộm
4693
+ ghì
4694
+ phẩn
4695
+
4696
+ nhèm
4697
+ thiểm
4698
+ liễn
4699
+ choán
4700
+ bớp
4701
+ tớp
4702
+ sớ
4703
+ mủi
4704
+ đọt
4705
+ cườm
4706
+ chỏng
4707
+ toi
4708
+ tịt
4709
+ guộc
4710
+ đìu
4711
+ đên
4712
+ đốp
4713
+ khuy
4714
+ chiền
4715
+ xúng
4716
+
4717
+ vẳng
4718
+ tréo
4719
+ keng
4720
+ hão
4721
+ cheng
4722
+ í
4723
+ dom
4724
+ thuộm
4725
+ sỏ
4726
+ sậy
4727
+
4728
+ hớp
4729
+ sém
4730
+ sác
4731
+ nhạnh
4732
+ ngộp
4733
+ mọ
4734
+ gun
4735
+ xoàn
4736
+ vằng
4737
+ toạc
4738
+
4739
+ rằn
4740
+ ngái
4741
+ xuý
4742
+ xính
4743
+ tuốc
4744
+ thây
4745
+ qúa
4746
+ đẫy
4747
+ trớn
4748
+ hòi
4749
+ sờn
4750
+ tuềnh
4751
+ gột
4752
+ lét
4753
+ rin
4754
+ mọn
4755
+ tâng
4756
+ mẹt
4757
+ húi
4758
+ buột
4759
+ tray
4760
+ quẳng
4761
+ ngâu
4762
+ duân
4763
+ thom
4764
+ ngỗ
4765
+ nghệch
4766
+ xôm
4767
+ phang
4768
+ ọp
4769
+ đon
4770
+ toáng
4771
+ thoan
4772
+ sái
4773
+ nhởn
4774
+ lúi
4775
+ rọc
4776
+ gạn
4777
+ ẹp
4778
+ dững
4779
+ trụng
4780
+ thều
4781
+ rạo
4782
+ nịt
4783
+ ngoèo
4784
+ mèn
4785
+ dực
4786
+ dõng
4787
+ làu
4788
+ kin
4789
+ duyện
4790
+ đung
4791
+ ngoạc
4792
+ tút
4793
+ trờ
4794
+
4795
+ cót
4796
+ vợi
4797
+ nhao
4798
+ nhặng
4799
+ chởm
4800
+ bươu
4801
+ xang
4802
+ vược
4803
+ vam
4804
+ ngấp
4805
+ xuê
4806
+ nhố
4807
+ bìm
4808
+ véo
4809
+ vảng
4810
+ thàng
4811
+ sồi
4812
+ queo
4813
+ khuâng
4814
+ ươi
4815
+ ngụa
4816
+ ngoáy
4817
+ ỉm
4818
+ hậm
4819
+ gằm
4820
+ túa
4821
+ sẩm
4822
+ rọt
4823
+ khuông
4824
+ huyến
4825
+ xắc
4826
+ soạng
4827
+ piêu
4828
+ đật
4829
+ đẫn
4830
+ tủm
4831
+ rủn
4832
+ choẹ
4833
+ xiêng
4834
+ viềng
4835
+ tằng
4836
+
4837
+ xoe
4838
+ ngắc
4839
+ lởi
4840
+ hom
4841
+ ã
4842
+ sồng
4843
+ rụm
4844
+ páo
4845
+ nhảu
4846
+ khựng
4847
+ kháp
4848
+ hoác
4849
+ thọc
4850
+ rắt
4851
+ giắt
4852
+ đỏng
4853
+ tỉm
4854
+ lói
4855
+ khau
4856
+ trùn
4857
+ trạo
4858
+ soóc
4859
+ ới
4860
+ kẻng
4861
+ sượt
4862
+ qủa
4863
+ hỏn
4864
+ chẹt
4865
+ bện
4866
+ téc
4867
+ sõng
4868
+ rén
4869
+ nhùng
4870
+ gầu
4871
+ dặc
4872
+ vức
4873
+ phơ
4874
+ nhõng
4875
+ kềm
4876
+ rền
4877
+ nguệch
4878
+ khưu
4879
+ khấp
4880
+ khảnh
4881
+ hựu
4882
+ tược
4883
+ sia
4884
+ đin
4885
+ sượng
4886
+ kháo
4887
+ xẹt
4888
+ trẩy
4889
+ rón
4890
+ quẫy
4891
+ tênh
4892
+ iu
4893
+ rịn
4894
+ phạc
4895
+ pác
4896
+ đuống
4897
+ quết
4898
+ phấp
4899
+
4900
+ lớ
4901
+ hâu
4902
+ bòng
4903
+ thin
4904
+ sui
4905
+ quắm
4906
+ phiu
4907
+ tiêng
4908
+ róc
4909
+ rận
4910
+ muông
4911
+ muồng
4912
+ gui
4913
+ gong
4914
+ đúm
4915
+ bẳn
4916
+ xốn
4917
+ loe
4918
+ bẽo
4919
+ vấy
4920
+ truật
4921
+ sõi
4922
+ nẩy
4923
+ xút
4924
+ toe
4925
+ tẹo
4926
+ sật
4927
+ rây
4928
+ nui
4929
+ lấu
4930
+ dạc
4931
+ sếu
4932
+ phắt
4933
+ lèng
4934
+ khuỵu
4935
+ cắc
4936
+ ruộm
4937
+ kheo
4938
+ hóp
4939
+ gièm
4940
+ bốp
4941
+
4942
+ xín
4943
+ rưởi
4944
+ phạ
4945
+ nhổm
4946
+ lống
4947
+
4948
+
4949
+ vưởng
4950
+ rúc
4951
+ quặt
4952
+ đủi
4953
+ chấy
4954
+ chạn
4955
+ són
4956
+ giát
4957
+ dềnh
4958
+ trét
4959
+ roe
4960
+ panh
4961
+ lến
4962
+ lằng
4963
+ dộng
4964
+ đít
4965
+ sển
4966
+ lọn
4967
+ khuyển
4968
+ đủng
4969
+ cợn
4970
+ choai
4971
+ bươm
4972
+ nhớp
4973
+ gỏng
4974
+ giựt
4975
+ càu
4976
+ tuẫn
4977
+ tẹt
4978
+
4979
+ nhíp
4980
+ chụm
4981
+ vờn
4982
+ sụa
4983
+ moan
4984
+ choé
4985
+ chỏ
4986
+ cham
4987
+ chá
4988
+ nhùn
4989
+ lất
4990
+ dèm
4991
+ vích
4992
+ thút
4993
+ rum
4994
+ nhời
4995
+ khoắng
4996
+ heng
4997
+ xeo
4998
+
4999
+
5000
+ phử
5001
+ phiêng
5002
+ ních
5003
+ nghịu
5004
+ lum
5005
+ lữa
5006
+ gụ
5007
+ chểnh
5008
+ chái
5009
+ búc
5010
+ rệu
5011
+ rái
5012
+ quèn
5013
+ ngấu
5014
+ gon
5015
+ đừ
5016
+ đĩ
5017
+ chộn
5018
+ tồng
5019
+ núng
5020
+ nót
5021
+ lua
5022
+ khạo
5023
+ giót
5024
+ đòng
5025
+ đẹt
5026
+ trĩnh
5027
+ phễu
5028
+ nầy
5029
+ khểnh
5030
+ giê
5031
+ cụng
5032
+ xầm
5033
+ lơn
5034
+ thuồng
5035
+ thoá
5036
+ síp
5037
+ phau
5038
+ pắc
5039
+ nhẩn
5040
+ nghỉm
5041
+ hẩm
5042
+ bợm
5043
+ vồn
5044
+ sín
5045
+ ry
5046
+ phơn
5047
+ pe
5048
+ ngạnh
5049
+ nạnh
5050
+ lườm
5051
+ lảm
5052
+ xuyền
5053
+ trui
5054
+ quýnh
5055
+ bấc
5056
+ nâm
5057
+ chuôi
5058
+ bụp
5059
+ rờn
5060
+ què
5061
+ nhắt
5062
+ mèm
5063
+ láu
5064
+ choang
5065
+ phổng
5066
+ nhụt
5067
+ nện
5068
+ lẹm
5069
+ khênh
5070
+ trẽn
5071
+ sướt
5072
+ lảo
5073
+ hoanh
5074
+ bịn
5075
+ bậu
5076
+ vùn
5077
+ trư
5078
+ quít
5079
+ ngoắt
5080
+ ỉn
5081
+ chành
5082
+ thếp
5083
+ nhuốc
5084
+ ngoằng
5085
+ ngheo
5086
+ cáy
5087
+ buy
5088
+ lờn
5089
+ toét
5090
+ nhoẻn
5091
+ kít
5092
+ huyễn
5093
+ hem
5094
+ gía
5095
+ cùa
5096
+ ướm
5097
+ quao
5098
+ nhim
5099
+
5100
+ đưng
5101
+ bĩu
5102
+ sẩn
5103
+ hin
5104
+ sây
5105
+ lỏm
5106
+ giầu
5107
+ xuyệt
5108
+ vãnh
5109
+ nhón
5110
+ lườn
5111
+ khú
5112
+ ưỡn
5113
+ ruỗng
5114
+ pủa
5115
+ chếch
5116
+ thuân
5117
+ nọng
5118
+ nèo
5119
+ hiều
5120
+ dúa
5121
+ xìu
5122
+ rướn
5123
+ quàn
5124
+ rùm
5125
+ ngồn
5126
+ lìn
5127
+ khoáy
5128
+ chúm
5129
+ bơn
5130
+ khốm
5131
+ cỏn
5132
+ choảng
5133
+ chạch
5134
+ váp
5135
+ sãi
5136
+ háu
5137
+ chuý
5138
+ chím
5139
+ yêm
5140
+ xán
5141
+ thũng
5142
+ tễnh
5143
+ khính
5144
+ gở
5145
+ đễ
5146
+ bía
5147
+ sụ
5148
+ quị
5149
+ nhít
5150
+ mán
5151
+ huôi
5152
+ huơ
5153
+ hắng
5154
+ ghìm
5155
+ dôm
5156
+ chon
5157
+ bẹt
5158
+ xạc
5159
+ ủa
5160
+ truyển
5161
+ sấn
5162
+
5163
+ nhiêm
5164
+ mồn
5165
+ lưa
5166
+ líp
5167
+ gày
5168
+ đớp
5169
+ đì
5170
+ xịch
5171
+ tuận
5172
+ phụt
5173
+ oẹ
5174
+ oách
5175
+ nặm
5176
+ m��
5177
+ mội
5178
+ hển
5179
+ hằm
5180
+ duẫn
5181
+ dũa
5182
+
5183
+ diếc
5184
+ dến
5185
+ cọt
5186
+ bổi
5187
+ vể
5188
+
5189
+ ình
5190
+ dim
5191
+ mủn
5192
+ khướt
5193
+ khoeo
5194
+ khệ
5195
+ chễ
5196
+ cạ
5197
+ sốp
5198
+ rốc
5199
+ nhẹp
5200
+ gin
5201
+ chòng
5202
+ chỏm
5203
+ xường
5204
+ vập
5205
+ sệ
5206
+ ruy
5207
+ rức
5208
+ quẻ
5209
+ nghen
5210
+ khon
5211
+ huýt
5212
+ hổn
5213
+ xức
5214
+ quĩ
5215
+ miêng
5216
+ khẩm
5217
+ eng
5218
+ chã
5219
+ bệch
5220
+ xúp
5221
+ roa
5222
+ rẻo
5223
+ ngoải
5224
+ mấn
5225
+ chẩm
5226
+ thoong
5227
+ nhíu
5228
+ muôi
5229
+
5230
+ lịnh
5231
+ ghè
5232
+ vao
5233
+ ui
5234
+ nẫu
5235
+ mưng
5236
+ khuỵ
5237
+ thừ
5238
+ thia
5239
+ ngáng
5240
+ lom
5241
+ dáo
5242
+ dánh
5243
+ phừng
5244
+ nguậy
5245
+
5246
+ huyn
5247
+ dể
5248
+ chổm
5249
+ thõng
5250
+ lũa
5251
+ khoen
5252
+ khều
5253
+ giạ
5254
+ dẹo
5255
+ sởn
5256
+ rem
5257
+ huồi
5258
+ gông
5259
+ cũn
5260
+ vởn
5261
+ trợt
5262
+ thết
5263
+ ne
5264
+ nau
5265
+ nấn
5266
+ hẵng
5267
+ gừa
5268
+ giăm
5269
+ chếnh
5270
+ rương
5271
+ nhon
5272
+ lếch
5273
+ ghẽ
5274
+ đễnh
5275
+ bớ
5276
+ bạng
5277
+ thiềng
5278
+ tệp
5279
+ sộp
5280
+ sẻn
5281
+ phướng
5282
+ phôn
5283
+ păng
5284
+ luyên
5285
+ lịa
5286
+ cỡm
5287
+ bâu
5288
+ tạch
5289
+ sít
5290
+ lởn
5291
+ giảo
5292
+ dơn
5293
+ ché
5294
+ xố
5295
+ xắp
5296
+ tiển
5297
+ thếch
5298
+ rờ
5299
+ pang
5300
+ nhương
5301
+ nguýt
5302
+ diềm
5303
+ súa
5304
+ ngợ
5305
+ ngằn
5306
+ mén
5307
+ lử
5308
+ loong
5309
+ khẩy
5310
+ chèm
5311
+ xởi
5312
+ liếp
5313
+ dởm
5314
+ bum
5315
+ xạo
5316
+ vốc
5317
+ tron
5318
+ triện
5319
+ rề
5320
+ lảnh
5321
+ khiu
5322
+ hống
5323
+ try
5324
+ liến
5325
+
5326
+ hum
5327
+ xiềng
5328
+ rười
5329
+ lúp
5330
+ hõm
5331
+ dạm
5332
+ tiệu
5333
+ thững
5334
+ tém
5335
+ nốc
5336
+ khảng
5337
+ cùn
5338
+ phẩu
5339
+ giáy
5340
+ đụn
5341
+ đét
5342
+ chò
5343
+ xược
5344
+ vẩu
5345
+
5346
+ nhày
5347
+ mòng
5348
+ đoảng
5349
+ dia
5350
+ cụp
5351
+ chổng
5352
+ biều
5353
+ xồm
5354
+ vẹm
5355
+ tứa
5356
+ thùa
5357
+ nĩa
5358
+ gâm
5359
+ é
5360
+ vói
5361
+ soản
5362
+ rệp
5363
+ phệ
5364
+ ngộn
5365
+ xoàng
5366
+ tiễu
5367
+ rặt
5368
+ ngoắc
5369
+ dy
5370
+ chạ
5371
+
5372
+ oa
5373
+ nhắng
5374
+ ngoạm
5375
+ mủng
5376
+ mím
5377
+ mệ
5378
+ hụ
5379
+ dịnh
5380
+ càm
5381
+ bịnh
5382
+ xếch
5383
+ trố
5384
+ tiếm
5385
+ thịch
5386
+ quở
5387
+ pả
5388
+ mớn
5389
+ lồm
5390
+ chĩnh
5391
+ chẽm
5392
+ tun
5393
+ thểu
5394
+ pồ
5395
+ khén
5396
+ híp
5397
+ đúa
5398
+ dác
5399
+ chẹn
5400
+ luốc
5401
+ khù
5402
+ cồm
5403
+ chổ
5404
+ chét
5405
+ chêm
5406
+ chễm
5407
+ chệ
5408
+ toẹt
5409
+ nhéo
5410
+ lổn
5411
+ hia
5412
+ đển
5413
+ phỉnh
5414
+ phắc
5415
+ ngồng
5416
+ lốm
5417
+ xèng
5418
+ xấc
5419
+ sồ
5420
+ niết
5421
+ nhiểu
5422
+ nạy
5423
+ liệp
5424
+ huẩn
5425
+ hoáy
5426
+ xửa
5427
+ xẻn
5428
+ tuyn
5429
+ mém
5430
+ láp
5431
+ din
5432
+ bứa
5433
+ ục
5434
+ trươi
5435
+ tở
5436
+ suồng
5437
+ nọt
5438
+ khàng
5439
+ hoản
5440
+ dụa
5441
+
5442
+ nhụa
5443
+ nhoẹt
5444
+ mứa
5445
+ giong
5446
+ dái
5447
+ chù
5448
+ chõng
5449
+ suê
5450
+
5451
+ nhiện
5452
+ loằng
5453
+ è
5454
+ coen
5455
+ bùm
5456
+ vục
5457
+ thuôn
5458
+ thụng
5459
+ liệng
5460
+ hếch
5461
+ gường
5462
+ dỏ
5463
+ chũ
5464
+ bỡn
5465
+ bím
5466
+ tưa
5467
+ trành
5468
+ thoàn
5469
+
5470
+ rày
5471
+ nguẩy
5472
+ choạc
5473
+ boe
5474
+ triễn
5475
+ thượt
5476
+ rùi
5477
+ nhẩy
5478
+ giội
5479
+ duối
5480
+ dóc
5481
+ yều
5482
+ xái
5483
+ tòm
5484
+ táu
5485
+ hoạnh
5486
+ hiêu
5487
+ deng
5488
+ triêm
5489
+ thúi
5490
+
5491
+ gừ
5492
+ chía
5493
+ xửng
5494
+ váo
5495
+ trạnh
5496
+ tọt
5497
+ thòm
5498
+ rướm
5499
+ ót
5500
+ nhèo
5501
+ néo
5502
+ hoắt
5503
+ ẻo
5504
+ choe
5505
+ biễn
5506
+ vặc
5507
+ truyên
5508
+ tồ
5509
+ rom
5510
+ riếu
5511
+ quơn
5512
+ phạn
5513
+ nghẽo
5514
+ khọt
5515
+ hoắm
5516
+ gum
5517
+ đười
5518
+ đót
5519
+ diến
5520
+ boi
5521
+ báy
5522
+ xẩu
5523
+ vầu
5524
+ truồi
5525
+ tậm
5526
+ nhín
5527
+ lị
5528
+ khạp
5529
+ đỏi
5530
+ dợ
5531
+ đia
5532
+ chiển
5533
+ xuẩn
5534
+ úm
5535
+ ời
5536
+ nhuân
5537
+ nhiệp
5538
+ meng
5539
+ khắn
5540
+ ẹo
5541
+ deo
5542
+ dằm
5543
+ xổng
5544
+ xoạc
5545
+ xiu
5546
+ rống
5547
+
5548
+ mẩm
5549
+ lỏn
5550
+ lếp
5551
+ kím
5552
+ gôm
5553
+ dỏng
5554
+ vỳ
5555
+ thụp
5556
+ sỗ
5557
+ nộn
5558
+ loàn
5559
+ hặc
5560
+ diu
5561
+ bải
5562
+ ại
5563
+ xoảng
5564
+ vống
5565
+ toong
5566
+ sòm
5567
+ sậu
5568
+ rui
5569
+ ràm
5570
+ pheng
5571
+ noé
5572
+ nhin
5573
+ lếu
5574
+ khoàng
5575
+ ỉa
5576
+ hịch
5577
+ bường
5578
+ thiềm
5579
+ táy
5580
+ sịt
5581
+ pờ
5582
+ nhách
5583
+ nẫng
5584
+ đoàng
5585
+ chỉa
5586
+ trập
5587
+ sểnh
5588
+ rếu
5589
+
5590
+ phét
5591
+ méc
5592
+ hiềng
5593
+ cun
5594
+ chiện
5595
+ ùm
5596
+ thạp
5597
+ quắc
5598
+ pênh
5599
+ nhong
5600
+ nhiễn
5601
+ nghễ
5602
+ xía
5603
+ ùng
5604
+ tọc
5605
+ sèo
5606
+ ngươn
5607
+ kía
5608
+ hợm
5609
+ hoải
5610
+ xênh
5611
+ triêu
5612
+ rộm
5613
+ nghệp
5614
+ nẫm
5615
+ loảng
5616
+ dem
5617
+ cửi
5618
+ bụa
5619
+ ực
5620
+ thuyến
5621
+ thum
5622
+ sừ
5623
+ pẩu
5624
+ đíp
5625
+ biêu
5626
+ ảng
5627
+ vỵ
5628
+ vố
5629
+ véc
5630
+
5631
+ rạm
5632
+ pai
5633
+ nớ
5634
+ nắc
5635
+ loai
5636
+ hoẹ
5637
+ đọi
5638
+ cỡn
5639
+ chồ
5640
+ ụp
5641
+ quạch
5642
+ phọt
5643
+ oặt
5644
+ luyn
5645
+ huý
5646
+ đù
5647
+ dồ
5648
+ chặp
5649
+ ầu
5650
+ thướng
5651
+ pán
5652
+ giắc
5653
+ coong
5654
+ sớt
5655
+ pông
5656
+ nim
5657
+ lôm
5658
+ hoảnh
5659
+ xùa
5660
+ xoành
5661
+ xoạch
5662
+ xộ
5663
+ xan
5664
+ tuynh
5665
+ tuôi
5666
+ ròn
5667
+ py
5668
+
5669
+ phướn
5670
+ phịu
5671
+ pheo
5672
+ noong
5673
+ nhiệu
5674
+ ngoã
5675
+ ỉu
5676
+ huỵch
5677
+ huých
5678
+
5679
+ doe
5680
+ choè
5681
+ bựa
5682
+ xạm
5683
+ vểnh
5684
+ tỏng
5685
+ thòn
5686
+ sòn
5687
+ quờ
5688
+ khuổi
5689
+ hùi
5690
+ diểm
5691
+ chạo
5692
+ chằn
5693
+ cảu
5694
+ via
5695
+ vện
5696
+ triên
5697
+ trẹo
5698
+ trảo
5699
+ tâu
5700
+ ruệ
5701
+ nhột
5702
+ gau
5703
+ đợ
5704
+ dìn
5705
+ chặc
5706
+ xồ
5707
+ thuẩn
5708
+ sại
5709
+ phéng
5710
+ ộp
5711
+ nhỏm
5712
+ nguyến
5713
+ lìu
5714
+ bíp
5715
+ thé
5716
+ sạo
5717
+ quạng
5718
+ púng
5719
+ poe
5720
+ pam
5721
+ lạo
5722
+ kiếu
5723
+ huênh
5724
+ choẹt
5725
+ chõ
5726
+ chẩy
5727
+ bép
5728
+ bau
5729
+ xàm
5730
+ trum
5731
+ thớm
5732
+ múp
5733
+ lỷ
5734
+ khoèo
5735
+
5736
+ dợt
5737
+ coóng
5738
+ vệnh
5739
+ thưng
5740
+ thèn
5741
+ thát
5742
+ rơn
5743
+ nọi
5744
+ luynh
5745
+ khum
5746
+ hoạc
5747
+ đẻn
5748
+ bam
5749
+ xự
5750
+ voóc
5751
+ tuối
5752
+ tực
5753
+ thườn
5754
+ thoắng
5755
+ rịt
5756
+ phịch
5757
+ phăm
5758
+ oe
5759
+ oẳn
5760
+ nhoạng
5761
+ ngòn
5762
+ liềng
5763
+ gioi
5764
+ giâm
5765
+ gảy
5766
+ dúng
5767
+ dồng
5768
+ chượp
5769
+ bôm
5770
+ xềnh
5771
+ truyến
5772
+ trôn
5773
+ trấp
5774
+ teng
5775
+ quăn
5776
+ pín
5777
+ nhủi
5778
+ nhẫy
5779
+ ngủn
5780
+ nả
5781
+ mung
5782
+ khì
5783
+ hây
5784
+ goi
5785
+ giôn
5786
+ chẩu
5787
+ cẫng
5788
+ xam
5789
+ thếnh
5790
+ tềnh
5791
+ sẵng
5792
+ noe
5793
+ hiêng
5794
+ giấp
5795
+ tren
5796
+ tiu
5797
+ rế
5798
+ nhiền
5799
+ duỵ
5800
+ dớn
5801
+ cúa
5802
+ cồi
5803
+ chẫm
5804
+ ành
5805
+ yêng
5806
+ xề
5807
+ uyn
5808
+ tủn
5809
+ trẹm
5810
+ tổi
5811
+ thọt
5812
+ rấm
5813
+ qu
5814
+ pui
5815
+ nhinh
5816
+ mừ
5817
+ lựng
5818
+ khun
5819
+ ghiếc
5820
+ ên
5821
+ đũi
5822
+ cọn
5823
+ chuỳ
5824
+ chô
5825
+ chiếng
5826
+ xoẹt
5827
+ tiểng
5828
+ rảng
5829
+ quện
5830
+ ồm
5831
+ nhia
5832
+ nghiêu
5833
+ mơi
5834
+ mầy
5835
+ kếp
5836
+ cum
5837
+ vưu
5838
+ voa
5839
+ tòn
5840
+ soan
5841
+ rều
5842
+ pồn
5843
+ khé
5844
+ huỳ
5845
+ giậu
5846
+ ễnh
5847
+ đạng
5848
+ cờn
5849
+ bẫng
5850
+ xên
5851
+ ừng
5852
+ tễu
5853
+ sún
5854
+ siên
5855
+ siêm
5856
+ sẳn
5857
+ quặp
5858
+ pua
5859
+ õng
5860
+ măm
5861
+ liện
5862
+ khào
5863
+ đổm
5864
+ đàu
5865
+ bằn
5866
+ xiều
5867
+ vẳn
5868
+ triêng
5869
+ thoã
5870
+ thiến
5871
+ thè
5872
+ ỏn
5873
+ ỡm
5874
+ ọc
5875
+ lun
5876
+ khịt
5877
+ khắng
5878
+ giu
5879
+ gải
5880
+ doàn
5881
+ điễn
5882
+ dịa
5883
+ chẹo
5884
+ bửng
5885
+ bẳng
5886
+ vôn
5887
+ uân
5888
+ tré
5889
+ thíp
5890
+ soạt
5891
+ rổn
5892
+ rỏ
5893
+ riệu
5894
+ phum
5895
+ oát
5896
+ nuy
5897
+
5898
+ nhồng
5899
+ ngưởi
5900
+ ngầy
5901
+ khin
5902
+ gườm
5903
+ dình
5904
+ dìa
5905
+ đểm
5906
+ choong
5907
+ chản
5908
+ biêng
5909
+ béc
5910
+
5911
+ vim
5912
+ ường
5913
+ thuyện
5914
+ thẻn
5915
+ sột
5916
+ sếnh
5917
+ rỉa
5918
+ phóc
5919
+ ồng
5920
+
5921
+ nhều
5922
+ nhẳng
5923
+ nháng
5924
+ giau
5925
+ dóng
5926
+ đén
5927
+ bộng
5928
+ xuông
5929
+ xun
5930
+ tuồi
5931
+ tõm
5932
+ tịu
5933
+ thuổng
5934
+ rụp
5935
+ ràn
5936
+ pố
5937
+ phảm
5938
+ niễn
5939
+ ngườm
5940
+ huội
5941
+ ghèn
5942
+ doa
5943
+ dờ
5944
+ chọ
5945
+ bặc
5946
+ ua
5947
+ quảy
5948
+ pong
5949
+ phính
5950
+ ngóp
5951
+ náng
5952
+ moọc
5953
+ mếch
5954
+ hoằn
5955
+ gịn
5956
+ dăng
5957
+ côm
5958
+ chẻo
5959
+ bíu
5960
+ ây
5961
+ thạt
5962
+ sùm
5963
+ sồn
5964
+ sặt
5965
+ ỏm
5966
+ niền
5967
+ nác
5968
+ mản
5969
+ lụ
5970
+ lộp
5971
+ khuỷ
5972
+ hoong
5973
+ hổm
5974
+ hảng
5975
+ ét
5976
+ éc
5977
+ đũng
5978
+ đuề
5979
+ đú
5980
+ đôm
5981
+ cháng
5982
+ bộp
5983
+ quắn
5984
+ phám
5985
+ nơn
5986
+ nhiếu
5987
+ nhẫm
5988
+
5989
+ lọp
5990
+ lòm
5991
+ loãn
5992
+ lèm
5993
+ kiễng
5994
+ khúm
5995
+ ịch
5996
+ hử
5997
+ hiệt
5998
+ gioăng
5999
+ dẫy
6000
+ dáy
6001
+ đân
6002
+ chận
6003
+ xừ
6004
+ tuếch
6005
+ trỉa
6006
+ thàn
6007
+ sựt
6008
+ rúi
6009
+ pốt
6010
+ phoi
6011
+ phềnh
6012
+ noa
6013
+ lẹo
6014
+ léng
6015
+ hướm
6016
+ dừ
6017
+ củm
6018
+ têm
6019
+ sơm
6020
+ sạnh
6021
+ săng
6022
+ pom
6023
+ ón
6024
+ oắc
6025
+ nhiển
6026
+ khọm
6027
+ kẽo
6028
+ hiệm
6029
+ đui
6030
+ dớp
6031
+ choọng
6032
+ bắng
6033
+ xìn
6034
+ vọp
6035
+ vình
6036
+ viểm
6037
+ rôi
6038
+ rạnh
6039
+ qúi
6040
+ pon
6041
+ khoằm
6042
+ hảnh
6043
+ gụi
6044
+ đỏm
6045
+ dẽ
6046
+ chụt
6047
+ chỏi
6048
+ chẹp
6049
+ bỗ
6050
+ biễu
6051
+ uỳnh
6052
+ tũn
6053
+ trự
6054
+ trệu
6055
+ tìn
6056
+ têu
6057
+ tẽn
6058
+ tạn
6059
+ sộc
6060
+ sẹc
6061
+ pía
6062
+ nhiểm
6063
+ ngứ
6064
+ mum
6065
+ măn
6066
+ lôn
6067
+ lòn
6068
+ hự
6069
+ gúp
6070
+ gòi
6071
+ dòn
6072
+ đị
6073
+ chựng
6074
+ chầy
6075
+ biêm
6076
+ xoi
6077
+ thồng
6078
+ rẹt
6079
+ quì
6080
+ ơm
6081
+ nủ
6082
+ khoắt
6083
+ kẹ
6084
+ đụp
6085
+ dử
6086
+ điến
6087
+ bỏi
6088
+ béng
6089
+ vọn
6090
+ thởi
6091
+ thẳn
6092
+ tếch
6093
+ sụng
6094
+ sằn
6095
+ rài
6096
+ páp
6097
+ nình
6098
+ nhoét
6099
+ nhoáy
6100
+ nhẩu
6101
+ nghin
6102
+ nghiễn
6103
+ nãi
6104
+ muỗm
6105
+ khộp
6106
+ khấy
6107
+ khằm
6108
+ đưới
6109
+ cạc
6110
+ bảm
6111
+ xớt
6112
+ vường
6113
+ trược
6114
+ trảy
6115
+ trẫm
6116
+ tiễng
6117
+ sỉa
6118
+ rũa
6119
+ roong
6120
+ riệp
6121
+ phài
6122
+ pách
6123
+ nhò
6124
+ nhịt
6125
+ lớt
6126
+ lớm
6127
+ lổm
6128
+ liếu
6129
+ khịa
6130
+ giút
6131
+
6132
+ dun
6133
+ đõ
6134
+ cón
6135
+ chẽn
6136
+ chảng
6137
+ cặt
6138
+ biềm
6139
+ xeng
6140
+ trính
6141
+ tộp
6142
+ sằng
6143
+ oản
6144
+ nhội
6145
+ nhãi
6146
+ ngộc
6147
+ lỹ
6148
+ kều
6149
+ hỵ
6150
+ điêm
6151
+ dếnh
6152
+ dận
6153
+ chiểm
6154
+ bủng
6155
+ ần
6156
+ ròm
6157
+ poọng
6158
+ phốc
6159
+ ợt
6160
+ nuốc
6161
+ nởi
6162
+ ngam
6163
+ mạy
6164
+ luổng
6165
+ lóp
6166
+ liễng
6167
+ kiệp
6168
+ goa
6169
+ gâu
6170
+ duôi
6171
+ chượt
6172
+ chẳn
6173
+ ẳng
6174
+ xếnh
6175
+ vơn
6176
+ vổ
6177
+ tọng
6178
+ thài
6179
+ quẽ
6180
+ pim
6181
+ phon
6182
+ phiểu
6183
+ phến
6184
+ phéc
6185
+ pết
6186
+ pạc
6187
+
6188
+ nự
6189
+ nị
6190
+ nhoay
6191
+ nhải
6192
+ mự
6193
+ mên
6194
+ mế
6195
+ loóng
6196
+ khìn
6197
+ khìa
6198
+ khẹt
6199
+ khạng
6200
+ hoát
6201
+ hiết
6202
+ gới
6203
+ đượng
6204
+ độp
6205
+ dộ
6206
+ đeng
6207
+ dất
6208
+ đạch
6209
+ cớm
6210
+ choa
6211
+ bương
6212
+ bìn
6213
+ úi
6214
+ tếnh
6215
+ tén
6216
+ suyển
6217
+ soọng
6218
+ phưởng
6219
+ phuông
6220
+ phưng
6221
+
6222
+ nhây
6223
+ nẩu
6224
+ mằng
6225
+ khành
6226
+ gớp
6227
+ dên
6228
+ dẩu
6229
+ củn
6230
+ cõn
6231
+ chuệch
6232
+ choá
6233
+ bợt
6234
+ bẹo
6235
+ bẩu
6236
+ bạnh
6237
+ tủng
6238
+ trằm
6239
+ thềnh
6240
+ thẩu
6241
+ thạ
6242
+ rạt
6243
+ qun
6244
+ pỉnh
6245
+ phỏm
6246
+ phèng
6247
+ pèng
6248
+ nhậy
6249
+ ngúm
6250
+ lủ
6251
+ liểng
6252
+ khiệm
6253
+ khễnh
6254
+ hầy
6255
+ gọ
6256
+ dỵ
6257
+ đư
6258
+ dợn
6259
+
6260
+ chũm
6261
+ chệnh
6262
+ cấc
6263
+
6264
+ vửa
6265
+ vồm
6266
+ vên
6267
+
6268
+ trơi
6269
+ tởn
6270
+ thẩy
6271
+ sổi
6272
+ quớ
6273
+ péo
6274
+ pềnh
6275
+ pạ
6276
+ oong
6277
+ nhuy
6278
+ nhúa
6279
+ nhự
6280
+ ngớn
6281
+ ngởi
6282
+ nằn
6283
+ moa
6284
+ mìu
6285
+ mín
6286
+ lủn
6287
+ loàng
6288
+ liễm
6289
+ khướu
6290
+ khừa
6291
+ khị
6292
+ hừ
6293
+ hón
6294
+ giúi
6295
+ duyền
6296
+ duông
6297
+ dứ
6298
+ choắt
6299
+ chậy
6300
+ xướt
6301
+ trúm
6302
+ tría
6303
+ trỉ
6304
+ sơi
6305
+ sỉn
6306
+ sem
6307
+ pun
6308
+ pốc
6309
+ phốp
6310
+ nen
6311
+ khiểu
6312
+ khệnh
6313
+ húa
6314
+ hể
6315
+ hế
6316
+ gười
6317
+ gẩm
6318
+ dủ
6319
+ đớt
6320
+ chũng
6321
+ chón
6322
+ chéng
6323
+ bưởng
6324
+ biểm
6325
+ xai
6326
+ thấn
6327
+ tảy
6328
+ quài
6329
+ pứa
6330
+
6331
+ pịa
6332
+ phời
6333
+ pém
6334
+ nưng
6335
+ nhướn
6336
+ nhê
6337
+ ngoạt
6338
+ nghỉu
6339
+ nậy
6340
+ mựng
6341
+ mịnh
6342
+ lụn
6343
+ lỉu
6344
+ kheng
6345
+ hèm
6346
+ hẩy
6347
+ giẫy
6348
+ cổn
6349
+ chìu
6350
+ buối
6351
+ bếnh
6352
+ báp
6353
+ vắp
6354
+ ún
6355
+ từa
6356
+ tóng
6357
+ rân
6358
+ phạch
6359
+ nhịu
6360
+ ngúng
6361
+ ngảo
6362
+ mem
6363
+ mảo
6364
+ luồi
6365
+ lũm
6366
+ lợt
6367
+ khồng
6368
+ khẹc
6369
+ kên
6370
+ goong
6371
+ giô
6372
+ gấy
6373
+ dốp
6374
+ đóp
6375
+ coe
6376
+ bót
6377
+ bển
6378
+ ản
6379
+ xia
6380
+ veng
6381
+ vảo
6382
+ ướng
6383
+
6384
+ tròm
6385
+ troi
6386
+ trển
6387
+ trèm
6388
+ tràu
6389
+ tiểm
6390
+ thá
6391
+ sịa
6392
+ sênh
6393
+ rửng
6394
+ roam
6395
+ qùa
6396
+ phực
6397
+ phè
6398
+ ỏng
6399
+
6400
+ nhưn
6401
+ nhợ
6402
+ ngẩy
6403
+ mừu
6404
+ mụi
6405
+ miểng
6406
+ lừu
6407
+ khươi
6408
+ khừng
6409
+ khoòng
6410
+ khim
6411
+ khày
6412
+ khẳm
6413
+ hượu
6414
+ hởn
6415
+ hoét
6416
+ giay
6417
+ gẩy
6418
+ dút
6419
+ dướng
6420
+ đứ
6421
+ xùi
6422
+ xẹo
6423
+ xân
6424
+ truỷ
6425
+ triến
6426
+ tiềng
6427
+ tểnh
6428
+ rụa
6429
+ quèo
6430
+ phinh
6431
+ phấm
6432
+ oét
6433
+ nười
6434
+ nống
6435
+ niêng
6436
+
6437
+ nhừng
6438
+ nhay
6439
+ ngoác
6440
+ nèn
6441
+ mính
6442
+ loỏng
6443
+ khưn
6444
+ ía
6445
+ hỳ
6446
+ hềnh
6447
+ hệch
6448
+ gim
6449
+ gié
6450
+ diểu
6451
+ điếp
6452
+ đệp
6453
+ chốp
6454
+ chốm
6455
+ chom
6456
+ xim
6457
+ xiểng
6458
+ ượng
6459
+ trỗ
6460
+ tèm
6461
+ tắng
6462
+ rốp
6463
+ rổi
6464
+ quạu
6465
+ pớn
6466
+ phộc
6467
+ nường
6468
+ nhúp
6469
+ nhuật
6470
+ nguốn
6471
+ ngưới
6472
+ nguầy
6473
+ nân
6474
+ mốn
6475
+ mởi
6476
+ lốn
6477
+ lọm
6478
+ khiện
6479
+ khặng
6480
+ họt
6481
+ gìa
6482
+ dỹ
6483
+ dum
6484
+ dín
6485
+ dắc
6486
+ chược
6487
+ chời
6488
+ chiệc
6489
+ chềnh
6490
+ bụm
6491
+ biệc
6492
+ xoọng
6493
+ xon
6494
+ ườn
6495
+ ủn
6496
+ tuyễn
6497
+ trụa
6498
+ trây
6499
+ toá
6500
+ thuông
6501
+ thên
6502
+ sềnh
6503
+ sất
6504
+ rịp
6505
+ phuộc
6506
+ phoóc
6507
+
6508
+ pài
6509
+ óp
6510
+ nủa
6511
+ nhôn
6512
+ nhiềm
6513
+ nghéo
6514
+ luý
6515
+ lụm
6516
+ khuống
6517
+ hỗng
6518
+ gữa
6519
+ goòng
6520
+ gám
6521
+ êu
6522
+ dức
6523
+ diển
6524
+ ầng
6525
+ xêm
6526
+ vự
6527
+ ược
6528
+ trũi
6529
+ thoán
6530
+ thín
6531
+ thìm
6532
+ tèn
6533
+ súi
6534
+ soọc
6535
+ rẳng
6536
+ quặm
6537
+ phậm
6538
+ ò
6539
+ nùa
6540
+
6541
+ nốp
6542
+ níp
6543
+ niệp
6544
+ nhùi
6545
+ nhóp
6546
+ nhợi
6547
+ nhìu
6548
+ ngốt
6549
+ ngồ
6550
+ nảo
6551
+ miềng
6552
+ mâng
6553
+ lẳn
6554
+ lậm
6555
+ khường
6556
+ huần
6557
+ hía
6558
+ háp
6559
+ gậm
6560
+ ềnh
6561
+ duyển
6562
+ dớt
6563
+ doang
6564
+ doai
6565
+ điệm
6566
+ đêu
6567
+ chuổng
6568
+ chẳm
6569
+ bươi
6570
+ ay
6571
+ xỉnh
6572
+ xiếu
6573
+ vèn
6574
+ trốc
6575
+ thoản
6576
+ soong
6577
+ sím
6578
+ pút
6579
+ púa
6580
+ phâng
6581
+ pếu
6582
+ pét
6583
+ pau
6584
+ pấc
6585
+ nun
6586
+ nóp
6587
+ nính
6588
+ nhụi
6589
+ nhốm
6590
+ ngượi
6591
+ nghẹ
6592
+ ngau
6593
+ ngãng
6594
+ ngàm
6595
+ nật
6596
+ mim
6597
+ lưn
6598
+ hị
6599
+ giạt
6600
+ ghéc
6601
+ đún
6602
+
6603
+ dôn
6604
+ dọi
6605
+ dít
6606
+ diếu
6607
+ coa
6608
+ chưn
6609
+ chịa
6610
+ chão
6611
+
6612
+ bợn
6613
+ xọp
6614
+ xện
6615
+ vùa
6616
+ trủng
6617
+ troóc
6618
+ trỏng
6619
+ tợi
6620
+ tỉu
6621
+ tều
6622
+ tếp
6623
+ tẹc
6624
+ tãng
6625
+ sỳ
6626
+ sịch
6627
+
6628
+ rột
6629
+ roát
6630
+ rầng
6631
+ quóc
6632
+ quịt
6633
+ quéo
6634
+ piêng
6635
+ phôm
6636
+ phành
6637
+ nột
6638
+ nhứng
6639
+ nhồm
6640
+ nhoàm
6641
+ nhền
6642
+ ngong
6643
+ míp
6644
+ lệt
6645
+ lế
6646
+ khấc
6647
+ hũng
6648
+ háy
6649
+ hản
6650
+ gỉa
6651
+ dười
6652
+ dọ
6653
+ dích
6654
+ dãnh
6655
+ dắm
6656
+ cũa
6657
+ cọi
6658
+ chiếp
6659
+ chem
6660
+ buỗi
6661
+ xờm
6662
+ tướt
6663
+ trun
6664
+ trộc
6665
+ thuỳnh
6666
+ thựu
6667
+ thửng
6668
+ thôm
6669
+ síu
6670
+ sảm
6671
+ rứ
6672
+ piềng
6673
+ phâu
6674
+ nhù
6675
+ nhệch
6676
+ nguyển
6677
+ ngữa
6678
+ ngổm
6679
+ nghép
6680
+ nganh
6681
+ mủm
6682
+ luyệt
6683
+ lẻm
6684
+ lày
6685
+ khẻm
6686
+ hưởn
6687
+ hín
6688
+ gờn
6689
+ giộp
6690
+ gát
6691
+ dợm
6692
+ đém
6693
+ dáu
6694
+ cứt
6695
+ choóng
6696
+ chôi
6697
+ chắm
6698
+ chám
6699
+ chậc
6700
+ buôi
6701
+ bèm
6702
+ ậc
6703
+ xủn
6704
+ xiệc
6705
+ xằng
6706
+ xăn
6707
+ vởi
6708
+ vọ
6709
+ vảnh
6710
+ ười
6711
+ trụt
6712
+ trâng
6713
+ tói
6714
+ thọn
6715
+ thờm
6716
+ séng
6717
+ são
6718
+ ruộc
6719
+ roẹt
6720
+ riệt
6721
+ quày
6722
+ pớ
6723
+ pít
6724
+ phún
6725
+ phư
6726
+ phóp
6727
+ phoong
6728
+ phoanh
6729
+ phếch
6730
+ pản
6731
+ pằn
6732
+ oạp
6733
+ nững
6734
+ noan
6735
+ nhiu
6736
+ nhìa
6737
+ nguây
6738
+ ngỗn
6739
+ nghệm
6740
+ nghế
6741
+ ngật
6742
+ nềnh
6743
+ mợi
6744
+ mõi
6745
+ mẹc
6746
+ luệ
6747
+ lỉ
6748
+ khỏ
6749
+ khảy
6750
+ kẹm
6751
+ hươn
6752
+ huối
6753
+ huận
6754
+ hừa
6755
+ hữ
6756
+ hính
6757
+ hện
6758
+ ghếch
6759
+ ệch
6760
+ đưỡng
6761
+ đườn
6762
+ doái
6763
+ dẩn
6764
+ cời
6765
+ chuôn
6766
+ chươi
6767
+ chớn
6768
+ câng
6769
+ cặng
6770
+ bứu
6771
+ bưa
6772
+ xững
6773
+ xáp
6774
+ vủ
6775
+ voòng
6776
+ vâm
6777
+ trới
6778
+ trến
6779
+ tọ
6780
+ thẽ
6781
+ tặn
6782
+ sừn
6783
+ sôn
6784
+ riều
6785
+ pung
6786
+ phảo
6787
+ pát
6788
+ oem
6789
+ num
6790
+ noọc
6791
+ nhoong
6792
+ ngừm
6793
+ nghẻ
6794
+ luốt
6795
+ lẻng
6796
+ khoài
6797
+ khếnh
6798
+ khề
6799
+ khầu
6800
+ hẹo
6801
+ hẩu
6802
+ ẻm
6803
+ đươi
6804
+ dún
6805
+ dỡn
6806
+ doãng
6807
+ điêng
6808
+ đếu
6809
+ dão
6810
+ dách
6811
+ cuộng
6812
+ chừn
6813
+ choay
6814
+ cẳm
6815
+ buội
6816
+ biếp
6817
+ bẻo
6818
+ ạnh
6819
+ yểng
6820
+ xụi
6821
+ xục
6822
+ xờ
6823
+ xĩnh
6824
+ xéc
6825
+ xẵng
6826
+ vều
6827
+ uýnh
6828
+ uỵch
6829
+ uôn
6830
+ tuyện
6831
+ truột
6832
+ trức
6833
+ trớt
6834
+ trổng
6835
+ trịt
6836
+ tria
6837
+ tọp
6838
+ thủm
6839
+ thim
6840
+ théo
6841
+ tháy
6842
+
6843
+ sáy
6844
+ rún
6845
+ roóng
6846
+ róm
6847
+ rến
6848
+ rấy
6849
+ quyn
6850
+ poọc
6851
+ phỗng
6852
+ phồ
6853
+ phặng
6854
+
6855
+ pầng
6856
+ păn
6857
+ nuýp
6858
+
6859
+ nhõn
6860
+ nhoạm
6861
+ ngoẹo
6862
+ nghín
6863
+ nghì
6864
+ mứ
6865
+ mọp
6866
+ mềnh
6867
+ mam
6868
+ lưởng
6869
+ luấn
6870
+ lỡm
6871
+ lóm
6872
+ lản
6873
+ khôm
6874
+ khật
6875
+ khằng
6876
+ hụp
6877
+ hủm
6878
+ hén
6879
+ hẵn
6880
+ gủi
6881
+ gách
6882
+ ẻn
6883
+ đụt
6884
+ dủng
6885
+ dừm
6886
+ dũi
6887
+ duấn
6888
+ doong
6889
+ đễn
6890
+ dèn
6891
+ dảm
6892
+ cươn
6893
+ cuổi
6894
+ coỏng
6895
+ chũi
6896
+ chuếnh
6897
+ chều
6898
+ xỏn
6899
+ vọc
6900
+ vạnh
6901
+ trẹt
6902
+ thẻo
6903
+ tẽ
6904
+ sổm
6905
+ sâng
6906
+ roòng
6907
+ roàng
6908
+ quớt
6909
+ quộc
6910
+ quào
6911
+ pưn
6912
+ pùa
6913
+ phưỡng
6914
+ peo
6915
+ pành
6916
+ pàng
6917
+ pàn
6918
+ núa
6919
+ ngum
6920
+ nghển
6921
+ ngạ
6922
+ muých
6923
+ miểu
6924
+ lộm
6925
+ khòm
6926
+ khặn
6927
+ hủng
6928
+ hoẵng
6929
+ hiêm
6930
+ hép
6931
+ ghị
6932
+ duyết
6933
+ dữu
6934
+ duế
6935
+ duần
6936
+ đự
6937
+ dộp
6938
+ đợn
6939
+ doạnh
6940
+ đèm
6941
+ đẩm
6942
+ đách
6943
+ cới
6944
+ choã
6945
+ chiễn
6946
+ chẹm
6947
+ bỉa
6948
+ xoàm
6949
+ xớ
6950
+ xáy
6951
+ xản
6952
+ xạch
6953
+ ưởng
6954
+ tụa
6955
+ truyệt
6956
+ trốt
6957
+ trép
6958
+ trể
6959
+ trằng
6960
+ trài
6961
+ tìa
6962
+ thứu
6963
+ thùm
6964
+ thóng
6965
+ thão
6966
+ sộng
6967
+ soàn
6968
+ rỹ
6969
+ rươm
6970
+ riệc
6971
+ reng
6972
+ rêm
6973
+ rấn
6974
+ quấc
6975
+ quác
6976
+ poan
6977
+ piu
6978
+ phùa
6979
+ phiềng
6980
+ păm
6981
+ ờn
6982
+ nuôn
6983
+ nừng
6984
+ nùi
6985
+ noọng
6986
+ nỏng
6987
+ nờ
6988
+ niện
6989
+ nhụng
6990
+ nhóng
6991
+ nhể
6992
+ nghể
6993
+ ngàu
6994
+ mụt
6995
+ mươn
6996
+ muổi
6997
+ lỗng
6998
+ khức
6999
+ khục
7000
+ khụ
7001
+ khoách
7002
+ khảu
7003
+ hún
7004
+ hứ
7005
+ hạy
7006
+ hày
7007
+ hăn
7008
+ guyên
7009
+ gôi
7010
+ giớ
7011
+ giào
7012
+ giằm
7013
+ gấn
7014
+ đướng
7015
+ dót
7016
+ dộc
7017
+ dớ
7018
+ diểng
7019
+ diềng
7020
+ diền
7021
+ dều
7022
+ dảo
7023
+ dạnh
7024
+ cươi
7025
+ coóc
7026
+ chủa
7027
+ chíu
7028
+ chếu
7029
+ chể
7030
+ chặm
7031
+ cạng
7032
+ buốc
7033
+ boăn
7034
+ âng
7035
+ àm
7036
+ xượt
7037
+ xuốt
7038
+ xườn
7039
+ xựng
7040
+ xuấn
7041
+ xợt
7042
+ xơm
7043
+ xốm
7044
+ xòm
7045
+ xoèn
7046
+ xoanh
7047
+ xẹc
7048
+ xậy
7049
+ xảnh
7050
+ uộng
7051
+ uôm
7052
+ ừa
7053
+ tưu
7054
+ tứng
7055
+ truốt
7056
+ trũ
7057
+ trợi
7058
+ tró
7059
+ triểu
7060
+ treng
7061
+ trẩu
7062
+ toòng
7063
+ toạn
7064
+ toài
7065
+ thươn
7066
+ thưn
7067
+ thơn
7068
+ thỏn
7069
+ thoạn
7070
+ thịu
7071
+ thén
7072
+ thém
7073
+ thặt
7074
+ tạu
7075
+ tấng
7076
+ sụm
7077
+ sội
7078
+ sịp
7079
+ sị
7080
+
7081
+ sết
7082
+ sẻng
7083
+ sện
7084
+ rỳ
7085
+ rược
7086
+ rự
7087
+ rỡn
7088
+ roãn
7089
+ rép
7090
+ rẹc
7091
+ rật
7092
+ quố
7093
+ quo
7094
+ quin
7095
+ pọng
7096
+ piên
7097
+ phươn
7098
+ phọ
7099
+ phiếp
7100
+ phéo
7101
+ phâm
7102
+ pây
7103
+ õn
7104
+
7105
+ nhộp
7106
+ nhoóng
7107
+ nhoằng
7108
+ nhịa
7109
+ nhạp
7110
+ ngựu
7111
+ nguồi
7112
+ ngủng
7113
+ nênh
7114
+ nàu
7115
+ nẳng
7116
+ nẫn
7117
+ mớp
7118
+ mẳn
7119
+ mậm
7120
+ luýnh
7121
+ lươm
7122
+ loắt
7123
+ lền
7124
+ kíu
7125
+ khụm
7126
+ khủa
7127
+ khừ
7128
+ khủ
7129
+ khoong
7130
+ khỏng
7131
+ khộng
7132
+ khỏn
7133
+ khoàn
7134
+ khẳn
7135
+ khắm
7136
+ khài
7137
+ kẹn
7138
+ kến
7139
+ kếm
7140
+ ín
7141
+ huýnh
7142
+ hưỡng
7143
+ huổng
7144
+ huếch
7145
+ hưa
7146
+ họi
7147
+ hợ
7148
+ hèo
7149
+ hánh
7150
+ gung
7151
+ gữ
7152
+ giửa
7153
+ gioan
7154
+ giỡ
7155
+ giạm
7156
+ ẹt
7157
+ ết
7158
+ ển
7159
+ ẹc
7160
+ dước
7161
+ dứng
7162
+ dui
7163
+ đựa
7164
+ dờn
7165
+ đởm
7166
+ đóc
7167
+ đoanh
7168
+ đoà
7169
+ đớ
7170
+ diêng
7171
+ đía
7172
+ đết
7173
+ đặp
7174
+ dảnh
7175
+ cừa
7176
+ coan
7177
+ chuôm
7178
+ chuổi
7179
+ chuẫn
7180
+ chơm
7181
+ chếm
7182
+ bửa
7183
+ àng
7184
+ àn
dataset/data_generation/confusion_set.py ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding: utf8
2
+ import re
3
+ from normalize import chuan_hoa_dau_tu_tieng_viet
4
+ import numpy as np
5
+ from tqdm import tqdm
6
+ import textdistance
7
+ import json
8
+ from copy import copy
9
+ with open("common-vietnamese-syllables.txt", "r", encoding="utf-8") as file:
10
+ vi_syllables = [line.strip("\n") for line in file.readlines()]
11
+
12
+ vi_syllables_new = []
13
+ for syllable in vi_syllables:
14
+ normalized = chuan_hoa_dau_tu_tieng_viet(syllable)
15
+ vi_syllables_new.append(normalized)
16
+
17
+ regex_nguyen_am_don = "ộ|ặ|ằ|ụ|ầ|a|ũ|á|ể|ỡ|ủ|y|ở|ế|ẵ|ệ|é|ẹ|â|ề|ê|ọ|ờ|ẳ|ợ|ỷ|ữ|ị|e|u|ò|ẫ|i|ỉ|ẩ|ẽ|õ|ỹ|ô|ỵ|ồ|ú|í|ó|ỗ|ã|ẻ|ù|ă|ơ|ứ|ậ|ử|ừ|à|ĩ|ả|ố|ớ|ự|ắ|o|ý|ỳ|ư|ấ|ễ|ạ|ỏ|ổ|è|ì"
18
+ regex_nguyen_am_doi = "uằ|iê|ấu|ượ|ùy|ạy|uỹ|ươ|ỗi|yệ|ụy|ẫy|oà|ái|ói|uồ|uỷ|oỏ|ệu|ue|oi|ậu|oè|uã|ãi|òi|ơi|ựa|ụi|iể|oá|ìa|ĩu|uẹ|ìu|ầu|ỏe|ối|uẳ|ịa|òe|ai|ọe|yể|ày|ỉu|uỵ|uể|óe|ỉa|ũa|ườ|uè|êu|ẹo|uá|ỏi|uấ|ưỡ|ội|au|iề|ửu|ọi|ảu|uẽ|ầy|ẻo|ao|yế|uẻ|uơ|ưở|iế|uở|ịu|ủa|ẫu|uặ|oằ|oò|ạu|uỳ|ạo|oọ|ưa|oẹ|ui|uậ|ủi|áo|óa|ẩu|ảy|oẵ|áu|ựu|uô|ửa|ễu|uâ|oạ|uổ|uê|ùi|ếu|ời|iu|uo|oé|yễ|oẳ|uớ|ay|iễ|ủy|ướ|oó|eo|ũi|oả|ua|ỏa|ấy|uố|èo|oo|úy|ẩy|ồi|yề|ẽo|uẫ|ứu|ãy|ổi|ía|ảo|ué|uờ|ùa|ia|ều|oa|iệ|àu|õa|oắ|uắ|uả|ứa|ởi|ụa|ũy|òa|íu|éo|oã|uă|uộ|ữu|úa|ải|ỡi|ừu|ểu|oe|õi|ọa|ừa|uệ|uý|uó|ào|uà|ây|oă|uạ|ữa|oặ|uy|ợi|uẩ|uỗ|ão|uế|ưu|ửi|ại|âu|ới|uầ|ĩa|úi|oẻ|ôi|ài|uề|yê|ậy|áy"
19
+ regex_nguyen_am_ba = "uỷu|uây|ươu|iệu|yếu|yểu|uyế|uyệ|uyề|ưỡi|uôi|ượi|uổi|oay|uào|iễu|oeo|oèo|uỗi|oai|uấy|oái|uỵu|uyể|uồi|oáy|yều|oẹo|uẫy|ưởi|iểu|uầy|iêu|uối|uyễ|ưới|iều|oài|uao|ươi|yêu|ười|uya|oải|ướu|uội|oại|iếu|ượu|uẩy|uyê|uậy"
20
+ all_phu_am_dau = {'', 'gh', 'q', 'kh', 'p', 'm', 'qu', 'n', 'b', 'g', 't', 'ch', 'th', 'k', 'đ', 'r', 'ph', 'ngh', 'gi', 'tr', 's', 'l', 'h', 'nh', 'c', 'ng', 'd', 'v', 'x'}
21
+ all_phu_am_cuoi = {'', 'ng', 'nh', 't', 'ch', 'c', 'p', 'm', 'k', 'n'}
22
+ all_nguyen_am_don = "ộ|ặ|ằ|ụ|ầ|a|ũ|á|ể|ỡ|ủ|y|ở|ế|ẵ|ệ|é|ẹ|â|ề|ê|ọ|ờ|ẳ|ợ|ỷ|ữ|ị|e|u|ò|ẫ|i|ỉ|ẩ|ẽ|õ|ỹ|ô|ỵ|ồ|ú|í|ó|ỗ|ã|ẻ|ù|ă|ơ|ứ|ậ|ử|ừ|à|ĩ|ả|ố|ớ|ự|ắ|o|ý|ỳ|ư|ấ|ễ|ạ|ỏ|ổ|è|ì".split("|")
23
+ all_nguyen_am_doi = "uằ|iê|ấu|ượ|ùy|ạy|uỹ|ươ|ỗi|yệ|ụy|ẫy|oà|ái|ói|uồ|uỷ|oỏ|ệu|ue|oi|ậu|oè|uã|ãi|òi|ơi|ựa|ụi|iể|oá|ìa|ĩu|uẹ|ìu|ầu|ỏe|ối|uẳ|ịa|òe|ai|ọe|yể|ày|ỉu|uỵ|uể|óe|ỉa|ũa|ườ|uè|êu|ẹo|uá|ỏi|uấ|ưỡ|ội|au|iề|ửu|ọi|ảu|uẽ|ầy|ẻo|ao|yế|uẻ|uơ|ưở|iế|uở|ịu|ủa|ẫu|uặ|oằ|oò|ạu|uỳ|ạo|oọ|ưa|oẹ|ui|uậ|ủi|áo|óa|ẩu|ảy|oẵ|áu|ựu|uô|ửa|ễu|uâ|oạ|uổ|uê|ùi|ếu|ời|iu|uo|oé|yễ|oẳ|uớ|ay|iễ|ủy|ướ|oó|eo|ũi|oả|ua|ỏa|ấy|uố|èo|oo|úy|ẩy|ồi|yề|ẽo|uẫ|ứu|ãy|ổi|ía|ảo|ué|uờ|ùa|ia|ều|oa|iệ|àu|õa|oắ|uắ|uả|ứa|ởi|ụa|ũy|òa|íu|éo|oã|uă|uộ|ữu|úa|ải|ỡi|ừu|ểu|oe|õi|ọa|ừa|uệ|uý|uó|ào|uà|ây|oă|uạ|ữa|oặ|uy|ợi|uẩ|uỗ|ão|uế|ưu|ửi|ại|âu|ới|uầ|ĩa|úi|oẻ|ôi|ài|uề|yê|ậy|áy".split("|")
24
+ all_nguyen_am_ba = "uỷu|uây|ươu|iệu|yếu|yểu|uyế|uyệ|uyề|ưỡi|uôi|ượi|uổi|oay|uào|iễu|oeo|oèo|uỗi|oai|uấy|oái|uỵu|uyể|uồi|oáy|yều|oẹo|uẫy|ưởi|iểu|uầy|iêu|uối|uyễ|ưới|iều|oài|uao|ươi|yêu|ười|uya|oải|ướu|uội|oại|iếu|ượu|uẩy|uyê|uậy".split("|")
25
+
26
+ confusion_set = dict()
27
+
28
+ special_list = set()
29
+ for syllable in tqdm(vi_syllables_new):
30
+ # print(syllable)
31
+ if syllable[0:2] in ["qu", "gi"]:
32
+ special_list.add(syllable)
33
+ # print(f"Ignore {syllable}")
34
+ continue
35
+
36
+ confusion_set[syllable] = dict()
37
+ syllable_candidates = confusion_set[syllable]
38
+ syllable_candidates['phu_am_dau'] = set()
39
+ syllable_candidates['nguyen_am'] = set()
40
+ syllable_candidates['phu_am_cuoi'] = set()
41
+
42
+ if len(re.findall(regex_nguyen_am_ba, syllable)) != 0:
43
+ result = re.findall(regex_nguyen_am_ba, syllable)
44
+ nguyen_am = result[0]
45
+ elif len(re.findall(regex_nguyen_am_doi, syllable)) != 0:
46
+ result = re.findall(regex_nguyen_am_doi, syllable)
47
+ nguyen_am = result[0]
48
+ elif len(re.findall(regex_nguyen_am_don, syllable)) != 0:
49
+ result = re.findall(regex_nguyen_am_don, syllable)
50
+ nguyen_am = result[0]
51
+ else:
52
+ raise Exception("Khong co nguyen am")
53
+ phu_am_dau, phu_am_cuoi = "", ""
54
+ if len(re.findall(f"(.+){nguyen_am}", syllable)) !=0 :
55
+ result = re.findall(f"(.+){nguyen_am}", syllable)
56
+ phu_am_dau = result[0]
57
+ if len(re.findall(f"{nguyen_am}(.+)", syllable)) !=0 :
58
+ result = re.findall(f"{nguyen_am}(.+)", syllable)
59
+ phu_am_cuoi = result[0]
60
+
61
+ ### Error thay đổi phụ âm đầu
62
+ for candidate in all_phu_am_dau:
63
+ if "".join([candidate, nguyen_am, phu_am_cuoi]) in vi_syllables_new:
64
+ syllable_candidates['phu_am_dau'].add("".join([candidate, nguyen_am, phu_am_cuoi]))
65
+ ### Error thay đổi nguyên âm
66
+ all_nguyen_am = all_nguyen_am_don + all_nguyen_am_doi + all_nguyen_am_ba
67
+ for candidate in all_nguyen_am:
68
+ if "".join([phu_am_dau, candidate, phu_am_cuoi]) in vi_syllables_new:
69
+ syllable_candidates['nguyen_am'].add("".join([phu_am_dau, candidate, phu_am_cuoi]))
70
+ ### Error thay đổi phụ âm cuối
71
+ for candidate in all_phu_am_cuoi:
72
+ if "".join([phu_am_dau, nguyen_am, candidate]) in vi_syllables_new:
73
+ syllable_candidates['phu_am_cuoi'].add("".join([phu_am_dau, nguyen_am, candidate]))
74
+
75
+ for syllable in tqdm(special_list):
76
+
77
+ if len(re.findall(regex_nguyen_am_don, syllable)) > 1:
78
+ phu_am_dau = syllable[0:2]
79
+ remained = syllable[2:]
80
+ else:
81
+ phu_am_dau = syllable[0]
82
+ remained = syllable[1:]
83
+
84
+ confusion_set[syllable] = dict()
85
+ syllable_candidates = confusion_set[syllable]
86
+ syllable_candidates['phu_am_dau'] = set()
87
+ syllable_candidates['nguyen_am'] = set()
88
+ syllable_candidates['phu_am_cuoi'] = set()
89
+
90
+
91
+ if len(re.findall(regex_nguyen_am_ba, remained)) != 0:
92
+ result = re.findall(regex_nguyen_am_ba, remained)
93
+ nguyen_am = result[0]
94
+ elif len(re.findall(regex_nguyen_am_doi, remained)) != 0:
95
+ result = re.findall(regex_nguyen_am_doi, remained)
96
+ nguyen_am = result[0]
97
+ elif len(re.findall(regex_nguyen_am_don, remained)) != 0:
98
+ result = re.findall(regex_nguyen_am_don, remained)
99
+ nguyen_am = result[0]
100
+ else:
101
+ nguyen_am, phu_am_cuoi = "", ""
102
+
103
+ phu_am_cuoi = ""
104
+
105
+ if nguyen_am != "" and len(re.findall(f"{nguyen_am}(.+)", remained)) !=0 :
106
+ result = re.findall(f"{nguyen_am}(.+)", remained)
107
+ phu_am_cuoi = result[0]
108
+
109
+ ### Error thay đổi phụ âm đầu
110
+ for candidate in all_phu_am_dau:
111
+ if "".join([candidate, nguyen_am, phu_am_cuoi]) in vi_syllables_new:
112
+ syllable_candidates['phu_am_dau'].add("".join([candidate, nguyen_am, phu_am_cuoi]))
113
+ ### Error thay đổi nguyên âm
114
+ all_nguyen_am = all_nguyen_am_don + all_nguyen_am_doi + all_nguyen_am_ba
115
+ for candidate in all_nguyen_am:
116
+ if "".join([phu_am_dau, candidate, phu_am_cuoi]) in vi_syllables_new:
117
+ syllable_candidates['nguyen_am'].add("".join([phu_am_dau, candidate, phu_am_cuoi]))
118
+ ### Error thay đổi phụ âm cuối
119
+ for candidate in all_phu_am_cuoi:
120
+ if "".join([phu_am_dau, nguyen_am, candidate]) in vi_syllables_new:
121
+ syllable_candidates['phu_am_cuoi'].add("".join([phu_am_dau, nguyen_am, candidate]))
122
+
123
+ for key in tqdm(confusion_set.keys()):
124
+ for key_2_level in confusion_set[key].keys():
125
+ try:
126
+ confusion_set[key][key_2_level].remove(key)
127
+ except:
128
+ pass
129
+
130
+ for key in tqdm(confusion_set.keys()):
131
+ for key_2_level in confusion_set[key].keys():
132
+ candidates_to_remove = []
133
+ for candidate in confusion_set[key][key_2_level]:
134
+ similarity = textdistance.damerau_levenshtein.normalized_similarity(key, candidate)
135
+ if similarity < 0.5:
136
+ candidates_to_remove.append(candidate)
137
+ for candidate in candidates_to_remove:
138
+ confusion_set[key][key_2_level].remove(candidate)
139
+
140
+ keyboard_neighbor = {'a': 'áàảãạ',
141
+ 'ă': 'ắằẳẵặ',
142
+ 'â': 'ấầẩẫậ',
143
+ 'á': 'aàảãạ',
144
+ 'à': 'aáảãạ',
145
+ 'ả': 'aáàãạ',
146
+ 'ã': 'aáàảạ',
147
+ 'ạ': 'aáàảã',
148
+ 'ắ': 'ăằẳẵặ',
149
+ 'ằ': 'ăắẳẵặ',
150
+ 'ẳ': 'ăắằẵặ',
151
+ 'ặ': 'ăắằẳẵ',
152
+ 'ẵ': 'ăắằẳặ',
153
+ 'ấ': 'âầẩẫậ',
154
+ 'ầ': 'âấẩẫậ',
155
+ 'ẩ': 'âấầẫậ',
156
+ 'ẫ': 'âấầẩậ',
157
+ 'ậ': 'âấầẩẫ',
158
+ 'e': 'èéẻẽẹ',
159
+ 'é': 'eèẻẽẹ',
160
+ 'è': 'eéẻẽẹ',
161
+ 'ẻ': 'eéèẽẹ',
162
+ 'ẽ': 'eéèẻẹ',
163
+ 'ẹ': 'eéèẻẽ',
164
+ 'ê': 'ếềểễệ',
165
+ 'ế': 'êềểễệ',
166
+ 'ề': 'êếểễệ',
167
+ 'ể': 'êếềễệ',
168
+ 'ễ': 'êếềểệ',
169
+ 'ệ': 'êếềểễ',
170
+ 'i': 'íìỉĩị',
171
+ 'í': 'iìỉĩị',
172
+ 'ì': 'iíỉĩị',
173
+ 'ỉ': 'iíìĩị',
174
+ 'ĩ': 'iíìỉị',
175
+ 'ị': 'iíìỉĩ',
176
+ 'o': 'òóỏọõ',
177
+ 'ó': 'oòỏọõ',
178
+ 'ò': 'oóỏọõ',
179
+ 'ỏ': 'oóòọõ',
180
+ 'õ': 'oóòỏọ',
181
+ 'ọ': 'oóòỏõ',
182
+ 'ô': 'ốồổỗộ',
183
+ 'ố': 'ôồổỗộ',
184
+ 'ồ': 'ôốổỗộ',
185
+ 'ổ': 'ôốồỗộ',
186
+ 'ộ': 'ôốồổỗ',
187
+ 'ỗ': 'ôốồổộ',
188
+ 'ơ': 'ớờởợỡ',
189
+ 'ớ': 'ơờởợỡ',
190
+ 'ờ': 'ơớởợỡ',
191
+ 'ở': 'ơớờợỡ',
192
+ 'ợ': 'ơớờởỡ',
193
+ 'ỡ': 'ơớờởợ',
194
+ 'u': 'úùủũụ',
195
+ 'ú': 'uùủũụ',
196
+ 'ù': 'uúủũụ',
197
+ 'ủ': 'uúùũụ',
198
+ 'ũ': 'uúùủụ',
199
+ 'ụ': 'uúùủũ',
200
+ 'ư': 'ứừữửự',
201
+ 'ứ': 'ưừữửự',
202
+ 'ừ': 'ưứữửự',
203
+ 'ử': 'ưứừữự',
204
+ 'ữ': 'ưứừửự',
205
+ 'ự': 'ưứừữử',
206
+ 'y': 'ýỳỷỵỹ',
207
+ 'ý': 'yỳỷỵỹ',
208
+ 'ỳ': 'yýỷỵỹ',
209
+ 'ỷ': 'yýỳỵỹ',
210
+ 'ỵ': 'yýỳỷỹ',
211
+ 'ỹ': 'yýỳỷỵ'}
212
+
213
+ pattern = "(" + "|".join(keyboard_neighbor.keys()) + "){1}"
214
+
215
+ def make_accent_change_candidates(text):
216
+ result = re.findall(pattern, text)
217
+ candidates = []
218
+ for candidate in result:
219
+ [candidates.append(text.replace(candidate, x)) for x in keyboard_neighbor[candidate]]
220
+ return set(candidates)
221
+
222
+ typo = json.load(open("../noising_resources/typo.json", "r", encoding="utf-8"))
223
+ typo_pattern = "(" + "|".join(typo.keys()) + "){1}"
224
+ accent_pattern = "(s|f|r|x|j|1|2|3|4|5){1}"
225
+
226
+ def convert_to_non_telex(text):
227
+ word = copy(text)
228
+ candidates = re.findall(typo_pattern, text)
229
+ for candidate in candidates:
230
+ replaced = typo[candidate][0]
231
+ # Move accent to the end of text
232
+ if len(re.findall(accent_pattern, replaced)) != 0:
233
+ word = re.sub(candidate, replaced[0:-1], word)
234
+ word += replaced[-1]
235
+ else:
236
+ word = re.sub(candidate, replaced, word)
237
+ return word
238
+
239
+
240
+ def keep_1_distance_candidates(text, nguyen_am_errors : set):
241
+ nguyen_am_errors = list(nguyen_am_errors)
242
+ text = convert_to_non_telex(text)
243
+ distances = [textdistance.damerau_levenshtein(text, convert_to_non_telex(error)) for error in nguyen_am_errors]
244
+ indies_to_keep = np.where(np.array(distances) <= 1)[0]
245
+ return set([nguyen_am_errors[i] for i in indies_to_keep])
246
+
247
+ for key in tqdm(confusion_set.keys()):
248
+ candidates = make_accent_change_candidates(key)
249
+ one_distance_candidates = keep_1_distance_candidates(key, confusion_set[key]['nguyen_am'])
250
+ candidates = candidates.union(one_distance_candidates)
251
+ high_probs_list = candidates.intersection(confusion_set[key]['nguyen_am'])
252
+ lower_probs_list = confusion_set[key]['nguyen_am'].difference(high_probs_list)
253
+ confusion_set[key]['nguyen_am'] = [high_probs_list, lower_probs_list]
254
+
255
+ for key in tqdm(confusion_set.keys()):
256
+ confusion_set[key]['nguyen_am'] = [list(confusion_set[key]['nguyen_am'][0]), list(confusion_set[key]['nguyen_am'][1])]
257
+ confusion_set[key]['phu_am_dau'] = list(confusion_set[key]['phu_am_dau'])
258
+ confusion_set[key]['phu_am_cuoi'] = list(confusion_set[key]['phu_am_cuoi'])
259
+
260
+ with open("../noising_resources/confusion_set.json", "w+", encoding="utf-8") as outfile:
261
+ print(confusion_set, file = outfile)
262
+
dataset/data_generation/keyboard_neighbor.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ def getKeyboardNeighbors():
3
+ keyboardNeighbors = {}
4
+ keyboardNeighbors['a'] = ["ắằẳẵặă|âấầẩẫậ|áàảãạ", [0.15, 0.15, 0.7]]
5
+ keyboardNeighbors['ă'] = ["ắằẳẵặ|âấầẩẫậ|aáàảãạ", [0.7, 0.15, 0.15]]
6
+ keyboardNeighbors['â'] = ["ấầẩẫậ|aáàảãạ|ăắằẳẵặ", [0.7, 0.15, 0.15]]
7
+ keyboardNeighbors['á'] = ["aàảãạ|ăắằẳẵặ|âấầẩẫậ", [0.7, 0.15, 0.15]]
8
+ keyboardNeighbors['à'] = ["aáảãạ|ăắằẳẵặ|âấầẩẫậ", [0.7, 0.15, 0.15]]
9
+ keyboardNeighbors['ả'] = ["aáàãạ|ăắằẳẵặ|âấầẩẫậ", [0.7, 0.15, 0.15]]
10
+ keyboardNeighbors['ã'] = ["aáàảạ|ăắằẳẵặ|âấầẩẫậ", [0.7, 0.15, 0.15]]
11
+ keyboardNeighbors['ạ'] = ["aáàảã|ăắằẳẵặ|âấầẩẫậ", [0.7, 0.15, 0.15]]
12
+ keyboardNeighbors['ắ'] = ["ăằẳẵặ|aáàảãạ|âấầẩẫậ", [0.7, 0.15, 0.15]]
13
+ keyboardNeighbors['ằ'] = ["ăắẳẵặ|aáàảãạ|âấầẩẫậ", [0.7, 0.15, 0.15]]
14
+ keyboardNeighbors['ẳ'] = ["ăắằẵặ|aáàảãạ|âấầẩẫậ", [0.7, 0.15, 0.15]]
15
+ keyboardNeighbors['ặ'] = ["ăắằẳẵ|aáàảãạ|âấầẩẫậ", [0.7, 0.15, 0.15]]
16
+ keyboardNeighbors['ẵ'] = ["ăắằẳặ|aáàảãạ|âấầẩẫậ", [0.7, 0.15, 0.15]]
17
+ keyboardNeighbors['ấ'] = ["âầẩẫậ|aáàảãạ|ăắằẳẵặ", [0.7, 0.15, 0.15]]
18
+ keyboardNeighbors['ầ'] = ["âấẩẫậ|aáàảãạ|ăắằẳẵặ", [0.7, 0.15, 0.15]]
19
+ keyboardNeighbors['ẩ'] = ["âấầẫậ|aáàảãạ|ăắằẳẵặ", [0.7, 0.15, 0.15]]
20
+ keyboardNeighbors['ẫ'] = ["âấầẩậ|aáàảãạ|ăắằẳẵặ", [0.7, 0.15, 0.15]]
21
+ keyboardNeighbors['ậ'] = ["âấầẩẫ|aáàảãạ|ăắằẳẵặ", [0.7, 0.15, 0.15]]
22
+ keyboardNeighbors['e'] = ["èéẻẽẹ|êếềểễệ", [0.7, 0.3]]
23
+ keyboardNeighbors['é'] = ["eèẻẽẹ|êếềểễệ", [0.7, 0.3]]
24
+ keyboardNeighbors['è'] = ["eéẻẽẹ|êếềểễệ", [0.7, 0.3]]
25
+ keyboardNeighbors['ẻ'] = ["eéèẽẹ|êếềểễệ", [0.7, 0.3]]
26
+ keyboardNeighbors['ẽ'] = ["eéèẻẹ|êếềểễệ", [0.7, 0.3]]
27
+ keyboardNeighbors['ẹ'] = ["eéèẻẽ|êếềểễệ", [0.7, 0.3]]
28
+ keyboardNeighbors['ê'] = ["eéèẻẽẹ|ếềểễệ", [0.3, 0.7]]
29
+ keyboardNeighbors['ế'] = ["eéèẻẽẹ|êềểễệ", [0.3, 0.7]]
30
+ keyboardNeighbors['ề'] = ["eéèẻẽẹ|êếểễệ", [0.3, 0.7]]
31
+ keyboardNeighbors['ể'] = ["eéèẻẽẹ|êếềễệ", [0.3, 0.7]]
32
+ keyboardNeighbors['ễ'] = ["eéèẻẽẹ|êếềểệ", [0.3, 0.7]]
33
+ keyboardNeighbors['ệ'] = ["eéèẻẽẹ|êếềểễ", [0.3, 0.7]]
34
+ keyboardNeighbors['i'] = ["íìỉĩị|ýỳỷỹỵy", [0.7, 0.3]]
35
+ keyboardNeighbors['í'] = ["iìỉĩị|ýỳỷỹỵy", [0.7, 0.3]]
36
+ keyboardNeighbors['ì'] = ["iíỉĩị|ýỳỷỹỵy", [0.7, 0.3]]
37
+ keyboardNeighbors['ỉ'] = ["iíìĩị|ýỳỷỹỵy", [0.7, 0.3]]
38
+ keyboardNeighbors['ĩ'] = ["iíìỉị|ýỳỷỹỵy", [0.7, 0.3]]
39
+ keyboardNeighbors['ị'] = ["iíìỉĩ|ýỳỷỹỵy", [0.7, 0.3]]
40
+ keyboardNeighbors['o'] = ["òóỏọõ|ôốồổỗộ|ơớờởợỡ", [0.7, 0.15, 0.15]]
41
+ keyboardNeighbors['ó'] = ["oòỏọõ|ôốồổỗộ|ơớờởợỡ", [0.7, 0.15, 0.15]]
42
+ keyboardNeighbors['ò'] = ["oóỏọõ|ôốồổỗộ|ơớờởợỡ", [0.7, 0.15, 0.15]]
43
+ keyboardNeighbors['ỏ'] = ["oóòọõ|ôốồổỗộ|ơớờởợỡ", [0.7, 0.15, 0.15]]
44
+ keyboardNeighbors['õ'] = ["oóòỏọ|ôốồổỗộ|ơớờởợỡ", [0.7, 0.15, 0.15]]
45
+ keyboardNeighbors['ọ'] = ["oóòỏõ|ôốồổỗộ|ơớờởợỡ", [0.7, 0.15, 0.15]]
46
+ keyboardNeighbors['ô'] = ["oóòỏọõ|ốồổỗộ|ơớờởợỡ", [0.15, 0.7, 0.15]]
47
+ keyboardNeighbors['ố'] = ["oóòỏọõ|ôồổỗộ|ơớờởợỡ", [0.15, 0.7, 0.15]]
48
+ keyboardNeighbors['ồ'] = ["oóòỏọõ|ôốổỗộ|ơớờởợỡ", [0.15, 0.7, 0.15]]
49
+ keyboardNeighbors['ổ'] = ["oóòỏọõ|ôốồỗộ|ơớờởợỡ", [0.15, 0.7, 0.15]]
50
+ keyboardNeighbors['ộ'] = ["oóòỏọõ|ôốồổỗ|ơớờởợỡ", [0.15, 0.7, 0.15]]
51
+ keyboardNeighbors['ỗ'] = ["oóòỏọõ|ôốồổộ|ơớờởợỡ", [0.15, 0.7, 0.15]]
52
+ keyboardNeighbors['ơ'] = ["oóòỏọõ|ôốồổỗộ|ớờởợỡ", [0.15, 0.15, 0.7]]
53
+ keyboardNeighbors['ớ'] = ["oóòỏọõ|ôốồổỗộ|ơờởợỡ", [0.15, 0.15, 0.7]]
54
+ keyboardNeighbors['ờ'] = ["oóòỏọõ|ôốồổỗộ|ơớởợỡ", [0.15, 0.15, 0.7]]
55
+ keyboardNeighbors['ở'] = ["oóòỏọõ|ôốồổỗộ|ơớờợỡ", [0.15, 0.15, 0.7]]
56
+ keyboardNeighbors['ợ'] = ["oóòỏọõ|ôốồổỗộ|ơớờởỡ", [0.15, 0.15, 0.7]]
57
+ keyboardNeighbors['ỡ'] = ["oóòỏọõ|ôốồổỗộ|ơớờởợ", [0.15, 0.15, 0.7]]
58
+ keyboardNeighbors['u'] = ["úùủũụ|ưứừữửự", [0.7, 0.3]]
59
+ keyboardNeighbors['ú'] = ["uùủũụ|ưứừữửự", [0.7, 0.3]]
60
+ keyboardNeighbors['ù'] = ["uúủũụ|ưứừữửự", [0.7, 0.3]]
61
+ keyboardNeighbors['ủ'] = ["uúùũụ|ưứừữửự", [0.7, 0.3]]
62
+ keyboardNeighbors['ũ'] = ["uúùủụ|ưứừữửự", [0.7, 0.3]]
63
+ keyboardNeighbors['ụ'] = ["uúùủũ|ưứừữửự", [0.7, 0.3]]
64
+ keyboardNeighbors['ư'] = ["uúùủũụ|ứừữửự", [0.3, 0.7]]
65
+ keyboardNeighbors['ứ'] = ["uúùủũụ|ưừữửự", [0.3, 0.7]]
66
+ keyboardNeighbors['ừ'] = ["uúùủũụ|ưứữửự", [0.3, 0.7]]
67
+ keyboardNeighbors['ử'] = ["uúùủũụ|ưứừữự", [0.3, 0.7]]
68
+ keyboardNeighbors['ữ'] = ["uúùủũụ|ưứừửự", [0.3, 0.7]]
69
+ keyboardNeighbors['ự'] = ["uúùủũụ|ưứừữử", [0.3, 0.7]]
70
+ keyboardNeighbors['y'] = ["ýỳỷỵỹ|iíìỉĩị", [0.7, 0.3]]
71
+ keyboardNeighbors['ý'] = ["yỳỷỵỹ|iíìỉĩị", [0.7, 0.3]]
72
+ keyboardNeighbors['ỳ'] = ["yýỷỵỹ|iíìỉĩị", [0.7, 0.3]]
73
+ keyboardNeighbors['ỷ'] = ["yýỳỵỹ|iíìỉĩị", [0.7, 0.3]]
74
+ keyboardNeighbors['ỵ'] = ["yýỳỷỹ|iíìỉĩị", [0.7, 0.3]]
75
+ keyboardNeighbors['ỹ'] = ["yýỳỷỵ|iíìỉĩị", [0.7, 0.3]]
76
+ for key in keyboardNeighbors.keys():
77
+ keyboardNeighbors[key] = [keyboardNeighbors[key][0].split("|"), keyboardNeighbors[key][1]]
78
+ return keyboardNeighbors
79
+
dataset/data_generation/normalize.py ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Copyright @ nguyenvanhieu.vn
3
+ Thằng code python này không giữ được lower/upper case
4
+ Sẽ update khi rảnh
5
+ """
6
+ import re
7
+
8
+
9
+ uniChars = "àáảãạâầấẩẫậăằắẳẵặèéẻẽẹêềếểễệđìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữựỳýỷỹỵÀÁẢÃẠÂẦẤẨẪẬĂẰẮẲẴẶÈÉẺẼẸÊỀẾỂỄỆĐÌÍỈĨỊÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢÙÚỦŨỤƯỪỨỬỮỰỲÝỶỸỴÂĂĐÔƠƯ"
10
+ unsignChars = "aaaaaaaaaaaaaaaaaeeeeeeeeeeediiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAAEEEEEEEEEEEDIIIOOOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYYAADOOU"
11
+
12
+
13
+ def loaddicchar():
14
+ dic = {}
15
+ char1252 = 'à|á|ả|ã|ạ|ầ|ấ|ẩ|ẫ|ậ|ằ|ắ|ẳ|ẵ|ặ|è|é|ẻ|ẽ|ẹ|ề|ế|ể|ễ|ệ|ì|í|ỉ|ĩ|ị|ò|ó|ỏ|õ|ọ|ồ|ố|ổ|ỗ|ộ|ờ|ớ|ở|ỡ|ợ|ù|ú|ủ|ũ|ụ|ừ|ứ|ử|ữ|ự|ỳ|ý|ỷ|ỹ|ỵ|À|Á|Ả|Ã|Ạ|Ầ|Ấ|Ẩ|Ẫ|Ậ|Ằ|Ắ|Ẳ|Ẵ|Ặ|È|É|Ẻ|Ẽ|Ẹ|Ề|Ế|Ể|Ễ|Ệ|Ì|Í|Ỉ|Ĩ|Ị|Ò|Ó|Ỏ|Õ|Ọ|Ồ|Ố|Ổ|Ỗ|Ộ|Ờ|Ớ|Ở|Ỡ|Ợ|Ù|Ú|Ủ|Ũ|Ụ|Ừ|Ứ|Ử|Ữ|Ự|Ỳ|Ý|Ỷ|Ỹ|Ỵ'.split(
16
+ '|')
17
+ charutf8 = "à|á|ả|ã|ạ|ầ|ấ|ẩ|ẫ|ậ|ằ|ắ|ẳ|ẵ|ặ|è|é|ẻ|ẽ|ẹ|ề|ế|ể|ễ|ệ|ì|í|ỉ|ĩ|ị|ò|ó|ỏ|õ|ọ|ồ|ố|ổ|ỗ|ộ|ờ|ớ|ở|ỡ|ợ|ù|ú|ủ|ũ|ụ|ừ|ứ|ử|ữ|ự|ỳ|ý|ỷ|ỹ|ỵ|À|Á|Ả|Ã|Ạ|Ầ|Ấ|Ẩ|Ẫ|Ậ|Ằ|Ắ|Ẳ|Ẵ|Ặ|È|É|Ẻ|Ẽ|Ẹ|Ề|Ế|Ể|Ễ|Ệ|Ì|Í|Ỉ|Ĩ|Ị|Ò|Ó|Ỏ|Õ|Ọ|Ồ|Ố|Ổ|Ỗ|Ộ|Ờ|Ớ|Ở|Ỡ|Ợ|Ù|Ú|Ủ|Ũ|Ụ|Ừ|Ứ|Ử|Ữ|Ự|Ỳ|Ý|Ỷ|Ỹ|Ỵ".split(
18
+ '|')
19
+ for i in range(len(char1252)):
20
+ dic[char1252[i]] = charutf8[i]
21
+ return dic
22
+
23
+
24
+ dicchar = loaddicchar()
25
+
26
+
27
+ def convertwindown1525toutf8(txt):
28
+ return re.sub(
29
+ r'à|á|ả|ã|ạ|ầ|ấ|ẩ|ẫ|ậ|ằ|ắ|ẳ|ẵ|ặ|è|é|ẻ|ẽ|ẹ|ề|ế|ể|ễ|ệ|ì|í|ỉ|ĩ|ị|ò|ó|ỏ|õ|ọ|ồ|ố|ổ|ỗ|ộ|ờ|ớ|ở|ỡ|ợ|ù|ú|ủ|ũ|ụ|ừ|ứ|ử|ữ|ự|ỳ|ý|ỷ|ỹ|ỵ|À|Á|Ả|Ã|Ạ|Ầ|Ấ|Ẩ|Ẫ|Ậ|Ằ|Ắ|Ẳ|Ẵ|Ặ|È|É|Ẻ|Ẽ|Ẹ|Ề|Ế|Ể|Ễ|Ệ|Ì|Í|Ỉ|Ĩ|Ị|Ò|Ó|Ỏ|Õ|Ọ|Ồ|Ố|Ổ|Ỗ|Ộ|Ờ|Ớ|Ở|Ỡ|Ợ|Ù|Ú|Ủ|Ũ|Ụ|Ừ|Ứ|Ử|Ữ|Ự|Ỳ|Ý|Ỷ|Ỹ|Ỵ',
30
+ lambda x: dicchar[x.group()], txt)
31
+
32
+ """
33
+ Start section: Chuyển câu văn về kiểu gõ telex khi không bật Unikey
34
+ Ví dụ: thủy = thuyr, tượng = tuwowngj
35
+ """
36
+ bang_nguyen_am = [['a', 'à', 'á', 'ả', 'ã', 'ạ', 'a'],
37
+ ['ă', 'ằ', 'ắ', 'ẳ', 'ẵ', 'ặ', 'aw'],
38
+ ['â', 'ầ', 'ấ', 'ẩ', 'ẫ', 'ậ', 'aa'],
39
+ ['e', 'è', 'é', 'ẻ', 'ẽ', 'ẹ', 'e'],
40
+ ['ê', 'ề', 'ế', 'ể', 'ễ', 'ệ', 'ee'],
41
+ ['i', 'ì', 'í', 'ỉ', 'ĩ', 'ị', 'i'],
42
+ ['o', 'ò', 'ó', 'ỏ', 'õ', 'ọ', 'o'],
43
+ ['ô', 'ồ', 'ố', 'ổ', 'ỗ', 'ộ', 'oo'],
44
+ ['ơ', 'ờ', 'ớ', 'ở', 'ỡ', 'ợ', 'ow'],
45
+ ['u', 'ù', 'ú', 'ủ', 'ũ', 'ụ', 'u'],
46
+ ['ư', 'ừ', 'ứ', 'ử', 'ữ', 'ự', 'uw'],
47
+ ['y', 'ỳ', 'ý', 'ỷ', 'ỹ', 'ỵ', 'y']]
48
+ bang_ky_tu_dau = ['', 'f', 's', 'r', 'x', 'j']
49
+
50
+ nguyen_am_to_ids = {}
51
+
52
+ for i in range(len(bang_nguyen_am)):
53
+ for j in range(len(bang_nguyen_am[i]) - 1):
54
+ nguyen_am_to_ids[bang_nguyen_am[i][j]] = (i, j)
55
+
56
+
57
+ def vn_word_to_telex_type(word):
58
+ dau_cau = 0
59
+ new_word = ''
60
+ for char in word:
61
+ x, y = nguyen_am_to_ids.get(char, (-1, -1))
62
+ if x == -1:
63
+ new_word += char
64
+ continue
65
+ if y != 0:
66
+ dau_cau = y
67
+ new_word += bang_nguyen_am[x][-1]
68
+ new_word += bang_ky_tu_dau[dau_cau]
69
+ return new_word
70
+
71
+
72
+ def vn_sentence_to_telex_type(sentence):
73
+ """
74
+ Chuyển câu tiếng việt có dấu về kiểu gõ telex.
75
+ :param sentence:
76
+ :return:
77
+ """
78
+ words = sentence.split()
79
+ for index, word in enumerate(words):
80
+ words[index] = vn_word_to_telex_type(word)
81
+ return ' '.join(words)
82
+ """
83
+ Start section: Chuyển câu văn về cách gõ dấu kiểu cũ: dùng òa úy thay oà uý
84
+ Xem tại đây: https://vi.wikipedia.org/wiki/Quy_t%E1%BA%AFc_%C4%91%E1%BA%B7t_d%E1%BA%A5u_thanh_trong_ch%E1%BB%AF_qu%E1%BB%91c_ng%E1%BB%AF
85
+ """
86
+
87
+
88
+ def chuan_hoa_dau_tu_tieng_viet(word):
89
+ if not is_valid_vietnam_word(word):
90
+ return word
91
+
92
+ chars = list(word)
93
+ dau_cau = 0
94
+ nguyen_am_index = []
95
+ qu_or_gi = False
96
+ for index, char in enumerate(chars):
97
+ x, y = nguyen_am_to_ids.get(char, (-1, -1))
98
+ if x == -1:
99
+ continue
100
+ elif x == 9: # check qu
101
+ if index != 0 and chars[index - 1] == 'q':
102
+ chars[index] = 'u'
103
+ qu_or_gi = True
104
+ elif x == 5: # check gi
105
+ if index != 0 and chars[index - 1] == 'g':
106
+ chars[index] = 'i'
107
+ qu_or_gi = True
108
+ if y != 0:
109
+ dau_cau = y
110
+ chars[index] = bang_nguyen_am[x][0]
111
+ if not qu_or_gi or index != 1:
112
+ nguyen_am_index.append(index)
113
+ if len(nguyen_am_index) < 2:
114
+ if qu_or_gi:
115
+ if len(chars) == 2:
116
+ x, y = nguyen_am_to_ids.get(chars[1])
117
+ chars[1] = bang_nguyen_am[x][dau_cau]
118
+ else:
119
+ x, y = nguyen_am_to_ids.get(chars[2], (-1, -1))
120
+ if x != -1:
121
+ chars[2] = bang_nguyen_am[x][dau_cau]
122
+ else:
123
+ chars[1] = bang_nguyen_am[5][dau_cau] if chars[1] == 'i' else bang_nguyen_am[9][dau_cau]
124
+ return ''.join(chars)
125
+ return word
126
+
127
+ for index in nguyen_am_index:
128
+ x, y = nguyen_am_to_ids[chars[index]]
129
+ if x == 4 or x == 8: # ê, ơ
130
+ chars[index] = bang_nguyen_am[x][dau_cau]
131
+ # for index2 in nguyen_am_index:
132
+ # if index2 != index:
133
+ # x, y = nguyen_am_to_ids[chars[index]]
134
+ # chars[index2] = bang_nguyen_am[x][0]
135
+ return ''.join(chars)
136
+
137
+ if len(nguyen_am_index) == 2:
138
+ if nguyen_am_index[-1] == len(chars) - 1:
139
+ x, y = nguyen_am_to_ids[chars[nguyen_am_index[0]]]
140
+ chars[nguyen_am_index[0]] = bang_nguyen_am[x][dau_cau]
141
+ # x, y = nguyen_am_to_ids[chars[nguyen_am_index[1]]]
142
+ # chars[nguyen_am_index[1]] = bang_nguyen_am[x][0]
143
+ else:
144
+ # x, y = nguyen_am_to_ids[chars[nguyen_am_index[0]]]
145
+ # chars[nguyen_am_index[0]] = bang_nguyen_am[x][0]
146
+ x, y = nguyen_am_to_ids[chars[nguyen_am_index[1]]]
147
+ chars[nguyen_am_index[1]] = bang_nguyen_am[x][dau_cau]
148
+ else:
149
+ # x, y = nguyen_am_to_ids[chars[nguyen_am_index[0]]]
150
+ # chars[nguyen_am_index[0]] = bang_nguyen_am[x][0]
151
+ x, y = nguyen_am_to_ids[chars[nguyen_am_index[1]]]
152
+ chars[nguyen_am_index[1]] = bang_nguyen_am[x][dau_cau]
153
+ # x, y = nguyen_am_to_ids[chars[nguyen_am_index[2]]]
154
+ # chars[nguyen_am_index[2]] = bang_nguyen_am[x][0]
155
+ return ''.join(chars)
156
+
157
+
158
+ def is_valid_vietnam_word(word):
159
+ chars = list(word)
160
+ nguyen_am_index = -1
161
+ for index, char in enumerate(chars):
162
+ x, y = nguyen_am_to_ids.get(char, (-1, -1))
163
+ if x != -1:
164
+ if nguyen_am_index == -1:
165
+ nguyen_am_index = index
166
+ else:
167
+ if index - nguyen_am_index != 1:
168
+ return False
169
+ nguyen_am_index = index
170
+ return True
171
+
172
+
173
+ def chuan_hoa_dau_cau_tieng_viet(sentence):
174
+ """
175
+ Chuyển câu tiếng việt về chuẩn gõ dấu kiểu cũ.
176
+ :param sentence:
177
+ :return:
178
+ """
179
+ sentence = sentence.lower()
180
+ words = sentence.split()
181
+ for index, word in enumerate(words):
182
+ words[index] = chuan_hoa_dau_tu_tieng_viet(word)
183
+ return ' '.join(words)
dataset/data_generation/typing_error_gen.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from normalize import chuan_hoa_dau_tu_tieng_viet
3
+ import numpy as np
4
+
5
+ with open("common-vietnamese-syllables.txt", "r") as file:
6
+ vi_syllables = [line.strip("\n") for line in file.readlines()]
7
+
8
+ file = open("../../dataset/noising_resources/kieu_go_dau_cu_moi.txt", "w+")
9
+ for syllable in vi_syllables:
10
+ normalized = chuan_hoa_dau_tu_tieng_viet(syllable)
11
+ if normalized != syllable:
12
+ print(normalized, syllable, file = file)
13
+ file.close()
dataset/log/prepare_data.log ADDED
File without changes
dataset/noise.py ADDED
@@ -0,0 +1,655 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import string
2
+ from nltk.tokenize import word_tokenize
3
+ import numpy as np
4
+ import re
5
+ import unidecode
6
+ import nltk
7
+ import json
8
+ import os
9
+ real_file_path = "/".join(os.path.realpath(__file__).split("/")[:-1])
10
+ nltk.download('punkt')
11
+ from dataset.vocab import Vocab
12
+ from ast import literal_eval
13
+
14
+ class SynthesizeData(object):
15
+ """
16
+ Uitils class to create artificial miss-spelled words
17
+ Args:
18
+ vocab_path: path to vocab file. Vocab file is expected to be a set of words, separate by ' ', no newline charactor.
19
+ """
20
+
21
+ def __init__(self, vocab: Vocab):
22
+
23
+ self.vocab = vocab
24
+ self.tokenizer = word_tokenize
25
+
26
+ self.vn_alphabet = ['a', 'ă', 'â', 'b', 'c', 'd', 'đ', 'e', 'ê', 'g', 'h', 'i', 'k', 'l', 'm', 'n', 'o', 'ô',
27
+ 'ơ', 'p', 'q', 'r', 's', 't', 'u', 'ư', 'v', 'x', 'y']
28
+ self.alphabet_len = len(self.vn_alphabet)
29
+ self.word_couples = [pair.strip("\n").split(" ") for pair in open(os.path.join(real_file_path, "noising_resources/kieu_go_dau_cu_moi.txt"), "r", encoding='utf-8').readlines()]
30
+ self.homowords = literal_eval(open( os.path.join(real_file_path, "noising_resources/confusion_set.json"), "r", encoding='utf-8').read())
31
+ self.homo_leters_dict = literal_eval(open( os.path.join(real_file_path, "noising_resources/homo_leter.json"), "r", encoding='utf-8').read())
32
+
33
+ self.teencode_dict = {'mình': ['mk', 'mik', 'mjk'], 'vô': ['zô', 'zo', 'vo'], 'vậy': ['zậy', 'z', 'zay', 'za'],
34
+ 'phải': ['fải', 'fai', ], 'biết': ['bit', 'biet'],
35
+ 'rồi': ['rùi', 'ròi', 'r'], 'bây': ['bi', 'bay'], 'giờ': ['h', ],
36
+ 'không': ['k', 'ko', 'khong', 'hk', 'hong', 'hông', '0', 'kg', 'kh', ],
37
+ 'đi': ['di', 'dj', ], 'gì': ['j', ], 'em': ['e', ], 'được': ['dc', 'đc', ], 'tao': ['t'],
38
+ 'tôi': ['t'], 'chồng': ['ck'], 'vợ': ['vk']
39
+ }
40
+
41
+ self.typo = json.load( open(os.path.join(real_file_path,"noising_resources/typo.json"), "r", encoding='utf-8'))
42
+ self.all_char_candidates = self.get_all_char_candidates()
43
+ self.all_word_candidates = self.get_all_word_candidates()
44
+
45
+ def replace_teencode(self, word):
46
+ candidates = self.teencode_dict.get(word, None)
47
+ if candidates is not None:
48
+ chosen_one = 0
49
+ if len(candidates) > 1:
50
+ chosen_one = np.random.randint(0, len(candidates))
51
+ return candidates[chosen_one]
52
+
53
+
54
+ def replace_char_candidate(self, char):
55
+ """
56
+ return a homophone char/subword of the input char.
57
+ """
58
+ return np.random.choice(self.homo_leters_dict[char])
59
+
60
+ def replace_word_candidate(self, word):
61
+ """
62
+ Return a new typo word of the input word for example òa oà
63
+ """
64
+ capital_flag = word[0].isupper()
65
+ word = word.lower()
66
+ if capital_flag and word in self.teencode_dict:
67
+ return self.replace_teencode(word).capitalize()
68
+ elif word in self.teencode_dict:
69
+ return self.replace_teencode(word)
70
+
71
+ for couple in self.word_couples:
72
+ for i in range(2):
73
+ if couple[i] == word:
74
+ if i == 0:
75
+ if capital_flag:
76
+ return couple[1].capitalize()
77
+ else:
78
+ return couple[1]
79
+ else:
80
+ if capital_flag:
81
+ return couple[0].capitalize()
82
+ else:
83
+ return couple[0]
84
+
85
+ def replace_homo_candidate(self, word):
86
+ """
87
+ Return a homo word of the input word
88
+ """
89
+ capital_flag = word[0].isupper()
90
+ word = word.lower()
91
+
92
+ def random_capitalize(word):
93
+ index = np.random.randint(0, len(word))
94
+ return word[0:index] + word[index].upper() + word[index+1:]
95
+
96
+ candidate_type = np.random.choice(["phu_am_dau", "phu_am_cuoi", "nguyen_am"]\
97
+ , p = [0.1, 0.3, 0.6])
98
+ if candidate_type == "nguyen_am":
99
+ coin = np.random.choice([0, 1], p = [0.7, 0.3])
100
+ candidates = list(self.homowords[word][candidate_type][coin])
101
+ else:
102
+ candidates = list(self.homowords[word][candidate_type])
103
+ if len(candidates) == 0:
104
+ if capital_flag:
105
+ return word
106
+ return random_capitalize(word)
107
+
108
+ candidate = np.random.choice(candidates)
109
+ if capital_flag:
110
+ return candidate.capitalize()
111
+ return candidate
112
+
113
+ def replace_char_candidate_typo(self, char):
114
+ """
115
+ return a homophone char/subword of the input char.
116
+ """
117
+ candidates = self.typo[char]
118
+ num_lower_priority = len(candidates) - 1
119
+ round_flag = 10 * num_lower_priority
120
+
121
+ return np.random.choice(candidates, p = [0.7, *[3 / round_flag for i in range(num_lower_priority)]])
122
+
123
+
124
+
125
+ def get_all_char_candidates(self):
126
+
127
+ return list(self.homo_leters_dict.keys())
128
+
129
+ def get_all_word_candidates(self):
130
+
131
+ all_word_candidates = []
132
+ for couple in self.word_couples:
133
+ all_word_candidates.extend(couple)
134
+ return all_word_candidates
135
+
136
+
137
+ def remove_diacritics(self, text, onehot_label):
138
+ """
139
+ Replace word which has diacritics with the same word without diacritics
140
+ Args:
141
+ text: a list of word tokens
142
+ onehot_label: onehot array indicate position of word that has already modify, so this
143
+ function only choose the word that do not has onehot label == 1.
144
+ return: a list of word tokens has one word that its diacritics was removed,
145
+ a list of onehot label indicate the position of words that has been modified.
146
+ """
147
+
148
+ if len(text) == len(' '.join(text).split()):
149
+ its_me = True
150
+ else:
151
+ its_me = False
152
+
153
+ idx = np.random.randint(0, len(onehot_label))
154
+ prevent_loop = 0
155
+ noised_token = unidecode.unidecode(text[idx])
156
+ while onehot_label[idx] != 0 or not self.vocab.exist(text[idx]) or text[idx] in string.punctuation or text[idx] == noised_token:
157
+ idx = np.random.randint(0, len(onehot_label))
158
+ noised_token = unidecode.unidecode(text[idx])
159
+ prevent_loop += 1
160
+ if prevent_loop > 10:
161
+ return False, text, onehot_label
162
+
163
+ onehot_label[idx] = 1
164
+ token = text[idx]
165
+ text[idx] = unidecode.unidecode(text[idx])
166
+
167
+ if (len(text) != len(' '.join(text).split())) and its_me:
168
+ print("ERROR:")
169
+ print("text: ", text)
170
+ print("replaced token: ", text[idx])
171
+ print("org token: ", token)
172
+
173
+ return True, text, onehot_label
174
+
175
+ def replace_with_random_letter(self, text, onehot_label):
176
+ """
177
+ Replace, add (or remove) a random letter in a random chosen word with a random letter
178
+ Args:
179
+ text: a list of word tokens
180
+ onehot_label: onehot array indicate position of word that has already modify, so this
181
+ function only choose the word that do not has onehot label == 1.
182
+ return: a list of word tokens has one word that has been modified,
183
+ a list of onehot label indicate the position of words that has been modified.
184
+ """
185
+
186
+ if len(text) == len(' '.join(text).split()):
187
+ its_me = True
188
+ else:
189
+ its_me = False
190
+
191
+ idx = np.random.randint(0, len(onehot_label))
192
+ prevent_loop = 0
193
+ while onehot_label[idx] != 0 or not self.vocab.exist(text[idx]) or len(text[idx]) < 3:
194
+ idx = np.random.randint(0, len(onehot_label))
195
+ prevent_loop += 1
196
+ if prevent_loop > 10:
197
+ return False, text, onehot_label
198
+
199
+
200
+
201
+ # replace, add or remove? 0 is replace, 1 is add, 2 is remove
202
+ # 0.8 1 edits, 0.2 2 edits
203
+ num_edit = np.random.choice([1,2], p = [0.8, 0.2])
204
+ coin = np.random.choice([0, 1, 2])
205
+
206
+ for i in range(num_edit):
207
+ token = list(text[idx])
208
+ if coin == 0:
209
+ chosen_idx = np.random.randint(0, len(token))
210
+ replace_candidate = self.vn_alphabet[np.random.randint(
211
+ 0, self.alphabet_len)]
212
+ token[chosen_idx] = replace_candidate
213
+ text[idx] = "".join(token)
214
+ elif coin == 1:
215
+ chosen_idx = np.random.randint(0, len(token) + 1)
216
+ if chosen_idx == len(token):
217
+ added_chars = self.vn_alphabet[np.random.randint(0, self.alphabet_len)] + \
218
+ token[0]
219
+ chosen_idx = 0
220
+ else:
221
+ added_chars = token[chosen_idx] + \
222
+ self.vn_alphabet[np.random.randint(0, self.alphabet_len)]
223
+
224
+ token[chosen_idx] = added_chars
225
+ text[idx] = "".join(token)
226
+ else:
227
+ chosen_idx = np.random.randint(0, len(token))
228
+ token[chosen_idx] = ""
229
+ text[idx] = "".join(token)
230
+
231
+ onehot_label[idx] = 1
232
+
233
+ if (len(text) != len(' '.join(text).split())) and its_me:
234
+ print("ERROR:")
235
+ print("text: ", text)
236
+ print("replaced token: ", text[idx])
237
+ print("org token: ", token)
238
+ print("coin: ", coin)
239
+ return False, text, onehot_label
240
+
241
+ return True, text, onehot_label
242
+
243
+ def replace_with_new_typo_word(self, text, onehot_label):
244
+ """
245
+ Replace a candidate word (if exist in the word_couple) with its homophone. if successful, return True, else False
246
+ Args:
247
+ text: a list of word tokens
248
+ onehot_label: onehot array indicate position of word that has already modify, so this
249
+ function only choose the word that do not has onehot label == 1.
250
+ return: True, text, onehot_label if successful replace, else False, text, onehot_label
251
+ """
252
+ # account for the case that the word in the text is upper case but its lowercase match the candidates list
253
+
254
+ if len(text) == len(' '.join(text).split()):
255
+ its_me = True
256
+ else:
257
+ its_me = False
258
+
259
+ candidates = []
260
+ for i in range(len(text)):
261
+ if text[i].lower() in self.all_word_candidates or text[i].lower() in self.teencode_dict.keys():
262
+ candidates.append((i, text[i]))
263
+
264
+ if len(candidates) == 0:
265
+ return False, text, onehot_label
266
+
267
+ idx = np.random.randint(0, len(candidates))
268
+ prevent_loop = 0
269
+ while onehot_label[candidates[idx][0]] != 0 or not self.vocab.exist(candidates[idx][1]):
270
+ idx = np.random.choice(np.arange(0, len(candidates)))
271
+ prevent_loop += 1
272
+ if prevent_loop > 10:
273
+ return False, text, onehot_label
274
+
275
+ text[candidates[idx][0]] = self.replace_word_candidate(
276
+ candidates[idx][1])
277
+
278
+ if (len(text) != len(' '.join(text).split())) and its_me:
279
+ print("ERROR:")
280
+ print("text: ", text)
281
+ print("replaced token: ", text[candidates[idx][0]])
282
+ print("org token: ", candidates[idx][1])
283
+
284
+ onehot_label[candidates[idx][0]] = 1
285
+ return True, text, onehot_label
286
+
287
+ def replace_with_homophone_word(self, text, onehot_label):
288
+ """
289
+ Replace a candidate word (if exist in the word_couple) with its homophone. if successful, return True, else False
290
+ Args:
291
+ text: a list of word tokens
292
+ onehot_label: onehot array indicate position of word that has already modify, so this
293
+ function only choose the word that do not has onehot label == 1.
294
+ return: True, text, onehot_label if successful replace, else False, text, onehot_label
295
+ """
296
+ # account for the case that the word in the text is upper case but its lowercase match the candidates list
297
+
298
+ if len(text) == len(' '.join(text).split()):
299
+ its_me = True
300
+ else:
301
+ its_me = False
302
+
303
+ candidates = []
304
+ for i in range(len(text)):
305
+ if text[i].lower() in self.homowords:
306
+ candidates.append((i, text[i]))
307
+
308
+ if len(candidates) == 0:
309
+ return False, text, onehot_label
310
+
311
+ idx = np.random.randint(0, len(candidates))
312
+ prevent_loop = 0
313
+ while onehot_label[candidates[idx][0]] != 0 or not self.vocab.exist(candidates[idx][1]):
314
+ idx = np.random.choice(np.arange(0, len(candidates)))
315
+ prevent_loop += 1
316
+ if prevent_loop > 10:
317
+ return False, text, onehot_label
318
+
319
+ text[candidates[idx][0]] = self.replace_homo_candidate(
320
+ candidates[idx][1])
321
+
322
+ if (len(text) != len(' '.join(text).split())) and its_me:
323
+ print("ERROR:")
324
+ print("text: ", text)
325
+ print("replaced token: ", text[candidates[idx][0]])
326
+ print("org token: ", candidates[idx][1])
327
+ return False, text, onehot_label
328
+
329
+ onehot_label[candidates[idx][0]] = 1
330
+ return True, text, onehot_label
331
+
332
+ def replace_with_homophone_letter(self, text, onehot_label):
333
+
334
+ """
335
+ Replace a subword/letter with its homophones
336
+ Args:
337
+ text: a list of word tokens
338
+ onehot_label: onehot array indicate position of word that has already modify, so this
339
+ function only choose the word that do not has onehot label == 1.
340
+ return: True, text, onehot_label if successful replace, else False, None, None
341
+ """
342
+
343
+ if len(text) == len(' '.join(text).split()):
344
+ its_me = True
345
+ else:
346
+ its_me = False
347
+
348
+ candidates = []
349
+ for i in range(len(text)):
350
+ for char in self.all_char_candidates:
351
+ if re.search("^" + char, text[i]) is not None:
352
+ candidates.append((i, char, "^" + char ))
353
+ if re.search(char + "$", text[i]) is not None:
354
+ candidates.append((i, char, char + "$"))
355
+
356
+ if len(candidates) == 0:
357
+
358
+ return False, text, onehot_label
359
+
360
+ else:
361
+ idx = np.random.randint(0, len(candidates))
362
+ prevent_loop = 0
363
+ while onehot_label[candidates[idx][0]] != 0 or not self.vocab.exist(text[candidates[idx][0]]) or len(text[candidates[idx][0]]) < 2:
364
+ idx = np.random.randint(0, len(candidates))
365
+ prevent_loop += 1
366
+ if prevent_loop > 10:
367
+ return False, text, onehot_label
368
+
369
+ replaced = self.replace_char_candidate(candidates[idx][1])
370
+ ## 0.15% remove the candidate. cát -> cá
371
+ coin = np.random.choice([0, 1], p = [0.8, 0.2])
372
+ text_to_replace = text[candidates[idx][0]]
373
+ result = re.sub(candidates[idx][2], replaced if coin == 0 else "",
374
+ text_to_replace)
375
+ if result == "":
376
+ result = re.sub(candidates[idx][2], replaced,
377
+ text_to_replace)
378
+
379
+ text[candidates[idx][0]] = result
380
+
381
+ if (len(text) != len(' '.join(text).split())) and its_me:
382
+ print("ERROR:")
383
+ print("text: ", text)
384
+ print("replaced token: ", text[candidates[idx][0]])
385
+ print("letter: ", candidates[idx][1])
386
+ print("replaced letter: ", replaced)
387
+
388
+ onehot_label[candidates[idx][0]] = 1
389
+ return True, text, onehot_label
390
+
391
+ def replace_with_typo_letter(self, text, onehot_label):
392
+ """
393
+ Replace a subword/letter with its homophones
394
+ Args:
395
+ text: a list of word tokens
396
+ onehot_label: onehot array indicate position of word that has already modify, so this
397
+ function only choose the word that do not has onehot label == 1.
398
+ return: True, text, onehot_label if successful replace, else False, None, None
399
+ """
400
+
401
+ if len(text) == len(' '.join(text).split()):
402
+ its_me = True
403
+ else:
404
+ its_me = False
405
+
406
+ # find index noise
407
+ idx = np.random.randint(0, len(onehot_label))
408
+ prevent_loop = 0
409
+ while onehot_label[idx] != 0 or not self.vocab.exist(text[idx]):
410
+ idx = np.random.randint(0, len(onehot_label))
411
+ prevent_loop += 1
412
+ if prevent_loop > 10:
413
+ return False, text, onehot_label
414
+
415
+ index_noise = idx
416
+ onehot_label[index_noise] = 1
417
+
418
+ org_word = text[index_noise]
419
+ word_noise = text[index_noise]
420
+
421
+ pattern = "(" + "|".join(self.typo.keys()) + "){1}"
422
+ candidates = re.findall(pattern, word_noise)
423
+ if len(candidates) == 0:
424
+ return False, text, onehot_label
425
+ accent_pattern = "(s|f|r|x|j|1|2|3|4|5){1}"
426
+ for candidate in candidates:
427
+ replaced = self.replace_char_candidate_typo(candidate)
428
+ # Move accent to the end of text
429
+ result = re.findall(accent_pattern, replaced)
430
+ if len(result) != 0:
431
+ word_noise = re.sub(candidate, replaced[0:-1], word_noise)
432
+ word_noise += replaced[-1]
433
+ else:
434
+ word_noise = re.sub(candidate, replaced, word_noise)
435
+
436
+ text[index_noise] = word_noise
437
+
438
+ if len(word_noise) < 3:
439
+ return True, text, onehot_label
440
+ ### Introduce one or two edit on text
441
+ num_edits = np.random.choice([0, 1, 2], p = [0.5, 0.35, 0.15])
442
+
443
+ for i in range(num_edits):
444
+ coin = np.random.choice([0, 1, 2, 3])
445
+ word_noise = list(text[index_noise])
446
+ start_char = word_noise.pop(0)
447
+
448
+ if coin == 0:
449
+ chosen_idx = np.random.randint(0, len(word_noise))
450
+ word_noise[chosen_idx] = self.vn_alphabet[np.random.randint(0, self.alphabet_len)]
451
+ text[index_noise] = start_char + "".join(word_noise)
452
+ elif coin == 1:
453
+ chosen_idx = np.random.randint(0, len(word_noise))
454
+ word_noise[chosen_idx] += self.vn_alphabet[np.random.randint(0, self.alphabet_len)]
455
+ text[index_noise] = start_char + "".join(word_noise)
456
+ elif coin == 2:
457
+ if len(word_noise) < 2:
458
+ continue
459
+ chosen_idxs = np.random.choice(range(len(word_noise)), size = 2)
460
+ word_noise[chosen_idxs[0]], word_noise[chosen_idxs[1]] = \
461
+ word_noise[chosen_idxs[1]], word_noise[chosen_idxs[0]]
462
+ text[index_noise] = start_char + "".join(word_noise)
463
+ else:
464
+ chosen_idx = np.random.randint(0, len(word_noise))
465
+ word_noise[chosen_idx] = ""
466
+ text[index_noise] = start_char + "".join(word_noise)
467
+
468
+ return True, text, onehot_label
469
+
470
+ def split_word(self, text, onehot_label):
471
+
472
+ # find index noise
473
+ idx = np.random.randint(0, len(onehot_label))
474
+ prevent_loop = 0
475
+ while onehot_label[idx] not in [0, 1] or len(text[idx]) < 3 or text[idx] in r'''!"#$%&'()*+,-./:;<=>?@[]^_`{|}~''' :
476
+ idx = np.random.randint(0, len(onehot_label))
477
+ prevent_loop += 1
478
+ if prevent_loop > 10:
479
+ return False, text, onehot_label
480
+
481
+ org_word = text[idx]
482
+ new_text = text[:idx]
483
+ new_onehot = onehot_label[:idx]
484
+
485
+ index_split = np.random.randint(1, len(org_word))
486
+
487
+ new_text.extend([org_word[:index_split], org_word[index_split:]])
488
+ new_onehot.extend([2, 2])
489
+
490
+ if idx < len(text) - 1:
491
+ new_text.extend(text[idx+1:])
492
+ new_onehot.extend(onehot_label[idx+1:])
493
+
494
+ return True, new_text, new_onehot
495
+
496
+ def merge_word(self, text, onehot_label):
497
+ length = len(onehot_label)
498
+ if length < 2:
499
+ return False, text, onehot_label
500
+
501
+ def validate_len(idx, size):
502
+ while idx + size > length:
503
+ if idx > 0:
504
+ idx -= 1
505
+ else:
506
+ size -= 1
507
+ return idx, size
508
+
509
+ def validate_value(idx, size):
510
+ for i in range(idx, idx+size):
511
+ if onehot_label[i] not in [0, 1] or text[i] in r'''!"#$%&'()*+,-./:;<=>?@[]^_`{|}~''':
512
+ return False
513
+ return True
514
+
515
+ # find index noise
516
+ min_words = 2
517
+ max_words = 3 if length > 3 else length
518
+ num_words = np.random.randint(min_words, max_words + 1)
519
+ idx = np.random.randint(0, length)
520
+ prevent_loop = 0
521
+ idx, num_words = validate_len(idx, num_words)
522
+ while not validate_value(idx, num_words) :
523
+ prevent_loop += 1
524
+ if prevent_loop > 10:
525
+ return False, text, onehot_label
526
+ idx = np.random.randint(0, length)
527
+ num_words = np.random.randint(min_words, max_words + 1)
528
+ idx, num_words = validate_len(idx, num_words)
529
+
530
+ new_text = text[:idx]
531
+ new_onehot = onehot_label[:idx]
532
+ new_text.append(''.join(text[idx:idx+num_words]))
533
+
534
+ new_onehot.append(-num_words+1)
535
+
536
+ if idx + num_words < length:
537
+ new_text.extend(text[idx+num_words:])
538
+ new_onehot.extend(onehot_label[idx+num_words:])
539
+
540
+ return True, new_text, new_onehot
541
+
542
+ def add_normal_noise(self, sentence, percent_err=0.2, num_type_err=4):
543
+
544
+ tokens = sentence.split()
545
+
546
+ if len(tokens) <= 0:
547
+ print(f"SOMETHING WROONG - sent: {sentence}")
548
+
549
+ onehot_label = [0] * len(tokens)
550
+
551
+ num_wrong = int(np.ceil(percent_err * len(tokens)))
552
+ num_wrong = np.random.randint(1, num_wrong + 1)
553
+ if np.random.rand() < 0.05:
554
+ num_wrong = 0
555
+
556
+ prevent_loop = 0
557
+
558
+ for i in range(0, num_wrong):
559
+
560
+ err = np.random.choice(range(num_type_err + 1)\
561
+ , p = [0.15, 0.15, 0.1, 0.2, 0.4])
562
+
563
+ if err == 0:
564
+ _, tokens, onehot_label = self.remove_diacritics(
565
+ tokens, onehot_label)
566
+
567
+ elif err == 1:
568
+ _, tokens, onehot_label = self.replace_with_typo_letter(
569
+ tokens, onehot_label)
570
+
571
+ elif err == 2:
572
+ _, tokens, onehot_label = self.replace_with_random_letter(
573
+ tokens, onehot_label)
574
+
575
+ elif err == 3:
576
+ _, tokens, onehot_label = self.replace_with_homophone_letter(
577
+ tokens, onehot_label)
578
+
579
+ else:
580
+ _, tokens, onehot_label = self.replace_with_homophone_word(
581
+ tokens, onehot_label)
582
+
583
+
584
+ prevent_loop += 1
585
+
586
+ if prevent_loop > 10:
587
+ return ' '.join(tokens), ' '.join([str(i) for i in onehot_label])
588
+
589
+ # print(tokens)
590
+
591
+ self.verify(tokens, sentence)
592
+
593
+ return ' '.join(tokens), ' '.join([str(i) for i in onehot_label])
594
+
595
+ def add_split_merge_noise(self, sentence, percent_err=0.15, num_type_err=2, percent_normal_err = 0.15):
596
+
597
+ def count_zero_one(onehot_label):
598
+ return sum([1 if onehot in [0, 1] else 0 for onehot in onehot_label])
599
+
600
+ ## Introduce normal noise before split merge
601
+ normal_noise, normal_onehot = self.add_normal_noise(
602
+ sentence, percent_err=percent_normal_err)
603
+
604
+ tokens = normal_noise.split()
605
+ length = len(tokens)
606
+
607
+ onehot_label = [int(x) for x in normal_onehot.split(" ")]
608
+
609
+ num_wrong = int(np.ceil(percent_err * length))
610
+ num_wrong = np.random.randint(1, num_wrong + 1)
611
+ if np.random.rand() < 0.05:
612
+ num_wrong = 0
613
+
614
+ min_zeroes = length - num_wrong
615
+ zero_one_num = length
616
+ prevent_loop = 0
617
+ while zero_one_num > min_zeroes:
618
+
619
+ err = np.random.randint(0, num_type_err)
620
+
621
+ if err == 0:
622
+ _, tokens, onehot_label = self.split_word(
623
+ tokens, onehot_label)
624
+
625
+ else:
626
+ _, tokens, onehot_label = self.merge_word(
627
+ tokens, onehot_label)
628
+
629
+ prevent_loop += 1
630
+
631
+ if prevent_loop > 10:
632
+ return ' '.join(tokens), ' '.join([str(i) for i in onehot_label])
633
+
634
+ zero_one_num = count_zero_one(onehot_label)
635
+
636
+ return ' '.join(tokens), ' '.join([str(i) for i in onehot_label])
637
+
638
+ def verify(self, noised_tokens, sentence):
639
+ if len(noised_tokens) != len(' '.join(noised_tokens).split()):
640
+ print("ERROR:")
641
+ print("TEXT : ", sentence)
642
+ print("TOKENS: ", ' '.join(noised_tokens))
643
+ exit()
644
+
645
+ return True
646
+
647
+
648
+ if __name__ == "__main__":
649
+ text = "Ô kìa ai như cô thắm , con bác năm ở xa mới về , nghiêng nghiêng"
650
+ dict_pickle_path = '../data/vi/datasets/vi_wiki/vi_wiki.vocab.test.pkl'
651
+ vocab = Vocab()
652
+ vocab.load_vocab_dict(dict_pickle_path)
653
+ noiser = SynthesizeData(vocab)
654
+ noised_text, onehot_label = noiser.add_split_merge_noise(text, percent_err=0.5)
655
+ print(noised_text)
dataset/noising_resources/accents.json ADDED
@@ -0,0 +1,498 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"ă": [
2
+ ["ắằẳẵặ", "âấầẩẫậ", "aáàảãạ"
3
+ ],
4
+ [
5
+ 0.7,
6
+ 0.15,
7
+ 0.15
8
+ ]
9
+ ], "â": [
10
+ ["ấầẩẫậ", "aáàảãạ", "ăắằẳẵặ"
11
+ ],
12
+ [
13
+ 0.7,
14
+ 0.15,
15
+ 0.15
16
+ ]
17
+ ], "á": [
18
+ ["aàảãạ", "ăắằẳẵặ", "âấầẩẫậ"
19
+ ],
20
+ [
21
+ 0.7,
22
+ 0.15,
23
+ 0.15
24
+ ]
25
+ ], "à": [
26
+ ["aáảãạ", "ăắằẳẵặ", "âấầẩẫậ"
27
+ ],
28
+ [
29
+ 0.7,
30
+ 0.15,
31
+ 0.15
32
+ ]
33
+ ], "ả": [
34
+ ["aáàãạ", "ăắằẳẵặ", "âấầẩẫậ"
35
+ ],
36
+ [
37
+ 0.7,
38
+ 0.15,
39
+ 0.15
40
+ ]
41
+ ], "ã": [
42
+ ["aáàảạ", "ăắằẳẵặ", "âấầẩẫậ"
43
+ ],
44
+ [
45
+ 0.7,
46
+ 0.15,
47
+ 0.15
48
+ ]
49
+ ], "ạ": [
50
+ ["aáàảã", "ăắằẳẵặ", "âấầẩẫậ"
51
+ ],
52
+ [
53
+ 0.7,
54
+ 0.15,
55
+ 0.15
56
+ ]
57
+ ], "ắ": [
58
+ ["ăằẳẵặ", "aáàảãạ", "âấầẩẫậ"
59
+ ],
60
+ [
61
+ 0.7,
62
+ 0.15,
63
+ 0.15
64
+ ]
65
+ ], "ằ": [
66
+ ["ăắẳẵặ", "aáàảãạ", "âấầẩẫậ"
67
+ ],
68
+ [
69
+ 0.7,
70
+ 0.15,
71
+ 0.15
72
+ ]
73
+ ], "ẳ": [
74
+ ["ăắằẵặ", "aáàảãạ", "âấầẩẫậ"
75
+ ],
76
+ [
77
+ 0.7,
78
+ 0.15,
79
+ 0.15
80
+ ]
81
+ ], "ặ": [
82
+ ["ăắằẳẵ", "aáàảãạ", "âấầẩẫậ"
83
+ ],
84
+ [
85
+ 0.7,
86
+ 0.15,
87
+ 0.15
88
+ ]
89
+ ], "ẵ": [
90
+ ["ăắằẳặ", "aáàảãạ", "âấầẩẫậ"
91
+ ],
92
+ [
93
+ 0.7,
94
+ 0.15,
95
+ 0.15
96
+ ]
97
+ ], "ấ": [
98
+ ["âầẩẫậ", "aáàảãạ", "ăắằẳẵặ"
99
+ ],
100
+ [
101
+ 0.7,
102
+ 0.15,
103
+ 0.15
104
+ ]
105
+ ], "ầ": [
106
+ ["âấẩẫậ", "aáàảãạ", "ăắằẳẵặ"
107
+ ],
108
+ [
109
+ 0.7,
110
+ 0.15,
111
+ 0.15
112
+ ]
113
+ ], "ẩ": [
114
+ ["âấầẫậ", "aáàảãạ", "ăắằẳẵặ"
115
+ ],
116
+ [
117
+ 0.7,
118
+ 0.15,
119
+ 0.15
120
+ ]
121
+ ], "ẫ": [
122
+ ["âấầẩậ", "aáàảãạ", "ăắằẳẵặ"
123
+ ],
124
+ [
125
+ 0.7,
126
+ 0.15,
127
+ 0.15
128
+ ]
129
+ ], "ậ": [
130
+ ["âấầẩẫ", "aáàảãạ", "ăắằẳẵặ"
131
+ ],
132
+ [
133
+ 0.7,
134
+ 0.15,
135
+ 0.15
136
+ ]
137
+ ], "é": [
138
+ ["eèẻẽẹ", "êếềểễệ"
139
+ ],
140
+ [
141
+ 0.7,
142
+ 0.3
143
+ ]
144
+ ], "è": [
145
+ ["eéẻẽẹ", "êếềểễệ"
146
+ ],
147
+ [
148
+ 0.7,
149
+ 0.3
150
+ ]
151
+ ], "ẻ": [
152
+ ["eéèẽẹ", "êếềểễệ"
153
+ ],
154
+ [
155
+ 0.7,
156
+ 0.3
157
+ ]
158
+ ], "ẽ": [
159
+ ["eéèẻẹ", "êếềểễệ"
160
+ ],
161
+ [
162
+ 0.7,
163
+ 0.3
164
+ ]
165
+ ], "ẹ": [
166
+ ["eéèẻẽ", "êếềểễệ"
167
+ ],
168
+ [
169
+ 0.7,
170
+ 0.3
171
+ ]
172
+ ], "ê": [
173
+ ["eéèẻẽẹ", "ếềểễệ"
174
+ ],
175
+ [
176
+ 0.7,
177
+ 0.3
178
+ ]
179
+ ], "ế": [
180
+ ["eéèẻẽẹ", "êềểễệ"
181
+ ],
182
+ [
183
+ 0.3,
184
+ 0.7
185
+ ]
186
+ ], "ề": [
187
+ ["eéèẻẽẹ", "êếểễệ"
188
+ ],
189
+ [
190
+ 0.3,
191
+ 0.7
192
+ ]
193
+ ], "ể": [
194
+ ["eéèẻẽẹ", "êếềễệ"
195
+ ],
196
+ [
197
+ 0.3,
198
+ 0.7
199
+ ]
200
+ ], "ễ": [
201
+ ["eéèẻẽẹ", "êếềểệ"
202
+ ],
203
+ [
204
+ 0.3,
205
+ 0.7
206
+ ]
207
+ ], "ệ": [
208
+ ["eéèẻẽẹ", "êếềểễ"
209
+ ],
210
+ [
211
+ 0.3,
212
+ 0.7
213
+ ]
214
+ ], "í": [
215
+ ["iìỉĩị", "ýỳỷỹỵ"
216
+ ],
217
+ [
218
+ 0.7,
219
+ 0.3
220
+ ]
221
+ ], "ì": [
222
+ ["iíỉĩị", "ýỳỷỹỵ"
223
+ ],
224
+ [
225
+ 0.7,
226
+ 0.3
227
+ ]
228
+ ], "ỉ": [
229
+ ["iíìĩị", "ýỳỷỹỵ"
230
+ ],
231
+ [
232
+ 0.7,
233
+ 0.3
234
+ ]
235
+ ], "ĩ": [
236
+ ["iíìỉị", "ýỳỷỹỵ"
237
+ ],
238
+ [
239
+ 0.7,
240
+ 0.3
241
+ ]
242
+ ], "ị": [
243
+ ["iíìỉĩ", "ýỳỷỹỵ"
244
+ ],
245
+ [
246
+ 0.7,
247
+ 0.3
248
+ ]
249
+ ], "ó": [
250
+ ["oòỏọõ", "ôốồổỗộ", "ơớờởợỡ"
251
+ ],
252
+ [
253
+ 0.7,
254
+ 0.15,
255
+ 0.15
256
+ ]
257
+ ], "ò": [
258
+ ["oóỏọõ", "ôốồổỗộ", "ơớờởợỡ"
259
+ ],
260
+ [
261
+ 0.7,
262
+ 0.15,
263
+ 0.15
264
+ ]
265
+ ], "ỏ": [
266
+ ["oóòọõ", "ôốồổỗộ", "ơớờởợỡ"
267
+ ],
268
+ [
269
+ 0.7,
270
+ 0.15,
271
+ 0.15
272
+ ]
273
+ ], "õ": [
274
+ ["oóòỏọ", "ôốồổỗộ", "ơớờởợỡ"
275
+ ],
276
+ [
277
+ 0.7,
278
+ 0.15,
279
+ 0.15
280
+ ]
281
+ ], "ọ": [
282
+ ["oóòỏõ", "ôốồổỗộ", "ơớờởợỡ"
283
+ ],
284
+ [
285
+ 0.7,
286
+ 0.15,
287
+ 0.15
288
+ ]
289
+ ], "ô": [
290
+ ["oóòỏọõ", "ốồổỗộ", "ơớờởợỡ"
291
+ ],
292
+ [
293
+ 0.15,
294
+ 0.7,
295
+ 0.15
296
+ ]
297
+ ], "ố": [
298
+ ["oóòỏọõ", "ôồổỗộ", "ơớờởợỡ"
299
+ ],
300
+ [
301
+ 0.15,
302
+ 0.7,
303
+ 0.15
304
+ ]
305
+ ], "ồ": [
306
+ ["oóòỏọõ", "ôốổỗộ", "ơớờởợỡ"
307
+ ],
308
+ [
309
+ 0.15,
310
+ 0.7,
311
+ 0.15
312
+ ]
313
+ ], "ổ": [
314
+ ["oóòỏọõ", "ôốồỗộ", "ơớờởợỡ"
315
+ ],
316
+ [
317
+ 0.15,
318
+ 0.7,
319
+ 0.15
320
+ ]
321
+ ], "ộ": [
322
+ ["oóòỏọõ", "ôốồổỗ", "ơớờởợỡ"
323
+ ],
324
+ [
325
+ 0.15,
326
+ 0.7,
327
+ 0.15
328
+ ]
329
+ ], "ỗ": [
330
+ ["oóòỏọõ", "ôốồổộ", "ơớờởợỡ"
331
+ ],
332
+ [
333
+ 0.15,
334
+ 0.7,
335
+ 0.15
336
+ ]
337
+ ], "ơ": [
338
+ ["oóòỏọõ", "ôốồổỗộ", "ớờởợỡ"
339
+ ],
340
+ [
341
+ 0.15,
342
+ 0.15,
343
+ 0.7
344
+ ]
345
+ ], "ớ": [
346
+ ["oóòỏọõ", "ôốồổỗộ", "ơờởợỡ"
347
+ ],
348
+ [
349
+ 0.15,
350
+ 0.15,
351
+ 0.7
352
+ ]
353
+ ], "ờ": [
354
+ ["oóòỏọõ", "ôốồổỗộ", "ơớởợỡ"
355
+ ],
356
+ [
357
+ 0.15,
358
+ 0.15,
359
+ 0.7
360
+ ]
361
+ ], "ở": [
362
+ ["oóòỏọõ", "ôốồổỗộ", "ơớờợỡ"
363
+ ],
364
+ [
365
+ 0.15,
366
+ 0.15,
367
+ 0.7
368
+ ]
369
+ ], "ợ": [
370
+ ["oóòỏọõ", "ôốồổỗộ", "ơớờởỡ"
371
+ ],
372
+ [
373
+ 0.15,
374
+ 0.15,
375
+ 0.7
376
+ ]
377
+ ], "ỡ": [
378
+ ["oóòỏọõ", "ôốồổỗộ", "ơớờởợ"
379
+ ],
380
+ [
381
+ 0.15,
382
+ 0.15,
383
+ 0.7
384
+ ]
385
+ ], "ú": [
386
+ ["uùủũụ", "ưứừữửự"
387
+ ],
388
+ [
389
+ 0.7,
390
+ 0.3
391
+ ]
392
+ ], "ù": [
393
+ ["uúủũụ", "ưứừữửự"
394
+ ],
395
+ [
396
+ 0.7,
397
+ 0.3
398
+ ]
399
+ ], "ủ": [
400
+ ["uúùũụ", "ưứừữửự"
401
+ ],
402
+ [
403
+ 0.7,
404
+ 0.3
405
+ ]
406
+ ], "ũ": [
407
+ ["uúùủụ", "ưứừữửự"
408
+ ],
409
+ [
410
+ 0.7,
411
+ 0.3
412
+ ]
413
+ ], "ụ": [
414
+ ["uúùủũ", "ưứừữửự"
415
+ ],
416
+ [
417
+ 0.7,
418
+ 0.3
419
+ ]
420
+ ], "ư": [
421
+ ["uúùủũụ", "ứừữửự"
422
+ ],
423
+ [
424
+ 0.3,
425
+ 0.7
426
+ ]
427
+ ], "ứ": [
428
+ ["uúùủũụ", "ưừữửự"
429
+ ],
430
+ [
431
+ 0.3,
432
+ 0.7
433
+ ]
434
+ ], "ừ": [
435
+ ["uúùủũụ", "ưứữửự"
436
+ ],
437
+ [
438
+ 0.3,
439
+ 0.7
440
+ ]
441
+ ], "ử": [
442
+ ["uúùủũụ", "ưứừữự"
443
+ ],
444
+ [
445
+ 0.3,
446
+ 0.7
447
+ ]
448
+ ], "ữ": [
449
+ ["uúùủũụ", "ưứừửự"
450
+ ],
451
+ [
452
+ 0.3,
453
+ 0.7
454
+ ]
455
+ ], "ự": [
456
+ ["uúùủũụ", "ưứừữử"
457
+ ],
458
+ [
459
+ 0.3,
460
+ 0.7
461
+ ]
462
+ ], "ý": [
463
+ ["yỳỷỵỹ", "iíìỉĩị"
464
+ ],
465
+ [
466
+ 0.7,
467
+ 0.3
468
+ ]
469
+ ], "ỳ": [
470
+ ["yýỷỵỹ", "iíìỉĩị"
471
+ ],
472
+ [
473
+ 0.7,
474
+ 0.3
475
+ ]
476
+ ], "ỷ": [
477
+ ["yýỳỵỹ", "iíìỉĩị"
478
+ ],
479
+ [
480
+ 0.7,
481
+ 0.3
482
+ ]
483
+ ], "ỵ": [
484
+ ["yýỳỷỹ", "iíìỉĩị"
485
+ ],
486
+ [
487
+ 0.7,
488
+ 0.3
489
+ ]
490
+ ], "ỹ": [
491
+ ["yýỳỷỵ", "iíìỉĩị"
492
+ ],
493
+ [
494
+ 0.7,
495
+ 0.3
496
+ ]
497
+ ]
498
+ }
dataset/noising_resources/confusion_set.json ADDED
The diff for this file is too large to render. See raw diff
 
dataset/noising_resources/homo_leter.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"s": ["x"],
2
+ "x": ["s"],
3
+ "gi": ["d", "j"],
4
+ "d": ["gi", "z", "đ"],
5
+ "ch": ["tr", "c"],
6
+ "tr": ["ch", "t"],
7
+ "ng": ["n", "ngh"],
8
+ "n": ["ng", "nh", "l", "m"],
9
+ "nh": ["n", "ngh"],
10
+ "ngh": ["ng", "nh"],
11
+ "y": ["i"],
12
+ "i": ["y", "j"],
13
+ "l": ["n"],
14
+ "qu": ["w", "q"],
15
+ "w": ["qu"],
16
+ "ph": ["f"],
17
+ "f": ["ph"],
18
+ "th": ["t"],
19
+ "t": ["th", "c", "p", "tr"],
20
+ "z": ["d"],
21
+ "c": ["k", "t", "ch"],
22
+ "k": ["c"],
23
+ "q": ["qu"],
24
+ "j": ["i", "gi"],
25
+ "đ": ["d"],
26
+ "m": ["n"],
27
+ "p": ["t"]}
dataset/noising_resources/kieu_go_dau_cu_moi.txt ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ hóa hoá
2
+ hòa hoà
3
+ ủy uỷ
4
+ thủy thuỷ
5
+ khỏe khoẻ
6
+ tòa toà
7
+ khóa khoá
8
+ họa hoạ
9
+ túy tuý
10
+ thỏa thoả
11
+ hủy huỷ
12
+ thúy thuý
13
+ tùy tuỳ
14
+ tỏa toả
15
+ dọa doạ
16
+ hỏa hoả
17
+ xóa xoá
18
+ thùy thuỳ
19
+ thụy thuỵ
20
+ tọa toạ
21
+ úy uý
22
+ lũy luỹ
23
+ khỏa khoả
24
+ lụy luỵ
25
+ tụy tuỵ
26
+ tủy tuỷ
27
+ ngụy nguỵ
28
+ òa oà
29
+ đóa đoá
30
+ xòe xoè
31
+ hòe hoè
32
+ lòa loà
33
+ nhòa nhoà
34
+ khóe khoé
35
+ trụy truỵ
36
+ góa goá
37
+ tóe toé
38
+ xòa xoà
39
+ lóa loá
40
+ lòe loè
41
+ đọa đoạ
42
+ nhòe nhoè
43
+ lõa loã
44
+ lóe loé
45
+ nhụy nhuỵ
46
+ ngọa ngoạ
47
+ súy suý
48
+ xõa xoã
49
+ xúy xuý
50
+ quá qúa
51
+ chọe choẹ
52
+ quả qủa
53
+ chóe choé
54
+ thóa thoá
55
+ giá gía
56
+ chúy chuý
57
+ ọe oẹ
58
+ khụy khuỵ
59
+ nóe noé
60
+ họe hoẹ
61
+ húy huý
62
+ ngõa ngoã
63
+ chòe choè
64
+ dụy duỵ
65
+ chùy chuỳ
66
+ hùy huỳ
67
+ thõa thoã
68
+ khủy khuỷ
69
+ quí qúi
70
+ chóa choá
71
+ quà qùa
72
+ trủy truỷ
73
+ già gìa
74
+ tóa toá
75
+ lúy luý
76
+ giả gỉa
77
+ chõa choã
78
+ đòa đoà
dataset/noising_resources/typo.json ADDED
@@ -0,0 +1,650 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "ă": [
3
+ "aw",
4
+ "a8"
5
+ ],
6
+ "â": [
7
+ "aa",
8
+ "a6"
9
+ ],
10
+ "ấ": [
11
+ "aas",
12
+ "a61",
13
+ "âs",
14
+ "â1"
15
+ ],
16
+ "ầ": [
17
+ "aaf",
18
+ "a62",
19
+ "âf",
20
+ "â2"
21
+ ],
22
+ "ẩ": [
23
+ "aar",
24
+ "a63",
25
+ "âr",
26
+ "â3"
27
+ ],
28
+ "ẫ": [
29
+ "aax",
30
+ "a64",
31
+ "âx",
32
+ "â4"
33
+ ],
34
+ "ậ": [
35
+ "aaj",
36
+ "a65",
37
+ "âj",
38
+ "â5"
39
+ ],
40
+ "á": [
41
+ "as",
42
+ "a1"
43
+ ],
44
+ "à": [
45
+ "af",
46
+ "a2"
47
+ ],
48
+ "ả": [
49
+ "ar",
50
+ "a3"
51
+ ],
52
+ "ã": [
53
+ "ax",
54
+ "a4"
55
+ ],
56
+ "ạ": [
57
+ "aj",
58
+ "a5"
59
+ ],
60
+ "ắ": [
61
+ "aws",
62
+ "ăs",
63
+ "ă1",
64
+ "a81"
65
+ ],
66
+ "ổ": [
67
+ "oor",
68
+ "ô3",
69
+ "ôr",
70
+ "o63"
71
+ ],
72
+ "ỗ": [
73
+ "oox",
74
+ "ô4",
75
+ "ôx",
76
+ "o64"
77
+ ],
78
+ "ộ": [
79
+ "ooj",
80
+ "ô5",
81
+ "ôj",
82
+ "o65"
83
+ ],
84
+ "ơ": [
85
+ "ow",
86
+ "o7"
87
+ ],
88
+ "ằ": [
89
+ "awf",
90
+ "ă2",
91
+ "ăf",
92
+ "a82"
93
+ ],
94
+ "ẳ": [
95
+ "awr",
96
+ "ă3",
97
+ "ăr",
98
+ "a83"
99
+ ],
100
+ "ẵ": [
101
+ "awx",
102
+ "ă4",
103
+ "ăx",
104
+ "a84"
105
+ ],
106
+ "ặ": [
107
+ "awj",
108
+ "ă5",
109
+ "ăj",
110
+ "a85"
111
+ ],
112
+ "ó": [
113
+ "os",
114
+ "o1"
115
+ ],
116
+ "ò": [
117
+ "of",
118
+ "o2"
119
+ ],
120
+ "ỏ": [
121
+ "or",
122
+ "o3"
123
+ ],
124
+ "õ": [
125
+ "ox",
126
+ "o4"
127
+ ],
128
+ "ọ": [
129
+ "oj",
130
+ "o5"
131
+ ],
132
+ "ô": [
133
+ "oo",
134
+ "o6"
135
+ ],
136
+ "ố": [
137
+ "oos",
138
+ "ô1",
139
+ "ôs",
140
+ "o61"
141
+ ],
142
+ "ồ": [
143
+ "oof",
144
+ "ô2",
145
+ "ôf",
146
+ "o62"
147
+ ],
148
+ "ớ": [
149
+ "ows",
150
+ "ơ1",
151
+ "ơs",
152
+ "o71"
153
+ ],
154
+ "ờ": [
155
+ "owf",
156
+ "ơ2",
157
+ "ơf",
158
+ "o72"
159
+ ],
160
+ "ở": [
161
+ "owr",
162
+ "ơ3",
163
+ "ơr",
164
+ "o73"
165
+ ],
166
+ "ỡ": [
167
+ "owx",
168
+ "ơ4",
169
+ "ơx",
170
+ "o74"
171
+ ],
172
+ "ợ": [
173
+ "owj",
174
+ "ơ5",
175
+ "ơj",
176
+ "o75"
177
+ ],
178
+ "é": [
179
+ "es",
180
+ "e1"
181
+ ],
182
+ "è": [
183
+ "ef",
184
+ "e2"
185
+ ],
186
+ "ẻ": [
187
+ "er",
188
+ "e3"
189
+ ],
190
+ "ẽ": [
191
+ "ex",
192
+ "e4"
193
+ ],
194
+ "ẹ": [
195
+ "ej",
196
+ "e5"
197
+ ],
198
+ "ê": [
199
+ "ee",
200
+ "e6"
201
+ ],
202
+ "ế": [
203
+ "ees",
204
+ "ês",
205
+ "ê1",
206
+ "e61"
207
+ ],
208
+ "ề": [
209
+ "eef",
210
+ "ê2",
211
+ "e62",
212
+ "êf"
213
+ ],
214
+ "ể": [
215
+ "eer",
216
+ "ê3",
217
+ "êr",
218
+ "e63"
219
+ ],
220
+ "ễ": [
221
+ "eex",
222
+ "ê4",
223
+ "êx",
224
+ "e64"
225
+ ],
226
+ "ệ": [
227
+ "eej",
228
+ "ê5",
229
+ "êj",
230
+ "e65"
231
+ ],
232
+ "ú": [
233
+ "us",
234
+ "u1"
235
+ ],
236
+ "ù": [
237
+ "uf",
238
+ "u2"
239
+ ],
240
+ "ủ": [
241
+ "ur",
242
+ "u3"
243
+ ],
244
+ "ũ": [
245
+ "ux",
246
+ "u4"
247
+ ],
248
+ "ụ": [
249
+ "uj",
250
+ "u5"
251
+ ],
252
+ "ư": [
253
+ "uw",
254
+ "u7"
255
+ ],
256
+ "ứ": [
257
+ "uws",
258
+ "ư1",
259
+ "ưs",
260
+ "u71"
261
+ ],
262
+ "ừ": [
263
+ "uwf",
264
+ "ư2",
265
+ "ưf",
266
+ "u72"
267
+ ],
268
+ "ử": [
269
+ "uwr",
270
+ "ư3",
271
+ "ưr",
272
+ "u73"
273
+ ],
274
+ "ữ": [
275
+ "uwx",
276
+ "ư4",
277
+ "ưx",
278
+ "u74"
279
+ ],
280
+ "ự": [
281
+ "uwj",
282
+ "ư5",
283
+ "ưj",
284
+ "u75"
285
+ ],
286
+ "í": [
287
+ "is",
288
+ "i1"
289
+ ],
290
+ "ì": [
291
+ "if",
292
+ "i2"
293
+ ],
294
+ "ỉ": [
295
+ "ir",
296
+ "i3"
297
+ ],
298
+ "ị": [
299
+ "ij",
300
+ "i5"
301
+ ],
302
+ "ĩ": [
303
+ "ix",
304
+ "i4"
305
+ ],
306
+ "ý": [
307
+ "ys",
308
+ "y1"
309
+ ],
310
+ "ỳ": [
311
+ "yf",
312
+ "y2"
313
+ ],
314
+ "ỷ": [
315
+ "yr",
316
+ "y3"
317
+ ],
318
+ "ỵ": [
319
+ "yj",
320
+ "y5"
321
+ ],
322
+ "đ": [
323
+ "dd",
324
+ "d9"
325
+ ],
326
+ "Ă": [
327
+ "Aw",
328
+ "A8"
329
+ ],
330
+ "Â": [
331
+ "Aa",
332
+ "A6"
333
+ ],
334
+ "Ấ": [
335
+ "Aas",
336
+ "A61",
337
+ "Âs",
338
+ "Ă1"
339
+ ],
340
+ "Ầ": [
341
+ "Aaf",
342
+ "A62",
343
+ "Âf",
344
+ "Ă2"
345
+ ],
346
+ "Ẩ": [
347
+ "Aar",
348
+ "A63",
349
+ "Âr",
350
+ "Ă3"
351
+ ],
352
+ "Ẫ": [
353
+ "Aax",
354
+ "A64",
355
+ "Âx",
356
+ "Ă4"
357
+ ],
358
+ "Ậ": [
359
+ "Aaj",
360
+ "A65",
361
+ "Âj",
362
+ "Ă5"
363
+ ],
364
+ "Á": [
365
+ "As",
366
+ "A1"
367
+ ],
368
+ "À": [
369
+ "Af",
370
+ "A2"
371
+ ],
372
+ "Ả": [
373
+ "Ar",
374
+ "A3"
375
+ ],
376
+ "Ã": [
377
+ "Ax",
378
+ "A4"
379
+ ],
380
+ "Ạ": [
381
+ "Aj",
382
+ "A5"
383
+ ],
384
+ "Ắ": [
385
+ "Aws",
386
+ "Ă1",
387
+ "Ăs",
388
+ "A81"
389
+ ],
390
+ "Ổ": [
391
+ "Oor",
392
+ "Ô3",
393
+ "Ôr",
394
+ "O63"
395
+ ],
396
+ "Ỗ": [
397
+ "Oox",
398
+ "Ô4",
399
+ "Ôx",
400
+ "O64"
401
+ ],
402
+ "Ộ": [
403
+ "Ooj",
404
+ "Ô5",
405
+ "Ôj",
406
+ "O65"
407
+ ],
408
+ "Ơ": [
409
+ "Ow",
410
+ "O7"
411
+ ],
412
+ "Ằ": [
413
+ "Awf",
414
+ "Ă2",
415
+ "Ăf",
416
+ "A82"
417
+ ],
418
+ "Ẳ": [
419
+ "Awr",
420
+ "Ă3",
421
+ "Ăr",
422
+ "A83"
423
+ ],
424
+ "Ẵ": [
425
+ "Awx",
426
+ "Ă4",
427
+ "Ăx",
428
+ "A84"
429
+ ],
430
+ "Ặ": [
431
+ "Awj",
432
+ "Ă5",
433
+ "Ăj",
434
+ "A85"
435
+ ],
436
+ "Ó": [
437
+ "Os",
438
+ "O1"
439
+ ],
440
+ "Ò": [
441
+ "Of",
442
+ "O2"
443
+ ],
444
+ "Ỏ": [
445
+ "Or",
446
+ "O3"
447
+ ],
448
+ "Õ": [
449
+ "Ox",
450
+ "O4"
451
+ ],
452
+ "Ọ": [
453
+ "Oj",
454
+ "O5"
455
+ ],
456
+ "Ô": [
457
+ "Oo",
458
+ "O6"
459
+ ],
460
+ "Ố": [
461
+ "Oos",
462
+ "Ô1",
463
+ "Ôs",
464
+ "O61"
465
+ ],
466
+ "Ồ": [
467
+ "Oof",
468
+ "Ô2",
469
+ "Ôf",
470
+ "O62"
471
+ ],
472
+ "Ớ": [
473
+ "Ows",
474
+ "Ơ1",
475
+ "Ơs",
476
+ "O71"
477
+ ],
478
+ "Ờ": [
479
+ "Owf",
480
+ "Ơ2",
481
+ "Ơf",
482
+ "O72"
483
+ ],
484
+ "Ở": [
485
+ "Owr",
486
+ "Ơ3",
487
+ "Ơr",
488
+ "O73"
489
+ ],
490
+ "Ỡ": [
491
+ "Owx",
492
+ "Ơ4",
493
+ "Ơx",
494
+ "O74"
495
+ ],
496
+ "Ợ": [
497
+ "Owj",
498
+ "Ơ5",
499
+ "Ơj",
500
+ "O75"
501
+ ],
502
+ "É": [
503
+ "Es",
504
+ "E1"
505
+ ],
506
+ "È": [
507
+ "Ef",
508
+ "E2"
509
+ ],
510
+ "Ẻ": [
511
+ "Er",
512
+ "E3"
513
+ ],
514
+ "Ẽ": [
515
+ "Ex",
516
+ "E4"
517
+ ],
518
+ "Ẹ": [
519
+ "Ej",
520
+ "E5"
521
+ ],
522
+ "Ê": [
523
+ "Ee",
524
+ "E6"
525
+ ],
526
+ "Ế": [
527
+ "Ees",
528
+ "Ê1",
529
+ "Ês",
530
+ "E61"
531
+ ],
532
+ "Ề": [
533
+ "Eef",
534
+ "Ê2",
535
+ "Êf",
536
+ "E62"
537
+ ],
538
+ "Ể": [
539
+ "Eer",
540
+ "Ê3",
541
+ "Êr",
542
+ "E63"
543
+ ],
544
+ "Ễ": [
545
+ "Eex",
546
+ "Ê4",
547
+ "Êx",
548
+ "E64"
549
+ ],
550
+ "Ệ": [
551
+ "Eej",
552
+ "Ê5",
553
+ "Êj",
554
+ "E65"
555
+ ],
556
+ "Ú": [
557
+ "Us",
558
+ "U1"
559
+ ],
560
+ "Ù": [
561
+ "Uf",
562
+ "U2"
563
+ ],
564
+ "Ủ": [
565
+ "Ur",
566
+ "U3"
567
+ ],
568
+ "Ũ": [
569
+ "Ux",
570
+ "U4"
571
+ ],
572
+ "Ụ": [
573
+ "Uj",
574
+ "U5"
575
+ ],
576
+ "Ư": [
577
+ "Uw",
578
+ "U7"
579
+ ],
580
+ "Ứ": [
581
+ "Uws",
582
+ "Ư1",
583
+ "Ưs",
584
+ "U71"
585
+ ],
586
+ "Ừ": [
587
+ "Uwf",
588
+ "Ư2",
589
+ "Ưf",
590
+ "U72"
591
+ ],
592
+ "Ử": [
593
+ "Uwr",
594
+ "Ư3",
595
+ "Ưr",
596
+ "U73"
597
+ ],
598
+ "Ữ": [
599
+ "Uwx",
600
+ "Ư4",
601
+ "Ưx",
602
+ "U74"
603
+ ],
604
+ "Ự": [
605
+ "Uwj",
606
+ "Ư5",
607
+ "Ưj",
608
+ "U75"
609
+ ],
610
+ "Í": [
611
+ "Is",
612
+ "I1"
613
+ ],
614
+ "Ì": [
615
+ "If",
616
+ "I2"
617
+ ],
618
+ "Ỉ": [
619
+ "Ir",
620
+ "I3"
621
+ ],
622
+ "Ị": [
623
+ "Ij",
624
+ "I5"
625
+ ],
626
+ "Ĩ": [
627
+ "Ix",
628
+ "I4"
629
+ ],
630
+ "Ý": [
631
+ "Ys",
632
+ "Y1"
633
+ ],
634
+ "Ỳ": [
635
+ "Yf",
636
+ "Y2"
637
+ ],
638
+ "Ỷ": [
639
+ "Yr",
640
+ "Y3"
641
+ ],
642
+ "Ỵ": [
643
+ "Yj",
644
+ "Y5"
645
+ ],
646
+ "Đ": [
647
+ "Dd",
648
+ "D9"
649
+ ]
650
+ }
dataset/prepare_dataset.py ADDED
@@ -0,0 +1,310 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from vocab import Vocab
2
+ from noise import SynthesizeData
3
+ import os
4
+ import sys
5
+ import ray
6
+ import re
7
+ import time
8
+ from datetime import datetime as dt
9
+ sys.path.append("..")
10
+ import numpy as np
11
+ from params import PERCENT_NOISE, NUM_CPUS, NUM_PROCESSES
12
+ from utils.logger import get_logger
13
+ from viet_text_tools import normalize_diacritics
14
+
15
+ from transformers import AutoTokenizer
16
+ CHAR_TRANSFORMER_MAX_SEQ_LEN = 512
17
+ tokenizer = AutoTokenizer.from_pretrained("vinai/bartpho-word-base", use_fast=False)
18
+ logger = get_logger("./log/prepare_data.log")
19
+
20
+ @ray.remote
21
+ class PrepareActor(object):
22
+ def __init__(self, id, lang, data_root='../data', corpus="binhbq") -> None:
23
+ self.data_root, self.lang, self.corpus = data_root, lang, corpus
24
+ self.id = id
25
+ self.data_dir = f'{data_root}/{corpus}'
26
+
27
+ def open_files(self):
28
+ self.train_noise_file_name = f'{self.corpus}.train.noise' + str(self.id)
29
+ self.train_file_name = f'{self.corpus}.train' + str(self.id)
30
+ self.train_onehot_file_name = f'{self.corpus}.onehot.train' + str(self.id)
31
+ self.train_length_file_name = f'{self.corpus}.length.train' + str(self.id)
32
+ self.train_file_path = self.data_dir + '/' + self.train_file_name
33
+ self.train_noise_file_path = self.data_dir + '/' + self.train_noise_file_name
34
+ self.train_onehot_file_path = self.data_dir + '/' + self.train_onehot_file_name
35
+ self.train_length_file_path = self.data_dir + '/' + self.train_length_file_name
36
+ self.train_file = open(self.train_file_path, 'w', encoding='utf-8')
37
+ self.train_noise_file = open(self.train_noise_file_path, 'w', encoding='utf-8')
38
+ self.train_onehot_file = open(self.train_onehot_file_path, 'w', encoding='utf-8')
39
+ self.train_length_file = open(self.train_length_file_path, 'w', encoding='utf-8')
40
+
41
+ self.valid_file_name = f'{self.corpus}.valid' + str(self.id)
42
+ self.valid_noise_file_name = f'{self.corpus}.valid.noise' + str(self.id)
43
+ self.valid_onehot_file_name = f'{self.corpus}.onehot.valid' + str(self.id)
44
+ self.valid_length_file_name = f'{self.corpus}.length.valid' + str(self.id)
45
+ self.valid_file_path = self.data_dir + '/' + self.valid_file_name
46
+ self.valid_noise_file_path = self.data_dir + '/' + self.valid_noise_file_name
47
+ self.valid_onehot_file_path = self.data_dir + '/' + self.valid_onehot_file_name
48
+ self.valid_length_file_path = self.data_dir + '/' + self.valid_length_file_name
49
+ self.valid_file = open(self.valid_file_path, 'w', encoding='utf-8')
50
+ self.valid_noise_file = open(self.valid_noise_file_path, 'w', encoding='utf-8')
51
+ self.valid_onehot_file = open(self.valid_onehot_file_path, 'w', encoding='utf-8')
52
+ self.valid_length_file = open(self.valid_length_file_path, 'w', encoding='utf-8')
53
+
54
+ self.test_file_name = f'{self.corpus}.test' + str(self.id)
55
+ self.test_noise_file_name = f'{self.corpus}.test.noise' + str(self.id)
56
+ self.test_onehot_file_name = f'{self.corpus}.onehot.test' + str(self.id)
57
+ self.test_length_file_name = f'{self.corpus}.length.test' + str(self.id)
58
+ self.test_file_path = self.data_dir + '/' + self.test_file_name
59
+ self.test_noise_file_path = self.data_dir + '/' + self.test_noise_file_name
60
+ self.test_onehot_file_path = self.data_dir + '/' + self.test_onehot_file_name
61
+ self.test_length_file_path = self.data_dir + '/' + self.test_length_file_name
62
+ self.test_file = open(self.test_file_path, 'w', encoding='utf-8')
63
+ self.test_noise_file = open(self.test_noise_file_path, 'w', encoding='utf-8')
64
+ self.test_onehot_file = open(self.test_onehot_file_path, 'w', encoding='utf-8')
65
+ self.test_length_file = open(self.test_length_file_path, 'w', encoding='utf-8')
66
+
67
+ def close_files(self):
68
+ if self.train_noise_file:
69
+ self.train_noise_file.close()
70
+ if self.train_onehot_file:
71
+ self.train_onehot_file.close()
72
+ if self.train_length_file:
73
+ self.train_length_file.close()
74
+ if self.train_file:
75
+ self.train_file.close()
76
+
77
+ if self.test_noise_file:
78
+ self.test_noise_file.close()
79
+ if self.test_onehot_file:
80
+ self.test_onehot_file.close()
81
+ if self.test_length_file:
82
+ self.test_length_file.close()
83
+ if self.test_file:
84
+ self.test_file.close()
85
+
86
+ if self.valid_noise_file:
87
+ self.valid_noise_file.close()
88
+ if self.valid_onehot_file:
89
+ self.valid_onehot_file.close()
90
+ if self.valid_length_file:
91
+ self.valid_length_file.close()
92
+ if self.valid_file:
93
+ self.valid_file.close()
94
+
95
+
96
+
97
+
98
+ def prepare_subword_sents_and_vocab(self, lines: ray.data.Dataset):
99
+
100
+ vocab = Vocab(self.lang)
101
+ self.subword_sents = []
102
+
103
+ print(f"{dt.now()} PrepareActor[{self.id}].prepare_sublist_and_vocab() BEGIN...")
104
+
105
+ for line in lines.iter_rows():
106
+ line = line.strip("\n")
107
+ words = line.split(" ")
108
+ ###
109
+ if len(words) > 150:
110
+ splited_lines = re.split("[.;]+", line)
111
+ for splited_line in splited_lines:
112
+ words = splited_line.split(" ")
113
+ if len(words) < 10 or len(words) > 150:
114
+ continue
115
+ words = [normalize_diacritics(word) for word in words]
116
+ vocab.update_subword_freq(words)
117
+ splited_line = " ".join(words)
118
+ self.subword_sents.append(splited_line)
119
+ continue
120
+ ###
121
+ if len(words) < 10:
122
+ continue
123
+ words = [normalize_diacritics(word) for word in words]
124
+ line = " ".join(words)
125
+ vocab.update_subword_freq(words)
126
+ self.subword_sents.append(line)
127
+
128
+ print(f"{dt.now()} PrepareActor[{self.id}].prepare_sublist_and_vocab() COMPLETED...")
129
+
130
+ return vocab
131
+
132
+
133
+ def gen_noised_and_onehot(self, noiser:SynthesizeData = None):
134
+ print(f"{dt.now()} PrepareActor[{self.id}].gen_training_data() BEGIN...")
135
+ self.open_files()
136
+ logger = get_logger(f"log/prepare_data_worker{self.id}.log")
137
+ assert noiser != None
138
+
139
+ self.noiser = noiser
140
+ np.random.seed(2001)
141
+ np.random.shuffle(self.subword_sents)
142
+
143
+ train_examples = 0
144
+ #### Train 0.89 Valid 0.01 Test 0.10
145
+ max_train_examples = int(0.89 * len(self.subword_sents))
146
+ max_valid_examples = int(0.90 * len(self.subword_sents))
147
+
148
+ for line in self.subword_sents:
149
+ train_examples += 1
150
+
151
+ if train_examples < max_train_examples:
152
+ data_for = "train"
153
+ elif train_examples < max_valid_examples:
154
+ data_for = "valid"
155
+ else:
156
+ data_for = "test"
157
+
158
+
159
+ if len(line) > (CHAR_TRANSFORMER_MAX_SEQ_LEN - 2):
160
+ continue
161
+
162
+ normal_noise, normal_onehot = self.noiser.add_normal_noise(
163
+ line, percent_err=PERCENT_NOISE)
164
+
165
+ split_merge_noise, split_merge_onehot = self.noiser.add_split_merge_noise(
166
+ line, percent_err=PERCENT_NOISE, percent_normal_err=PERCENT_NOISE)
167
+
168
+ la = len(normal_noise)
169
+ lb = len(split_merge_noise)
170
+
171
+ if la > (CHAR_TRANSFORMER_MAX_SEQ_LEN - 2):
172
+ logger.log(f"INFO: Noised longer than Transformer's max limit (NORMAL NOISE).")
173
+ logger.log(f"TEXT: {normal_noise}")
174
+ continue
175
+
176
+ if lb > (CHAR_TRANSFORMER_MAX_SEQ_LEN - 2):
177
+ logger.log(f"INFO: Noised longer than Transformer's max limit (SPLIT MERGE NOISE).")
178
+ logger.log(f"TEXT: {split_merge_noise}")
179
+ continue
180
+
181
+ if data_for == "train":
182
+ self.train_noise_file.write(normal_noise + '\n')
183
+ self.train_noise_file.write(split_merge_noise + '\n')
184
+ self.train_onehot_file.write(normal_onehot + '\n')
185
+ self.train_onehot_file.write(split_merge_onehot + '\n')
186
+ self.train_file.write(line + "\n")
187
+ self.train_length_file.write(str(la) + "\n")
188
+ self.train_length_file.write(str(lb) + "\n")
189
+ elif data_for == "test":
190
+ self.test_noise_file.write(normal_noise + '\n')
191
+ self.test_noise_file.write(split_merge_noise + '\n')
192
+ self.test_onehot_file.write(normal_onehot + '\n')
193
+ self.test_onehot_file.write(split_merge_onehot + '\n')
194
+ self.test_file.write(line + "\n")
195
+ self.test_length_file.write(str(la) + "\n")
196
+ self.test_length_file.write(str(lb) + "\n")
197
+ else:
198
+ self.valid_noise_file.write(normal_noise + '\n')
199
+ self.valid_noise_file.write(split_merge_noise + '\n')
200
+ self.valid_onehot_file.write(normal_onehot + '\n')
201
+ self.valid_onehot_file.write(split_merge_onehot + '\n')
202
+ self.valid_file.write(line + "\n")
203
+ self.valid_length_file.write(str(la) + "\n")
204
+ self.valid_length_file.write(str(lb) + "\n")
205
+
206
+ print(f"{dt.now()} PrepareActor[{self.id}].gen_training_data() COMPLETED...")
207
+ self.close_files()
208
+
209
+
210
+ class PrepareDataset:
211
+
212
+ def __init__(self, data_root='../data', lang='vi', corpus='binhvq'):
213
+ self.data_root, self.lang, self.corpus = data_root, lang, corpus
214
+ self.data_dir = f'{data_root}/{corpus}'
215
+
216
+ self.vocab = Vocab(self.lang)
217
+
218
+ # Number of CPUS
219
+ self.MAX_CPUS = 12
220
+ self.NUM_CPUS = NUM_CPUS if NUM_CPUS < self.MAX_CPUS else self.MAX_CPUS
221
+
222
+ ray.init(num_cpus=NUM_CPUS)
223
+
224
+ print(f"{dt.now()} PrepareDataset: Initiating {NUM_PROCESSES} PrepareActor")
225
+ self.actors = [PrepareActor.remote(i, lang, self.data_root, self.corpus) for i in range(NUM_PROCESSES)]
226
+
227
+ self.vocab_pickle_name = f'{self.corpus}.vocab.pkl'
228
+ self.vocab_pickle_path = self.data_dir + '/' + self.vocab_pickle_name
229
+ self.vocab_dict_name = f'{self.corpus}.dict.txt'
230
+ self.vocab_dict_path = self.data_dir + '/' + self.vocab_dict_name
231
+
232
+ def build_vocab_and_subwords(self, ray_ds: ray.data.Dataset):
233
+
234
+ print(f"{dt.now()} PrepareDataset.build_vocab_and_subwords()")
235
+
236
+ shards = ray_ds.split(n = NUM_PROCESSES)
237
+
238
+ subword_and_vocab_refs = [actor.prepare_subword_sents_and_vocab.remote(
239
+ shard) for actor, shard in zip(self.actors, shards)]
240
+ subwords_and_vocabs = ray.get(subword_and_vocab_refs)
241
+ # Return results is vocab
242
+
243
+ for i in range(NUM_PROCESSES):
244
+ self.vocab.merge_sub_vocabs(subwords_and_vocabs[i])
245
+
246
+
247
+ def build_noised_and_onehot(self):
248
+
249
+ print(f"{dt.now()} PrepareDataset.build_noised_and_onehot.remote() BEGIN...")
250
+
251
+ noiser = SynthesizeData(self.vocab)
252
+
253
+ noised_and_onehot_refs = [actor.gen_noised_and_onehot.remote(noiser) \
254
+ for actor in self.actors]
255
+
256
+ _ = ray.get(noised_and_onehot_refs)
257
+
258
+ print(f"{dt.now()} PrepareDataset.build_noised_and_onehot.remote() COMPLETE !!!")
259
+
260
+ print(f"{dt.now()} PrepareDataset.build_noised_and_onehot(): Writing to noised and onehot files!!!")
261
+
262
+
263
+ def prepare_data(self, in_file_name='vi_wiki.data.txt'):
264
+
265
+ print(f"{dt.now()} PrepareDataset.prepare_data(): open_files()")
266
+
267
+ self.in_file_path = self.data_dir + '/' + in_file_name
268
+
269
+ if not os.path.exists(self.in_file_path):
270
+ print(f"{dt.now()} PrepareDataset.prepare_data(): Cannot find input file!!!")
271
+ print(f'File path: {self.in_file_path}')
272
+ return
273
+
274
+ print(f"{dt.now()} PrepareDataset.prepare_data(): Processing file part by part ...")
275
+
276
+ with open(self.in_file_path, 'r', encoding='utf-8') as ifile:
277
+ lines = ifile.readlines()
278
+
279
+ ray_ds = ray.data.from_items(lines)
280
+ del lines
281
+ print(f"{dt.now()} PrepareDataset.prepare_data(): Building Vocabulary...")
282
+ self.build_vocab_and_subwords(ray_ds)
283
+ self.vocab.build_vocab(topk=100000)
284
+ print(f"{dt.now()} PrepareDataset.prepare_data(): Writing Vocabulary to text file...")
285
+ self.vocab.save_dict_text(self.vocab_dict_path)
286
+ print(f"{dt.now()} PrepareDataset.prepare_data(): Writing Vocabulary to pickle file...")
287
+ self.vocab.save_vocab_dict(self.vocab_pickle_path)
288
+ print(f"{dt.now()} PrepareDataset.prepare_data(): Gen train noised and onehot...")
289
+ self.build_noised_and_onehot()
290
+ print(f"{dt.now()} PrepareDataset - Complete preparing dataset!!!")
291
+
292
+
293
+ if __name__ == "__main__":
294
+ import argparse
295
+ description = '''
296
+ prepare_dataset.py:
297
+
298
+ Usage: python prepare_dataset.py --dataset vi_wiki --file vi_wiki.data.txt --test False
299
+
300
+ '''
301
+ parser = argparse.ArgumentParser(description=description)
302
+ parser.add_argument('--file', type=str, default='corpus-small.txt')
303
+ parser.add_argument('--corpus', type=str, default='binhvq')
304
+ parser.add_argument('--data_root', type=str, default="../data")
305
+ args = parser.parse_args()
306
+ creater = PrepareDataset(data_root = args.data_root, corpus=args.corpus)
307
+ start_time = time.time()
308
+ creater.prepare_data(args.file)
309
+ end_time = time.time()
310
+ print(f"Time consumed for generate data: {end_time - start_time}")
dataset/prepare_vsec.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from tqdm import tqdm
3
+ import sys
4
+ from viet_text_tools import normalize_diacritics
5
+ sys.path.append("..")
6
+ from utils.logger import get_logger
7
+ import re
8
+ vsec_path = "../data/vsec/VSEC.jsonl"
9
+ test_file = open("../data/vsec/vsec.test", "w+")
10
+ test_noise_file = open("../data/vsec/vsec.test.noise", "w+")
11
+
12
+ with open(vsec_path, "r") as file:
13
+ data = [json.loads(x[0:-1]) for x in file.readlines()]
14
+
15
+ def get_true_text(sentence: dict):
16
+ true_tokens = []
17
+ for word in sentence['annotations']:
18
+ if word['is_correct'] == True:
19
+ true_tokens.append(word['current_syllable'])
20
+ else:
21
+ true_tokens.append(word['alternative_syllables'][0])
22
+ true_sentence = " ".join(true_tokens)
23
+ words = re.findall("\w+|[^\w\s]{1}", true_sentence)
24
+ return " ".join(words)
25
+
26
+ def get_noise_text(sentence: dict):
27
+ noised_tokens = []
28
+ for word in sentence['annotations']:
29
+ noised_tokens.append(word['current_syllable'])
30
+ noised_sentence = " ".join(noised_tokens)
31
+ words = re.findall("\w+|[^\w\s]{1}", noised_sentence)
32
+ noised_tokens = []
33
+ for word in words:
34
+ new_word = normalize_diacritics(word)
35
+ noised_tokens.append(new_word)
36
+ return " ".join(noised_tokens)
37
+
38
+ for sentence in tqdm(data):
39
+ true_text = get_true_text(sentence)
40
+ noised_text = get_noise_text(sentence)
41
+
42
+ test_file.write(true_text + "\n")
43
+ test_noise_file.write(noised_text + "\n")
44
+
45
+ test_file.close()
46
+ test_noise_file.close()
dataset/util.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import numpy as np
3
+ from tqdm import tqdm
4
+ from math import ceil
5
+
6
+ def load_vsec_dataset(base_path, corr_file, incorr_file):
7
+ # load files
8
+ if base_path:
9
+ assert os.path.exists(base_path) == True
10
+ incorr_data = []
11
+ opfile1 = open(os.path.join(base_path, incorr_file), "r", encoding="utf-8")
12
+ for line in opfile1:
13
+ if line.strip() != "":
14
+ incorr_data.append(line.strip())
15
+ opfile1.close()
16
+ corr_data = []
17
+ opfile2 = open(os.path.join(base_path, corr_file), "r", encoding="utf-8")
18
+ for line in opfile2:
19
+ if line.strip() != "":
20
+ corr_data.append(line.strip())
21
+ opfile2.close()
22
+
23
+ assert len(incorr_data) == len(corr_data)
24
+
25
+ data = []
26
+ for x, y in zip(corr_data, incorr_data):
27
+ data.append((x, y))
28
+
29
+ print(f"loaded tuples of (incorr, corr) examples from {base_path}")
30
+ return data
31
+
32
+ def load_dataset(base_path, corr_file, incorr_file, length_file = None):
33
+ # load files
34
+ if base_path:
35
+ assert os.path.exists(base_path) == True
36
+
37
+ data = []
38
+ opfile2 = open(os.path.join(base_path, corr_file), "r", encoding="utf-8")
39
+ for line in tqdm(opfile2):
40
+ if line.strip() != "":
41
+ data.append([line.strip()])
42
+ data.append([line.strip()])
43
+ opfile2.close()
44
+
45
+ opfile1 = open(os.path.join(base_path, incorr_file), "r", encoding="utf-8")
46
+ for i, line in tqdm(enumerate(opfile1)):
47
+ if line.strip() != "":
48
+ data[i].append(line.strip())
49
+ opfile1.close()
50
+
51
+ opfile4 = open(os.path.join(base_path, length_file), "r", encoding="utf-8")
52
+ for i, line in tqdm(enumerate(opfile4)):
53
+ if line.strip() != "":
54
+ data[i].append(int(line))
55
+ opfile4.close()
56
+
57
+ print(f"loaded tuples of (incorr, corr, length) examples from {base_path}")
58
+ return data
59
+
60
+ def load_epoch_dataset(base_path, corr_file, incorr_file, length_file, epoch: int, num_epoch: int):
61
+ # load files
62
+ if base_path:
63
+ assert os.path.exists(base_path) == True
64
+ assert num_epoch >= 1
65
+ assert epoch >= 1 and epoch <= num_epoch
66
+
67
+ ## Count number of data
68
+ opfile = open(os.path.join(base_path, length_file), "r", encoding="utf-8")
69
+ count = 0
70
+ for i, line in tqdm(enumerate(opfile)):
71
+ count +=1
72
+ opfile.close()
73
+ print(f"Number of training datas: {count} examples!")
74
+
75
+ epochdataset_examples = int(ceil(1 / num_epoch * count))
76
+ start_index = epochdataset_examples * (epoch - 1)
77
+ end_index = start_index + epochdataset_examples
78
+
79
+ data = []
80
+ opfile2 = open(os.path.join(base_path, corr_file), "r", encoding="utf-8")
81
+ traverse_count = 0
82
+ for i, line in tqdm(enumerate(opfile2)):
83
+
84
+ if line.strip() != "":
85
+ if traverse_count >= start_index and traverse_count < end_index :
86
+ data.append([line.strip()])
87
+ traverse_count += 1
88
+ elif traverse_count >= end_index:
89
+ break
90
+ else:
91
+ traverse_count += 1
92
+
93
+ if traverse_count >= start_index and traverse_count < end_index :
94
+ data.append([line.strip()])
95
+ traverse_count += 1
96
+ elif traverse_count >= end_index:
97
+ break
98
+ else:
99
+ traverse_count += 1
100
+
101
+ opfile2.close()
102
+ opfile1 = open(os.path.join(base_path, incorr_file), "r", encoding="utf-8")
103
+ traverse_count = 0
104
+ for i, line in tqdm(enumerate(opfile1)):
105
+ if line.strip() != "":
106
+ if traverse_count >= start_index and traverse_count < end_index :
107
+ data[i - start_index].append(line.strip())
108
+ elif traverse_count >= end_index:
109
+ break
110
+ traverse_count += 1
111
+ opfile1.close()
112
+ traverse_count = 0
113
+ opfile4 = open(os.path.join(base_path, length_file), "r", encoding="utf-8")
114
+ for i, line in tqdm(enumerate(opfile4)):
115
+ if line.strip() != "":
116
+ if traverse_count >= start_index and traverse_count < end_index :
117
+ data[i - start_index].append(int(line))
118
+ elif traverse_count >= end_index:
119
+ break
120
+ traverse_count += 1
121
+ opfile4.close()
122
+
123
+ print(f"loaded tuples of (incorr, corr, length) examples from {base_path}")
124
+ return data
125
+
126
+
127
+
128
+
dataset/vocab.py ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+ import pickle
3
+ import re
4
+ import os
5
+ import sys
6
+
7
+
8
+ sys.path.append("..")
9
+
10
+ from params import *
11
+
12
+ class Vocab():
13
+ def __init__(self, lang='vi'):
14
+ self.not_alphabet_regex = '''[^aAàÀảẢãÃáÁạẠăĂằẰẳẲẵẴắẮặẶâÂầẦẩẨẫẪấẤậẬbBcCdDđĐeEèÈẻẺẽẼéÉẹẸêÊềỀểỂễỄếẾệỆfFgGhHiIìÌỉỈĩĨíÍịỊjJkKlLmMnNoOòÒỏỎõÕóÓọỌôÔồỒổỔỗỖốỐộỘơƠờỜởỞỡỠớỚợỢpPqQrRsStTuUùÙủỦũŨúÚụỤưƯừỪửỬữỮứỨựỰvVwWxXyYỳỲỷỶỹỸýÝỵỴzZ0123456789!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ ]'''
15
+ self.lang = lang
16
+ self.token_freq_list = []
17
+ self.token_freq, self.token2idx, self.idx2token = {}, {}, {}
18
+ self.pad_token = "<<PAD>>"
19
+ self.unk_token = "<<UNK>>"
20
+ self.sub_token = "<<SUB>>"
21
+ self.eos_token = "<<EOS>>"
22
+
23
+ self.chartoken2idx, self.idx2chartoken = {}, {}
24
+ self.char_unk_token, self.char_pad_token, self.char_start_token, self.char_end_token = \
25
+ "<<CHAR_UNK>>", "<<CHAR_PAD>>", "<<CHAR_START>>", "<<CHAR_END>>"
26
+ self.char_space_token = "<<CHAR_SPACE>>"
27
+
28
+ def set_lang(self, lang):
29
+ self.lang = lang
30
+
31
+ def exist(self, word):
32
+
33
+ return word in self.token2idx
34
+
35
+ def update_subword_freq(self, subwords: list):
36
+ for subword in subwords:
37
+ if not subword.isdigit():
38
+ if re.search(self.not_alphabet_regex, subword):
39
+ continue
40
+ if subword not in self.token_freq:
41
+ self.token_freq[subword] = 0
42
+ self.token_freq[subword] += 1
43
+
44
+ def merge_sub_vocabs(self, vocab: Vocab):
45
+ for subword in vocab.token_freq:
46
+ if subword not in self.token_freq:
47
+ self.token_freq[subword] = 0
48
+ self.token_freq[subword] += vocab.token_freq[subword]
49
+
50
+ def insert_special_tokens(self):
51
+ # add <<PAD>> special token
52
+ self.pad_token_idx = len(self.token2idx)
53
+ self.token2idx[self.pad_token] = self.pad_token_idx
54
+ self.idx2token[self.pad_token_idx] = self.pad_token
55
+
56
+ # add <<SUB>> special token
57
+ self.sub_token_idx = len(self.token2idx)
58
+ self.token2idx[self.sub_token] = self.sub_token_idx
59
+ self.idx2token[self.sub_token_idx] = self.sub_token
60
+
61
+ # add <<UNK>> special token
62
+ self.unk_token_idx = len(self.token2idx)
63
+ self.token2idx[self.unk_token] = self.unk_token_idx
64
+ self.idx2token[self.unk_token_idx] = self.unk_token
65
+
66
+ # add <<EOS>> special token
67
+ self.eos_token_idx = len(self.token2idx)
68
+ self.token2idx[self.eos_token] = self.eos_token_idx
69
+ self.idx2token[self.eos_token_idx] = self.eos_token
70
+
71
+ def insert_dicts(self, build_char_vocab=True):
72
+
73
+ for (token, _) in self.token_freq_list:
74
+ idx = len(self.token2idx)
75
+ self.idx2token[idx] = token
76
+ self.token2idx[token] = idx
77
+
78
+ self.insert_special_tokens()
79
+
80
+
81
+ print(f"Total Vocab's size: {len(self.token2idx)}")
82
+
83
+ self.vocab_dict = {"token2idx": self.token2idx,
84
+ "idx2token": self.idx2token}
85
+
86
+ # load_char_tokens
87
+ if build_char_vocab:
88
+ print("loading character tokens")
89
+ self.get_char_tokens()
90
+
91
+ def build_vocab(self, topk=100000, build_char_vocab=True):
92
+ # retain only topk tokens
93
+ if topk is not None:
94
+ sorted_ = sorted(self.token_freq.items(),
95
+ key=lambda item: item[1], reverse=True)
96
+
97
+ self.token_freq_list = sorted_[:topk]
98
+
99
+ print(f"Total tokens retained: {len(self.token_freq_list)}")
100
+
101
+ self.insert_dicts(build_char_vocab)
102
+
103
+ def build_vocab_from_text(self, path_: str, build_char_vocab=True):
104
+ if not os.path.exists(path_):
105
+ print(f"Vocab: Cannot find dict file: {path_}")
106
+ else:
107
+ print("Building vocab from vocab dict file!")
108
+ with open(path_, 'r') as dict_file:
109
+ for line in dict_file:
110
+ token_freq = line.split()
111
+ if token_freq[0] not in [self.pad_token, self.sub_token, self.unk_token, self.eos_token]:
112
+ try:
113
+ self.token_freq_list.append((token_freq[0], token_freq[1]))
114
+ except:
115
+ print(line)
116
+
117
+ self.insert_dicts(build_char_vocab)
118
+
119
+ def load_vocab_dict(self, path_: str):
120
+ """
121
+ path_: path where the vocab pickle file is saved
122
+ """
123
+ with open(path_, 'rb') as fp:
124
+ self.vocab_dict = pickle.load(fp)
125
+ self.token2idx = self.vocab_dict['token2idx']
126
+ self.idx2token = self.vocab_dict['idx2token']
127
+
128
+ self.chartoken2idx = self.vocab_dict['chartoken2idx']
129
+
130
+ self.idx2chartoken = self.vocab_dict['idx2chartoken']
131
+
132
+ self.pad_token_idx = self.token2idx[self.pad_token]
133
+ self.sub_token_idx = self.token2idx[self.sub_token]
134
+ self.unk_token_idx = self.token2idx[self.unk_token]
135
+
136
+ self.char_unk_token_idx = self.chartoken2idx[self.char_unk_token]
137
+
138
+ def save_vocab_dict(self, path_: str):
139
+ """
140
+ path_: path where the vocab pickle file to be saved
141
+ vocab_: the dict data
142
+ """
143
+ with open(path_, 'wb') as fp:
144
+ pickle.dump(self.vocab_dict, fp, protocol=pickle.HIGHEST_PROTOCOL)
145
+
146
+ return
147
+
148
+ def save_dict_text(self, path_):
149
+
150
+ with open(path_, 'w', encoding='utf-8') as ofile:
151
+ print("len(self.token_freq_list): ", len(self.token_freq_list))
152
+ for (subword, fre) in self.token_freq_list:
153
+ ofile.write(f'{subword} {fre}\n')
154
+
155
+ ofile.write(f'{self.pad_token} -1\n')
156
+ ofile.write(f'{self.sub_token} -1\n')
157
+ ofile.write(f'{self.unk_token} -1\n')
158
+ ofile.write(f'{self.eos_token} -1\n')
159
+
160
+ def get_char_tokens(self):
161
+ special_tokens = [self.char_pad_token, self.char_start_token,
162
+ self.char_end_token, self.char_unk_token,
163
+ self.char_space_token]
164
+
165
+ for char in special_tokens:
166
+ idx = len(self.chartoken2idx)
167
+ self.chartoken2idx[char] = idx
168
+ self.idx2chartoken[idx] = char
169
+
170
+ if self.lang == 'vi':
171
+ chars = list(
172
+ '''aAàÀảẢãÃáÁạẠăĂằẰẳẲẵẴắẮặẶâÂầẦẩẨẫẪấẤậẬbBcCdDđĐeEèÈẻẺẽẼéÉẹẸêÊềỀểỂễỄếẾệỆfFgGhHiIìÌỉỈĩĨíÍịỊjJkKlLmMnNoOòÒỏỎõÕóÓọỌôÔồỒổỔỗỖốỐộỘơƠờỜởỞỡỠớỚợỢpPqQrRsStTuUùÙủỦũŨúÚụỤưƯừỪửỬữỮứỨựỰvVwWxXyYỳỲỷỶỹỸýÝỵỴzZ0123456789!"#$%&'()*+,-./:;<=>?@[]^_`{|}~''')
173
+ else:
174
+ chars = list(
175
+ '''aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789,;.!?:'"/\_@#$%^&*~`+-=<>()[]{|}''')
176
+
177
+ for char in chars:
178
+ if char not in self.chartoken2idx:
179
+ idx = len(self.chartoken2idx)
180
+ self.chartoken2idx[char] = idx
181
+ self.idx2chartoken[idx] = char
182
+
183
+ print(f"number of unique chars found: {len(self.chartoken2idx)}")
184
+
185
+ self.vocab_dict["chartoken2idx"] = self.chartoken2idx
186
+ self.vocab_dict["idx2chartoken"] = self.idx2chartoken
187
+
188
+
models/__init__.py ADDED
File without changes
models/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (151 Bytes). View file
 
models/__pycache__/collator.cpython-310.pyc ADDED
Binary file (2.72 kB). View file
 
models/__pycache__/corrector.cpython-310.pyc ADDED
Binary file (5.21 kB). View file
 
models/__pycache__/model.cpython-310.pyc ADDED
Binary file (1.07 kB). View file
 
models/__pycache__/sampler.cpython-310.pyc ADDED
Binary file (3.83 kB). View file
 
models/__pycache__/tokenizer.cpython-310.pyc ADDED
Binary file (2.56 kB). View file
 
models/__pycache__/transformer.cpython-310.pyc ADDED
Binary file (2.29 kB). View file
 
models/__pycache__/util.cpython-310.pyc ADDED
Binary file (1.48 kB). View file
 
models/collator.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ from abc import abstractmethod
3
+ from models.tokenizer import TokenAligner
4
+
5
+ class PTCollator():
6
+
7
+ def __init__(self, tokenAligner: TokenAligner):
8
+ self.tokenAligner = tokenAligner
9
+
10
+ def collate(self, dataloader_batch, type = "train") -> dict:
11
+ if type == "train":
12
+ return self.collate_train(dataloader_batch)
13
+ elif type == "test":
14
+ return self.collate_test(dataloader_batch)
15
+ elif type == "correct":
16
+ return self.collate_correct(dataloader_batch)
17
+
18
+ @abstractmethod
19
+ def collate_train(self, dataloader_batch):
20
+
21
+ pass
22
+
23
+ @abstractmethod
24
+ def collate_test(self, dataloader_batch):
25
+ pass
26
+
27
+
28
+ @abstractmethod
29
+ def collate_correct(self, dataloader_batch):
30
+ pass
31
+
32
+ class DataCollatorForCharacterTransformer(PTCollator):
33
+
34
+ def __init__(self, tokenAligner: TokenAligner):
35
+ super().__init__(tokenAligner)
36
+
37
+ def collate_train(self, dataloader_batch):
38
+ noised, labels = [], []
39
+ for sample in dataloader_batch:
40
+ labels.append(sample[0])
41
+ noised.append(sample[1])
42
+
43
+ batch_srcs, batch_tgts, batch_lengths, batch_attention_masks = self.tokenAligner.tokenize_for_transformer_with_tokenization(noised, labels)
44
+ data = dict()
45
+ data['batch_src'] = batch_srcs
46
+ data['batch_tgt'] = batch_tgts
47
+ data['attn_masks'] = batch_attention_masks
48
+ data['lengths'] = batch_lengths
49
+ return data
50
+
51
+ def collate_test(self, dataloader_batch):
52
+ noised, labels = [], []
53
+ for sample in dataloader_batch:
54
+ labels.append(sample[0])
55
+ noised.append(sample[1])
56
+
57
+ batch_srcs, batch_attention_masks = self.tokenAligner.tokenize_for_transformer_with_tokenization(noised, None)
58
+ data = dict()
59
+ data['batch_src'] = batch_srcs
60
+ data['noised_texts'] = noised
61
+ data['label_texts'] = labels
62
+ data['attn_masks'] = batch_attention_masks
63
+ return data
64
+
65
+ def collate_correct(self, dataloader_batch):
66
+ noised, labels = [], []
67
+ for sample in dataloader_batch:
68
+ noised.append(sample[1])
69
+
70
+ batch_srcs, batch_attention_masks= self.tokenAligner.tokenize_for_transformer_with_tokenization(noised)
71
+
72
+ data = dict()
73
+ data['batch_src'] = batch_srcs
74
+ data['noised_texts'] = noised
75
+ data['attn_masks'] = batch_attention_masks
76
+ return data
77
+
78
+
models/corrector.py ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import time
3
+
4
+ from torch.utils.data import DataLoader
5
+ from datetime import datetime as dt
6
+ from params import *
7
+ from models.model import ModelWrapper
8
+ from utils.metrics import get_mned_metric_from_TruePredict, get_metric_from_TrueWrongPredictV3
9
+ from utils.logger import get_logger
10
+ from models.sampler import RandomBatchSampler, BucketBatchSampler
11
+ from termcolor import colored
12
+ import re
13
+
14
+ class Corrector:
15
+ def __init__(self, model_wrapper: ModelWrapper):
16
+ self.model_name = model_wrapper.model_name
17
+ self.model = model_wrapper.model
18
+ self.model_wrapper = model_wrapper
19
+ self.logger = get_logger("./log/test.log")
20
+
21
+ self.device = DEVICE
22
+
23
+ self.model.to(self.device)
24
+ self.logger.log(f"Device: {self.device}")
25
+ self.logger.log("Loaded model")
26
+
27
+ def correct_transfomer_with_tr(self, batch, num_beams = 2):
28
+ correction = dict()
29
+ original = batch
30
+ splits = re.findall("\w\S+\w|\w+|[^\w\s]{1}", batch)
31
+ batch = " ".join(splits)
32
+ with torch.no_grad():
33
+ self.model.eval()
34
+ batch_infer_start = time.time()
35
+ batch = self.model_wrapper.collator.collate([[None, batch,None, None]], type = "correct")
36
+
37
+ result = self.model.inference(batch['batch_src'], num_beams = num_beams,
38
+ tokenAligner=self.model_wrapper.collator.tokenAligner)
39
+ correction['predict_text'] = result
40
+ correction['noised_text'] = batch['noised_texts']
41
+ correction['original_text'] = original
42
+
43
+ total_infer_time = time.time() - batch_infer_start
44
+ correction['time'] = total_infer_time
45
+
46
+ t = re.sub(r"(\s*)([.,:?!;]{1})(\s*)", r"\2\3", correction['predict_text'][0])
47
+ t = re.sub(r"((?P<parenthesis>\()\s)", r"\g<parenthesis>", t)
48
+ t = re.sub(r"(\s(?P<parenthesis>\)))", r"\g<parenthesis>", t)
49
+ t = re.sub(r"((?P<bracket>\[)\s)", r"\g<bracket>", t)
50
+ t = re.sub(r"(\s(?P<bracket>\]))", r"\g<bracket>", t)
51
+ t = re.sub(r"([\'\"])\s(.*)\s([\'\"])", r"\1\2\3", t)
52
+ correction['predict_text']= re.sub(r"\s(%)", "%", t)
53
+ return correction
54
+
55
+ def _get_transfomer_with_tr_generations(self, batch, num_beams = 2):
56
+ correction = dict()
57
+ with torch.no_grad():
58
+ self.model.eval()
59
+ batch_infer_start = time.time()
60
+
61
+ result = self.model.inference(batch['batch_src'], num_beams = num_beams,
62
+ tokenAligner=self.model_wrapper.collator.tokenAligner)
63
+
64
+ correction['predict_text'] = result
65
+ correction['noised_text'] = batch['noised_texts']
66
+
67
+ total_infer_time = time.time() - batch_infer_start
68
+ correction['time'] = total_infer_time
69
+
70
+ return correction
71
+
72
+ def step(self, batch, num_beams = 2):
73
+ outputs= self._get_transfomer_with_tr_generations(batch, num_beams)
74
+ batch_predictions = outputs['predict_text']
75
+ batch_label_texts = batch['label_texts']
76
+ batch_noised_texts = batch['noised_texts']
77
+
78
+ return batch_predictions, batch_noised_texts, batch_label_texts
79
+
80
+ def _evaluation_loop_autoregressive(self, data_loader, num_beams = 2):
81
+ TP, FP, FN = 0, 0, 0
82
+ MNED = 0.0
83
+ O_MNED = 0.0
84
+ total_infer_time = 0.0
85
+ twp_logger = get_logger(f"./log/true_wrong_predict{time.time()}.log")
86
+ with torch.no_grad():
87
+
88
+ self.model.eval()
89
+
90
+ for step, batch in enumerate(data_loader):
91
+
92
+ batch_infer_start = time.time()
93
+
94
+ batch_predictions, batch_noised_texts, batch_label_texts = \
95
+ self.step(batch, num_beams = num_beams)
96
+
97
+ batch_infer_time = time.time() - batch_infer_start
98
+
99
+ _TP, _FP, _FN = get_metric_from_TrueWrongPredictV3(batch_label_texts, batch_noised_texts, batch_predictions, self.model_wrapper.tokenAligner.vocab, twp_logger)
100
+
101
+ TP += _TP
102
+ FP += _FP
103
+ FN += _FN
104
+
105
+ _MNED = get_mned_metric_from_TruePredict(batch_label_texts, batch_predictions)
106
+ MNED += _MNED
107
+
108
+ _O_MNED = get_mned_metric_from_TruePredict(batch_label_texts, batch_noised_texts)
109
+ O_MNED += _O_MNED
110
+
111
+ info = '{} - Evaluate - iter: {:08d}/{:08d} - TP: {} - FP: {} - FN: {} - _MNED: {:.5f} - _O_MNED: {:.5f} - {} time: {:.2f}s'.format(
112
+ dt.now(),
113
+ step,
114
+ self.test_iters,
115
+ _TP,
116
+ _FP,
117
+ _FN,
118
+ _MNED,
119
+ _O_MNED,
120
+ self.device,
121
+ batch_infer_time)
122
+
123
+ self.logger.log(info)
124
+
125
+ torch.cuda.empty_cache()
126
+ total_infer_time += time.time() - batch_infer_start
127
+ return total_infer_time, TP, FP, FN, MNED / len(data_loader), O_MNED / len(data_loader)
128
+
129
+ def evaluate(self, dataset, beams: int = None):
130
+
131
+ def test_collate_wrapper(batch):
132
+ return self.model_wrapper.collator.collate(batch, type = "test")
133
+
134
+ if not BUCKET_SAMPLING:
135
+ self.test_sampler = RandomBatchSampler(dataset, VALID_BATCH_SIZE, shuffle = False)
136
+ else:
137
+ self.test_sampler = BucketBatchSampler(dataset, shuffle = True)
138
+
139
+ data_loader = DataLoader(dataset=dataset,batch_sampler= self.test_sampler,\
140
+ collate_fn=test_collate_wrapper)
141
+
142
+ self.test_iters = len(data_loader)
143
+
144
+ assert beams != None
145
+ total_infer_time, TP, FP, FN, MNED, O_MNED = self._evaluation_loop_autoregressive(data_loader, num_beams = beams)
146
+
147
+
148
+ self.logger.log("Total inference time for this data is: {:4f} secs".format(total_infer_time))
149
+ self.logger.log("###############################################")
150
+
151
+ info = f"Metrics for Auto-Regressive with Beam Search number {beams}"
152
+ self.logger.log(colored(info, "green"))
153
+
154
+ dc_TP = TP
155
+ dc_FP = FP
156
+ dc_FN = FN
157
+
158
+ dc_precision = dc_TP / (dc_TP + dc_FP)
159
+ dc_recall = dc_TP / (dc_TP + dc_FN)
160
+ dc_F1 = 2. * dc_precision * dc_recall/ ((dc_precision + dc_recall) + 1e-8)
161
+
162
+ self.logger.log(f"TP: {TP}. FP: {FP}. FN: {FN}")
163
+
164
+ self.logger.log(f"Precision: {dc_precision}")
165
+ self.logger.log(f"Recall: {dc_recall}")
166
+ self.logger.log(f"F1: {dc_F1}")
167
+ self.logger.log(f"MNED: {MNED}")
168
+ self.logger.log(f"O_MNED: {O_MNED}")
169
+
170
+ return
models/model.py ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from models.transformer import TransformerWithTR
2
+ from models.collator import *
3
+ from transformers import AutoTokenizer
4
+ import transformers
5
+ from models.tokenizer import TokenAligner
6
+ from dataset.vocab import Vocab
7
+
8
+ class ModelWrapper:
9
+
10
+ def __init__(self, model, vocab: Vocab):
11
+ self.model_name = model
12
+
13
+ if model == "tfmwtr":
14
+ self.tokenizer = AutoTokenizer.from_pretrained("vinai/bartpho-word-base")
15
+ self.tokenAligner = TokenAligner(self.tokenizer, vocab)
16
+ self.bart = transformers.MBartForConditionalGeneration.from_pretrained("vinai/bartpho-word-base")
17
+ self.model = TransformerWithTR(self.bart, self.tokenizer.pad_token_id)
18
+ self.collator = DataCollatorForCharacterTransformer(self.tokenAligner)
19
+ # self.model.resize_token_embeddings(self.tokenAligner)
20
+ else:
21
+ raise(Exception(f"Model {model} isn't implemented!"))
22
+
models/sampler.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from torch.utils.data.dataloader import Sampler
2
+ import sys
3
+ sys.path.append("..")
4
+ from dataset.autocorrect_dataset import SpellCorrectDataset
5
+ import numpy as np
6
+ from params import RANDOM_SEED, MAXIMUM_TOKENS_PER_BATCH
7
+ import copy
8
+ from tqdm import tqdm
9
+ import time
10
+
11
+ class RandomBatchSampler(Sampler):
12
+ def __init__(self, data: SpellCorrectDataset, batch_size = 1, shuffle = True):
13
+ self.data = data
14
+ self.seq = list(range(0, len(self.data)))
15
+ self.shuffle = shuffle
16
+ self.iters = 0
17
+ self.batch_size = batch_size
18
+ if self.shuffle:
19
+ np.random.seed(RANDOM_SEED)
20
+ np.random.shuffle(self.seq)
21
+ self.seq = [ self.seq[index: index + self.batch_size] \
22
+ for index in range(self.iters, len(self.seq), self.batch_size)]
23
+ self.default_seq = copy.deepcopy(self.seq)
24
+
25
+ def __iter__(self):
26
+ return iter(self.seq)
27
+
28
+ def __len__(self):
29
+ return len(self.seq)
30
+
31
+ def load_checkpoints(self, iters = 0):
32
+ self.seq = list(range(0, len(self.data)))
33
+ if self.shuffle:
34
+ np.random.seed(RANDOM_SEED)
35
+ np.random.shuffle(self.seq)
36
+ self.iters = iters
37
+ self.seq = [ self.seq[index: index + self.batch_size] \
38
+ for index in range(self.iters, len(self.seq), self.batch_size)]
39
+
40
+ class BucketBatchSampler(Sampler):
41
+ def __init__(self, data: SpellCorrectDataset, shuffle = True):
42
+ start = time.time()
43
+ self.remained_indies = None
44
+ self.data = data
45
+ self.shuffle = shuffle
46
+ print("Initializing Bucket Batch Sampler From Scratch")
47
+ self.data.dataset = sorted(self.data.dataset, key = lambda x: x[2])
48
+ token_counts = 0
49
+ indies_lists = []
50
+ self.seq = []
51
+ for index, values in tqdm(enumerate(self.data.dataset)):
52
+ if token_counts >= MAXIMUM_TOKENS_PER_BATCH:
53
+ self.seq.append(indies_lists)
54
+ indies_lists = []
55
+ token_counts = 0
56
+ indies_lists.append(index)
57
+ token_counts += values[2]
58
+ if len(indies_lists) != 0 and token_counts != 0:
59
+ self.seq.append(indies_lists)
60
+
61
+ if shuffle:
62
+ np.random.seed(RANDOM_SEED)
63
+ np.random.shuffle(self.seq)
64
+ end = time.time()
65
+ print(f"Initialized Bucket Batch Sampler From Scratch: {end - start}")
66
+ self.default_seq = copy.deepcopy(self.seq)
67
+
68
+ def __iter__(self):
69
+ return iter(self.seq)
70
+
71
+ def __len__(self):
72
+ return len(self.seq)
73
+
74
+ def load_checkpoints(self, remained_indies):
75
+ start = time.time()
76
+ print("Loading Bucket Batch Sampler From Checkpoint")
77
+ remained_indies = sorted(remained_indies)
78
+ token_counts = 0
79
+ indies_lists = []
80
+ self.seq = []
81
+ for index in tqdm(remained_indies):
82
+ values = self.data.dataset[index]
83
+ if token_counts >= MAXIMUM_TOKENS_PER_BATCH:
84
+ self.seq.append(indies_lists)
85
+ indies_lists = []
86
+ token_counts = 0
87
+ indies_lists.append(index)
88
+ token_counts += values[2]
89
+
90
+ if len(indies_lists) != 0 and token_counts != 0:
91
+ self.seq.append(indies_lists)
92
+
93
+ if self.shuffle:
94
+ np.random.seed(RANDOM_SEED)
95
+ np.random.shuffle(self.seq)
96
+ end = time.time()
97
+ print(f"Loaded Bucket Batch Sampler From Checkpoint: {end - start}")
98
+
99
+
models/tokenizer.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ sys.path.append("..")
3
+ from dataset.vocab import Vocab
4
+ from torch.nn.utils.rnn import pad_sequence
5
+ from transformers import AutoTokenizer
6
+
7
+
8
+ class TokenAligner():
9
+ def __init__(self, tokenizer: AutoTokenizer, vocab: Vocab):
10
+ self.tokenizer = tokenizer
11
+ self.vocab = vocab
12
+
13
+ """
14
+ params:
15
+ text ---- str
16
+ """
17
+ def _char_tokenize(self, text):
18
+ characters = list(text)
19
+ tokens = [ token + "@@" if i < len(characters) - 1 and characters[i + 1] != " " else token for i, token in enumerate(characters)]
20
+ tokens = [token for token in tokens if token not in [" @@", " "]]
21
+ encoded = self.tokenizer.encode_plus(tokens, return_tensors = "pt")
22
+ token_ids = encoded['input_ids'].squeeze(0)
23
+ attn_mask = encoded['attention_mask'].squeeze(0)
24
+ return tokens, token_ids, attn_mask
25
+
26
+ def char_tokenize(self, batch_texts):
27
+ doc = dict()
28
+ doc['tokens'] = []
29
+ doc['token_ids'] = []
30
+ doc['attention_mask'] = []
31
+ for text in batch_texts:
32
+ tokens, token_ids, attn_mask = self._char_tokenize(text)
33
+ doc['tokens'].append(tokens)
34
+ doc['token_ids'].append(token_ids)
35
+ doc['attention_mask'].append(attn_mask)
36
+ return doc
37
+
38
+ def tokenize_for_transformer_with_tokenization(self, batch_noised_text, batch_label_texts = None):
39
+ docs = self.char_tokenize(batch_noised_text)
40
+ batch_srcs = docs['token_ids']
41
+ batch_attention_masks = docs['attention_mask']
42
+
43
+ batch_attention_masks = pad_sequence(batch_attention_masks ,
44
+ batch_first=True, padding_value=0)
45
+
46
+ batch_srcs = pad_sequence(batch_srcs ,
47
+ batch_first=True, padding_value=self.tokenizer.pad_token_id)
48
+
49
+ if batch_label_texts != None:
50
+ batch_lengths = [len(self.tokenizer.tokenize(text)) for text in batch_label_texts]
51
+ batch_tgts = self.tokenizer.batch_encode_plus(batch_label_texts, max_length = 512,
52
+ truncation = True, padding=True, return_tensors="pt")['input_ids']
53
+ return batch_srcs, batch_tgts, batch_lengths, batch_attention_masks
54
+
55
+ return batch_srcs, batch_attention_masks