├── .gitignore ├── README.md ├── config.py ├── data ├── char-token2id ├── test_dataset.csv ├── train_dataset.csv ├── val_dataset.csv ├── w2v_data │ ├── dataset.csv │ └── stop_words.txt └── word-token2id ├── engines ├── __init__.py ├── data.py ├── models │ ├── PretrainedModel.py │ ├── TextCNN.py │ ├── TextRCNN.py │ ├── TextRNN.py │ ├── Transformer.py │ └── __init__.py ├── predict.py ├── train.py └── utils │ ├── __init__.py │ ├── clean_data.py │ ├── logger.py │ ├── losses │ ├── __init__.py │ ├── focal_loss.py │ └── rdrop_loss.py │ ├── mask.py │ ├── metrics.py │ ├── sentence2vec.py │ └── word2vec.py ├── img ├── batch_test.png ├── bert.png ├── interactive_predict.png ├── textcnn.png ├── textrcnn.png ├── textrnn.png └── train.png ├── logs ├── textcnn-char.log ├── textcnn-word.log ├── train_word2vec.log └── transformer-word.log ├── main.py └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | local_settings.py 60 | db.sqlite3 61 | db.sqlite3-journal 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # IPython 80 | profile_default/ 81 | ipython_config.py 82 | 83 | # pyenv 84 | .python-version 85 | 86 | # pipenv 87 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 88 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 89 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 90 | # install all needed dependencies. 91 | #Pipfile.lock 92 | 93 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 94 | __pypackages__/ 95 | 96 | # Celery stuff 97 | celerybeat-schedule 98 | celerybeat.pid 99 | 100 | # SageMath parsed files 101 | *.sage.py 102 | 103 | # Environments 104 | .env 105 | .venv 106 | env/ 107 | venv/ 108 | ENV/ 109 | env.bak/ 110 | venv.bak/ 111 | 112 | # Spyder project settings 113 | .spyderproject 114 | .spyproject 115 | 116 | # Rope project settings 117 | .ropeproject 118 | 119 | # mkdocs documentation 120 | /site 121 | 122 | # mypy 123 | .mypy_cache/ 124 | .dmypy.json 125 | dmypy.json 126 | 127 | # Pyre type checker 128 | .pyre/ 129 | .idea/ 130 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Text Classifier 2 | 3 | ![Authour](https://img.shields.io/badge/Author-stanleylsx-blue.svg) 4 | [![GitHub license](https://img.shields.io/badge/license-MIT-yellowgreen.svg)](https://github.com/StanleyLsx/entity_extractor_by_ner) 5 | 6 | **公众号文章:[文本分类之Text-CNN/RNN/RCNN算法原理及工程实现](https://mp.weixin.qq.com/s/7fbTt3Ov715ixErYfKR2kA)** 7 | **公众号文章:[一篇文章带你走进词向量并掌握Word2Vec](https://mp.weixin.qq.com/s/SAEV6WkbkOxzTCvF6GUz_A)** 8 | 9 | 本仓库不再维护欢迎使用功能更全的[text_classifier_torch](https://github.com/stanleylsx/text_classifier_torch)实现任务 10 | 该项目是基于Tensorflow2.3的文本分类任务,通过直接配置可支持: 11 | 12 | * **TextCNN/TextRNN/TextRCNN/Transformer/Bert/AlBert/DistilBert基本分类模型的训练** 13 | * **TextCNN/TextRNN/TextRCNN/Transformer的token可选用词粒度/字粒度** 14 | * **Word2Vec特征增强后接TextCNN/TextRNN/TextRCNN/Transformer** 15 | * **支持Attention-TextCNN/TextRNN** 16 | * **FGM和PGD两种对抗方法的引入训练** 17 | * **对比学习方法R-drop引入** 18 | * **支持二分类和多分类,支持FocalLoss** 19 | * **保存为pb文件可供部署** 20 | * **项目代码支持交互测试和批量测试,批量测试可以观察错误分布和分析bad case** 21 | 22 | 23 | ## 环境 24 | * python 3.7.10 25 | * tensorflow-gpu==2.3.0 26 | * tensorflow-addons==0.15.0 27 | * tqdm==4.50.2 28 | * gensim==3.8.3 29 | * jieba==0.42.1 30 | * pandas==1.1.3 31 | * scikit-learn==0.23.2 32 | * transformers==4.6.1 33 | * texttable==1.6.4 34 | 35 | ## 更新历史 36 | 日期| 版本 |描述 37 | :---|:-------|--- 38 | 2018-12-01| v1.0.0 |初始仓库 39 | 2020-10-20| v2.0.0 |重构项目 40 | 2020-10-26| v2.1.0 |加入F1、Precise、Recall分类指标,计算方式支持macro、micro、average、binary 41 | 2020-11-26| v2.3.1 |加入focal loss用于改善标签分布不平衡的情况 42 | 2020-11-19| v2.4.0 |增加每个类别的指标,重构指标计算逻辑 43 | 2021-03-02| v2.5.0 |使用Dataset替换自己写的数据加载器来加载数据 44 | 2021-03-15| v3.0.0 |支持仅使用TextCNN/TextRCNN进行数据训练(基于词粒度的token,使用随机生成的Embedding层) 45 | 2021-03-16| v3.1.0 |支持取用Word2Vec的词向量后接TextCNN/TextRCNN进行数据训练;在log中打印配置 46 | 2021-03-17| v3.1.1 |根据词频过滤一部分频率极低的词,不加入词表 47 | 2021-04-25| v3.1.6 |通过配置可选GPU和CPU进行训练 48 | 2021-06-17| v3.2.0 |增加字粒度的模型训练预测 49 | 2021-09-27| v3.3.0 |增加测试集的批量测试 50 | 2021-11-01| v4.0.0 |增加对抗训练,目前支持FGM和PGD两种方式;增加Bert微调分类训练;更换demo数据集 51 | 2021-11-24| v4.2.0 |增加Transformer模型做文本分类、增加对比学习方法r-drop 52 | 2022-04-22| v5.0.0 |批量测试打印bad_case以及预测混淆情况、文件夹检查、配置里面不再自己定义标签顺序、各类预训练模型支持 53 | 54 | 55 | ## 数据集 56 | 部分头条新闻数据集 57 | 58 | ## 使用 59 | ### 配置 60 | 在config.py中配置好各个参数,文件中有详细参数说明 61 | 62 | ### 训练分类器 63 | 配置好下列参数 64 | ``` 65 | classifier_config = { 66 | # 模型选择 67 | # 传统模型:TextCNN/TextRNN/TextRCNN/Transformer 68 | # 预训练模型:Bert/DistilBert/AlBert/RoBerta/Electra/XLNet 69 | 'classifier': 'TextCNN', 70 | # 若选择Bert系列微调做分类,请在pretrained指定预训练模型的版本 71 | 'pretrained': 'bert-base-chinese', 72 | # 训练数据集 73 | 'train_file': 'data/train_dataset.csv', 74 | # 验证数据集 75 | 'val_file': 'data/val_dataset.csv', 76 | # 测试数据集 77 | 'test_file': 'data/test_dataset.csv', 78 | # 引入外部的词嵌入,可选word2vec、Bert 79 | # word2vec:使用word2vec词向量做特征增强 80 | # 不填写则随机初始化的Embedding 81 | 'embedding_method': '', 82 | # token的粒度,token选择字粒度的时候,词嵌入(embedding_method)无效 83 | # 词粒度:'word' 84 | # 字粒度:'char' 85 | 'token_level': 'word', 86 | # 去停用词,路径需要在上面的word2vec_config中配置,仅限非预训练微调使用 87 | 'stop_words': True, 88 | # 是否去掉特殊字符 89 | 'remove_special': True, 90 | # 不外接词嵌入的时候需要自定义的向量维度 91 | 'embedding_dim': 300, 92 | # 存放词表的地方 93 | 'token_file': 'data/word-token2id', 94 | # 类别列表 95 | 'classes': ['家居', '时尚', '教育', '财经', '时政', '娱乐', '科技', '体育', '游戏', '房产'], 96 | # 模型保存的文件夹 97 | 'checkpoints_dir': 'model/textcnn', 98 | # 模型保存的名字 99 | 'checkpoint_name': 'textcnn', 100 | # 使用Textcnn模型时候设定卷集核的个数 101 | 'num_filters': 64, 102 | # 学习率 103 | # 微调预训练模型时建议更小,设置5e-5 104 | 'learning_rate': 0.0005, 105 | # 优化器选择 106 | # 可选:Adagrad/Adadelta/RMSprop/SGD/Adam/AdamW 107 | 'optimizer': 'Adam', 108 | # 训练epoch 109 | 'epoch': 100, 110 | # 最多保存max_to_keep个模型 111 | 'max_to_keep': 1, 112 | # 每print_per_batch打印 113 | 'print_per_batch': 100, 114 | # 是否提前结束 115 | 'is_early_stop': True, 116 | # 是否引入attention 117 | # 注意:textrcnn不支持 118 | 'use_attention': False, 119 | # attention大小 120 | 'attention_size': 300, 121 | 'patient': 8, 122 | 'batch_size': 256, 123 | 'max_sequence_length': 300, 124 | # 遗忘率 125 | 'dropout_rate': 0.5, 126 | # 隐藏层维度 127 | # 使用textrcnn、textrnn和transformer中需要设定 128 | # 使用transformer建议设定为2048 129 | 'hidden_dim': 256, 130 | # 编码器个数(使用transformer需要设定) 131 | 'encoder_num': 1, 132 | # 多头注意力的个数(使用transformer需要设定) 133 | 'head_num': 12, 134 | # 若为二分类则使用binary 135 | # 多分类使用micro或macro 136 | 'metrics_average': 'micro', 137 | # 类别样本比例失衡的时候可以考虑使用 138 | 'use_focal_loss': False, 139 | # 使用标签平滑 140 | # 主要用在预训练模型微调,直接训练小模型使用标签平滑会带来负面效果,慎用 141 | 'use_label_smoothing': False, 142 | 'smooth_factor': 0.1, 143 | # 是否使用GAN进行对抗训练 144 | 'use_gan': False, 145 | # 目前支持FGM和PGD两种方法 146 | # fgm:Fast Gradient Method 147 | # pgd:Projected Gradient Descent 148 | 'gan_method': 'pgd', 149 | # 对抗次数 150 | 'attack_round': 3, 151 | # 使用对比学习,不推荐和对抗方法一起使用,效率慢收益不大 152 | 'use_r_drop': False 153 | } 154 | 155 | ``` 156 | 配置完参数之后开始训练模型 157 | ``` 158 | # [train_classifier, interactive_predict, test, save_model, train_word2vec, train_sif_sentence_vec] 159 | mode = 'train_classifier' 160 | ``` 161 | * 训练结果 162 | 163 | ![train_results_textcnn](https://img-blog.csdnimg.cn/949975114b5e46b68f8a019d7d34204e.png) 164 | 165 | ### 测试 166 | 训练好模型直接可以开始测试,可以进行交互测试也可以批量测试 167 | * 交互测试 168 | ``` 169 | # [train_classifier, interactive_predict, test, save_model, train_word2vec, train_sif_sentence_vec] 170 | mode = 'interactive_predict' 171 | ``` 172 | 交互测试结果 173 | ![interactive_predict](https://img-blog.csdnimg.cn/433787e1760b45968536b8315ad8e581.png) 174 | 175 | * 批量测试 176 | 177 | 在测试数据集配置上填和训练/验证集文件同构的文件地址 178 | ``` 179 | # 测试数据集 180 | 'test_file': 'data/test_dataset.csv', 181 | ``` 182 | 模式设定为测试模式 183 | ``` 184 | # [train_classifier, interactive_predict, test, save_model, train_word2vec, train_sif_sentence_vec] 185 | mode = 'test' 186 | ``` 187 | 批量测试结果 188 | ![batch_test](https://img-blog.csdnimg.cn/bd22c813350449ef937b3a50e1f09322.png) 189 | 190 | 批量测试完会给出各个标签混淆的分布 191 | ![error_dis](https://img-blog.csdnimg.cn/f50949d5ac574a32aed0b89330e3687c.png) 192 | 193 | 批量测试完同时会给出一份bad_case文件,方便更细致的纠正标签和判断模型效果 194 | ![badcese](https://img-blog.csdnimg.cn/0a70b09cbbb1435f98596cee2c3ac359.png) 195 | 196 | ### 训练word2vec 197 | 在config.py中的mode中配置好词向量训练的相关参数,并在mode中选择train_word2vec并运行: 198 | ``` 199 | word2vec_config = { 200 | 'stop_words': 'data/w2v_data/stop_words.txt', # 停用词(可为空) 201 | 'train_data': 'data/w2v_data/dataset.csv', # 词向量训练用的数据 202 | 'model_dir': 'model/word2vec_model', # 词向量模型的保存文件夹 203 | 'model_name': 'word2vec_model.pkl', # 词向量模型名 204 | 'word2vec_dim': 300, # 词向量维度 205 | 'min_count': 3, # 最低保留词频大小 206 | # 选择skip-gram和cbow 207 | 'sg': 'cbow' 208 | } 209 | 210 | # [train_classifier, interactive_predict, test, save_model, train_word2vec, train_sif_sentence_vec] 211 | mode = 'train_word2vec' 212 | ``` 213 | 214 | ## 公众号 215 | 相关问题欢迎在公众号反馈: 216 | 217 | ![小贤算法屋](https://img-blog.csdnimg.cn/20210427094903895.jpg) 218 | 219 | 220 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : config.py 6 | # @Software: PyCharm 7 | 8 | 9 | # [train_classifier, interactive_predict, test, save_model, train_word2vec, train_sif_sentence_vec] 10 | mode = 'train_classifier' 11 | 12 | word2vec_config = { 13 | 'stop_words': 'data/w2v_data/stop_words.txt', # 停用词(可为空) 14 | 'train_data': 'data/w2v_data/dataset.csv', # 词向量训练用的数据 15 | 'model_dir': 'model/word2vec_model', # 词向量模型的保存文件夹 16 | 'model_name': 'word2vec_model.pkl', # 词向量模型名 17 | 'word2vec_dim': 300, # 词向量维度 18 | 'min_count': 3, # 最低保留词频大小 19 | # 选择skip-gram和cbow 20 | 'sg': 'cbow' 21 | } 22 | 23 | CUDA_VISIBLE_DEVICES = 0 24 | # int, -1:CPU, [0,]:GPU 25 | # coincides with tf.CUDA_VISIBLE_DEVICES 26 | 27 | classifier_config = { 28 | # 模型选择 29 | # 传统模型:TextCNN/TextRNN/TextRCNN/Transformer 30 | # 预训练模型:Bert/DistilBert/AlBert/RoBerta/Electra/XLNet 31 | 'classifier': 'TextCNN', 32 | # 若选择Bert系列微调做分类,请在pretrained指定预训练模型的版本 33 | 'pretrained': 'bert-base-chinese', 34 | # 训练数据集 35 | 'train_file': 'data/train_dataset.csv', 36 | # 验证数据集 37 | 'val_file': 'data/val_dataset.csv', 38 | # 测试数据集 39 | 'test_file': 'data/test_dataset.csv', 40 | # 引入外部的词嵌入,可选word2vec、Bert 41 | # word2vec:使用word2vec词向量做特征增强 42 | # 不填写则随机初始化的Embedding 43 | 'embedding_method': '', 44 | # token的粒度,token选择字粒度的时候,词嵌入(embedding_method)无效 45 | # 词粒度:'word' 46 | # 字粒度:'char' 47 | 'token_level': 'word', 48 | # 去停用词,路径需要在上面的word2vec_config中配置,仅限非预训练微调使用 49 | 'stop_words': True, 50 | # 是否去掉特殊字符 51 | 'remove_special': True, 52 | # 不外接词嵌入的时候需要自定义的向量维度 53 | 'embedding_dim': 300, 54 | # 存放词表的地方 55 | 'token_file': 'data/word-token2id', 56 | # 类别列表 57 | 'classes': ['家居', '时尚', '教育', '财经', '时政', '娱乐', '科技', '体育', '游戏', '房产'], 58 | # 模型保存的文件夹 59 | 'checkpoints_dir': 'model/textcnn', 60 | # 模型保存的名字 61 | 'checkpoint_name': 'textcnn', 62 | # 使用Textcnn模型时候设定卷集核的个数 63 | 'num_filters': 64, 64 | # 学习率 65 | # 微调预训练模型时建议更小,设置5e-5 66 | 'learning_rate': 0.0005, 67 | # 优化器选择 68 | # 可选:Adagrad/Adadelta/RMSprop/SGD/Adam/AdamW 69 | 'optimizer': 'Adam', 70 | # 训练epoch 71 | 'epoch': 100, 72 | # 最多保存max_to_keep个模型 73 | 'max_to_keep': 1, 74 | # 每print_per_batch打印 75 | 'print_per_batch': 100, 76 | # 是否提前结束 77 | 'is_early_stop': True, 78 | # 是否引入attention 79 | # 注意:textrcnn不支持 80 | 'use_attention': False, 81 | # attention大小 82 | 'attention_size': 300, 83 | 'patient': 8, 84 | 'batch_size': 256, 85 | 'max_sequence_length': 300, 86 | # 遗忘率 87 | 'dropout_rate': 0.5, 88 | # 隐藏层维度 89 | # 使用textrcnn、textrnn和transformer中需要设定 90 | # 使用transformer建议设定为2048 91 | 'hidden_dim': 256, 92 | # 编码器个数(使用transformer需要设定) 93 | 'encoder_num': 1, 94 | # 多头注意力的个数(使用transformer需要设定) 95 | 'head_num': 12, 96 | # 若为二分类则使用binary 97 | # 多分类使用micro或macro 98 | 'metrics_average': 'micro', 99 | # 类别样本比例失衡的时候可以考虑使用 100 | 'use_focal_loss': True, 101 | # focal loss的各个标签权重 102 | 'weight': None, 103 | # 使用标签平滑 104 | # 主要用在预训练模型微调,直接训练小模型使用标签平滑会带来负面效果,慎用 105 | 'use_label_smoothing': False, 106 | 'smooth_factor': 0.1, 107 | # 是否使用GAN进行对抗训练 108 | 'use_gan': False, 109 | # 目前支持FGM和PGD两种方法 110 | # fgm:Fast Gradient Method 111 | # pgd:Projected Gradient Descent 112 | 'gan_method': 'pgd', 113 | # 对抗次数 114 | 'attack_round': 3, 115 | # 使用对比学习,不推荐和对抗方法一起使用,效率慢收益不大 116 | 'use_r_drop': False 117 | } 118 | -------------------------------------------------------------------------------- /data/char-token2id: -------------------------------------------------------------------------------- 1 | 混 1 2 | 合 2 3 | 型 3 4 | 基 4 5 | 金 5 6 | 有 6 7 | 望 7 8 | 拔 8 9 | 头 9 10 | 筹 10 11 | 2 11 12 | 0 12 13 | 7 13 14 | 年 14 15 | 股 15 16 | 市 16 17 | 迅 17 18 | 速 18 19 | 上 19 20 | 涨 20 21 | 使 21 22 | 票 22 23 | 独 23 24 | 领 24 25 | 风 25 26 | 骚 26 27 | 8 27 28 | 大 28 29 | 盘 29 30 | 一 30 31 | 泻 31 32 | 千 32 33 | 里 33 34 | 成 34 35 | 就 35 36 | 债 36 37 | 券 37 38 | 的 38 39 | 王 39 40 | 者 40 41 | 地 41 42 | 位 42 43 | 那 43 44 | 么 44 45 | 谁 45 46 | 将 46 47 | 在 47 48 | 9 48 49 | 坐 49 50 | 场 50 51 | 宝 51 52 | 座 52 53 | 业 53 54 | 内 54 55 | 人 55 56 | 士 56 57 | 认 57 58 | 为 58 59 | 今 59 60 | 宏 60 61 | 观 61 62 | 经 62 63 | 济 63 64 | 不 64 65 | 确 65 66 | 定 66 67 | 性 67 68 | 加 68 69 | 剧 69 70 | 证 70 71 | 波 71 72 | 动 72 73 | 具 73 74 | 灵 74 75 | 活 75 76 | 配 76 77 | 置 77 78 | 优 78 79 | 势 79 80 | 得 80 81 | 由 81 82 | 于 82 83 | 环 83 84 | 境 84 85 | 形 85 86 | 明 86 87 | 朗 87 88 | A 88 89 | 走 89 90 | 可 90 91 | 能 91 92 | 出 92 93 | 现 93 94 | 显 94 95 | 目 95 96 | 前 96 97 | 益 97 98 | 系 98 99 | 列 99 100 | 刺 100 101 | 激 101 102 | 政 102 103 | 策 103 104 | 实 104 105 | 施 105 106 | 并 106 107 | 初 107 108 | 见 108 109 | 效 109 110 | 先 110 111 | 行 111 112 | 指 112 113 | 标 113 114 | 已 114 115 | 所 115 116 | 改 116 117 | 善 117 118 | 自 118 119 | 去 119 120 | 1 120 121 | 月 121 122 | 以 122 123 | 来 123 124 | 货 124 125 | 币 125 126 | 供 126 127 | 应 127 128 | 量 128 129 | 增 129 130 | 回 130 131 | 升 131 132 | 份 132 133 | 信 133 134 | 贷 134 135 | 长 135 136 | 更 136 137 | 是 137 138 | 达 138 139 | 到 139 140 | 6 140 141 | 万 141 142 | 亿 142 143 | 元 143 144 | 复 144 145 | 苏 145 146 | 提 146 147 | 了 147 148 | 充 148 149 | 足 149 150 | 支 150 151 | 持 151 152 | 而 152 153 | P 153 154 | M 154 155 | I 155 156 | 数 156 157 | 连 157 158 | 续 158 159 | 两 159 160 | 个 160 161 | 比 161 162 | 强 162 163 | 化 163 164 | 体 164 165 | 企 165 166 | 稳 166 167 | 迹 167 168 | 象 168 169 | 也 169 170 | 带 170 171 | 近 171 172 | 期 172 173 | 反 173 174 | 弹 174 175 | 但 175 176 | 另 176 177 | 方 177 178 | 面 178 179 | 主 179 180 | 要 180 181 | 源 181 182 | 裕 182 183 | 流 183 184 | 推 184 185 | 受 185 186 | 整 186 187 | 趋 187 188 | 弱 188 189 | 影 189 190 | 响 190 191 | 公 191 192 | 司 192 193 | 绩 193 194 | 下 194 195 | 滑 195 196 | 否 196 197 | 仍 197 198 | 待 198 199 | 察 199 200 | 这 200 201 | 样 201 202 | 背 202 203 | 景 203 204 | 适 204 205 | 特 205 206 | 点 206 207 | 资 207 208 | 产 208 209 | 决 209 210 | 如 210 211 | 发 211 212 | 中 212 213 | 银 213 214 | 选 214 215 | 投 215 216 | 例 216 217 | 范 217 218 | 围 218 219 | 3 219 220 | 等 220 221 | 融 221 222 | 工 222 223 | 分 223 224 | 析 224 225 | 类 225 226 | 似 226 227 | 利 227 228 | 理 228 229 | 杂 229 230 | 多 230 231 | 变 231 232 | 调 232 233 | 和 233 234 | 别 234 235 | 向 235 236 | 好 236 237 | 时 237 238 | 获 238 239 | 较 239 240 | 高 240 241 | 收 241 242 | 则 242 243 | 规 243 244 | 避 244 245 | 险 245 246 | 因 246 247 | 此 247 248 | 把 248 249 | 握 249 250 | 跷 250 251 | 板 251 252 | 想 252 253 | 报 253 254 | 统 254 255 | 计 255 256 | 表 256 257 | 小 257 258 | 且 258 259 | 良 259 260 | 据 260 261 | 河 261 262 | 研 262 263 | 究 263 264 | 心 264 265 | 率 265 266 | 本 266 267 | 记 267 268 | 许 268 269 | 超 269 270 | 声 270 271 | 尔 271 272 | 冬 272 273 | 打 273 274 | 造 274 275 | 新 275 276 | 警 276 277 | 匪 277 278 | 片 278 279 | 谢 279 280 | 霆 280 281 | 锋 281 282 | 刘 282 283 | 青 283 284 | 云 284 285 | 杨 285 286 | 幂 286 287 | 演 287 288 | 讯 288 289 | 张 289 290 | 世 290 291 | 韬 291 292 | 昨 292 293 | 日 293 294 | 悉 294 295 | 监 295 296 | 制 296 297 | 部 297 298 | 罗 298 299 | 志 299 300 | 执 300 301 | 导 301 302 | 消 302 303 | 失 303 304 | 子 304 305 | 暂 305 306 | 名 306 307 | 邀 307 308 | 请 308 309 | 衔 309 310 | 当 310 311 | 红 311 312 | 偶 312 313 | 像 313 314 | 微 314 315 | 博 315 316 | 井 316 317 | 柏 317 318 | 然 318 319 | 及 319 320 | 老 320 321 | 戏 321 322 | 骨 322 323 | 吴 323 324 | 刚 324 325 | 廖 325 326 | 启 326 327 | 智 327 328 | 众 328 329 | 星 329 330 | 盟 330 331 | 力 331 332 | 求 332 333 | 全 333 334 | 该 334 335 | 美 335 336 | 讲 336 337 | 述 337 338 | 民 338 339 | 国 339 340 | 海 340 341 | 最 341 342 | 兵 342 343 | 厂 343 344 | 生 344 345 | 离 345 346 | 奇 346 347 | 命 347 348 | 案 348 349 | 枚 349 350 | 诅 350 351 | 咒 351 352 | 幽 352 353 | 古 353 354 | 神 354 355 | 探 355 356 | 热 356 357 | 血 357 358 | 官 358 359 | 差 359 360 | 引 360 361 | 死 361 362 | 未 362 363 | 卜 363 364 | 追 364 365 | 凶 365 366 | 迷 366 367 | 途 367 368 | 齐 368 369 | 肩 369 370 | 半 370 371 | 怎 371 372 | 搭 372 373 | 衣 373 374 | 服 374 375 | 组 375 376 | 图 376 377 | 语 377 378 | 根 378 379 | 装 379 380 | 择 380 381 | 与 381 382 | 着 382 383 | 协 383 384 | 马 384 385 | 尾 385 386 | 原 386 387 | 让 387 388 | 相 388 389 | 互 389 390 | 衬 390 391 | 托 391 392 | 才 392 393 | 展 393 394 | 格 394 395 | 呢 395 396 | 给 396 397 | 家 397 398 | 些 398 399 | 参 399 400 | 考 400 401 | 清 401 402 | 爽 402 403 | 直 403 404 | 很 404 405 | 夏 405 406 | 天 406 407 | 炎 407 408 | 季 408 409 | 节 409 410 | 膀 410 411 | 舒 411 412 | 满 412 413 | 春 413 414 | 运 414 415 | 鲜 415 416 | 色 416 417 | 你 417 418 | 感 418 419 | 接 419 420 | 丽 420 421 | 验 421 422 | 宽 422 423 | 松 423 424 | 字 424 425 | 母 425 426 | 艳 426 427 | 蓝 427 428 | 同 428 429 | 夺 429 430 | 黄 430 431 | 短 431 432 | 裙 432 433 | 都 433 434 | 被 434 435 | 媚 435 436 | 阳 436 437 | 光 437 438 | 包 438 439 | 黑 439 440 | 净 440 441 | 熟 441 442 | 又 442 443 | 少 443 444 | 女 444 445 | 般 445 446 | 甜 446 447 | f 447 448 | e 448 449 | l 449 450 | 从 450 451 | 左 451 452 | 手 452 453 | 延 453 454 | 伸 454 455 | 右 455 456 | 腰 456 457 | 荷 457 458 | 叶 458 459 | 边 459 460 | 浪 460 461 | 漫 461 462 | 卷 462 463 | 容 463 464 | 易 464 465 | 起 465 466 | 轻 466 467 | 哦 467 468 | 深 468 469 | 军 469 470 | 情 470 471 | 突 471 472 | 白 472 473 | 条 473 474 | 纹 474 475 | 绑 475 476 | 蝴 476 477 | 蝶 477 478 | 结 478 479 | 抢 479 480 | 眼 480 481 | 北 481 482 | 京 482 483 | 拟 483 484 | 底 484 485 | 再 485 486 | 售 486 487 | 套 487 488 | 房 488 489 | 李 489 490 | 霞 490 491 | 约 491 492 | 余 492 493 | 括 493 494 | 丰 494 495 | 台 495 496 | 郭 496 497 | 庄 497 498 | 项 498 499 | 通 499 500 | 州 500 501 | 驹 501 502 | 桥 502 503 | 随 503 504 | 陆 504 505 | 入 505 506 | 住 506 507 | 后 507 508 | 管 508 509 | 作 509 510 | 安 510 511 | 排 511 512 | 保 512 513 | 办 513 514 | 议 514 515 | 事 515 516 | 程 516 517 | 障 517 518 | 租 518 519 | 府 519 520 | 何 520 521 | 购 521 522 | 正 522 523 | 副 523 524 | 任 524 525 | 耀 525 526 | 东 526 527 | 代 527 528 | 进 528 529 | 跟 529 530 | 踪 530 531 | 检 531 532 | 查 532 533 | 介 533 534 | 绍 534 535 | 朝 535 536 | 区 536 537 | 关 537 538 | 负 538 539 | 责 539 540 | 问 540 541 | 题 541 542 | 建 542 543 | 设 543 544 | 各 544 545 | 件 545 546 | 薄 546 547 | 础 547 548 | 对 548 549 | 落 549 550 | 难 550 551 | 度 551 552 | 道 552 553 | 路 553 554 | 水 554 555 | 电 555 556 | 屋 556 557 | 步 557 558 | 交 558 559 | 付 559 560 | 况 560 561 | 二 561 562 | 常 562 563 | 营 563 564 | 口 564 565 | 5 565 566 | 物 566 567 | 户 567 568 | 需 568 569 | 门 569 570 | 尽 570 571 | 快 571 572 | 准 572 573 | 备 573 574 | 完 574 575 | 细 575 576 | 法 576 577 | 措 577 578 | 限 578 579 | 价 579 580 | 跨 580 581 | 立 581 582 | 健 582 583 | 机 583 584 | 综 584 585 | 我 585 586 | 评 586 587 | 论 587 588 | 骗 588 589 | 号 589 590 | 称 590 591 | 违 591 592 | 四 592 593 | 六 593 594 | 级 594 595 | 单 595 596 | 委 596 597 | 会 597 598 | 免 598 599 | 费 599 600 | 鉴 600 601 | 真 601 602 | 伪 602 603 | 德 603 604 | 庆 604 605 | 即 605 606 | 某 606 607 | 学 607 608 | 毕 608 609 | 段 609 610 | 间 610 611 | 找 611 612 | 忙 612 613 | 碌 613 614 | 他 614 615 | 校 615 616 | 附 616 617 | 假 617 618 | 英 618 619 | 广 619 620 | 告 620 621 | 吸 621 622 | 五 622 623 | 百 623 624 | 网 624 625 | 站 625 626 | 询 626 627 | 专 627 628 | 务 628 629 | 盗 629 630 | 用 630 631 | 漏 631 632 | 洞 632 633 | 醒 633 634 | 审 634 635 | 核 635 636 | 买 636 637 | 佯 637 638 | 或 638 639 | 弄 639 640 | 钱 640 641 | 放 641 642 | 们 642 643 | 教 643 644 | 育 644 645 | 宿 645 646 | 舍 646 647 | 没 647 648 | 试 648 649 | 除 649 650 | 其 650 651 | 做 651 652 | 几 652 653 | 绝 653 654 | 过 654 655 | 码 655 656 | 疑 656 657 | 己 657 658 | 登 658 659 | 录 659 660 | 页 660 661 | 示 661 662 | C 662 663 | E 663 664 | T 664 665 | 息 665 666 | 总 666 667 | 4 667 668 | 听 668 669 | 阅 669 670 | 读 670 671 | 写 671 672 | 却 672 673 | 姓 673 674 | 布 674 675 | 果 675 676 | 移 676 677 | 花 677 678 | 木 678 679 | 联 679 680 | 还 680 681 | 解 681 682 | 释 682 683 | 屡 683 684 | 革 684 685 | 院 685 686 | 话 686 687 | 空 687 688 | 书 688 689 | 招 689 690 | 拿 690 691 | 编 691 692 | 依 692 693 | 之 693 694 | 按 694 695 | 照 695 696 | 种 696 697 | 式 697 698 | 彩 698 699 | 印 699 700 | 章 700 701 | 辨 701 702 | 无 702 703 | 只 703 704 | 款 704 705 | 员 705 706 | 诉 706 707 | 非 707 708 | 乱 708 709 | 寄 709 710 | 往 710 711 | 访 711 712 | 频 712 713 | 坛 713 714 | 客 714 715 | 圈 715 716 | 说 716 717 | 断 717 718 | 仅 718 719 | 敬 719 720 | 权 720 721 | 威 721 722 | 丝 722 723 | 绒 723 724 | 品 724 725 | 嘉 725 726 | 玲 726 727 | 尚 727 728 | 火 728 729 | 拼 729 730 | 料 730 731 | 征 731 732 | 雅 732 733 | 贵 733 734 | 族 734 735 | 魅 735 736 | 它 736 737 | 逐 737 738 | 渐 738 739 | 界 739 740 | 吃 740 741 | 香 741 742 | 柔 742 743 | 软 743 744 | 材 744 745 | 质 745 746 | 贴 746 747 | 觉 747 748 | 看 748 749 | 穿 749 750 | 味 750 751 | 墨 751 752 | 绿 752 753 | 外 753 754 | 气 754 755 | 腻 755 756 | 秘 756 757 | 酒 757 758 | 抹 758 759 | 胸 759 760 | 采 760 761 | 韵 761 762 | 极 762 763 | 富 763 764 | 撩 764 765 | 摆 765 766 | 褶 766 767 | 皱 767 768 | 妖 768 769 | 娆 769 770 | 典 770 771 | 露 771 772 | 割 772 773 | 袖 773 774 | 礼 774 775 | 徐 775 776 | 若 776 777 | 卖 777 778 | 姿 778 779 | 态 779 780 | 纯 780 781 | 雍 781 782 | 什 782 783 | 钻 783 784 | 石 784 785 | 链 785 786 | 饰 786 787 | 精 787 788 | 亮 788 789 | 鞋 789 790 | 扮 790 791 | 三 791 792 | 透 792 793 | 唇 793 794 | 妆 794 795 | 她 795 796 | 彰 796 797 | 媛 797 798 | 儿 798 799 | 创 799 800 | 哈 800 801 | 佛 801 802 | 岁 802 803 | 修 803 804 | 鲁 804 805 | 诺 805 806 | 拥 806 807 | 岛 807 808 | 技 808 809 | 术 809 810 | 商 810 811 | 历 811 812 | 雄 812 813 | 勃 813 814 | 摩 814 815 | 借 815 816 | 授 816 817 | 答 817 818 | 课 818 819 | 堂 819 820 | 令 820 821 | 兴 821 822 | 趣 822 823 | 居 823 824 | 斐 824 825 | 划 825 826 | 次 826 827 | 褒 827 828 | 奖 828 829 | 荣 829 830 | 誉 830 831 | 际 831 832 | 球 832 833 | 私 833 834 | 旅 834 835 | 身 835 836 | 籍 836 837 | 师 837 838 | 康 838 839 | 奈 839 840 | D 840 841 | G 841 842 | 怀 842 843 | 揣 843 844 | 周 844 845 | 游 845 846 | 梦 846 847 | 禁 847 848 | 诱 848 849 | 惑 849 850 | 辞 850 851 | 沙 851 852 | 滩 852 853 | 啤 853 854 | 邂 854 855 | 逅 855 856 | 太 856 857 | 友 857 858 | 构 858 859 | 至 859 860 | 爱 860 861 | 思 861 862 | 念 862 863 | 希 863 864 | 忆 864 865 | 转 865 866 | 折 866 867 | 开 867 868 | 始 868 869 | 异 869 870 | 域 870 871 | 遇 871 872 | O 872 873 | 临 873 874 | 每 874 875 | 处 875 876 | 意 876 877 | 识 877 878 | 笑 878 879 | 劳 879 880 | 赁 880 881 | 描 881 882 | 终 882 883 | 第 883 884 | 笔 884 885 | 幸 885 886 | 迈 886 887 | 谓 887 888 | 尤 888 889 | 硬 889 890 | 取 890 891 | 艰 891 892 | 辛 892 893 | 挫 893 894 | 室 894 895 | 寓 895 896 | 挑 896 897 | 战 897 898 | 帮 898 899 | 助 899 900 | 文 900 901 | 功 901 902 | 奠 902 903 | 欣 903 904 | 慰 904 905 | 团 905 906 | 队 906 907 | 注 907 908 | N 908 909 | 集 909 910 | 席 910 911 | 卫 911 912 | 斯 912 913 | 普 913 914 | 林 914 915 | 烈 915 916 | 甚 916 917 | 朋 917 918 | 荐 918 919 | 耳 919 920 | 传 920 921 | 阶 921 922 | 视 922 923 | 财 923 924 | 远 924 925 | 脑 925 926 | 络 926 927 | 索 927 928 | 维 928 929 | 护 929 930 | 熬 930 931 | 讳 931 932 | 言 932 933 | 蒸 933 934 | 缺 934 935 | 值 935 936 | 睐 936 937 | 铭 937 938 | 赢 938 939 | 福 939 940 | 竞 940 941 | 争 941 942 | 薪 942 943 | 酬 943 944 | 享 944 945 | 乐 945 946 | 坦 946 947 | 诚 947 948 | 帆 948 949 | 顺 949 950 | 西 950 951 | 碰 951 952 | 撞 952 953 | 坎 953 954 | 崇 954 955 | 胜 955 956 | 鼓 956 957 | 励 957 958 | 辩 958 959 | 担 959 960 | 驳 960 961 | 触 961 962 | 怒 962 963 | 诀 963 964 | 氛 964 965 | 密 965 966 | 曾 966 967 | 叫 967 968 | 习 968 969 | 预 969 970 | 算 970 971 | 必 971 972 | 须 972 973 | 讨 973 974 | 庭 974 975 | 佳 975 976 | 予 976 977 | 渴 977 978 | 植 978 979 | 状 979 980 | 慢 980 981 | 顾 981 982 | 重 982 983 | 涵 983 984 | 盖 984 985 | 批 985 986 | 纪 986 987 | 遍 987 988 | 岸 988 989 | 击 989 990 | 皇 990 991 | 帝 991 992 | 篮 992 993 | 肉 993 994 | 克 994 995 | 逆 995 996 | 赛 996 997 | 拉 997 998 | 幕 998 999 | 镇 999 1000 | 迎 1000 1001 | 秒 1001 1002 | 韦 1002 1003 | 詹 1003 1004 | 姆 1004 1005 | 补 1005 1006 | 龙 1006 1007 | 抓 1007 1008 | 账 1008 1009 | 防 1009 1010 | 守 1010 1011 | 攻 1011 1012 | 束 1012 1013 | c 1013 1014 | a 1014 1015 | r 1015 1016 | y 1016 1017 | 圆 1017 1018 | 峰 1018 1019 | 伙 1019 1020 | 伴 1020 1021 | 馆 1021 1022 | 伦 1022 1023 | 敦 1023 1024 | 曼 1024 1025 | 彻 1025 1026 | 举 1026 1027 | 双 1027 1028 | 留 1028 1029 | 归 1029 1030 | 倍 1030 1031 | 届 1031 1032 | 旨 1032 1033 | 职 1033 1034 | 培 1034 1035 | 训 1035 1036 | 促 1036 1037 | 袁 1037 1038 | 仁 1038 1039 | 戈 1039 1040 | 夫 1040 1041 | 签 1041 1042 | 署 1042 1043 | 框 1043 1044 | 架 1044 1045 | 著 1045 1046 | 首 1046 1047 | 共 1047 1048 | 宣 1048 1049 | 华 1049 1050 | 赞 1050 1051 | 琼 1051 1052 | 娜 1052 1053 | 切 1053 1054 | 欢 1054 1055 | 翻 1055 1056 | 番 1056 1057 | 刻 1057 1058 | 扩 1058 1059 | 模 1059 1060 | 蓬 1060 1061 | 亚 1061 1062 | 雀 1062 1063 | 巢 1063 1064 | 勤 1064 1065 | 知 1065 1066 | 聘 1066 1067 | 略 1067 1068 | 野 1068 1069 | 积 1069 1070 | 沟 1070 1071 | 紧 1071 1072 | 义 1072 1073 | 承 1073 1074 | 涉 1074 1075 | 艺 1075 1076 | 社 1076 1077 | 科 1077 1078 | 亲 1078 1079 | 港 1079 1080 | w 1080 1081 | b 1081 1082 | i 1082 1083 | t 1083 1084 | s 1084 1085 | h 1085 1086 | o 1086 1087 | u 1087 1088 | n 1088 1089 | g 1089 1090 | 湘 1090 1091 | 澄 1091 1092 | 浴 1092 1093 | 缸 1093 1094 | 孕 1094 1095 | 妇 1095 1096 | 拍 1096 1097 | 娱 1097 1098 | 午 1098 1099 | 爆 1099 1100 | 喜 1100 1101 | 熊 1101 1102 | 猫 1102 1103 | 侠 1103 1104 | 版 1104 1105 | 揭 1105 1106 | 焦 1106 1107 | 摄 1107 1108 | 泳 1108 1109 | 暴 1109 1110 | 脚 1110 1111 | 踏 1111 1112 | 奕 1112 1113 | 乎 1113 1114 | 脸 1114 1115 | 媒 1115 1116 | 虽 1116 1117 | 督 1117 1118 | 胖 1118 1119 | 恋 1119 1120 | 谈 1120 1121 | 肚 1121 1122 | 男 1122 1123 | 孩 1123 1124 | 阵 1124 1125 | 街 1125 1126 | 候 1126 1127 | 踢 1127 1128 | 玩 1128 1129 | 耍 1129 1130 | 吧 1130 1131 | 岳 1131 1132 | 爷 1132 1133 | z 1133 1134 | j 1134 1135 | 郑 1135 1136 | 宾 1136 1137 | 履 1137 1138 | 钟 1138 1139 | 固 1139 1140 | 陈 1140 1141 | 丹 1141 1142 | 蓉 1142 1143 | 截 1143 1144 | 偏 1144 1145 | 平 1145 1146 | 均 1146 1147 | 幅 1147 1148 | 沪 1148 1149 | 旗 1149 1150 | 奏 1150 1151 | 佑 1151 1152 | 勋 1152 1153 | 捞 1153 1154 | 晨 1154 1155 | 越 1155 1156 | 披 1156 1157 | 浮 1157 1158 | 郁 1158 1159 | 闷 1159 1160 | 忍 1160 1161 | 缩 1161 1162 | 旱 1162 1163 | 涝 1163 1164 | 润 1164 1165 | 距 1165 1166 | 药 1166 1167 | 减 1167 1168 | 九 1168 1169 | 额 1169 1170 | 降 1170 1171 | 低 1171 1172 | 靠 1172 1173 | 错 1173 1174 | 十 1174 1175 | 忧 1175 1176 | 辄 1176 1177 | 厚 1177 1178 | 便 1178 1179 | 鹰 1179 1180 | 盈 1180 1181 | 曝 1181 1182 | 饭 1182 1183 | 存 1183 1184 | 破 1184 1185 | 垫 1185 1186 | 严 1186 1187 | 峻 1187 1188 | 亏 1188 1189 | 损 1189 1190 | 巨 1190 1191 | 沦 1191 1192 | 逃 1192 1193 | 尴 1193 1194 | 尬 1194 1195 | 楼 1195 1196 | 邢 1196 1197 | 飞 1197 1198 | 音 1198 1199 | 凯 1199 1200 | 判 1200 1201 | 歧 1201 1202 | 拳 1202 1203 | 挠 1203 1204 | 痒 1204 1205 | 压 1205 1206 | 藐 1206 1207 | 顶 1207 1208 | 尖 1208 1209 | 豪 1209 1210 | 宅 1210 1211 | 端 1211 1212 | 僵 1212 1213 | 末 1213 1214 | 班 1214 1215 | 车 1215 1216 | 跌 1216 1217 | 庞 1217 1218 | 米 1218 1219 | 销 1219 1220 | 扔 1220 1221 | 簧 1221 1222 | 秤 1222 1223 | 泡 1223 1224 | 沫 1224 1225 | 裁 1225 1226 | 蔡 1226 1227 | 鸿 1227 1228 | 岩 1228 1229 | 冰 1229 1230 | 继 1230 1231 | 颁 1231 1232 | 渠 1232 1233 | 牌 1233 1234 | 闽 1234 1235 | 陶 1235 1236 | 瓷 1236 1237 | 灯 1237 1238 | 隆 1238 1239 | 汇 1239 1240 | 洋 1240 1241 | 耐 1241 1242 | 筑 1242 1243 | 恭 1243 1244 | 倡 1244 1245 | 锁 1245 1246 | 贸 1246 1247 | 厦 1247 1248 | 城 1248 1249 | 园 1249 1250 | 您 1250 1251 | 库 1251 1252 | 舰 1252 1253 | 倾 1253 1254 | 刊 1254 1255 | 掌 1255 1256 | 简 1256 1257 | 句 1257 1258 | 八 1258 1259 | 阐 1259 1260 | 斌 1260 1261 | 梳 1261 1262 | 纸 1262 1263 | 键 1263 1264 | 伍 1264 1265 | 素 1265 1266 | 棒 1266 1267 | 祝 1267 1268 | 贺 1268 1269 | 群 1269 1270 | 斗 1270 1271 | 抱 1271 1272 | 抗 1272 1273 | 隅 1273 1274 | 盛 1274 1275 | 燕 1275 1276 | 莎 1276 1277 | 菜 1277 1278 | 浅 1278 1279 | 致 1279 1280 | 词 1280 1281 | 谐 1281 1282 | 咱 1282 1283 | 零 1283 1284 | 概 1284 1285 | 危 1285 1286 | 够 1286 1287 | 馁 1287 1288 | 坚 1288 1289 | 止 1289 1290 | 食 1290 1291 | 呈 1291 1292 | 邱 1292 1293 | 江 1293 1294 | 泛 1294 1295 | 肥 1295 1296 | 沃 1296 1297 | 土 1297 1298 | 壤 1298 1299 | 吹 1299 1300 | 恨 1300 1301 | S 1301 1302 | 村 1302 1303 | 线 1303 1304 | 昊 1304 1305 | 寸 1305 1306 | p 1306 1307 | 抖 1307 1308 | 镜 1308 1309 | m 1309 1310 | 送 1310 1311 | B 1311 1312 | 储 1312 1313 | 卡 1313 1314 | 膜 1314 1315 | 器 1315 1316 | 池 1316 1317 | X 1317 1318 | R 1318 1319 | 尺 1319 1320 | F 1320 1321 | 沿 1321 1322 | 颗 1322 1323 | L 1323 1324 | 噪 1324 1325 | 辑 1325 1326 | 操 1326 1327 | 陷 1327 1328 | 泥 1328 1329 | 潭 1329 1330 | 冠 1330 1331 | 久 1331 1332 | 泰 1332 1333 | 毅 1333 1334 | 仓 1334 1335 | 属 1335 1336 | 钢 1336 1337 | 铁 1337 1338 | 杜 1338 1339 | 鑫 1339 1340 | 宋 1340 1341 | 罡 1341 1342 | 武 1342 1343 | 派 1343 1344 | 宠 1344 1345 | K 1345 1346 | 穷 1346 1347 | 轮 1347 1348 | 炫 1348 1349 | 悟 1349 1350 | 南 1350 1351 | 永 1351 1352 | 含 1352 1353 | 册 1353 1354 | d 1354 1355 | 载 1355 1356 | 址 1356 1357 | W 1357 1358 | x 1358 1359 | 歌 1359 1360 | 夕 1360 1361 | 浩 1361 1362 | 祖 1362 1363 | 繁 1363 1364 | 唱 1364 1365 | 晚 1365 1366 | 挥 1366 1367 | 练 1367 1368 | 筛 1368 1369 | 曲 1369 1370 | 既 1370 1371 | 胡 1371 1372 | 舞 1372 1373 | 昆 1373 1374 | 曹 1374 1375 | 秀 1375 1376 | 琴 1376 1377 | 献 1377 1378 | 汽 1378 1379 | 店 1379 1380 | 党 1380 1381 | 董 1381 1382 | 晟 1382 1383 | 杰 1383 1384 | 凝 1384 1385 | 聚 1385 1386 | 辈 1386 1387 | 苦 1387 1388 | 奋 1388 1389 | 捆 1389 1390 | 呼 1390 1391 | 奎 1391 1392 | 殷 1392 1393 | 田 1393 1394 | 柯 1394 1395 | 旧 1395 1396 | 瞬 1396 1397 | 塑 1397 1398 | 壳 1398 1399 | 烤 1399 1400 | 漆 1400 1401 | 块 1401 1402 | 屏 1402 1403 | 竟 1403 1404 | 测 1404 1405 | 输 1405 1406 | 晰 1406 1407 | 画 1407 1408 | 凭 1408 1409 | 兄 1409 1410 | 弟 1410 1411 | 娇 1411 1412 | 嫩 1412 1413 | 粉 1413 1414 | 巧 1414 1415 | 妙 1415 1416 | 朵 1416 1417 | 欲 1417 1418 | 尼 1418 1419 | 隐 1419 1420 | 朦 1420 1421 | 胧 1421 1422 | 迸 1422 1423 | 绎 1423 1424 | 狭 1424 1425 | 窄 1425 1426 | V 1426 1427 | 叉 1427 1428 | 湖 1428 1429 | 山 1429 1430 | 魂 1430 1431 | 牵 1431 1432 | 绕 1432 1433 | 仰 1433 1434 | 慕 1434 1435 | 圣 1435 1436 | 闪 1436 1437 | 拜 1437 1438 | 剑 1438 1439 | 溪 1439 1440 | 赐 1440 1441 | 削 1441 1442 | 乃 1442 1443 | 震 1443 1444 | 七 1444 1445 | 襄 1445 1446 | 宫 1446 1447 | 殿 1447 1448 | 父 1448 1449 | 玄 1449 1450 | 抵 1450 1451 | 徒 1451 1452 | 故 1452 1453 | 紫 1453 1454 | 霄 1454 1455 | 诲 1455 1456 | 亡 1456 1457 | 绵 1457 1458 | 崎 1458 1459 | 岖 1459 1460 | 旦 1460 1461 | 坡 1461 1462 | 跳 1462 1463 | 伤 1463 1464 | 扬 1464 1465 | 肯 1465 1466 | q 1466 1467 | k 1467 1468 | 驰 1468 1469 | 律 1469 1470 | 局 1470 1471 | 傍 1471 1472 | 困 1472 1473 | 扰 1473 1474 | 涂 1474 1475 | H 1475 1476 | 昕 1476 1477 | 欧 1477 1478 | 订 1478 1479 | 巴 1479 1480 | 黎 1480 1481 | 侵 1481 1482 | 害 1482 1483 | 秩 1483 1484 | 序 1484 1485 | 凡 1485 1486 | 召 1486 1487 | 劲 1487 1488 | 仿 1488 1489 | 冒 1489 1490 | 赴 1490 1491 | 川 1491 1492 | 省 1492 1493 | 扣 1493 1494 | 嫌 1494 1495 | 阻 1495 1496 | 劣 1496 1497 | 散 1497 1498 | 胁 1498 1499 | 珠 1499 1500 | 占 1500 1501 | 殊 1501 1502 | 契 1502 1503 | 遗 1503 1504 | 惕 1504 1505 | 误 1505 1506 | 阱 1506 1507 | 浦 1507 1508 | 鸡 1508 1509 | 倒 1509 1510 | 闭 1510 1511 | 坊 1511 1512 | 捷 1512 1513 | 径 1513 1514 | 译 1514 1515 | U 1515 1516 | v 1516 1517 | 蔽 1517 1518 | 仔 1518 1519 | 谨 1519 1520 | 慎 1520 1521 | 澳 1521 1522 | 兜 1522 1523 | 洁 1523 1524 | 纠 1524 1525 | 纷 1525 1526 | 皆 1526 1527 | 侣 1527 1528 | 惹 1528 1529 | 郎 1529 1530 | 肤 1530 1531 | 晒 1531 1532 | 铜 1532 1533 | 硕 1533 1534 | 绚 1534 1535 | 烂 1535 1536 | 夷 1536 1537 | 蜜 1537 1538 | 咯 1538 1539 | 忽 1539 1540 | 橙 1540 1541 | 潮 1541 1542 | 凸 1542 1543 | 麦 1543 1544 | 皮 1544 1545 | 缀 1545 1546 | 俏 1546 1547 | 暗 1547 1548 | 亦 1548 1549 | 沉 1549 1550 | 颜 1550 1551 | 添 1551 1552 | 跃 1552 1553 | 暑 1553 1554 | 央 1554 1555 | 织 1555 1556 | 践 1556 1557 | 愉 1557 1558 | 休 1558 1559 | 偿 1559 1560 | 控 1560 1561 | 冶 1561 1562 | 愿 1562 1563 | 乡 1563 1564 | 锻 1564 1565 | 炼 1565 1566 | 遵 1566 1567 | 浏 1567 1568 | 览 1568 1569 | 宜 1569 1570 | 溺 1570 1571 | 封 1571 1572 | 撰 1572 1573 | 龄 1573 1574 | 映 1574 1575 | 辉 1575 1576 | 甲 1576 1577 | 窗 1577 1578 | 挤 1578 1579 | 膳 1579 1580 | 养 1580 1581 | 惯 1581 1582 | 毒 1582 1583 | 童 1583 1584 | 孝 1584 1585 | 篇 1585 1586 | 角 1586 1587 | 史 1587 1588 | 纭 1588 1589 | 弃 1589 1590 | 碧 1590 1591 | 泓 1591 1592 | 静 1592 1593 | 丧 1593 1594 | 莫 1594 1595 | 洲 1595 1596 | 盲 1596 1597 | 妹 1597 1598 | 牙 1598 1599 | 塔 1599 1600 | 苑 1600 1601 | 珂 1601 1602 | 楠 1602 1603 | 怪 1603 1604 | 彼 1604 1605 | 瑞 1605 1606 | 扎 1606 1607 | 堆 1607 1608 | 农 1608 1609 | 霸 1609 1610 | 惊 1610 1611 | 狂 1611 1612 | 停 1612 1613 | 沸 1613 1614 | 腾 1614 1615 | 搜 1615 1616 | 跑 1616 1617 | 凌 1617 1618 | 魔 1618 1619 | 箱 1619 1620 | 疯 1620 1621 | 挡 1621 1622 | 抽 1622 1623 | 砸 1623 1624 | 冲 1624 1625 | J 1625 1626 | Z 1626 1627 | 邮 1627 1628 | 拓 1628 1629 | 妨 1629 1630 | 碍 1630 1631 | 捕 1631 1632 | 捉 1632 1633 | 携 1633 1634 | 硝 1634 1635 | 烟 1635 1636 | 壁 1636 1637 | 羊 1637 1638 | 灰 1638 1639 | 狼 1639 1640 | 播 1640 1641 | 缔 1641 1642 | 惟 1642 1643 | 瞄 1643 1644 | 栏 1644 1645 | 绘 1645 1646 | 衰 1646 1647 | 符 1647 1648 | 醉 1648 1649 | 翁 1649 1650 | 兼 1650 1651 | 佘 1651 1652 | 彬 1652 1653 | 蛋 1653 1654 | 糕 1654 1655 | 掘 1655 1656 | 慧 1656 1657 | 填 1657 1658 | 惠 1658 1659 | 射 1659 1660 | 滨 1660 1661 | 秉 1661 1662 | 餐 1662 1663 | 饮 1663 1664 | 驻 1664 1665 | 轨 1665 1666 | 挖 1666 1667 | 赔 1667 1668 | 煌 1668 1669 | 崛 1669 1670 | 浓 1670 1671 | 辟 1671 1672 | 奥 1672 1673 | 脱 1673 1674 | 颖 1674 1675 | 退 1675 1676 | 换 1676 1677 | 粗 1677 1678 | 幼 1678 1679 | 稚 1679 1680 | 逾 1680 1681 | 跻 1681 1682 | 梯 1682 1683 | 层 1683 1684 | 灾 1684 1685 | 废 1685 1686 | 墟 1686 1687 | 鹿 1687 1688 | 赏 1688 1689 | 悦 1689 1690 | 夜 1690 1691 | 雨 1691 1692 | 笋 1692 1693 | 涌 1693 1694 | 烧 1694 1695 | 臭 1695 1696 | 汪 1696 1697 | 诞 1697 1698 | 赚 1698 1699 | 棚 1699 1700 | 沓 1700 1701 | 踵 1701 1702 | 榜 1702 1703 | 敏 1703 1704 | 锐 1704 1705 | 揽 1705 1706 | 墙 1706 1707 | 循 1707 1708 | 怕 1708 1709 | 悄 1709 1710 | 酝 1710 1711 | 酿 1711 1712 | 缓 1712 1713 | 隔 1713 1714 | 鹤 1714 1715 | 兑 1715 1716 | 捧 1716 1717 | 杯 1717 1718 | 吗 1718 1719 | 掷 1719 1720 | 勇 1720 1721 | 冷 1721 1722 | 厌 1722 1723 | 烦 1723 1724 | 逼 1724 1725 | 暖 1725 1726 | 搅 1726 1727 | 宁 1727 1728 | 焊 1728 1729 | 裂 1729 1730 | 鼠 1730 1731 | 趴 1731 1732 | 撤 1732 1733 | 津 1733 1734 | 歇 1734 1735 | 顿 1735 1736 | 慌 1736 1737 | 闻 1737 1738 | 斩 1738 1739 | 钉 1739 1740 | 拨 1740 1741 | 遭 1741 1742 | 役 1742 1743 | 矮 1743 1744 | 干 1744 1745 | 拒 1745 1746 | 恶 1746 1747 | 铺 1747 1748 | 抛 1748 1749 | 潜 1749 1750 | 默 1750 1751 | 颠 1751 1752 | 覆 1752 1753 | 早 1753 1754 | 矩 1754 1755 | 哪 1755 1756 | 剩 1756 1757 | 麻 1757 1758 | 鼻 1758 1759 | 渗 1759 1760 | 扫 1760 1761 | 淘 1761 1762 | 洗 1762 1763 | 撑 1763 1764 | 壮 1764 1765 | 秋 1765 1766 | 旋 1766 1767 | 肆 1767 1768 | 忌 1768 1769 | 惮 1769 1770 | 毫 1770 1771 | 败 1771 1772 | 毛 1772 1773 | 温 1773 1774 | 剪 1774 1775 | 飒 1775 1776 | 靴 1776 1777 | 袜 1777 1778 | 妮 1778 1779 | 帕 1779 1780 | 洛 1780 1781 | 牛 1781 1782 | 裤 1782 1783 | 夹 1783 1784 | 拖 1784 1785 | 敞 1785 1786 | 巾 1786 1787 | 肃 1787 1788 | 泼 1788 1789 | 垂 1789 1790 | 衫 1790 1791 | 蒙 1791 1792 | 沈 1792 1793 | 吕 1793 1794 | 唐 1794 1795 | 咸 1795 1796 | 坏 1796 1797 | 浙 1797 1798 | 垮 1798 1799 | 耗 1799 1800 | 竣 1800 1801 | 针 1801 1802 | 腐 1802 1803 | 兆 1803 1804 | 肋 1804 1805 | 搞 1805 1806 | 掉 1806 1807 | 犀 1807 1808 | 寨 1808 1809 | 虎 1809 1810 | 寒 1810 1811 | 鬼 1811 1812 | 鳞 1812 1813 | 腿 1813 1814 | 雷 1814 1815 | 袍 1815 1816 | 盔 1816 1817 | 祥 1817 1818 | 铠 1818 1819 | 芒 1819 1820 | 恰 1820 1821 | 棕 1821 1822 | 缝 1822 1823 | 凉 1823 1824 | 飘 1824 1825 | 振 1825 1826 | 遥 1826 1827 | 欠 1827 1828 | 辣 1828 1829 | 旺 1829 1830 | 缤 1830 1831 | 缭 1831 1832 | 草 1832 1833 | Q 1833 1834 | 敌 1834 1835 | 棉 1835 1836 | 栗 1836 1837 | 雪 1837 1838 | 庸 1838 1839 | 闲 1839 1840 | Y 1840 1841 | 诠 1841 1842 | 删 1842 1843 | 档 1843 1844 | 帐 1844 1845 | 撼 1845 1846 | 磅 1846 1847 | 替 1847 1848 | 纱 1848 1849 | 寻 1849 1850 | 斥 1850 1851 | 畅 1851 1852 | 诗 1852 1853 | 虚 1853 1854 | 擎 1854 1855 | 淀 1855 1856 | 槛 1856 1857 | 匹 1857 1858 | 恼 1858 1859 | 袤 1859 1860 | 卓 1860 1861 | 罕 1861 1862 | 阔 1862 1863 | 藏 1863 1864 | 杀 1864 1865 | 纵 1865 1866 | 横 1866 1867 | 谜 1867 1868 | 敢 1868 1869 | 虑 1869 1870 | 诸 1870 1871 | 窟 1871 1872 | 猎 1872 1873 | 菲 1873 1874 | 厉 1874 1875 | 驱 1875 1876 | 赶 1876 1877 | 叹 1877 1878 | 璧 1878 1879 | 县 1879 1880 | 堰 1880 1881 | 栋 1881 1882 | 坝 1882 1883 | 俱 1883 1884 | 辆 1884 1885 | 稀 1885 1886 | 邹 1886 1887 | 治 1887 1888 | 郊 1888 1889 | 雇 1889 1890 | 蔬 1890 1891 | 亩 1891 1892 | 斤 1892 1893 | 忠 1893 1894 | 邻 1894 1895 | 窍 1895 1896 | 塞 1896 1897 | 胳 1897 1898 | 膊 1898 1899 | 姐 1899 1900 | 姣 1900 1901 | 纤 1901 1902 | 伟 1902 1903 | 廉 1903 1904 | 噱 1904 1905 | 攀 1905 1906 | 刀 1906 1907 | 芯 1907 1908 | 桌 1908 1909 | 兰 1909 1910 | 亭 1910 1911 | 幻 1911 1912 | 艾 1912 1913 | 貂 1913 1914 | 犹 1914 1915 | 豫 1915 1916 | 申 1916 1917 | 刑 1917 1918 | 孤 1918 1919 | 狱 1919 1920 | 疏 1920 1921 | 猝 1921 1922 | 玉 1922 1923 | 晃 1923 1924 | 枪 1924 1925 | 弘 1925 1926 | 棘 1926 1927 | 阴 1927 1928 | 悬 1928 1929 | 渊 1929 1930 | 堡 1930 1931 | 湾 1931 1932 | 荒 1932 1933 | 丛 1933 1934 | 傅 1934 1935 | 啥 1935 1936 | 啊 1936 1937 | 扯 1937 1938 | 淡 1938 1939 | 侧 1939 1940 | 咨 1940 1941 | 仪 1941 1942 | 允 1942 1943 | 潘 1943 1944 | 婉 1944 1945 | 罩 1945 1946 | 戴 1946 1947 | 瞪 1947 1948 | 呆 1948 1949 | 骑 1949 1950 | 猬 1950 1951 | 缚 1951 1952 | 犯 1952 1953 | 臂 1953 1954 | 恐 1954 1955 | 怖 1955 1956 | 纳 1956 1957 | 吉 1957 1958 | 莹 1958 1959 | 乞 1959 1960 | 奚 1960 1961 | 仲 1961 1962 | 翅 1962 1963 | 羽 1963 1964 | 胆 1964 1965 | 霍 1965 1966 | 棍 1966 1967 | 酷 1967 1968 | 俗 1968 1969 | 脍 1969 1970 | 炙 1970 1971 | 灌 1971 1972 | 逸 1972 1973 | 尘 1973 1974 | 衷 1974 1975 | 瞩 1975 1976 | 猜 1976 1977 | 懒 1977 1978 | 宇 1978 1979 | 丈 1979 1980 | 娘 1980 1981 | 嫁 1981 1982 | 丁 1982 1983 | 馨 1983 1984 | 娶 1984 1985 | 昌 1985 1986 | 剖 1986 1987 | 婚 1987 1988 | 锅 1988 1989 | 爹 1989 1990 | 屈 1990 1991 | 疼 1991 1992 | 孙 1992 1993 | 谱 1993 1994 | 捂 1994 1995 | 喻 1995 1996 | 猪 1996 1997 | 衡 1997 1998 | 汉 1998 1999 | 姑 1999 2000 | 奴 2000 2001 | 努 2001 2002 | 沾 2002 2003 | 梁 2003 2004 | 朽 2004 2005 | 睹 2005 2006 | 尹 2006 2007 | 侯 2007 2008 | 耕 2008 2009 | 急 2009 2010 | 伊 2010 2011 | 厄 2011 2012 | 槟 2012 2013 | 纽 2013 2014 | 俄 2014 2015 | 亥 2015 2016 | 莠 2016 2017 | 详 2017 2018 | 骤 2018 2019 | 豹 2019 2020 | 琪 2020 2021 | 卧 2021 2022 | 累 2022 2023 | 轰 2023 2024 | 茅 2024 2025 | 傻 2025 2026 | 瓜 2026 2027 | 愚 2027 2028 | 蠢 2028 2029 | 盆 2029 2030 | 栽 2030 2031 | 碑 2031 2032 | 懵 2032 2033 | 懂 2033 2034 | 敖 2034 2035 | 犬 2035 2036 | 莱 2036 2037 | 坞 2037 2038 | 炒 2038 2039 | 驯 2039 2040 | 畏 2040 2041 | 惧 2041 2042 | 勾 2042 2043 | 鸣 2043 2044 | 贤 2044 2045 | 挣 2045 2046 | 乏 2046 2047 | 搏 2047 2048 | 溯 2048 2049 | 茨 2049 2050 | 蕾 2050 2051 | 薇 2051 2052 | 悚 2052 2053 | 阿 2053 2054 | 汤 2054 2055 | 嫂 2055 2056 | 蒂 2056 2057 | 猛 2057 2058 | 琛 2058 2059 | 晶 2059 2060 | 婷 2060 2061 | 贾 2061 2062 | 汀 2062 2063 | 伯 2063 2064 | 弗 2064 2065 | 乍 2065 2066 | 恒 2066 2067 | 陌 2067 2068 | 狰 2068 2069 | 狞 2069 2070 | 辅 2070 2071 | 飙 2071 2072 | 挂 2072 2073 | 液 2073 2074 | 鞍 2074 2075 | 桃 2075 2076 | 魏 2076 2077 | 君 2077 2078 | 虹 2078 2079 | 渝 2079 2080 | 拷 2080 2081 | 贝 2081 2082 | 苛 2082 2083 | 罚 2083 2084 | 娄 2084 2085 | 烨 2085 2086 | 颐 2086 2087 | 戛 2087 2088 | 吵 2088 2089 | 闹 2089 2090 | 楚 2090 2091 | 糊 2091 2092 | 匆 2092 2093 | 稿 2093 2094 | 恢 2094 2095 | 哨 2095 2096 | 爵 2096 2097 | 森 2097 2098 | 狈 2098 2099 | 贡 2099 2100 | 榷 2100 2101 | 扳 2101 2102 | 埃 2102 2103 | 扛 2103 2104 | 锲 2104 2105 | 贫 2105 2106 | 唯 2106 2107 | 鹏 2107 2108 | 孟 2108 2109 | 柱 2109 2110 | 挚 2110 2111 | 赋 2111 2112 | 奉 2112 2113 | 赖 2113 2114 | 贯 2114 2115 | 邓 2115 2116 | 懈 2116 2117 | 摇 2117 2118 | 锦 2118 2119 | 涛 2119 2120 | 襟 2120 2121 | 睦 2121 2122 | 涣 2122 2123 | 岗 2123 2124 | 兢 2124 2125 | 矛 2125 2126 | 盾 2126 2127 | 牢 2127 2128 | 树 2128 2129 | 尝 2129 2130 | 稍 2130 2131 | 乘 2131 2132 | 吾 2132 2133 | 匾 2133 2134 | 陪 2134 2135 | 媲 2135 2136 | 赵 2136 2137 | 隶 2137 2138 | 壹 2138 2139 | 缴 2139 2140 | 兽 2140 2141 | 湛 2141 2142 | 靓 2142 2143 | 牧 2143 2144 | 孵 2144 2145 | 馈 2145 2146 | 淮 2146 2147 | 耘 2147 2148 | 估 2148 2149 | 慨 2149 2150 | 滞 2150 2151 | 刃 2151 2152 | 挺 2152 2153 | 株 2153 2154 | 暨 2154 2155 | 崭 2155 2156 | 迄 2156 2157 | 辖 2157 2158 | 崔 2158 2159 | 递 2159 2160 | 宗 2160 2161 | 医 2161 2162 | 慈 2162 2163 | 擦 2163 2164 | 硅 2164 2165 | 劫 2165 2166 | 仑 2166 2167 | 叱 2167 2168 | 咤 2168 2169 | 蕴 2169 2170 | 邃 2170 2171 | 啧 2171 2172 | 铸 2172 2173 | 犸 2173 2174 | 峡 2174 2175 | 秦 2175 2176 | 锡 2176 2177 | 麟 2177 2178 | 滴 2178 2179 | 桶 2179 2180 | 霉 2180 2181 | 隙 2181 2182 | 氨 2182 2183 | 酯 2183 2184 | 燥 2184 2185 | 刷 2185 2186 | 湿 2186 2187 | 砖 2187 2188 | 诛 2188 2189 | 鄙 2189 2190 | 疗 2190 2191 | 奶 2191 2192 | 妈 2192 2193 | 瓶 2193 2194 | 呐 2194 2195 | 晕 2195 2196 | 扇 2196 2197 | 冻 2197 2198 | 蓄 2198 2199 | 殖 2199 2200 | 隋 2200 2201 | 讼 2201 2202 | 谅 2202 2203 | 妥 2203 2204 | 尊 2204 2205 | 芝 2205 2206 | 哥 2206 2207 | 甘 2207 2208 | 泽 2208 2209 | 乔 2209 2210 | 勒 2210 2211 | 桑 2211 2212 | 翰 2212 2213 | 帅 2213 2214 | 肘 2214 2215 | 扼 2215 2216 | 救 2216 2217 | 驾 2217 2218 | 朱 2218 2219 | 臣 2219 2220 | 迪 2220 2221 | 恩 2221 2222 | 耶 2222 2223 | 糙 2223 2224 | 辜 2224 2225 | 泪 2225 2226 | 讶 2226 2227 | 涯 2227 2228 | 慑 2228 2229 | 荡 2229 2230 | 丢 2230 2231 | 痛 2231 2232 | 咕 2232 2233 | 哒 2233 2234 | 航 2234 2235 | 柳 2235 2236 | 晓 2236 2237 | 聪 2237 2238 | 骄 2238 2239 | 傲 2239 2240 | 佩 2240 2241 | 颇 2241 2242 | 凑 2242 2243 | 滤 2243 2244 | 滕 2244 2245 | 愈 2245 2246 | 寞 2246 2247 | 枕 2247 2248 | 怜 2248 2249 | 仙 2249 2250 | 闺 2250 2251 | 坑 2251 2252 | 惨 2252 2253 | 劈 2253 2254 | 旁 2254 2255 | 悲 2255 2256 | 叛 2256 2257 | 贱 2257 2258 | 嘴 2258 2259 | 貌 2259 2260 | 蜗 2260 2261 | 藻 2261 2262 | 漂 2262 2263 | 暧 2263 2264 | 昧 2264 2265 | 俩 2265 2266 | 豆 2266 2267 | 裸 2267 2268 | 趟 2268 2269 | 荧 2269 2270 | 遣 2270 2271 | 鱼 2271 2272 | 腩 2272 2273 | 堪 2273 2274 | 妞 2274 2275 | 筒 2275 2276 | 踝 2276 2277 | 吊 2277 2278 | 乖 2278 2279 | 帖 2279 2280 | 冈 2280 2281 | 箭 2281 2282 | 萨 2282 2283 | 鞭 2283 2284 | 玛 2284 2285 | 喝 2285 2286 | 谊 2286 2287 | 绪 2287 2288 | 兔 2288 2289 | 帽 2289 2290 | 灿 2290 2291 | 诧 2291 2292 | 暇 2292 2293 | 卢 2293 2294 | 聆 2294 2295 | 募 2295 2296 | 浇 2296 2297 | 夭 2297 2298 | 禹 2298 2299 | 刮 2299 2300 | 蹿 2300 2301 | 肌 2301 2302 | 返 2302 2303 | 驼 2303 2304 | 珑 2304 2305 | 咖 2305 2306 | 啡 2306 2307 | 魁 2307 2308 | 梧 2308 2309 | 淑 2309 2310 | 杏 2310 2311 | 髦 2311 2312 | 遮 2312 2313 | 臀 2313 2314 | 骼 2314 2315 | 呦 2315 2316 | 镂 2316 2317 | 插 2317 2318 | 赠 2318 2319 | 徕 2319 2320 | 炉 2320 2321 | 咏 2321 2322 | 旭 2322 2323 | 谦 2323 2324 | 钊 2324 2325 | 阎 2325 2326 | 溢 2326 2327 | 妻 2327 2328 | 瞿 2328 2329 | 爸 2329 2330 | 筋 2330 2331 | 逊 2331 2332 | 援 2332 2333 | 摊 2333 2334 | 魄 2334 2335 | 赌 2335 2336 | 楞 2336 2337 | 残 2337 2338 | 癫 2338 2339 | 萌 2339 2340 | 挽 2340 2341 | 崩 2341 2342 | 溃 2342 2343 | 芭 2343 2344 | 霹 2344 2345 | 雳 2345 2346 | 汗 2346 2347 | 淋 2347 2348 | 漓 2348 2349 | 欺 2349 2350 | 滔 2350 2351 | 呀 2351 2352 | 喃 2352 2353 | 辗 2353 2354 | 酸 2354 2355 | 潸 2355 2356 | 愧 2356 2357 | 疚 2357 2358 | 炖 2358 2359 | 滋 2359 2360 | 朔 2360 2361 | 钮 2361 2362 | 彭 2362 2363 | 翔 2363 2364 | 姚 2364 2365 | 冯 2365 2366 | 轩 2366 2367 | 釜 2367 2368 | 韩 2368 2369 | 姜 2369 2370 | 圭 2370 2371 | 串 2371 2372 | 埋 2372 2373 | 偷 2373 2374 | 奔 2374 2375 | 涩 2375 2376 | 烁 2376 2377 | 抬 2377 2378 | 摸 2378 2379 | 寂 2379 2380 | 陨 2380 2381 | 彷 2381 2382 | 璀 2382 2383 | 璨 2383 2384 | 掀 2384 2385 | 镶 2385 2386 | 嵌 2386 2387 | 谋 2387 2388 | 孔 2388 2389 | 御 2389 2390 | 喊 2390 2391 | 吼 2391 2392 | 催 2392 2393 | 僧 2393 2394 | 粥 2394 2395 | 邦 2395 2396 | 逝 2396 2397 | 押 2397 2398 | 躺 2398 2399 | 病 2399 2400 | 床 2400 2401 | 呻 2401 2402 | 吟 2402 2403 | 闯 2403 2404 | 挨 2404 2405 | 殴 2405 2406 | 拦 2406 2407 | 肿 2407 2408 | 戚 2408 2409 | 祸 2409 2410 | 瘦 2410 2411 | 扭 2411 2412 | 钦 2412 2413 | 瓦 2413 2414 | 污 2414 2415 | 垢 2415 2416 | 杉 2416 2417 | 矶 2417 2418 | 染 2418 2419 | 堵 2419 2420 | 愁 2420 2421 | 丑 2421 2422 | 陋 2422 2423 | 贪 2423 2424 | 渎 2424 2425 | 贿 2425 2426 | 罪 2426 2427 | 滥 2427 2428 | 敲 2428 2429 | 犒 2429 2430 | 诏 2430 2431 | 乾 2431 2432 | 坤 2432 2433 | 绣 2433 2434 | 慷 2434 2435 | 氏 2435 2436 | 梅 2436 2437 | 岐 2437 2438 | 厅 2438 2439 | 枉 2439 2440 | 脉 2440 2441 | 宕 2441 2442 | 伏 2442 2443 | 娟 2443 2444 | 圳 2444 2445 | 嘲 2445 2446 | 猴 2446 2447 | 旬 2447 2448 | 鸭 2448 2449 | 徘 2449 2450 | 徊 2450 2451 | 抄 2451 2452 | 糟 2452 2453 | 眉 2453 2454 | 吐 2454 2455 | 喘 2455 2456 | 赎 2456 2457 | 搬 2457 2458 | 厨 2458 2459 | 迫 2459 2460 | 潢 2460 2461 | 脏 2461 2462 | 橱 2462 2463 | 柜 2463 2464 | 芬 2464 2465 | 船 2465 2466 | 悍 2466 2467 | 胶 2467 2468 | 逢 2468 2469 | 玫 2469 2470 | 瑰 2470 2471 | 嗜 2471 2472 | 颓 2472 2473 | 油 2473 2474 | _ 2474 2475 | 漠 2475 2476 | 凤 2476 2477 | 冼 2477 2478 | 熙 2478 2479 | 惜 2479 2480 | 疤 2480 2481 | 痕 2481 2482 | 忘 2482 2483 | 狐 2483 2484 | 扑 2484 2485 | 俨 2485 2486 | 邪 2486 2487 | 唤 2487 2488 | 珍 2488 2489 | 聊 2489 2490 | 姻 2490 2491 | 礴 2491 2492 | 妍 2492 2493 | 谷 2493 2494 | 灼 2494 2495 | 阂 2495 2496 | 袱 2496 2497 | 茂 2497 2498 | 剂 2498 2499 | 纲 2499 2500 | 顷 2500 2501 | 矿 2501 2502 | 斜 2502 2503 | 刹 2503 2504 | 绰 2504 2505 | 囤 2505 2506 | 牺 2506 2507 | 牲 2507 2508 | 迁 2508 2509 | 擅 2509 2510 | 垄 2510 2511 | 赤 2511 2512 | 蜀 2512 2513 | 雒 2513 2514 | 戒 2514 2515 | 庚 2515 2516 | 洪 2516 2517 | 吁 2517 2518 | 挪 2518 2519 | 梨 2519 2520 | 睡 2520 2521 | 澡 2521 2522 | 逛 2522 2523 | 谣 2523 2524 | 晗 2524 2525 | 谭 2525 2526 | 钩 2526 2527 | 癌 2527 2528 | 腹 2528 2529 | 浆 2529 2530 | 税 2530 2531 | 胞 2531 2532 | 渡 2532 2533 | 哀 2533 2534 | 祈 2534 2535 | 哭 2535 2536 | 祷 2536 2537 | 蝉 2537 2538 | 狮 2538 2539 | 巫 2539 2540 | 钵 2540 2541 | 骇 2541 2542 | 炸 2542 2543 | 兹 2543 2544 | 囚 2544 2545 | 袭 2545 2546 | 症 2546 2547 | 卦 2547 2548 | 瞻 2548 2549 | 莉 2549 2550 | 琳 2550 2551 | 娅 2551 2552 | 珊 2552 2553 | 傀 2553 2554 | 儡 2554 2555 | 譬 2555 2556 | 吆 2556 2557 | 觑 2557 2558 | 棺 2558 2559 | 舛 2559 2560 | 椅 2560 2561 | 攫 2561 2562 | 蜘 2562 2563 | 蛛 2563 2564 | 憾 2564 2565 | 镁 2565 2566 | 铝 2566 2567 | 柄 2567 2568 | 磁 2568 2569 | 杆 2569 2570 | 棋 2570 2571 | 俊 2571 2572 | 啦 2572 2573 | 噢 2573 2574 | 炮 2574 2575 | 炯 2575 2576 | 汲 2576 2577 | 狠 2577 2578 | 鲨 2578 2579 | 冕 2579 2580 | 卯 2580 2581 | 俎 2581 2582 | 甩 2582 2583 | 陀 2583 2584 | 螺 2584 2585 | 弯 2585 2586 | 凛 2586 2587 | 冽 2587 2588 | 篷 2588 2589 | 浑 2589 2590 | 昂 2590 2591 | 膝 2591 2592 | 蝙 2592 2593 | 蝠 2593 2594 | 喇 2594 2595 | 铆 2595 2596 | 腕 2596 2597 | 凳 2597 2598 | 嗯 2598 2599 | 蔚 2599 2600 | 啼 2600 2601 | 谴 2601 2602 | 熄 2602 2603 | 粘 2603 2604 | 弥 2604 2605 | 扁 2605 2606 | 卸 2606 2607 | 恬 2607 2608 | 弊 2608 2609 | 怡 2609 2610 | 侦 2610 2611 | 钥 2611 2612 | 匙 2612 2613 | 垃 2613 2614 | 圾 2614 2615 | 祭 2615 2616 | 捡 2616 2617 | 啸 2617 2618 | 乌 2618 2619 | 蛟 2619 2620 | 玑 2620 2621 | 皓 2621 2622 | 杠 2622 2623 | 雕 2623 2624 | 蛇 2624 2625 | 婆 2625 2626 | 嘿 2626 2627 | 绸 2627 2628 | 腥 2628 2629 | 徽 2629 2630 | 囊 2630 2631 | 磨 2631 2632 | 砺 2632 2633 | 缘 2633 2634 | 乳 2634 2635 | 抉 2635 2636 | 闫 2636 2637 | 铮 2637 2638 | 倘 2638 2639 | 巷 2639 2640 | 蒋 2640 2641 | 窘 2641 2642 | 彦 2642 2643 | 萍 2643 2644 | 泉 2644 2645 | 龚 2645 2646 | 睁 2646 2647 | 蹦 2647 2648 | 倦 2648 2649 | 陡 2649 2650 | 噩 2650 2651 | 眠 2651 2652 | 翩 2652 2653 | 蹈 2653 2654 | 穆 2654 2655 | 奢 2655 2656 | 碎 2656 2657 | 匠 2657 2658 | 卉 2658 2659 | 纺 2659 2660 | 锥 2660 2661 | 蜕 2661 2662 | 屐 2662 2663 | 叠 2663 2664 | 肇 2664 2665 | 粒 2665 2666 | 胎 2666 2667 | 掣 2667 2668 | 吨 2668 2669 | 驶 2669 2670 | 屯 2670 2671 | 芸 2671 2672 | 殆 2672 2673 | 奄 2673 2674 | 厢 2674 2675 | 舌 2675 2676 | 喉 2676 2677 | 拆 2677 2678 | 拯 2678 2679 | 熏 2679 2680 | 昏 2680 2681 | 莞 2681 2682 | 镑 2682 2683 | 咋 2683 2684 | 昔 2684 2685 | 骋 2685 2686 | 赫 2686 2687 | 璐 2687 2688 | 婧 2688 2689 | 嘘 2689 2690 | 骂 2690 2691 | 仗 2691 2692 | 燃 2692 2693 | 狙 2693 2694 | 琅 2694 2695 | 瑟 2695 2696 | 哑 2696 2697 | 娃 2697 2698 | 姗 2698 2699 | 迟 2699 2700 | 窃 2700 2701 | 巩 2701 2702 | 俐 2702 2703 | 阖 2703 2704 | 硫 2704 2705 | 磺 2705 2706 | 焰 2706 2707 | 患 2707 2708 | 寐 2708 2709 | 杵 2709 2710 | 冥 2710 2711 | 匮 2711 2712 | 碜 2712 2713 | 綮 2713 2714 | 糖 2714 2715 | 矫 2715 2716 | 橇 2716 2717 | 颈 2717 2718 | 茫 2718 2719 | 宛 2719 2720 | 粲 2720 2721 | 黯 2721 2722 | 岂 2722 2723 | 唏 2723 2724 | 枯 2724 2725 | 讽 2725 2726 | 抚 2726 2727 | 拙 2727 2728 | 蹋 2728 2729 | 桩 2729 2730 | 帘 2730 2731 | 锯 2731 2732 | 灭 2732 2733 | 昭 2733 2734 | 姬 2734 2735 | 珀 2735 2736 | 悔 2736 2737 | 弦 2737 2738 | 谍 2738 2739 | 烹 2739 2740 | 佐 2740 2741 | 涤 2741 2742 | 恳 2742 2743 | 脆 2743 2744 | 睛 2744 2745 | 鼎 2745 2746 | 裔 2746 2747 | 贞 2747 2748 | 朴 2748 2749 | 抑 2749 2750 | 佬 2750 2751 | 鲍 2751 2752 | 堕 2752 2753 | 墅 2753 2754 | 钓 2754 2755 | 阮 2755 2756 | 恤 2756 2757 | 晤 2757 2758 | 磋 2758 2759 | 芮 2759 2760 | 铉 2760 2761 | 羁 2761 2762 | 愫 2762 2763 | 艇 2763 2764 | 剔 2764 2765 | 袋 2765 2766 | 瞳 2766 2767 | 吓 2767 2768 | 侨 2768 2769 | 榈 2769 2770 | 睿 2770 2771 | 黝 2771 2772 | 捐 2772 2773 | 恙 2773 2774 | 巅 2774 2775 | 砍 2775 2776 | 苹 2776 2777 | 砂 2777 2778 | 弧 2778 2779 | 腊 2779 2780 | 哲 2780 2781 | 骷 2781 2782 | 髅 2782 2783 | 薰 2783 2784 | 橄 2784 2785 | 榄 2785 2786 | 苯 2786 2787 | 氰 2787 2788 | 醛 2788 2789 | 溶 2789 2790 | 罐 2790 2791 | 勿 2791 2792 | 亳 2792 2793 | 瀑 2793 2794 | 蛮 2794 2795 | 帷 2795 2796 | 揉 2796 2797 | 穴 2797 2798 | 谕 2798 2799 | 妤 2799 2800 | 婿 2800 2801 | 钧 2801 2802 | 芳 2802 2803 | 蕊 2803 2804 | 栾 2804 2805 | 聂 2805 2806 | 摘 2806 2807 | 饶 2807 2808 | 诈 2808 2809 | 骏 2809 2810 | 逞 2810 2811 | 锂 2811 2812 | 盒 2812 2813 | 棱 2813 2814 | 槽 2814 2815 | 仕 2815 2816 | 疆 2816 2817 | 厥 2817 2818 | 帜 2818 2819 | 缉 2819 2820 | 枷 2820 2821 | 夸 2821 2822 | 屑 2822 2823 | 掏 2823 2824 | 攒 2824 2825 | 饼 2825 2826 | 翼 2826 2827 | 冗 2827 2828 | 蛊 2828 2829 | 厘 2829 2830 | 苗 2830 2831 | 柴 2831 2832 | 誓 2832 2833 | 唉 2833 2834 | 忐 2834 2835 | 忑 2835 2836 | 踩 2836 2837 | 鞠 2837 2838 | 躬 2838 2839 | 煎 2839 2840 | 脾 2840 2841 | 屁 2841 2842 | 叮 2842 2843 | 嘱 2843 2844 | 碳 2844 2845 | 辍 2845 2846 | 泊 2846 2847 | 尸 2847 2848 | 毗 2848 2849 | 铧 2849 2850 | 巡 2850 2851 | 茶 2851 2852 | 翌 2852 2853 | 萝 2853 2854 | 泣 2854 2855 | 哟 2855 2856 | 侃 2856 2857 | 涟 2857 2858 | 漪 2858 2859 | 宰 2859 2860 | 妄 2860 2861 | 窦 2861 2862 | 橡 2862 2863 | 夙 2863 2864 | 偃 2864 2865 | 亘 2865 2866 | 躯 2866 2867 | 沮 2867 2868 | 塌 2868 2869 | 裹 2869 2870 | 椭 2870 2871 | 疾 2871 2872 | 勉 2872 2873 | 菱 2873 2874 | 悸 2874 2875 | 亨 2875 2876 | 藤 2876 2877 | 嗣 2877 2878 | 澜 2878 2879 | 匿 2879 2880 | 撮 2880 2881 | 萎 2881 2882 | 凰 2882 2883 | 蝗 2883 2884 | 虫 2884 2885 | 伐 2885 2886 | 寿 2886 2887 | 釉 2887 2888 | 韧 2888 2889 | 匀 2889 2890 | 丫 2890 2891 | 饱 2891 2892 | 瞎 2892 2893 | 悠 2893 2894 | 狗 2894 2895 | 揪 2895 2896 | 贬 2896 2897 | 毯 2897 2898 | 滚 2898 2899 | 脯 2899 2900 | 瞧 2900 2901 | 嗨 2901 2902 | 腋 2902 2903 | 坨 2903 2904 | 趁 2904 2905 | 劝 2905 2906 | 橘 2906 2907 | 刨 2907 2908 | 赘 2908 2909 | 鸳 2909 2910 | 鸯 2910 2911 | 泄 2911 2912 | 脂 2912 2913 | 枣 2913 2914 | 脖 2914 2915 | 驭 2915 2916 | 呛 2916 2917 | 鹦 2917 2918 | 鹉 2918 2919 | 寡 2919 2920 | 嘛 2920 2921 | 萄 2921 2922 | 葡 2922 2923 | 菌 2923 2924 | 篱 2924 2925 | 拇 2925 2926 | 驴 2926 2927 | 爬 2927 2928 | 芹 2928 2929 | 茄 2929 2930 | 羡 2930 2931 | 佼 2931 2932 | 狄 2932 2933 | 晋 2933 2934 | 轴 2934 2935 | 倪 2935 2936 | 觊 2936 2937 | 觎 2937 2938 | 莘 2938 2939 | 诋 2939 2940 | 毁 2940 2941 | 绅 2941 2942 | 憧 2942 2943 | 憬 2943 2944 | 渔 2944 2945 | 盯 2945 2946 | 诵 2946 2947 | 夯 2947 2948 | 垒 2948 2949 | 函 2949 2950 | 惶 2950 2951 | 荆 2951 2952 | 捶 2952 2953 | 锤 2953 2954 | 瓣 2954 2955 | 侈 2955 2956 | 葵 2956 2957 | 舟 2957 2958 | 怨 2958 2959 | 躲 2959 2960 | 汰 2960 2961 | 椒 2961 2962 | 韭 2962 2963 | 柠 2963 2964 | 檬 2964 2965 | 饲 2965 2966 | 喂 2966 2967 | 葱 2967 2968 | 莓 2968 2969 | 椿 2969 2970 | 芽 2970 2971 | 睫 2971 2972 | 氧 2972 2973 | 翊 2973 2974 | 爪 2974 2975 | 郦 2975 2976 | 纾 2976 2977 | 翟 2977 2978 | 杭 2978 2979 | 炜 2979 2980 | 旷 2980 2981 | 奸 2981 2982 | 辕 2982 2983 | 嘈 2983 2984 | 颂 2984 2985 | 拮 2985 2986 | 卑 2986 2987 | 枢 2987 2988 | 饺 2988 2989 | 盼 2989 2990 | 寅 2990 2991 | 粮 2991 2992 | 窝 2992 2993 | 蜂 2993 2994 | 衅 2994 2995 | 镖 2995 2996 | 笛 2996 2997 | 羞 2997 2998 | 辱 2998 2999 | 嗑 2999 3000 | 雹 3000 3001 | 獒 3001 3002 | 踉 3002 3003 | 跄 3003 3004 | 摔 3004 3005 | 崖 3005 3006 | 棵 3006 3007 | 桂 3007 3008 | 纶 3008 3009 | 诶 3009 3010 | 淇 3010 3011 | 郝 3011 3012 | 郅 3012 3013 | 磊 3013 3014 | 闵 3014 3015 | 葬 3015 3016 | 冤 3016 3017 | 锈 3017 3018 | 岭 3018 3019 | 遴 3019 3020 | 肠 3020 3021 | 胃 3021 3022 | 肝 3022 3023 | 屹 3023 3024 | 苍 3024 3025 | 牟 3025 3026 | 绌 3026 3027 | 缠 3027 3028 | 熠 3028 3029 | 汶 3029 3030 | 敛 3030 3031 | 甄 3031 3032 | 暌 3032 3033 | 搔 3033 3034 | 肖 3034 3035 | 溅 3035 3036 | 宙 3036 3037 | 谙 3037 3038 | 佣 3038 3039 | 黛 3039 3040 | 溜 3040 3041 | 淳 3041 3042 | 腔 3042 3043 | 妒 3043 3044 | 喷 3044 3045 | 锣 3045 3046 | 拾 3046 3047 | 焕 3047 3048 | 翘 3048 3049 | 袂 3049 3050 | 僻 3050 3051 | 遏 3051 3052 | 觅 3052 3053 | 蔓 3053 3054 | 麓 3054 3055 | 喽 3055 3056 | 痴 3056 3057 | 茯 3057 3058 | 苓 3058 3059 | 龟 3059 3060 | 岔 3060 3061 | 驮 3061 3062 | 鸟 3062 3063 | 臧 3063 3064 | 蓟 3064 3065 | 竭 3065 3066 | 顽 3066 3067 | 哽 3067 3068 | 咽 3068 3069 | 瘸 3069 3070 | 瘟 3070 3071 | 逗 3071 3072 | 蓓 3072 3073 | 羹 3073 3074 | 窒 3074 3075 | 雾 3075 3076 | 磐 3076 3077 | 竖 3077 3078 | 罢 3078 3079 | 猕 3079 3080 | 厝 3080 3081 | 榻 3081 3082 | 碗 3082 3083 | 撇 3083 3084 | 劭 3084 3085 | 歹 3085 3086 | 竹 3086 3087 | 艋 3087 3088 | 憨 3088 3089 | 甫 3089 3090 | 昼 3090 3091 | 涅 3091 3092 | 贩 3092 3093 | 猖 3093 3094 | 獗 3094 3095 | 虐 3095 3096 | 捍 3096 3097 | 膘 3097 3098 | 髓 3098 3099 | 扶 3099 3100 | 嫦 3100 3101 | 娥 3101 3102 | 嚣 3102 3103 | 廓 3103 3104 | 缎 3104 3105 | 铅 3105 3106 | 倩 3106 3107 | 贰 3107 3108 | 婴 3108 3109 | 陕 3109 3110 | 黏 3110 3111 | 砝 3111 3112 | 埠 3112 3113 | 锏 3113 3114 | 歪 3114 3115 | 辫 3115 3116 | 躁 3116 3117 | 愎 3117 3118 | 仇 3118 3119 | 忤 3119 3120 | 仆 3120 3121 | 膨 3121 3122 | 胀 3122 3123 | 竿 3123 3124 | 靖 3124 3125 | 疲 3125 3126 | 笼 3126 3127 | 坠 3127 3128 | 娼 3128 3129 | 嫖 3129 3130 | 晴 3130 3131 | 寮 3131 3132 | 坪 3132 3133 | 妓 3133 3134 | 蕤 3134 3135 | 蚊 3135 3136 | 毓 3136 3137 | 跪 3137 3138 | 剥 3138 3139 | 莲 3139 3140 | 鸨 3140 3141 | 惩 3141 3142 | 荤 3142 3143 | 桐 3143 3144 | 嫉 3144 3145 | 趾 3145 3146 | 诊 3146 3147 | 嵩 3147 3148 | 掩 3148 3149 | 哇 3149 3150 | 絮 3150 3151 | 叨 3151 3152 | 卤 3152 3153 | 膏 3153 3154 | 侪 3154 3155 | 葫 3155 3156 | 芦 3156 3157 | 瓢 3157 3158 | 畔 3158 3159 | 妩 3159 3160 | 煤 3160 3161 | 辐 3161 3162 | 凄 3162 3163 | 忡 3163 3164 | 昙 3164 3165 | 渤 3165 3166 | 枝 3166 3167 | 寺 3167 3168 | 阀 3168 3169 | 煮 3169 3170 | 皈 3170 3171 | 檐 3171 3172 | 铂 3172 3173 | 镯 3173 3174 | 眸 3174 3175 | 筐 3175 3176 | 踊 3176 3177 | 煜 3177 3178 | 瞑 3178 3179 | 腴 3179 3180 | 咦 3180 3181 | 芙 3181 3182 | 咪 3182 3183 | 拗 3183 3184 | 绯 3184 3185 | 瑙 3185 3186 | 蹲 3186 3187 | 耽 3187 3188 | 搁 3188 3189 | 琢 3189 3190 | 宴 3190 3191 | 骛 3191 3192 | 浸 3192 3193 | 渍 3193 3194 | 胺 3194 3195 | 笨 3195 3196 | 蜡 3196 3197 | 械 3197 3198 | 凹 3198 3199 | 揩 3199 3200 | 骞 3200 3201 | 焉 3201 3202 | 穗 3202 3203 | 舆 3203 3204 | 咂 3204 3205 | 迭 3205 3206 | 拐 3206 3207 | 孺 3207 3208 | 鳌 3208 3209 | 髻 3209 3210 | 汁 3210 3211 | 裴 3211 3212 | 俪 3212 3213 | 谩 3213 3214 | 翠 3214 3215 | 菁 3215 3216 | 窜 3216 3217 | 昵 3217 3218 | 哎 3218 3219 | 疙 3219 3220 | 瘩 3220 3221 | 愤 3221 3222 | 淆 3222 3223 | 惫 3223 3224 | 嗝 3224 3225 | 尿 3225 3226 | 缪 3226 3227 | 纬 3227 3228 | 轶 3228 3229 | 瑜 3229 3230 | 阙 3230 3231 | 懦 3231 3232 | 刍 3232 3233 | 弓 3233 3234 | 帛 3234 3235 | 耻 3235 3236 | 诡 3236 3237 | 狡 3237 3238 | 猾 3238 3239 | 聩 3239 3240 | 廷 3240 3241 | 吞 3241 3242 | 噬 3242 3243 | 肢 3243 3244 | 憎 3244 3245 | 泾 3245 3246 | 渭 3246 3247 | 烙 3247 3248 | 逻 3248 3249 | 叙 3249 3250 | 媾 3250 3251 | 咬 3251 3252 | 惭 3252 3253 | 缥 3253 3254 | 缈 3254 3255 | 渲 3255 3256 | 螃 3256 3257 | 蟹 3257 3258 | 诟 3258 3259 | 玻 3259 3260 | 璃 3260 3261 | 帧 3261 3262 | 芊 3262 3263 | 彤 3263 3264 | 郡 3264 3265 | 伎 3265 3266 | 祺 3266 3267 | 鬟 3267 3268 | 雁 3268 3269 | 翎 3269 3270 | 擂 3270 3271 | 窥 3271 3272 | 倔 3272 3273 | 霾 3273 3274 | 绳 3274 3275 | 羲 3275 3276 | 骠 3276 3277 | 杖 3277 3278 | 叔 3278 3279 | 敷 3279 3280 | 丘 3280 3281 | 陵 3281 3282 | 饿 3282 3283 | 掠 3283 3284 | 旌 3284 3285 | 麾 3285 3286 | 歼 3286 3287 | 畜 3287 3288 | 撕 3288 3289 | 屠 3289 3290 | 戮 3290 3291 | 褪 3291 3292 | 寥 3292 3293 | 罄 3293 3294 | 榭 3294 3295 | 伞 3295 3296 | 盐 3296 3297 | 钾 3297 3298 | 撂 3298 3299 | 荼 3299 3300 | 闸 3300 3301 | 藉 3301 3302 | 荨 3302 3303 | 茬 3303 3304 | 樱 3304 3305 | 饪 3305 3306 | 丙 3306 3307 | 烯 3307 3308 | 亟 3308 3309 | 灶 3309 3310 | 煲 3310 3311 | 戋 3311 3312 | 笙 3312 3313 | 暄 3313 3314 | 屉 3314 3315 | 沐 3315 3316 | 茹 3316 3317 | 琦 3317 3318 | 箍 3318 3319 | 廊 3319 3320 | 辰 3320 3321 | 豌 3321 3322 | 吻 3322 3323 | 沌 3323 3324 | 醋 3324 3325 | 浔 3325 3326 | 焯 3326 3327 | 佰 3327 3328 | 瘫 3328 3329 | 痪 3329 3330 | 卿 3330 3331 | 嗅 3331 3332 | 蒲 3332 3333 | 桦 3333 3334 | 垛 3334 3335 | 磕 3335 3336 | 眷 3336 3337 | 煦 3337 3338 | 炊 3338 3339 | 殡 3339 3340 | 幢 3340 3341 | 衍 3341 3342 | 祁 3342 3343 | 擘 3343 3344 | 潍 3344 3345 | 笈 3345 3346 | 臆 3346 3347 | 噶 3347 3348 | 洒 3348 3349 | 惬 3349 3350 | 俭 3350 3351 | 怠 3351 3352 | 疫 3352 3353 | 坟 3353 3354 | 淼 3354 3355 | 墓 3355 3356 | 瑶 3356 3357 | 庙 3357 3358 | 鞘 3358 3359 | 眩 3359 3360 | 饕 3360 3361 | 餮 3361 3362 | 憋 3362 3363 | 辽 3363 3364 | 侮 3364 3365 | 膺 3365 3366 | 腱 3366 3367 | 蕉 3367 3368 | 墩 3368 3369 | 馒 3369 3370 | 蚂 3370 3371 | 蚁 3371 3372 | 俯 3372 3373 | 瞰 3373 3374 | 艘 3374 3375 | 桨 3375 3376 | 谎 3376 3377 | 箴 3377 3378 | 吝 3378 3379 | 啬 3379 3380 | 楔 3380 3381 | 挎 3381 3382 | 镀 3382 3383 | 鳖 3383 3384 | 鹜 3384 3385 | 砷 3385 3386 | 弈 3386 3387 | 稽 3387 3388 | 醚 3388 3389 | 乙 3389 3390 | 炔 3390 3391 | 蛙 3391 3392 | 嘻 3392 3393 | 迩 3393 3394 | 峨 3394 3395 | 茧 3395 3396 | 濡 3396 3397 | 娴 3397 3398 | 蜷 3398 3399 | 麽 3399 3400 | 梭 3400 3401 | 摒 3401 3402 | 诽 3402 3403 | 谤 3403 3404 | 擒 3404 3405 | 攘 3405 3406 | 淅 3406 3407 | 沥 3407 3408 | 眨 3408 3409 | 巍 3409 3410 | 拎 3410 3411 | 棣 3411 3412 | 骆 3412 3413 | 晖 3413 3414 | 瘾 3414 3415 | 喔 3415 3416 | 栎 3416 3417 | 葛 3417 3418 | 簇 3418 3419 | 篪 3419 3420 | 媳 3420 3421 | 猥 3421 3422 | 琐 3422 3423 | 岌 3423 3424 | 撒 3424 3425 | 沤 3425 3426 | 渺 3426 3427 | 呵 3427 3428 | 苟 3428 3429 | 瑕 3429 3430 | 粹 3430 3431 | 蹊 3431 3432 | 侍 3432 3433 | 哉 3433 3434 | 颉 3434 3435 | 炭 3435 3436 | 樊 3436 3437 | 饽 3437 3438 | 圻 3438 3439 | 舔 3439 3440 | 聿 3440 3441 | 拢 3441 3442 | 骊 3442 3443 | 谑 3443 3444 | 拘 3444 3445 | 酱 3445 3446 | 卺 3446 3447 | 舀 3447 3448 | 咙 3448 3449 | 斑 3449 3450 | 雯 3450 3451 | 鹅 3451 3452 | 鹃 3452 3453 | 贼 3453 3454 | 舵 3454 3455 | 屿 3455 3456 | 漾 3456 3457 | 晔 3457 3458 | 彪 3458 3459 | 曳 3459 3460 | 倚 3460 3461 | 涮 3461 3462 | 拭 3462 3463 | 飚 3463 3464 | 鳄 3464 3465 | 蹶 3465 3466 | 濒 3466 3467 | 筵 3467 3468 | 勺 3468 3469 | 炽 3469 3470 | 氓 3470 3471 | 荟 3471 3472 | 萃 3472 3473 | 殃 3473 3474 | 蹩 3474 3475 | 啻 3475 3476 | 矢 3476 3477 | 缜 3477 3478 | 砭 3478 3479 | 弛 3479 3480 | 笫 3480 3481 | 鏖 3481 3482 | 俑 3482 3483 | 嘟 3483 3484 | 汹 3484 3485 | 焚 3485 3486 | 酥 3486 3487 | 濠 3487 3488 | 萦 3488 3489 | 茸 3489 3490 | 丞 3490 3491 | 诙 3491 3492 | 腺 3492 3493 | 筷 3493 3494 | 珞 3494 3495 | 祉 3495 3496 | 掬 3496 3497 | 岿 3497 3498 | 醺 3498 3499 | 嚷 3499 3500 | 豁 3500 3501 | 菩 3501 3502 | 铿 3502 3503 | 锵 3503 3504 | 馅 3504 3505 | 靡 3505 3506 | 掐 3506 3507 | 矣 3507 3508 | 峪 3508 3509 | 摧 3509 3510 | 瞅 3510 3511 | 裳 3511 3512 | 烽 3512 3513 | 萧 3513 3514 | 拱 3514 3515 | 踞 3515 3516 | 塘 3516 3517 | 咫 3517 3518 | 嚏 3518 3519 | 孰 3519 3520 | 捭 3520 3521 | 莅 3521 3522 | 勘 3522 3523 | 捣 3523 3524 | 羔 3524 3525 | 慵 3525 3526 | 憩 3526 3527 | 臻 3527 3528 | 诫 3528 3529 | 寝 3529 3530 | 谧 3530 3531 | 浊 3531 3532 | 霎 3532 3533 | 澈 3533 3534 | 粤 3534 3535 | 栖 3535 3536 | 庇 3536 3537 | 栉 3537 3538 | 嗟 3538 3539 | 殉 3539 3540 | 涎 3540 3541 | 惦 3541 3542 | 邵 3542 3543 | 榫 3543 3544 | 碱 3544 3545 | 拌 3545 3546 | 烫 3546 3547 | 淫 3547 3548 | 秽 3548 3549 | 铲 3549 3550 | 畸 3550 3551 | 雏 3551 3552 | 盎 3552 3553 | 歉 3553 3554 | 瑭 3554 3555 | 熔 3555 3556 | 坯 3556 3557 | 壶 3557 3558 | 犷 3558 3559 | 扉 3559 3560 | 恍 3560 3561 | 绽 3561 3562 | 驿 3562 3563 | 澎 3563 3564 | 湃 3564 3565 | 茜 3565 3566 | 肴 3566 3567 | 酣 3567 3568 | 鲫 3568 3569 | 虾 3569 3570 | 馄 3570 3571 | 饨 3571 3572 | 菊 3572 3573 | 鳝 3573 3574 | 焖 3574 3575 | 秣 3575 3576 | 猿 3576 3577 | 捏 3577 3578 | 藩 3578 3579 | 沧 3579 3580 | 峙 3580 3581 | 侥 3581 3582 | 茱 3582 3583 | 茵 3583 3584 | 娑 3584 3585 | 葩 3585 3586 | 裨 3586 3587 | 瀛 3587 3588 | 蹴 3588 3589 | 婪 3589 3590 | 戟 3590 3591 | 搡 3591 3592 | 徨 3592 3593 | 麒 3593 3594 | 笃 3594 3595 | 馗 3595 3596 | 寇 3596 3597 | 遐 3597 3598 | 凿 3598 3599 | 煽 3599 3600 | 逮 3600 3601 | 潞 3601 3602 | 琮 3602 3603 | 饥 3603 3604 | 萁 3604 3605 | 戳 3605 3606 | 蘑 3606 3607 | 菇 3607 3608 | 啷 3608 3609 | 汛 3609 3610 | 挟 3610 3611 | 淹 3611 3612 | 阑 3612 3613 | 霜 3613 3614 | 渣 3614 3615 | 沼 3615 3616 | 璞 3616 3617 | 玷 3617 3618 | 辙 3618 3619 | 禺 3619 3620 | 诘 3620 3621 | 亍 3621 3622 | 埔 3622 3623 | 於 3623 3624 | 匡 3624 3625 | 赂 3625 3626 | 薛 3626 3627 | 畴 3627 3628 | 赡 3628 3629 | 峥 3629 3630 | 隽 3630 3631 | 砌 3631 3632 | 痞 3632 3633 | 黠 3633 3634 | 侬 3634 3635 | 掰 3635 3636 | 愕 3636 3637 | 诨 3637 3638 | 洽 3638 3639 | 卞 3639 3640 | 丸 3640 3641 | 蛰 3641 3642 | 坷 3642 3643 | 懊 3643 3644 | 扒 3644 3645 | 蟒 3645 3646 | 孚 3646 3647 | 痉 3647 3648 | 挛 3648 3649 | 俞 3649 3650 | 熹 3650 3651 | 诬 3651 3652 | 轲 3652 3653 | 贲 3653 3654 | 瞥 3654 3655 | 覃 3655 3656 | 萱 3656 3657 | 樟 3657 3658 | 崴 3658 3659 | 稻 3659 3660 | 瞒 3660 3661 | 逍 3661 3662 | 纣 3662 3663 | 缄 3663 3664 | 荔 3664 3665 | 碟 3665 3666 | 窖 3666 3667 | 赃 3667 3668 | 篑 3668 3669 | 禧 3669 3670 | 毋 3670 3671 | 赅 3671 3672 | 撬 3672 3673 | 腮 3673 3674 | 翱 3674 3675 | 厮 3675 3676 | 偕 3676 3677 | 毙 3677 3678 | 唆 3678 3679 | 蚀 3679 3680 | 遂 3680 3681 | 盏 3681 3682 | 耙 3682 3683 | 柬 3683 3684 | 陇 3684 3685 | 苞 3685 3686 | 佻 3686 3687 | 厕 3687 3688 | 吩 3688 3689 | 咐 3689 3690 | 孜 3690 3691 | 亵 3691 3692 | 褐 3692 3693 | 帼 3693 3694 | 圃 3694 3695 | 槐 3695 3696 | 遨 3696 3697 | 穹 3697 3698 | 摞 3698 3699 | 啃 3699 3700 | 恣 3700 3701 | 谒 3701 3702 | 缅 3702 3703 | 恺 3703 3704 | 汴 3704 3705 | 矗 3705 3706 | 珈 3706 3707 | 跋 3707 3708 | 扈 3708 3709 | 拽 3709 3710 | 螳 3710 3711 | 螂 3711 3712 | 袈 3712 3713 | 裟 3713 3714 | 趸 3714 3715 | 翡 3715 3716 | 唧 3716 3717 | 喳 3717 3718 | 堤 3718 3719 | 尉 3719 3720 | 茗 3720 3721 | 酵 3721 3722 | 潇 3722 3723 | 芋 3723 3724 | 喧 3724 3725 | 荫 3725 3726 | 矜 3726 3727 | 丶 3727 3728 | 蹉 3728 3729 | 跎 3729 3730 | 唾 3730 3731 | 凋 3731 3732 | 榴 3732 3733 | 虔 3733 3734 | 唠 3734 3735 | 腼 3735 3736 | 腆 3736 3737 | 倭 3737 3738 | 弩 3738 3739 | 兀 3739 3740 | 晾 3740 3741 | 皂 3741 3742 | 圜 3742 3743 | 斓 3743 3744 | 魇 3744 3745 | 岚 3745 3746 | 庾 3746 3747 | 傣 3747 3748 | 彝 3748 3749 | 椰 3749 3750 | 隍 3750 3751 | 宵 3751 3752 | 瑾 3752 3753 | 曦 3753 3754 | 晏 3754 3755 | 祯 3755 3756 | 琥 3756 3757 | 胯 3757 3758 | 瘪 3758 3759 | 缆 3759 3760 | 冀 3760 3761 | 鲸 3761 3762 | 嗓 3762 3763 | 睽 3763 3764 | 拂 3764 3765 | 蚤 3765 3766 | 嬉 3766 3767 | 摈 3767 3768 | 禅 3768 3769 | 冉 3769 3770 | 伶 3770 3771 | 苔 3771 3772 | 蜈 3772 3773 | 蚣 3773 3774 | 蝎 3774 3775 | 俺 3775 3776 | 猩 3776 3777 | 愠 3777 3778 | 枫 3778 3779 | 哙 3779 3780 | 虞 3780 3781 | 璇 3781 3782 | 沛 3782 3783 | 洱 3783 3784 | 鹭 3784 3785 | 茉 3785 3786 | 舱 3786 3787 | 缕 3787 3788 | 绷 3788 3789 | 钛 3789 3790 | 町 3790 3791 | 盂 3791 3792 | 浚 3792 3793 | 齿 3793 3794 | 遽 3794 3795 | 吭 3795 3796 | 寰 3796 3797 | 佟 3797 3798 | 迦 3798 3799 | 脊 3799 3800 | 喋 3800 3801 | 邝 3801 3802 | 焱 3802 3803 | 琨 3803 3804 | 沁 3804 3805 | 桓 3805 3806 | 孽 3806 3807 | 锢 3807 3808 | 葳 3808 3809 | 酌 3809 3810 | 娓 3810 3811 | 捋 3811 3812 | 耸 3812 3813 | 愣 3813 3814 | 肓 3814 3815 | 鱿 3815 3816 | 耿 3816 3817 | 铨 3817 3818 | 僚 3818 3819 | 谀 3819 3820 | 骥 3820 3821 | 掺 3821 3822 | 烘 3822 3823 | 嫣 3823 3824 | 铃 3824 3825 | 胫 3825 3826 | 氟 3826 3827 | 伺 3827 3828 | 晦 3828 3829 | 髋 3829 3830 | 瑚 3830 3831 | 鄂 3831 3832 | 戎 3832 3833 | 怯 3833 3834 | 骁 3834 3835 | 紊 3835 3836 | 魑 3836 3837 | 抒 3837 3838 | 锚 3838 3839 | 曙 3839 3840 | 霏 3840 3841 | 荏 3841 3842 | 苒 3842 3843 | 磬 3843 3844 | 闳 3844 3845 | 煞 3845 3846 | 迥 3846 3847 | 曰 3847 3848 | 拴 3848 3849 | 檀 3849 3850 | 柚 3850 3851 | 渥 3851 3852 | 楝 3852 3853 | 哗 3853 3854 | 嗤 3854 3855 | 癖 3855 3856 | 犊 3856 3857 | 娣 3857 3858 | 郜 3858 3859 | 锌 3859 3860 | 亢 3860 3861 | 宪 3861 3862 | 隘 3862 3863 | 丐 3863 3864 | 赦 3864 3865 | 玮 3865 3866 | 跤 3866 3867 | 孪 3867 3868 | 杳 3868 3869 | 舶 3869 3870 | 惋 3870 3871 | 搓 3871 3872 | 俾 3872 3873 | 鸦 3873 3874 | 涕 3874 3875 | 哩 3875 3876 | 谚 3876 3877 | 兮 3877 3878 | 诃 3878 3879 | 裆 3879 3880 | 呕 3880 3881 | 柒 3881 3882 | 淌 3882 3883 | 惆 3883 3884 | 怅 3884 3885 | 粱 3885 3886 | 摺 3886 3887 | 惺 3887 3888 | 栈 3888 3889 | 叁 3889 3890 | 讧 3890 3891 | 忾 3891 3892 | 梓 3892 3893 | 漩 3893 3894 | 肾 3894 3895 | 邋 3895 3896 | 遢 3896 3897 | 榆 3897 3898 | 蔷 3898 3899 | 痹 3899 3900 | 轿 3900 3901 | 椎 3901 3902 | 飓 3902 3903 | 铬 3903 3904 | 绊 3904 3905 | 灬 3905 3906 | 烛 3906 3907 | 棠 3907 3908 | 饵 3908 3909 | 阜 3909 3910 | 咳 3910 3911 | 嗽 3911 3912 | 捎 3912 3913 | 咧 3913 3914 | 蹂 3914 3915 | 躏 3915 3916 | 砥 3916 3917 | 俘 3917 3918 | 蹬 3918 3919 | 舅 3919 3920 | 岘 3920 3921 | 颤 3921 3922 | 碉 3922 3923 | 嘶 3923 3924 | 虏 3924 3925 | 炕 3925 3926 | 剿 3926 3927 | 脐 3927 3928 | 哼 3928 3929 | 抠 3929 3930 | 踱 3930 3931 | 噙 3931 3932 | 悯 3932 3933 | 剐 3933 3934 | 搀 3934 3935 | 筱 3935 3936 | 贻 3936 3937 | 孱 3937 3938 | 偌 3938 3939 | 捱 3939 3940 | 痂 3940 3941 | 儒 3941 3942 | 憔 3942 3943 | 悴 3943 3944 | 粝 3944 3945 | 瞌 3945 3946 | 嵘 3946 3947 | 攸 3947 3948 | 悖 3948 3949 | 罔 3949 3950 | 搪 3950 3951 | 杞 3951 3952 | 蹄 3952 3953 | 珏 3953 3954 | 钨 3954 3955 | 绮 3955 3956 | 嘀 3956 3957 | 褂 3957 3958 | 咚 3958 3959 | 瀚 3959 3960 | 庖 3960 3961 | 钒 3961 3962 | 鲲 3962 3963 | 悼 3963 3964 | 璋 3964 3965 | 炬 3965 3966 | 疮 3966 3967 | 掳 3967 3968 | 迂 3968 3969 | 姊 3969 3970 | 绞 3970 3971 | 幌 3971 3972 | 肮 3972 3973 | 姨 3973 3974 | 昱 3974 3975 | 忻 3975 3976 | 钞 3976 3977 | 梢 3977 3978 | 妃 3978 3979 | 歆 3979 3980 | 饷 3980 3981 | 俸 3981 3982 | 抨 3982 3983 | 阁 3983 3984 | 甸 3984 3985 | 蚕 3985 3986 | 柿 3986 3987 | 陛 3987 3988 | 钗 3988 3989 | 暮 3989 3990 | 疵 3990 3991 | 蔺 3991 3992 | 伽 3992 3993 | 榕 3993 3994 | 弭 3994 3995 | 蒌 3995 3996 | 泵 3996 3997 | 荞 3997 3998 | 霖 3998 3999 | 糗 3999 4000 | 纰 4000 4001 | 侄 4001 4002 | 沅 4002 4003 | 篡 4003 4004 | 枭 4004 4005 | 莺 4005 4006 | 倮 4006 4007 | 卒 4007 4008 | 敝 4008 4009 | 铩 4009 4010 | 爻 4010 4011 | 遁 4011 4012 | 壬 4012 4013 | 曜 4013 4014 | 拣 4014 4015 | 汕 4015 4016 | 恃 4016 4017 | 泯 4017 4018 | 谛 4018 4019 | 洼 4019 4020 | 淤 4020 4021 | 褥 4021 4022 | 垦 4022 4023 | 薹 4023 4024 | 芜 4024 4025 | 聋 4025 4026 | 桔 4026 4027 | 笠 4027 4028 | 榨 4028 4029 | 烩 4029 4030 | 鳕 4030 4031 | 菠 4031 4032 | 酪 4032 4033 | 竺 4033 4034 | 蹙 4034 4035 | 庹 4035 4036 | 斧 4036 4037 | 遑 4037 4038 | 鸽 4038 4039 | 峭 4039 4040 | 芥 4040 4041 | 姥 4041 4042 | 徙 4042 4043 | 禽 4043 4044 | 怂 4044 4045 | 恿 4045 4046 | 稣 4046 4047 | 狸 4047 4048 | 聒 4048 4049 | 缇 4049 4050 | 竽 4050 4051 | 玺 4051 4052 | 泗 4052 4053 | 咀 4053 4054 | 耷 4054 4055 | 莪 4055 4056 | 胚 4056 4057 | 欷 4057 4058 | 麂 4058 4059 | 尧 4059 4060 | 恕 4060 4061 | 酗 4061 4062 | 妊 4062 4063 | 娠 4063 4064 | 潦 4064 4065 | 俚 4065 4066 | 揍 4066 4067 | 怦 4067 4068 | 桢 4068 4069 | 鲱 4069 4070 | 坂 4070 4071 | 萤 4071 4072 | 嗷 4072 4073 | 捅 4073 4074 | 哄 4074 4075 | 鹊 4075 4076 | 摁 4076 4077 | 闰 4077 4078 | 钜 4078 4079 | 伉 4079 4080 | 榉 4080 4081 | 谲 4081 4082 | 羯 4082 4083 | 靶 4083 4084 | 蔑 4084 4085 | 擢 4085 4086 | 滢 4086 4087 | 攥 4087 4088 | 衙 4088 4089 | 嘎 4089 4090 | 忸 4090 4091 | 怩 4091 4092 | 伫 4092 4093 | 叭 4093 4094 | 炅 4094 4095 | 噎 4095 4096 | 苜 4096 4097 | 蓿 4097 4098 | 牡 4098 4099 | 毡 4099 4100 | 戾 4100 4101 | 璜 4101 4102 | 鄢 4102 4103 | 琉 4103 4104 | 牦 4104 4105 | 褛 4105 4106 | 婀 4106 4107 | 盅 4107 4108 | 羚 4108 4109 | 朕 4109 4110 | 鸾 4110 4111 | 陂 4111 4112 | 肺 4112 4113 | 皙 4113 4114 | 謦 4114 4115 | 颚 4115 4116 | 甥 4116 4117 | 沂 4117 4118 | 脓 4118 4119 | 韶 4119 4120 | 簿 4120 4121 | 谬 4121 4122 | 喀 4122 4123 | 肛 4123 4124 | 嚼 4124 4125 | 粽 4125 4126 | 哺 4126 4127 | 酋 4127 4128 | 砰 4128 4129 | 铢 4129 4130 | 湮 4130 4131 | 楂 4131 4132 | 奂 4132 4133 | 弑 4133 4134 | 蝼 4134 4135 | 滇 4135 4136 | 抻 4136 4137 | 呜 4137 4138 | 粪 4138 4139 | 颔 4139 4140 | 瞠 4140 4141 | 仨 4141 4142 | 靳 4142 4143 | 忱 4143 4144 | 鬓 4144 4145 | 匈 4145 4146 | 讪 4146 4147 | 隧 4147 4148 | 篝 4148 4149 | 钝 4149 4150 | 妲 4150 4151 | 绫 4151 4152 | 蒜 4152 4153 | 窿 4153 4154 | 弋 4154 4155 | 疝 4155 4156 | 汝 4156 4157 | 沽 4157 4158 | 幄 4158 4159 | 仄 4159 4160 | 稷 4160 4161 | 薯 4161 4162 | 莽 4162 4163 | 孀 4163 4164 | 咄 4164 4165 | 痊 4165 4166 | 柙 4166 4167 | 惘 4167 4168 | 姝 4168 4169 | 楷 4169 4170 | 臃 4170 4171 | 袒 4171 4172 | 骜 4172 4173 | 庐 4173 4174 | 蛀 4174 4175 | 匕 4175 4176 | 禄 4176 4177 | 蔗 4177 4178 | 宸 4178 4179 | 婕 4179 4180 | 瘤 4180 4181 | 蜿 4181 4182 | 蜒 4182 4183 | 哮 4183 4184 | 坳 4184 4185 | 砣 4185 4186 | 谶 4186 4187 | 埂 4187 4188 | 缨 4188 4189 | 捺 4189 4190 | 涡 4190 4191 | 咎 4191 4192 | 铎 4192 4193 | 祀 4193 4194 | 栌 4194 4195 | 唰 4195 4196 | 栅 4196 4197 | 靛 4197 4198 | 恪 4198 4199 | 菖 4199 4200 | 糯 4200 4201 | 犁 4201 4202 | 咔 4202 4203 | 嗒 4203 4204 | 鲤 4204 4205 | 箬 4205 4206 | 菰 4206 4207 | 泸 4207 4208 | 邸 4208 4209 | 剃 4209 4210 | 龈 4210 4211 | 熨 4211 4212 | 枸 4212 4213 | 鲟 4213 4214 | 莆 4214 4215 | 箐 4215 4216 | 晁 4216 4217 | 泌 4217 4218 | 禀 4218 4219 | 斋 4219 4220 | 呗 4220 4221 | 畦 4221 4222 | 倜 4222 4223 | 傥 4223 4224 | 邬 4224 4225 | 锒 4225 4226 | 铛 4226 4227 | 浃 4227 4228 | 袄 4228 4229 | 膛 4229 4230 | 蹭 4230 4231 | 遛 4231 4232 | 邰 4232 4233 | 囿 4233 4234 | 汾 4234 4235 | 臼 4235 4236 | 偎 4236 4237 | 眯 4237 4238 | 痰 4238 4239 | 眺 4239 4240 | 筝 4240 4241 | 汐 4241 4242 | 搂 4242 4243 | 乒 4243 4244 | 乓 4244 4245 | 镍 4245 4246 | 淝 4246 4247 | 髌 4247 4248 | 艮 4248 4249 | 甬 4249 4250 | 洮 4250 4251 | 塾 4251 4252 | 庑 4252 4253 | 觐 4253 4254 | 埙 4254 4255 | 炳 4255 4256 | 岱 4256 4257 | 浒 4257 4258 | 揖 4258 4259 | 喟 4259 4260 | 眶 4260 4261 | 囱 4261 4262 | 葆 4262 4263 | 狩 4263 4264 | 懑 4264 4265 | 漱 4265 4266 | 镔 4266 4267 | 榔 4267 4268 | 秆 4268 4269 | 锱 4269 4270 | 嫡 4270 4271 | 拄 4271 4272 | 牍 4272 4273 | 罹 4273 4274 | 镌 4274 4275 | 讹 4275 4276 | 绥 4276 4277 | 盥 4277 4278 | 嘣 4278 4279 | 乜 4279 4280 | 燎 4280 4281 | 瘁 4281 4282 | 霓 4282 4283 | 垠 4283 4284 | 睬 4284 4285 | 樯 4285 4286 | 橹 4286 4287 | 酹 4287 4288 | 轼 4288 4289 | 咆 4289 4290 | 灏 4290 4291 | 刁 4291 4292 | 烷 4292 4293 | 窑 4293 4294 | 娩 4294 4295 | 惰 4295 4296 | 拈 4296 4297 | 蛤 4297 4298 | 蟆 4298 4299 | 蜮 4299 4300 | 糅 4300 4301 | 芍 4301 4302 | 皿 4302 4303 | 窠 4303 4304 | 钰 4304 4305 | 禾 4305 4306 | 蔫 4306 4307 | 呃 4307 4308 | 潋 4308 4309 | 滟 4309 4310 | 峦 4310 4311 | 湍 4311 4312 | 湄 4312 4313 | 醇 4313 4314 | 沣 4314 4315 | 溥 4315 4316 | 鲠 4316 4317 | 栩 4317 4318 | 轧 4318 4319 | 戕 4319 4320 | 抡 4320 4321 | 琵 4321 4322 | 琶 4322 4323 | 甯 4323 4324 | 邈 4324 4325 | 鲶 4325 4326 | 銮 4326 4327 | 樘 4327 4328 | 垭 4328 4329 | 玖 4329 4330 | 徵 4330 4331 | 羸 4331 4332 | 肪 4332 4333 | 揶 4333 4334 | 揄 4334 4335 | 叟 4335 4336 | 睥 4336 4337 | 衩 4337 4338 | 挝 4338 4339 | 绛 4339 4340 | 啖 4340 4341 | 淖 4341 4342 | 氮 4342 4343 | 磷 4343 4344 | 珩 4344 4345 | 犄 4345 4346 | 殇 4346 4347 | 懿 4347 4348 | 讷 4348 4349 | 逑 4349 4350 | 叼 4350 4351 | 喱 4351 4352 | 赳 4352 4353 | 屎 4353 4354 | 锹 4354 4355 | 碾 4355 4356 | 坍 4356 4357 | 缃 4357 4358 | 酚 4358 4359 | 蒽 4359 4360 | 萘 4360 4361 | 氯 4361 4362 | 烃 4362 4363 | 秸 4363 4364 | 脲 4364 4365 | 怄 4365 4366 | 阪 4366 4367 | 啪 4367 4368 | 伢 4368 4369 | 庵 4369 4370 | 氢 4370 4371 | 俟 4371 4372 | 剌 4372 4373 | 瘀 4373 4374 | 幡 4374 4375 | 晌 4375 4376 | 汊 4376 4377 | 舜 4377 4378 | 迢 4378 4379 | 龇 4379 4380 | 砚 4380 4381 | 栓 4381 4382 | 褚 4382 4383 | 瑛 4383 4384 | 跛 4384 4385 | 搐 4385 4386 | 啜 4386 4387 | 铐 4387 4388 | 澧 4388 4389 | 谌 4389 4390 | 婶 4390 4391 | 拚 4391 4392 | 袅 4392 4393 | 呲 4393 4394 | 癞 4394 4395 | 僭 4395 4396 | 腑 4396 4397 | 稔 4397 4398 | 梆 4398 4399 | 漕 4399 4400 | 悱 4400 4401 | 恻 4401 4402 | 铤 4402 4403 | 澍 4403 4404 | 糜 4404 4405 | 鳅 4405 4406 | 骅 4406 4407 | 呖 4407 4408 | 缰 4408 4409 | 琰 4409 4410 | 娲 4410 4411 | 咛 4411 4412 | 踌 4412 4413 | 躇 4413 4414 | 骝 4414 4415 | 馥 4415 4416 | 摹 4416 4417 | 郫 4417 4418 | 陲 4418 4419 | 斟 4419 4420 | 梗 4420 4421 | 札 4421 4422 | 袢 4422 4423 | 裥 4423 4424 | 仟 4424 4425 | 剁 4425 4426 | 桀 4426 4427 | 舫 4427 4428 | 碴 4428 4429 | 薮 4429 4430 | 跆 4430 4431 | 侗 4431 4432 | 颊 4432 4433 | 拧 4433 4434 | 纫 4434 4435 | 撄 4435 4436 | 瞟 4436 4437 | 钙 4437 4438 | 铵 4438 4439 | 怵 4439 4440 | 蹒 4440 4441 | 跚 4441 4442 | 铄 4442 4443 | 缛 4443 4444 | 阄 4444 4445 | 蠡 4445 4446 | 飨 4446 4447 | 卵 4447 4448 | 掮 4448 4449 | 囔 4449 4450 | 讥 4450 4451 | 蚝 4451 4452 | 仃 4452 4453 | 珐 4453 4454 | 祚 4454 4455 | 咩 4455 4456 | 耄 4456 4457 | 耋 4457 4458 | 叽 4458 4459 | 桅 4459 4460 | 藕 4460 4461 | 昀 4461 4462 | 畹 4462 4463 | 甭 4463 4464 | 鸥 4464 4465 | 嬗 4465 4466 | 礁 4466 4467 | 抿 4467 4468 | 赈 4468 4469 | 槌 4469 4470 | 幔 4470 4471 | 锄 4471 4472 | 嗦 4472 4473 | 邑 4473 4474 | 酮 4474 4475 | 蘸 4475 4476 | 绉 4476 4477 | 淞 4477 4478 | 霭 4478 4479 | 鸠 4479 4480 | 霁 4480 4481 | 绶 4481 4482 | 耆 4482 4483 | 嶙 4483 4484 | 峋 4484 4485 | 漳 4485 4486 | 髯 4486 4487 | 冢 4487 4488 | 蚩 4488 4489 | 颛 4489 4490 | 顼 4490 4491 | 茎 4491 4492 | 溷 4492 4493 | 馀 4493 4494 | 菟 4494 4495 | 颦 4495 4496 | 谆 4496 4497 | 瘠 4497 4498 | 缮 4498 4499 | 馍 4499 4500 | 妾 4500 4501 | 痘 4501 4502 | 疹 4502 4503 | 蜃 4503 4504 | 镛 4504 4505 | 嚯 4505 4506 | 眈 4506 4507 | 骸 4507 4508 | 溧 4508 4509 | 挹 4509 4510 | 铰 4510 4511 | 诩 4511 4512 | 赊 4512 4513 | 枥 4513 4514 | 堑 4514 4515 | 吏 4515 4516 | 囡 4516 4517 | 魃 4517 4518 | 唬 4518 4519 | 廿 4519 4520 | 煊 4520 4521 | 蝰 4521 4522 | 桠 4522 4523 | 痼 4523 4524 | 喵 4524 4525 | 靥 4525 4526 | 掂 4526 4527 | 丌 4527 4528 | 笄 4528 4529 | 郓 4529 4530 | 祠 4530 4531 | 缧 4531 4532 | 绁 4532 4533 | 秧 4533 4534 | 溉 4534 4535 | 鳍 4535 4536 | 鲔 4536 4537 | 雌 4537 4538 | 噜 4538 4539 | 嗔 4539 4540 | 钼 4540 4541 | 婵 4541 4542 | 裼 4542 4543 | 豉 4543 4544 | 胱 4544 4545 | 钳 4545 4546 | 腚 4546 4547 | 杌 4547 4548 | 蜻 4548 4549 | 蜓 4549 4550 | 唁 4550 4551 | 捌 4551 4552 | 簸 4552 4553 | 徜 4553 4554 | 丕 4554 4555 | 蝇 4555 4556 | 匣 4556 4557 | 惚 4557 4558 | 徉 4558 4559 | 蓦 4559 4560 | 羿 4560 4561 | 衢 4561 4562 | 浣 4562 4563 | 殒 4563 4564 | 辘 4564 4565 | 殚 4565 4566 | 皋 4566 4567 | 撅 4567 4568 | 饬 4568 4569 | 梵 4569 4570 | 骰 4570 4571 | 咣 4571 4572 | 噌 4572 4573 | 颢 4573 4574 | 嚎 4574 4575 | 垣 4575 4576 | 醍 4576 4577 | 瓴 4577 4578 | 樵 4578 4579 | 桎 4579 4580 | 梏 4580 4581 | 闱 4581 4582 | 劾 4582 4583 | 萸 4583 4584 | 粳 4584 4585 | 轫 4585 4586 | 箔 4586 4587 | 飕 4587 4588 | 趿 4588 4589 | 哆 4589 4590 | 泞 4590 4591 | 柞 4591 4592 | 楸 4592 4593 | 椴 4593 4594 | 睇 4594 4595 | 皑 4595 4596 | 蔼 4596 4597 | 镰 4597 4598 | 鄱 4598 4599 | 嗡 4599 4600 | 茁 4600 4601 | 锉 4601 4602 | 钲 4602 4603 | 臊 4603 4604 | 宦 4604 4605 | 涿 4605 4606 | 蟑 4606 4607 | 帚 4607 4608 | 琏 4608 4609 | 蜚 4609 4610 | 孬 4610 4611 | 淄 4611 4612 | 牒 4612 4613 | 呤 4613 4614 | 噗 4614 4615 | 赉 4615 4616 | 踹 4616 4617 | 螨 4617 4618 | 糠 4618 4619 | 崽 4619 4620 | 铖 4620 4621 | 吖 4621 4622 | 叩 4622 4623 | 盹 4623 4624 | 绢 4624 4625 | 鬃 4625 4626 | 迤 4626 4627 | 逦 4627 4628 | 阉 4628 4629 | 蟾 4629 4630 | 黔 4630 4631 | 稼 4631 4632 | 鹳 4632 4633 | 谄 4633 4634 | 燮 4634 4635 | 镳 4635 4636 | 侏 4636 4637 | 筠 4637 4638 | 椟 4638 4639 | 椁 4639 4640 | 柩 4640 4641 | 赣 4641 4642 | 襁 4642 4643 | 褓 4643 4644 | 鼾 4644 4645 | 硒 4645 4646 | 碲 4646 4647 | 孥 4647 4648 | 痔 4648 4649 | 忿 4649 4650 | 唳 4650 4651 | 豚 4651 4652 | 玟 4652 4653 | 糌 4653 4654 | 粑 4654 4655 | 呱 4655 4656 | 浜 4656 4657 | 缢 4657 4658 | 痫 4658 4659 | 龅 4659 4660 | 濮 4660 4661 | 镙 4661 4662 | 壕 4662 4663 | 璎 4663 4664 | 舸 4664 4665 | 瘴 4665 4666 | 炀 4666 4667 | 裘 4667 4668 | 酰 4668 4669 | 歃 4669 4670 | 殓 4670 4671 | 胛 4671 4672 | 嗲 4672 4673 | 涓 4673 4674 | 佃 4674 4675 | 铯 4675 4676 | 锭 4676 4677 | 阚 4677 4678 | 蚌 4678 4679 | 皖 4679 4680 | 砟 4680 4681 | 焐 4681 4682 | 鸵 4682 4683 | 瓤 4683 4684 | 胤 4684 4685 | 饴 4685 4686 | 锨 4686 4687 | 秭 4687 4688 | 篆 4688 4689 | 泱 4689 4690 | 貉 4690 4691 | 柰 4691 4692 | 岷 4692 4693 | 揠 4693 4694 | 诣 4694 4695 | 刎 4695 4696 | 嘞 4696 4697 | 菡 4697 4698 | 圩 4698 4699 | 雉 4699 4700 | 狻 4700 4701 | 猊 4701 4702 | 狴 4702 4703 | 犴 4703 4704 | 谏 4704 4705 | 踯 4705 4706 | 躅 4706 4707 | 锰 4707 4708 | 枰 4708 4709 | 蝌 4709 4710 | 蚪 4710 4711 | 喏 4711 4712 | 馋 4712 4713 | 僖 4713 4714 | 麋 4714 4715 | 娉 4715 4716 | 榧 4716 4717 | 槠 4717 4718 | 槭 4718 4719 | 桤 4719 4720 | 桉 4720 4721 | 搽 4721 4722 | 跬 4722 4723 | 樨 4723 4724 | 嫔 4724 4725 | 淦 4725 4726 | 钿 4726 4727 | 赝 4727 4728 | 霰 4728 4729 | 鹬 4729 4730 | 祟 4730 4731 | 卅 4731 4732 | 炷 4732 4733 | 唿 4733 4734 | 恹 4734 4735 | 呔 4735 4736 | 嚓 4736 4737 | 卮 4737 4738 | 纨 4738 4739 | 绔 4739 4740 | 嬷 4740 4741 | 滦 4741 4742 | 悻 4742 4743 | 诿 4743 4744 | 籁 4744 4745 | 檄 4745 4746 | 逡 4746 4747 | 颧 4747 4748 | 颌 4748 4749 | 踮 4749 4750 | 郄 4750 4751 | 吠 4751 4752 | 瑁 4752 4753 | 荃 4753 4754 | 洳 4754 4755 | 崮 4755 4756 | 掼 4756 4757 | 斡 4757 4758 | 钯 4758 4759 | 蟠 4759 4760 | 倌 4760 4761 | 泔 4761 4762 | 滂 4762 4763 | 沱 4763 4764 | 啐 4764 4765 | 吱 4765 4766 | 逄 4766 4767 | 憷 4767 4768 | 苇 4768 4769 | 谯 4769 4770 | 刽 4770 4771 | 嵋 4771 4772 | 樽 4772 4773 | 稠 4773 4774 | 傩 4774 4775 | 訇 4775 4776 | [PAD] 0 4777 | [UNK] 4776 4778 | -------------------------------------------------------------------------------- /data/w2v_data/stop_words.txt: -------------------------------------------------------------------------------- 1 | , 2 | ? 3 | 、 4 | 。 5 | “ 6 | ” 7 | 《 8 | 》 9 | ! 10 | , 11 | : 12 | ; 13 | ? 14 | 人民 15 | 末##末 16 | 啊 17 | 阿 18 | 哎 19 | 哎呀 20 | 哎哟 21 | 唉 22 | 俺 23 | 俺们 24 | 按 25 | 按照 26 | 吧 27 | 吧哒 28 | 把 29 | 罢了 30 | 被 31 | 本 32 | 本着 33 | 比 34 | 比方 35 | 比如 36 | 鄙人 37 | 彼 38 | 彼此 39 | 边 40 | 别 41 | 别的 42 | 别说 43 | 并 44 | 并且 45 | 不比 46 | 不成 47 | 不单 48 | 不但 49 | 不独 50 | 不管 51 | 不光 52 | 不过 53 | 不仅 54 | 不拘 55 | 不论 56 | 不怕 57 | 不然 58 | 不如 59 | 不特 60 | 不惟 61 | 不问 62 | 不只 63 | 朝 64 | 朝着 65 | 趁 66 | 趁着 67 | 乘 68 | 冲 69 | 除 70 | 除此之外 71 | 除非 72 | 除了 73 | 此 74 | 此间 75 | 此外 76 | 从 77 | 从而 78 | 打 79 | 待 80 | 但 81 | 但是 82 | 当 83 | 当着 84 | 到 85 | 得 86 | 的 87 | 的话 88 | 等 89 | 等等 90 | 地 91 | 第 92 | 叮咚 93 | 对 94 | 对于 95 | 多 96 | 多少 97 | 而 98 | 而况 99 | 而且 100 | 而是 101 | 而外 102 | 而言 103 | 而已 104 | 尔后 105 | 反过来 106 | 反过来说 107 | 反之 108 | 非但 109 | 非徒 110 | 否则 111 | 嘎 112 | 嘎登 113 | 该 114 | 赶 115 | 个 116 | 各 117 | 各个 118 | 各位 119 | 各种 120 | 各自 121 | 给 122 | 根据 123 | 跟 124 | 故 125 | 故此 126 | 固然 127 | 关于 128 | 管 129 | 归 130 | 果然 131 | 果真 132 | 过 133 | 哈 134 | 哈哈 135 | 呵 136 | 和 137 | 何 138 | 何处 139 | 何况 140 | 何时 141 | 嘿 142 | 哼 143 | 哼唷 144 | 呼哧 145 | 乎 146 | 哗 147 | 还是 148 | 还有 149 | 换句话说 150 | 换言之 151 | 或 152 | 或是 153 | 或者 154 | 极了 155 | 及 156 | 及其 157 | 及至 158 | 即 159 | 即便 160 | 即或 161 | 即令 162 | 即若 163 | 即使 164 | 几 165 | 几时 166 | 己 167 | 既 168 | 既然 169 | 既是 170 | 继而 171 | 加之 172 | 假如 173 | 假若 174 | 假使 175 | 鉴于 176 | 将 177 | 较 178 | 较之 179 | 叫 180 | 接着 181 | 结果 182 | 借 183 | 紧接着 184 | 进而 185 | 尽 186 | 尽管 187 | 经 188 | 经过 189 | 就 190 | 就是 191 | 就是说 192 | 据 193 | 具体地说 194 | 具体说来 195 | 开始 196 | 开外 197 | 靠 198 | 咳 199 | 可 200 | 可见 201 | 可是 202 | 可以 203 | 况且 204 | 啦 205 | 来 206 | 来着 207 | 离 208 | 例如 209 | 哩 210 | 连 211 | 连同 212 | 两者 213 | 了 214 | 临 215 | 另 216 | 另外 217 | 另一方面 218 | 论 219 | 嘛 220 | 吗 221 | 慢说 222 | 漫说 223 | 冒 224 | 么 225 | 每 226 | 每当 227 | 们 228 | 莫若 229 | 某 230 | 某个 231 | 某些 232 | 拿 233 | 哪 234 | 哪边 235 | 哪儿 236 | 哪个 237 | 哪里 238 | 哪年 239 | 哪怕 240 | 哪天 241 | 哪些 242 | 哪样 243 | 那 244 | 那边 245 | 那儿 246 | 那个 247 | 那会儿 248 | 那里 249 | 那么 250 | 那么些 251 | 那么样 252 | 那时 253 | 那些 254 | 那样 255 | 乃 256 | 乃至 257 | 呢 258 | 能 259 | 你 260 | 你们 261 | 您 262 | 宁 263 | 宁可 264 | 宁肯 265 | 宁愿 266 | 哦 267 | 呕 268 | 啪达 269 | 旁人 270 | 呸 271 | 凭 272 | 凭借 273 | 其 274 | 其次 275 | 其二 276 | 其他 277 | 其它 278 | 其一 279 | 其余 280 | 其中 281 | 起 282 | 起见 283 | 岂但 284 | 恰恰相反 285 | 前后 286 | 前者 287 | 且 288 | 然而 289 | 然后 290 | 然则 291 | 让 292 | 人家 293 | 任 294 | 任何 295 | 任凭 296 | 如 297 | 如此 298 | 如果 299 | 如何 300 | 如其 301 | 如若 302 | 如上所述 303 | 若 304 | 若非 305 | 若是 306 | 啥 307 | 上下 308 | 尚且 309 | 设若 310 | 设使 311 | 甚而 312 | 甚么 313 | 甚至 314 | 省得 315 | 时候 316 | 什么 317 | 什么样 318 | 使得 319 | 是 320 | 是的 321 | 首先 322 | 谁 323 | 谁知 324 | 顺 325 | 顺着 326 | 似的 327 | 虽 328 | 虽然 329 | 虽说 330 | 虽则 331 | 随 332 | 随着 333 | 所 334 | 所以 335 | 他 336 | 他们 337 | 他人 338 | 它 339 | 它们 340 | 她 341 | 她们 342 | 倘 343 | 倘或 344 | 倘然 345 | 倘若 346 | 倘使 347 | 腾 348 | 替 349 | 通过 350 | 同 351 | 同时 352 | 哇 353 | 万一 354 | 往 355 | 望 356 | 为 357 | 为何 358 | 为了 359 | 为什么 360 | 为着 361 | 喂 362 | 嗡嗡 363 | 我 364 | 我们 365 | 呜 366 | 呜呼 367 | 乌乎 368 | 无论 369 | 无宁 370 | 毋宁 371 | 嘻 372 | 吓 373 | 相对而言 374 | 像 375 | 向 376 | 向着 377 | 嘘 378 | 呀 379 | 焉 380 | 沿 381 | 沿着 382 | 要 383 | 要不 384 | 要不然 385 | 要不是 386 | 要么 387 | 要是 388 | 也 389 | 也罢 390 | 也好 391 | 一 392 | 一般 393 | 一旦 394 | 一方面 395 | 一来 396 | 一切 397 | 一样 398 | 一则 399 | 依 400 | 依照 401 | 矣 402 | 以 403 | 以便 404 | 以及 405 | 以免 406 | 以至 407 | 以至于 408 | 以致 409 | 抑或 410 | 因 411 | 因此 412 | 因而 413 | 因为 414 | 哟 415 | 用 416 | 由 417 | 由此可见 418 | 由于 419 | 有 420 | 有的 421 | 有关 422 | 有些 423 | 又 424 | 于 425 | 于是 426 | 于是乎 427 | 与 428 | 与此同时 429 | 与否 430 | 与其 431 | 越是 432 | 云云 433 | 哉 434 | 再说 435 | 再者 436 | 在 437 | 在下 438 | 咱 439 | 咱们 440 | 则 441 | 怎 442 | 怎么 443 | 怎么办 444 | 怎么样 445 | 怎样 446 | 咋 447 | 照 448 | 照着 449 | 者 450 | 这 451 | 这边 452 | 这儿 453 | 这个 454 | 这会儿 455 | 这就是说 456 | 这里 457 | 这么 458 | 这么点儿 459 | 这么些 460 | 这么样 461 | 这时 462 | 这些 463 | 这样 464 | 正如 465 | 吱 466 | 之 467 | 之类 468 | 之所以 469 | 之一 470 | 只是 471 | 只限 472 | 只要 473 | 只有 474 | 至 475 | 至于 476 | 诸位 477 | 着 478 | 着呢 479 | 自 480 | 自从 481 | 自个儿 482 | 自各儿 483 | 自己 484 | 自家 485 | 自身 486 | 综上所述 487 | 总的来看 488 | 总的来说 489 | 总的说来 490 | 总而言之 491 | 总之 492 | 纵 493 | 纵令 494 | 纵然 495 | 纵使 496 | 遵照 497 | 作为 498 | 兮 499 | 呃 500 | 呗 501 | 咚 502 | 咦 503 | 喏 504 | 啐 505 | 喔唷 506 | 嗬 507 | 嗯 508 | 嗳 509 | ~ 510 | ! 511 | . 512 | : 513 | " 514 | ' 515 | ( 516 | ) 517 | * 518 | A 519 | 白 520 | 社会主义 521 | -- 522 | .. 523 | >> 524 | [ 525 | ] 526 | 527 | < 528 | > 529 | / 530 | \ 531 | | 532 | - 533 | _ 534 | + 535 | = 536 | & 537 | ^ 538 | % 539 | # 540 | @ 541 | ` 542 | ; 543 | $ 544 | ( 545 | ) 546 | —— 547 | — 548 | ¥ 549 | · 550 | ... 551 | ‘ 552 | ’ 553 | 〉 554 | 〈 555 | ⋯ 556 |   557 | 0 558 | 1 559 | 2 560 | 3 561 | 4 562 | 5 563 | 6 564 | 7 565 | 8 566 | 9 567 | 0 568 | 1 569 | 2 570 | 3 571 | 4 572 | 5 573 | 6 574 | 7 575 | 8 576 | 9 577 | 二 578 | 三 579 | 四 580 | 五 581 | 六 582 | 七 583 | 八 584 | 九 585 | 零 586 | > 587 | < 588 | @ 589 | # 590 | $ 591 | % 592 | ︿ 593 | & 594 | * 595 | + 596 | 〜 597 | | 598 | [ 599 | ] 600 | { 601 | } 602 | 啊哈 603 | 啊呀 604 | 啊哟 605 | 挨次 606 | 挨个 607 | 挨家挨户 608 | 挨门挨户 609 | 挨门逐户 610 | 挨着 611 | 按理 612 | 按期 613 | 按时 614 | 按说 615 | 暗地里 616 | 暗中 617 | 暗自 618 | 昂然 619 | 八成 620 | 白白 621 | 半 622 | 梆 623 | 保管 624 | 保险 625 | 饱 626 | 背地里 627 | 背靠背 628 | 倍感 629 | 倍加 630 | 本人 631 | 本身 632 | 甭 633 | 比起 634 | 比如说 635 | 比照 636 | 毕竟 637 | 必 638 | 必定 639 | 必将 640 | 必须 641 | 便 642 | 别人 643 | 并非 644 | 并肩 645 | 并没 646 | 并没有 647 | 并排 648 | 并无 649 | 勃然 650 | 不 651 | 不必 652 | 不常 653 | 不大 654 | 不但...而且 655 | 不得 656 | 不得不 657 | 不得了 658 | 不得已 659 | 不迭 660 | 不定 661 | 不对 662 | 不妨 663 | 不管怎样 664 | 不会 665 | 不仅...而且 666 | 不仅仅 667 | 不仅仅是 668 | 不经意 669 | 不可开交 670 | 不可抗拒 671 | 不力 672 | 不了 673 | 不料 674 | 不满 675 | 不免 676 | 不能不 677 | 不起 678 | 不巧 679 | 不然的话 680 | 不日 681 | 不少 682 | 不胜 683 | 不时 684 | 不是 685 | 不同 686 | 不能 687 | 不要 688 | 不外 689 | 不外乎 690 | 不下 691 | 不限 692 | 不消 693 | 不已 694 | 不亦乐乎 695 | 不由得 696 | 不再 697 | 不择手段 698 | 不怎么 699 | 不曾 700 | 不知不觉 701 | 不止 702 | 不止一次 703 | 不至于 704 | 才 705 | 才能 706 | 策略地 707 | 差不多 708 | 差一点 709 | 常 710 | 常常 711 | 常言道 712 | 常言说 713 | 常言说得好 714 | 长此下去 715 | 长话短说 716 | 长期以来 717 | 长线 718 | 敞开儿 719 | 彻夜 720 | 陈年 721 | 趁便 722 | 趁机 723 | 趁热 724 | 趁势 725 | 趁早 726 | 成年 727 | 成年累月 728 | 成心 729 | 乘机 730 | 乘胜 731 | 乘势 732 | 乘隙 733 | 乘虚 734 | 诚然 735 | 迟早 736 | 充分 737 | 充其极 738 | 充其量 739 | 抽冷子 740 | 臭 741 | 初 742 | 出 743 | 出来 744 | 出去 745 | 除此 746 | 除此而外 747 | 除此以外 748 | 除开 749 | 除去 750 | 除却 751 | 除外 752 | 处处 753 | 川流不息 754 | 传 755 | 传说 756 | 传闻 757 | 串行 758 | 纯 759 | 纯粹 760 | 此后 761 | 此中 762 | 次第 763 | 匆匆 764 | 从不 765 | 从此 766 | 从此以后 767 | 从古到今 768 | 从古至今 769 | 从今以后 770 | 从宽 771 | 从来 772 | 从轻 773 | 从速 774 | 从头 775 | 从未 776 | 从无到有 777 | 从小 778 | 从新 779 | 从严 780 | 从优 781 | 从早到晚 782 | 从中 783 | 从重 784 | 凑巧 785 | 粗 786 | 存心 787 | 达旦 788 | 打从 789 | 打开天窗说亮话 790 | 大 791 | 大不了 792 | 大大 793 | 大抵 794 | 大都 795 | 大多 796 | 大凡 797 | 大概 798 | 大家 799 | 大举 800 | 大略 801 | 大面儿上 802 | 大事 803 | 大体 804 | 大体上 805 | 大约 806 | 大张旗鼓 807 | 大致 808 | 呆呆地 809 | 带 810 | 殆 811 | 待到 812 | 单 813 | 单纯 814 | 单单 815 | 但愿 816 | 弹指之间 817 | 当场 818 | 当儿 819 | 当即 820 | 当口儿 821 | 当然 822 | 当庭 823 | 当头 824 | 当下 825 | 当真 826 | 当中 827 | 倒不如 828 | 倒不如说 829 | 倒是 830 | 到处 831 | 到底 832 | 到了儿 833 | 到目前为止 834 | 到头 835 | 到头来 836 | 得起 837 | 得天独厚 838 | 的确 839 | 等到 840 | 叮当 841 | 顶多 842 | 定 843 | 动不动 844 | 动辄 845 | 陡然 846 | 都 847 | 独 848 | 独自 849 | 断然 850 | 顿时 851 | 多次 852 | 多多 853 | 多多少少 854 | 多多益善 855 | 多亏 856 | 多年来 857 | 多年前 858 | 而后 859 | 而论 860 | 而又 861 | 尔等 862 | 二话不说 863 | 二话没说 864 | 反倒 865 | 反倒是 866 | 反而 867 | 反手 868 | 反之亦然 869 | 反之则 870 | 方 871 | 方才 872 | 方能 873 | 放量 874 | 非常 875 | 非得 876 | 分期 877 | 分期分批 878 | 分头 879 | 奋勇 880 | 愤然 881 | 风雨无阻 882 | 逢 883 | 弗 884 | 甫 885 | 嘎嘎 886 | 该当 887 | 概 888 | 赶快 889 | 赶早不赶晚 890 | 敢 891 | 敢情 892 | 敢于 893 | 刚 894 | 刚才 895 | 刚好 896 | 刚巧 897 | 高低 898 | 格外 899 | 隔日 900 | 隔夜 901 | 个人 902 | 各式 903 | 更 904 | 更加 905 | 更进一步 906 | 更为 907 | 公然 908 | 共 909 | 共总 910 | 够瞧的 911 | 姑且 912 | 古来 913 | 故而 914 | 故意 915 | 固 916 | 怪 917 | 怪不得 918 | 惯常 919 | 光 920 | 光是 921 | 归根到底 922 | 归根结底 923 | 过于 924 | 毫不 925 | 毫无 926 | 毫无保留地 927 | 毫无例外 928 | 好在 929 | 何必 930 | 何尝 931 | 何妨 932 | 何苦 933 | 何乐而不为 934 | 何须 935 | 何止 936 | 很 937 | 很多 938 | 很少 939 | 轰然 940 | 后来 941 | 呼啦 942 | 忽地 943 | 忽然 944 | 互 945 | 互相 946 | 哗啦 947 | 话说 948 | 还 949 | 恍然 950 | 会 951 | 豁然 952 | 活 953 | 伙同 954 | 或多或少 955 | 或许 956 | 基本 957 | 基本上 958 | 基于 959 | 极 960 | 极大 961 | 极度 962 | 极端 963 | 极力 964 | 极其 965 | 极为 966 | 急匆匆 967 | 即将 968 | 即刻 969 | 即是说 970 | 几度 971 | 几番 972 | 几乎 973 | 几经 974 | 既...又 975 | 继之 976 | 加上 977 | 加以 978 | 间或 979 | 简而言之 980 | 简言之 981 | 简直 982 | 见 983 | 将才 984 | 将近 985 | 将要 986 | 交口 987 | 较比 988 | 较为 989 | 接连不断 990 | 接下来 991 | 皆可 992 | 截然 993 | 截至 994 | 藉以 995 | 借此 996 | 借以 997 | 届时 998 | 仅 999 | 仅仅 1000 | 谨 1001 | 进来 1002 | 进去 1003 | 近 1004 | 近几年来 1005 | 近来 1006 | 近年来 1007 | 尽管如此 1008 | 尽可能 1009 | 尽快 1010 | 尽量 1011 | 尽然 1012 | 尽如人意 1013 | 尽心竭力 1014 | 尽心尽力 1015 | 尽早 1016 | 精光 1017 | 经常 1018 | 竟 1019 | 竟然 1020 | 究竟 1021 | 就此 1022 | 就地 1023 | 就算 1024 | 居然 1025 | 局外 1026 | 举凡 1027 | 据称 1028 | 据此 1029 | 据实 1030 | 据说 1031 | 据我所知 1032 | 据悉 1033 | 具体来说 1034 | 决不 1035 | 决非 1036 | 绝 1037 | 绝不 1038 | 绝顶 1039 | 绝对 1040 | 绝非 1041 | 均 1042 | 喀 1043 | 看 1044 | 看来 1045 | 看起来 1046 | 看上去 1047 | 看样子 1048 | 可好 1049 | 可能 1050 | 恐怕 1051 | 快 1052 | 快要 1053 | 来不及 1054 | 来得及 1055 | 来讲 1056 | 来看 1057 | 拦腰 1058 | 牢牢 1059 | 老 1060 | 老大 1061 | 老老实实 1062 | 老是 1063 | 累次 1064 | 累年 1065 | 理当 1066 | 理该 1067 | 理应 1068 | 历 1069 | 立 1070 | 立地 1071 | 立刻 1072 | 立马 1073 | 立时 1074 | 联袂 1075 | 连连 1076 | 连日 1077 | 连日来 1078 | 连声 1079 | 连袂 1080 | 临到 1081 | 另方面 1082 | 另行 1083 | 另一个 1084 | 路经 1085 | 屡 1086 | 屡次 1087 | 屡次三番 1088 | 屡屡 1089 | 缕缕 1090 | 率尔 1091 | 率然 1092 | 略 1093 | 略加 1094 | 略微 1095 | 略为 1096 | 论说 1097 | 马上 1098 | 蛮 1099 | 满 1100 | 没 1101 | 没有 1102 | 每逢 1103 | 每每 1104 | 每时每刻 1105 | 猛然 1106 | 猛然间 1107 | 莫 1108 | 莫不 1109 | 莫非 1110 | 莫如 1111 | 默默地 1112 | 默然 1113 | 呐 1114 | 那末 1115 | 奈 1116 | 难道 1117 | 难得 1118 | 难怪 1119 | 难说 1120 | 内 1121 | 年复一年 1122 | 凝神 1123 | 偶而 1124 | 偶尔 1125 | 怕 1126 | 砰 1127 | 碰巧 1128 | 譬如 1129 | 偏偏 1130 | 乒 1131 | 平素 1132 | 颇 1133 | 迫于 1134 | 扑通 1135 | 其后 1136 | 其实 1137 | 奇 1138 | 齐 1139 | 起初 1140 | 起来 1141 | 起首 1142 | 起头 1143 | 起先 1144 | 岂 1145 | 岂非 1146 | 岂止 1147 | 迄 1148 | 恰逢 1149 | 恰好 1150 | 恰恰 1151 | 恰巧 1152 | 恰如 1153 | 恰似 1154 | 千 1155 | 千万 1156 | 千万千万 1157 | 切 1158 | 切不可 1159 | 切莫 1160 | 切切 1161 | 切勿 1162 | 窃 1163 | 亲口 1164 | 亲身 1165 | 亲手 1166 | 亲眼 1167 | 亲自 1168 | 顷 1169 | 顷刻 1170 | 顷刻间 1171 | 顷刻之间 1172 | 请勿 1173 | 穷年累月 1174 | 取道 1175 | 去 1176 | 权时 1177 | 全都 1178 | 全力 1179 | 全年 1180 | 全然 1181 | 全身心 1182 | 然 1183 | 人人 1184 | 仍 1185 | 仍旧 1186 | 仍然 1187 | 日复一日 1188 | 日见 1189 | 日渐 1190 | 日益 1191 | 日臻 1192 | 如常 1193 | 如此等等 1194 | 如次 1195 | 如今 1196 | 如期 1197 | 如前所述 1198 | 如上 1199 | 如下 1200 | 汝 1201 | 三番两次 1202 | 三番五次 1203 | 三天两头 1204 | 瑟瑟 1205 | 沙沙 1206 | 上 1207 | 上来 1208 | 上去 -------------------------------------------------------------------------------- /engines/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : __init__.py 6 | # @Software: PyCharm 7 | -------------------------------------------------------------------------------- /engines/data.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : data.py 6 | # @Software: PyCharm 7 | import numpy as np 8 | import tensorflow as tf 9 | import os 10 | import jieba 11 | from tqdm import tqdm 12 | from gensim.models.word2vec import Word2Vec 13 | from engines.utils.word2vec import Word2VecUtils 14 | from engines.utils.clean_data import filter_word, filter_char 15 | from config import classifier_config 16 | from collections import Counter 17 | 18 | 19 | class DataManager: 20 | 21 | def __init__(self, logger): 22 | self.logger = logger 23 | self.token_level = classifier_config['token_level'] 24 | self.embedding_method = classifier_config['embedding_method'] 25 | self.classifier = classifier_config['classifier'] 26 | self.token_file = classifier_config['token_file'] 27 | self.support_pretrained_model = ['Bert', 'DistilBert', 'AlBert', 'Electra', 'RoBerta', 'XLNet'] 28 | if self.embedding_method != '': 29 | if self.classifier in self.support_pretrained_model: 30 | raise Exception('如果使用预训练模型微调,不需要设定embedding_method') 31 | if self.token_level == 'char' and self.embedding_method != '': 32 | raise Exception('字粒度不应该使用词嵌入') 33 | self.w2v_util = Word2VecUtils(logger) 34 | if classifier_config['stop_words']: 35 | self.stop_words = self.w2v_util.get_stop_words() 36 | else: 37 | self.stop_words = [] 38 | self.remove_sp = True if classifier_config['remove_special'] else False 39 | self.PADDING = '[PAD]' 40 | self.UNKNOWN = '[UNK]' 41 | 42 | if self.classifier in self.support_pretrained_model: 43 | self.tokenizer = self.tokenizer_for_pretrained_model(self.classifier) 44 | self.vocab_size = len(self.tokenizer) 45 | self.embedding_dim = None 46 | else: 47 | if self.embedding_method == 'word2vec': 48 | self.w2v_model = Word2Vec.load(self.w2v_util.model_path) 49 | self.embedding_dim = self.w2v_model.vector_size 50 | self.vocab_size = len(self.w2v_model.wv.vocab) 51 | self.word2token = {self.PADDING: 0} 52 | # 所有词对应的嵌入向量 [(word, vector)] 53 | vocab_list = [(k, self.w2v_model.wv[k]) for k, v in self.w2v_model.wv.vocab.items()] 54 | # [len(vocab)+1, embedding_dim] '+1'是增加了一个'PAD' 55 | self.embeddings_matrix = np.zeros((len(self.w2v_model.wv.vocab.items()) + 1, self.w2v_model.vector_size)) 56 | for i in tqdm(range(len(vocab_list))): 57 | word = vocab_list[i][0] 58 | self.word2token[word] = i + 1 59 | self.embeddings_matrix[i + 1] = vocab_list[i][1] 60 | # 保存词表及标签表 61 | with open(self.token_file, 'w', encoding='utf-8') as outfile: 62 | for word, token in self.word2token.items(): 63 | outfile.write(word + '\t' + str(token) + '\n') 64 | else: 65 | self.embedding_dim = classifier_config['embedding_dim'] 66 | self.token_file = classifier_config['token_file'] 67 | if not os.path.isfile(self.token_file): 68 | self.logger.info('vocab files not exist...') 69 | else: 70 | self.token2id, self.id2token = self.load_vocab() 71 | 72 | self.batch_size = classifier_config['batch_size'] 73 | self.max_sequence_length = classifier_config['max_sequence_length'] 74 | 75 | self.classes = classifier_config['classes'] 76 | self.class_id = {cls: index for index, cls in enumerate(self.classes)} 77 | self.max_label_number = len(self.classes) 78 | self.reverse_classes = {str(class_id): class_name for class_name, class_id in self.class_id.items()} 79 | 80 | self.logger.info('dataManager initialed...') 81 | 82 | def load_vocab(self, sentences=None): 83 | if not os.path.exists(self.token_file): 84 | self.logger.info('vocab files not exist, building vocab...') 85 | return self.build_vocab(sentences) 86 | word_token2id, id2word_token = {}, {} 87 | with open(self.token_file, 'r', encoding='utf-8') as infile: 88 | for row in infile: 89 | row = row.strip() 90 | word_token, word_token_id = row.split('\t')[0], int(row.split('\t')[1]) 91 | word_token2id[word_token] = word_token_id 92 | id2word_token[word_token_id] = word_token 93 | self.vocab_size = len(word_token2id) 94 | return word_token2id, id2word_token 95 | 96 | @staticmethod 97 | def processing_sentence(x, stop_words): 98 | cut_word = jieba.cut(str(x).strip()) 99 | if stop_words: 100 | words = [word for word in cut_word if word not in stop_words and word != ' '] 101 | else: 102 | words = list(cut_word) 103 | words = [word for word in words if word != ' '] 104 | return words 105 | 106 | def build_vocab(self, sentences): 107 | tokens = [] 108 | if self.token_level == 'word': 109 | # 词粒度 110 | for sentence in tqdm(sentences): 111 | words = self.processing_sentence(sentence, self.stop_words) 112 | tokens.extend(words) 113 | # 根据词频过滤一部分频率极低的词/字,不加入词表 114 | count_dict = Counter(tokens) 115 | tokens = [k for k, v in count_dict.items() if v > 1 and filter_word(k)] 116 | else: 117 | # 字粒度 118 | for sentence in tqdm(sentences): 119 | chars = list(sentence) 120 | if self.stop_words: 121 | chars = [char for char in chars if char not in self.stop_words and char != ' '] 122 | tokens.extend(chars) 123 | # 根据词频过滤一部分频率极低的词/字,不加入词表 124 | count_dict = Counter(tokens) 125 | tokens = [k for k, v in count_dict.items() if filter_char(k, remove_sp=self.remove_sp)] 126 | token2id = dict(zip(tokens, range(1, len(tokens) + 1))) 127 | id2token = dict(zip(range(1, len(tokens) + 1), tokens)) 128 | # 向生成的词表和标签表中加入[PAD] 129 | id2token[0] = self.PADDING 130 | token2id[self.PADDING] = 0 131 | # 向生成的词表中加入[UNK] 132 | id2token[len(id2token)] = self.UNKNOWN 133 | token2id[self.UNKNOWN] = len(id2token) 134 | # 保存词表及标签表 135 | with open(self.token_file, 'w', encoding='utf-8') as outfile: 136 | for idx in id2token: 137 | outfile.write(id2token[idx] + '\t' + str(idx) + '\n') 138 | self.vocab_size = len(token2id) 139 | self.token2id = token2id 140 | self.id2token = id2token 141 | return token2id, id2token 142 | 143 | def padding(self, sentence): 144 | """ 145 | 长度不足max_sequence_length则补齐 146 | :param sentence: 147 | :return: 148 | """ 149 | if len(sentence) < self.max_sequence_length: 150 | sentence += [self.PADDING for _ in range(self.max_sequence_length - len(sentence))] 151 | else: 152 | sentence = sentence[:self.max_sequence_length] 153 | return sentence 154 | 155 | @staticmethod 156 | def tokenizer_for_pretrained_model(model_type): 157 | if model_type == 'Bert': 158 | from transformers import BertTokenizer 159 | tokenizer = BertTokenizer.from_pretrained(classifier_config['pretrained']) 160 | elif model_type == 'DistilBert': 161 | from transformers import DistilBertTokenizer 162 | tokenizer = DistilBertTokenizer.from_pretrained(classifier_config['pretrained']) 163 | elif model_type == 'AlBert': 164 | from transformers import AlbertTokenizer 165 | tokenizer = AlbertTokenizer.from_pretrained(classifier_config['pretrained']) 166 | elif model_type == 'Electra': 167 | from transformers import ElectraTokenizer 168 | tokenizer = ElectraTokenizer.from_pretrained(classifier_config['pretrained']) 169 | elif model_type == 'RoBerta': 170 | from transformers import RobertaTokenizer 171 | tokenizer = RobertaTokenizer.from_pretrained(classifier_config['pretrained']) 172 | elif model_type == 'XLNet': 173 | from transformers import XLNetTokenizer 174 | tokenizer = XLNetTokenizer.from_pretrained(classifier_config['pretrained']) 175 | else: 176 | tokenizer = None 177 | return tokenizer 178 | 179 | def tokenizer_for_sentences(self, sent): 180 | tokens = [] 181 | sent = self.padding(sent) 182 | for token in sent: 183 | if token in self.token2id: 184 | tokens.append(self.token2id[token]) 185 | else: 186 | tokens.append(self.token2id[self.UNKNOWN]) 187 | return tokens 188 | 189 | def prepare_w2v_data(self, sentences, labels): 190 | """ 191 | 输出word2vec做embedding之后的X矩阵和y向量 192 | """ 193 | self.logger.info('loading data...') 194 | X, y = [], [] 195 | for record in tqdm(zip(sentences, labels)): 196 | sentence = self.processing_sentence(record[0], self.stop_words) 197 | tokens = self.tokenizer_for_sentences(sentence) 198 | label = tf.one_hot(record[1], depth=self.max_label_number) 199 | X.append(tokens) 200 | y.append(label) 201 | return np.array(X), np.array(y, dtype=np.float32) 202 | 203 | def prepare_pretrained_data(self, sentences, labels): 204 | """ 205 | 输出预训练做embedding之后的X矩阵和y向量 206 | """ 207 | self.logger.info('loading data...') 208 | tokens_list, y = [], [] 209 | for record in tqdm(zip(sentences, labels)): 210 | label = tf.one_hot(record[1], depth=self.max_label_number) 211 | if len(record[0]) > self.max_sequence_length-2: 212 | sentence = record[0][:self.max_sequence_length-2] 213 | tokens = self.tokenizer.encode(sentence) 214 | else: 215 | tokens = self.tokenizer.encode(record[0]) 216 | if len(tokens) < self.max_sequence_length: 217 | tokens += [0 for _ in range(self.max_sequence_length - len(tokens))] 218 | tokens_list.append(tokens) 219 | y.append(label) 220 | return np.array(tokens_list), np.array(y, dtype=np.float32) 221 | 222 | def prepare_data(self, sentences, labels): 223 | """ 224 | 输出X矩阵和y向量 225 | """ 226 | self.logger.info('loading data...') 227 | X, y = [], [] 228 | for record in tqdm(zip(sentences, labels)): 229 | if self.token_level == 'word': 230 | sentence = self.processing_sentence(record[0], self.stop_words) 231 | else: 232 | sentence = list(record[0]) 233 | if self.stop_words: 234 | sentence = [char for char in sentence if char not in self.stop_words and char != ' '] 235 | label = tf.one_hot(record[1], depth=self.max_label_number) 236 | tokens = self.tokenizer_for_sentences(sentence) 237 | X.append(tokens) 238 | y.append(label) 239 | return np.array(X), np.array(y, dtype=np.float32) 240 | 241 | def get_dataset(self, df): 242 | """ 243 | 构建Dataset 244 | """ 245 | df = df.loc[df.label.isin(self.classes)] 246 | df['label'] = df.label.map(lambda x: self.class_id[x]) 247 | # convert the data in matrix 248 | if self.classifier in self.support_pretrained_model: 249 | X, y = self.prepare_pretrained_data(df['sentence'], df['label']) 250 | else: 251 | if self.embedding_method == 'word2vec': 252 | X, y = self.prepare_w2v_data(df['sentence'], df['label']) 253 | else: 254 | X, y = self.prepare_data(df['sentence'], df['label']) 255 | dataset = tf.data.Dataset.from_tensor_slices((X, y)) 256 | return dataset 257 | 258 | def prepare_single_sentence(self, sentence): 259 | """ 260 | 把预测的句子转成矩阵和向量 261 | :param sentence: 262 | :return: 263 | """ 264 | if self.classifier in self.support_pretrained_model: 265 | if len(sentence) > self.max_sequence_length - 2: 266 | sentence = sentence[:self.max_sequence_length - 2] 267 | tokens = self.tokenizer.encode(sentence) 268 | else: 269 | tokens = self.tokenizer.encode(sentence) 270 | if len(tokens) < 150: 271 | tokens += [0 for _ in range(self.max_sequence_length - len(tokens))] 272 | return np.array([tokens]) 273 | else: 274 | if self.embedding_method == 'word2vec': 275 | sentence = self.w2v_util.processing_sentence(sentence, self.stop_words) 276 | tokens = self.tokenizer_for_sentences(sentence) 277 | return np.array([tokens]) 278 | else: 279 | if self.token_level == 'word': 280 | sentence = self.w2v_util.processing_sentence(sentence, self.stop_words) 281 | else: 282 | sentence = list(sentence) 283 | if self.stop_words: 284 | sentence = [char for char in sentence if char not in self.stop_words and char != ' '] 285 | tokens = self.tokenizer_for_sentences(sentence) 286 | return np.array([tokens]) 287 | -------------------------------------------------------------------------------- /engines/models/PretrainedModel.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022/06/13 22:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : PretrainedModel.py 6 | # @Software: PyCharm 7 | 8 | from abc import ABC 9 | from transformers import TFBertModel 10 | import tensorflow as tf 11 | from config import classifier_config 12 | 13 | 14 | class PretrainedModelClassification(tf.keras.Model, ABC): 15 | def __init__(self, num_classes, model_type): 16 | super(PretrainedModelClassification, self).__init__() 17 | self.max_sequence_length = classifier_config['max_sequence_length'] 18 | if model_type == 'Bert': 19 | from transformers import TFBertModel 20 | self.model = TFBertModel.from_pretrained(classifier_config['pretrained']) 21 | elif model_type == 'DistilBert': 22 | from transformers import TFDistilBertModel 23 | self.model = TFDistilBertModel.from_pretrained(classifier_config['pretrained']) 24 | elif model_type == 'AlBert': 25 | from transformers import TFAlbertModel 26 | self.model = TFAlbertModel.from_pretrained(classifier_config['pretrained']) 27 | elif model_type == 'RoBerta': 28 | from transformers import TFRobertaModel 29 | self.model = TFRobertaModel.from_pretrained(classifier_config['pretrained']) 30 | elif model_type == 'Electra': 31 | from transformers import TFElectraModel 32 | self.model = TFElectraModel.from_pretrained(classifier_config['pretrained']) 33 | elif model_type == 'XLNet': 34 | from transformers import TFXLNetModel 35 | self.model = TFXLNetModel.from_pretrained(classifier_config['pretrained']) 36 | self.dropout = tf.keras.layers.Dropout(classifier_config['dropout_rate'], name='dropout') 37 | self.dense = tf.keras.layers.Dense(num_classes, 38 | activation='softmax', 39 | kernel_regularizer=tf.keras.regularizers.l2(0.2), 40 | bias_regularizer=tf.keras.regularizers.l2(0.2), 41 | name='dense') 42 | 43 | @tf.function 44 | def call(self, inputs, training=None): 45 | sequence_len = tf.reduce_sum(tf.sign(inputs), axis=1) 46 | sequence_len = tf.cast(sequence_len, tf.int32) 47 | bert_mask_ids = tf.sequence_mask(sequence_len, self.max_sequence_length, tf.int32) 48 | last_hidden_state = self.model(input_ids=inputs, attention_mask=bert_mask_ids).last_hidden_state 49 | pooled_output = last_hidden_state[:, 0] 50 | dropout_outputs = self.dropout(pooled_output, training) 51 | outputs = self.dense(dropout_outputs) 52 | return outputs 53 | -------------------------------------------------------------------------------- /engines/models/TextCNN.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : textcnn.py 6 | # @Software: PyCharm 7 | from abc import ABC 8 | import tensorflow as tf 9 | from config import classifier_config 10 | 11 | 12 | class TextCNN(tf.keras.Model, ABC): 13 | """ 14 | TextCNN模型 15 | """ 16 | def __init__(self, num_classes, embedding_dim, vocab_size, embeddings_matrix=None): 17 | super(TextCNN, self).__init__() 18 | num_filters = classifier_config['num_filters'] 19 | seq_length = classifier_config['max_sequence_length'] 20 | if classifier_config['embedding_method'] is '': 21 | self.embedding = tf.keras.layers.Embedding(vocab_size+1, embedding_dim, mask_zero=True) 22 | else: 23 | self.embedding = tf.keras.layers.Embedding(vocab_size + 1, embedding_dim, weights=[embeddings_matrix], 24 | trainable=False) 25 | 26 | if classifier_config['use_attention']: 27 | attention_size = classifier_config['attention_size'] 28 | self.attention_W = tf.keras.layers.Dense(attention_size, activation='tanh', use_bias=False) 29 | self.attention_v = tf.Variable(tf.zeros([1, attention_size])) 30 | 31 | self.conv1 = tf.keras.layers.Conv2D(filters=num_filters, kernel_size=[2, embedding_dim], 32 | strides=1, 33 | padding='valid', 34 | activation='relu') 35 | self.pool1 = tf.keras.layers.MaxPooling2D(pool_size=[seq_length-2+1, 1], padding='valid') 36 | 37 | self.conv2 = tf.keras.layers.Conv2D(filters=num_filters, kernel_size=[3, embedding_dim], strides=1, 38 | padding='valid', 39 | activation='relu') 40 | self.pool2 = tf.keras.layers.MaxPooling2D(pool_size=[seq_length-3+1, 1], padding='valid') 41 | 42 | self.conv3 = tf.keras.layers.Conv2D(filters=num_filters, kernel_size=[4, embedding_dim], strides=1, 43 | padding='valid', 44 | activation='relu') 45 | self.pool3 = tf.keras.layers.MaxPooling2D(pool_size=[seq_length-4+1, 1], padding='valid') 46 | self.dropout = tf.keras.layers.Dropout(classifier_config['dropout_rate'], name='dropout') 47 | self.dense = tf.keras.layers.Dense(num_classes, 48 | activation='softmax', 49 | kernel_regularizer=tf.keras.regularizers.l2(0.2), 50 | bias_regularizer=tf.keras.regularizers.l2(0.2), 51 | name='dense') 52 | self.flatten = tf.keras.layers.Flatten(data_format='channels_last', name='flatten') 53 | 54 | @tf.function 55 | def call(self, inputs, training=None): 56 | inputs = self.embedding(inputs) 57 | if classifier_config['use_attention']: 58 | # 此处的attention是直接对embedding层做attention,思路来自于https://kexue.fm/archives/5409#%E6%B3%A8%E6%84%8F%E5%8A%9B 59 | output = self.attention_W(inputs) 60 | output = tf.matmul(output, self.attention_v, transpose_b=True) 61 | alpha = tf.nn.softmax(output, axis=1) 62 | inputs = alpha * inputs 63 | 64 | inputs = tf.expand_dims(inputs, -1) 65 | pooled_output = [] 66 | con1 = self.conv1(inputs) 67 | pool1 = self.pool1(con1) 68 | pooled_output.append(pool1) 69 | 70 | con2 = self.conv2(inputs) 71 | pool2 = self.pool2(con2) 72 | pooled_output.append(pool2) 73 | 74 | con3 = self.conv3(inputs) 75 | pool3 = self.pool3(con3) 76 | pooled_output.append(pool3) 77 | 78 | concat_outputs = tf.keras.layers.concatenate(pooled_output, axis=-1, name='concatenate') 79 | flatten_outputs = self.flatten(concat_outputs) 80 | dropout_outputs = self.dropout(flatten_outputs, training) 81 | outputs = self.dense(dropout_outputs) 82 | return outputs 83 | -------------------------------------------------------------------------------- /engines/models/TextRCNN.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/11/6 10:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : textrcnn.py 6 | # @Software: PyCharm 7 | from abc import ABC 8 | import tensorflow as tf 9 | from config import classifier_config 10 | 11 | 12 | class TextRCNN(tf.keras.Model, ABC): 13 | """ 14 | TextRCNN模型 15 | """ 16 | 17 | def __init__(self, num_classes, embedding_dim, vocab_size, embeddings_matrix=None): 18 | super(TextRCNN, self).__init__() 19 | hidden_dim = classifier_config['hidden_dim'] 20 | if classifier_config['embedding_method'] is '': 21 | self.embedding = tf.keras.layers.Embedding(vocab_size + 1, embedding_dim, mask_zero=True) 22 | else: 23 | self.embedding = tf.keras.layers.Embedding(vocab_size + 1, embedding_dim, weights=[embeddings_matrix], 24 | trainable=False) 25 | 26 | self.forward = tf.keras.layers.LSTM(hidden_dim, return_sequences=True) 27 | self.backward = tf.keras.layers.LSTM(hidden_dim, return_sequences=True, go_backwards=True) 28 | self.max_pool = tf.keras.layers.GlobalMaxPool1D() 29 | self.dropout = tf.keras.layers.Dropout(classifier_config['dropout_rate'], name='dropout') 30 | self.dense1 = tf.keras.layers.Dense(2 * hidden_dim + embedding_dim, activation='tanh') 31 | self.dense2 = tf.keras.layers.Dense(num_classes, 32 | activation='softmax', 33 | kernel_regularizer=tf.keras.regularizers.l2(0.1), 34 | bias_regularizer=tf.keras.regularizers.l2(0.1), 35 | name='dense') 36 | 37 | @tf.function 38 | def call(self, inputs, training=None): 39 | inputs = self.embedding(inputs) 40 | left_embedding = self.forward(inputs) 41 | right_embedding = self.backward(inputs) 42 | concat_outputs = tf.keras.layers.concatenate([left_embedding, inputs, right_embedding], axis=-1) 43 | dropout_outputs = self.dropout(concat_outputs, training) 44 | fc_outputs = self.dense1(dropout_outputs) 45 | pool_outputs = self.max_pool(fc_outputs) 46 | outputs = self.dense2(pool_outputs) 47 | return outputs 48 | -------------------------------------------------------------------------------- /engines/models/TextRNN.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/03/19 10:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : word2vec_textrnn.py 6 | # @Software: PyCharm 7 | from abc import ABC 8 | import tensorflow as tf 9 | from config import classifier_config 10 | 11 | 12 | class TextRNN(tf.keras.Model, ABC): 13 | """ 14 | TextRNN模型 15 | """ 16 | 17 | def __init__(self, num_classes, embedding_dim, vocab_size, embeddings_matrix=None): 18 | super(TextRNN, self).__init__() 19 | hidden_dim = classifier_config['hidden_dim'] 20 | if classifier_config['embedding_method'] is '': 21 | self.embedding = tf.keras.layers.Embedding(vocab_size + 1, embedding_dim, mask_zero=True) 22 | else: 23 | self.embedding = tf.keras.layers.Embedding(vocab_size + 1, embedding_dim, weights=[embeddings_matrix], 24 | trainable=False) 25 | self.bilstm = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(hidden_dim, return_sequences=True)) 26 | self.dropout = tf.keras.layers.Dropout(classifier_config['dropout_rate'], name='dropout') 27 | if classifier_config['use_attention']: 28 | self.attention_w = tf.Variable(tf.zeros([1, 2 * hidden_dim])) 29 | self.dense = tf.keras.layers.Dense(num_classes, 30 | activation='softmax', 31 | kernel_regularizer=tf.keras.regularizers.l2(0.1), 32 | bias_regularizer=tf.keras.regularizers.l2(0.1), 33 | name='dense') 34 | 35 | @tf.function 36 | def call(self, inputs, training=None): 37 | inputs = self.embedding(inputs) 38 | bilstm_outputs = self.bilstm(inputs) 39 | if classifier_config['use_attention']: 40 | output = tf.nn.tanh(bilstm_outputs) 41 | output = tf.matmul(output, self.attention_w, transpose_b=True) 42 | alpha = tf.nn.softmax(output, axis=1) 43 | outputs = alpha * bilstm_outputs 44 | bilstm_outputs = tf.nn.tanh(outputs) 45 | dropout_outputs = self.dropout(bilstm_outputs, training) 46 | outputs = tf.reduce_sum(dropout_outputs, axis=1) 47 | outputs = self.dense(outputs) 48 | return outputs 49 | -------------------------------------------------------------------------------- /engines/models/Transformer.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/3/30 22:56 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : transformer.py 6 | # @Software: PyCharm 7 | from abc import ABC 8 | import tensorflow as tf 9 | import numpy as np 10 | from config import classifier_config 11 | from engines.utils.mask import create_padding_mask 12 | 13 | 14 | class PositionalEncoding(tf.keras.layers.Layer): 15 | """ 16 | Args: 17 | embedding_dim: 模型的维度,论文默认是512 18 | seq_length: 文本序列的最大长度 19 | """ 20 | 21 | def __init__(self, embedding_dim, seq_length): 22 | super(PositionalEncoding, self).__init__() 23 | # 根据论文给的公式,构造出PE矩阵 24 | self.pe = np.array([[pos / np.power(10000, 2 * (i // 2) / embedding_dim) 25 | for i in range(embedding_dim)] for pos in range(seq_length)]) 26 | # 偶数列使用sin,奇数列使用cos 27 | self.pe[:, 0::2] = np.sin(self.pe[:, 0::2]) 28 | self.pe[:, 1::2] = np.cos(self.pe[:, 1::2]) 29 | 30 | @tf.function 31 | def call(self, inputs): 32 | # 在这里将词的embedding和位置embedding相加 33 | position_embed = inputs + self.pe 34 | return position_embed 35 | 36 | 37 | class MultiHeadAttention(tf.keras.layers.Layer): 38 | """ 39 | 多头注意力机制 40 | """ 41 | def __init__(self, embedding_dim): 42 | super(MultiHeadAttention, self).__init__() 43 | self.head_num = classifier_config['head_num'] 44 | 45 | if embedding_dim % self.head_num != 0: 46 | raise ValueError( 47 | 'embedding_dim({}) % head_num({}) is not zero. embedding_dim must be multiple of head_num.'.format( 48 | embedding_dim, self.head_num)) 49 | 50 | self.head_dim = embedding_dim // self.head_num 51 | self.embedding_dim = embedding_dim 52 | self.W_Q = tf.keras.layers.Dense(embedding_dim) 53 | self.W_K = tf.keras.layers.Dense(embedding_dim) 54 | self.W_V = tf.keras.layers.Dense(embedding_dim) 55 | self.W_O = tf.keras.layers.Dense(embedding_dim) 56 | 57 | def scaled_dot_product_attention(self, query, key, value, mask): 58 | """ 59 | 缩放点积注意力 60 | """ 61 | matmul_qk = tf.matmul(query, key, transpose_b=True) 62 | dk = self.head_dim ** -0.5 63 | scaled_attention = matmul_qk / tf.math.sqrt(dk) 64 | 65 | if mask is not None: 66 | scaled_attention += (mask * -1e9) 67 | 68 | attention_weights = tf.nn.softmax(scaled_attention, axis=-1) 69 | output = tf.matmul(attention_weights, value) 70 | return output 71 | 72 | def split_head(self, tensor, batch_size): 73 | tensor = tf.reshape(tensor, (batch_size, -1, self.head_num, self.head_dim)) 74 | tensor = tf.transpose(tensor, perm=[0, 2, 1, 3]) 75 | return tensor 76 | 77 | @tf.function 78 | def call(self, inputs, mask=None): 79 | batch_size = tf.shape(inputs)[0] 80 | query = self.W_Q(inputs) 81 | key = self.W_K(inputs) 82 | value = self.W_V(inputs) 83 | 84 | query = self.split_head(query, batch_size) 85 | key = self.split_head(key, batch_size) 86 | value = self.split_head(value, batch_size) 87 | 88 | z = self.scaled_dot_product_attention(query, key, value, mask) 89 | z = tf.reshape(z, (batch_size, -1, self.embedding_dim)) 90 | z = self.W_O(z) 91 | return z 92 | 93 | 94 | class PositionWiseFeedForwardLayer(tf.keras.layers.Layer): 95 | """ 96 | FeedForward层 97 | """ 98 | def __init__(self, embedding_dim): 99 | super(PositionWiseFeedForwardLayer, self).__init__() 100 | hidden_dim = classifier_config['hidden_dim'] 101 | self.dense_1 = tf.keras.layers.Dense(hidden_dim, activation='relu', kernel_initializer='he_uniform') 102 | self.dense_2 = tf.keras.layers.Dense(embedding_dim) 103 | 104 | @tf.function 105 | def call(self, inputs): 106 | output = self.dense_1(inputs) 107 | output = self.dense_2(output) 108 | return output 109 | 110 | 111 | class Encoder(tf.keras.layers.Layer): 112 | def __init__(self, embedding_dim, dropout_rate): 113 | super(Encoder, self).__init__() 114 | self.attention = MultiHeadAttention(embedding_dim) 115 | self.feed_forward = PositionWiseFeedForwardLayer(embedding_dim) 116 | self.layer_norm_1 = tf.keras.layers.LayerNormalization(epsilon=1e-6) 117 | self.layer_norm_2 = tf.keras.layers.LayerNormalization(epsilon=1e-6) 118 | self.dropout_1 = tf.keras.layers.Dropout(dropout_rate) 119 | self.dropout_2 = tf.keras.layers.Dropout(dropout_rate) 120 | 121 | @tf.function 122 | def call(self, inputs, training, mask): 123 | attention_outputs = self.attention(inputs, mask) 124 | outputs_1 = self.dropout_1(attention_outputs, training=training) 125 | outputs_1 = self.layer_norm_1(inputs + outputs_1) 126 | ffn_output = self.feed_forward(outputs_1) 127 | outputs_2 = self.dropout_2(ffn_output, training=training) 128 | outputs_2 = self.layer_norm_2(outputs_1 + outputs_2) 129 | return outputs_2 130 | 131 | 132 | class Transformer(tf.keras.Model, ABC): 133 | """ 134 | Transformer模型 135 | """ 136 | 137 | def __init__(self, num_classes, embedding_dim, vocab_size, embeddings_matrix=None): 138 | super(Transformer, self).__init__() 139 | dropout_rate = classifier_config['dropout_rate'] 140 | encoder_num = classifier_config['encoder_num'] 141 | seq_length = classifier_config['max_sequence_length'] 142 | if classifier_config['embedding_method'] is '': 143 | self.embedding = tf.keras.layers.Embedding(vocab_size+1, embedding_dim, mask_zero=True) 144 | else: 145 | self.embedding = tf.keras.layers.Embedding(vocab_size + 1, embedding_dim, weights=[embeddings_matrix], 146 | trainable=False) 147 | self.positional_encoder = PositionalEncoding(embedding_dim, seq_length) 148 | self.encoders = [Encoder(embedding_dim, dropout_rate) for _ in range(encoder_num)] 149 | self.dense = tf.keras.layers.Dense(num_classes, activation='softmax') 150 | self.dropout = tf.keras.layers.Dropout(dropout_rate) 151 | self.avg_pool = tf.keras.layers.GlobalAvgPool1D() 152 | 153 | @tf.function 154 | def call(self, inputs, training=None): 155 | mask = create_padding_mask(inputs) 156 | embed_inputs = self.embedding(inputs) 157 | output = self.positional_encoder(embed_inputs) 158 | for encoder in self.encoders: 159 | output = encoder(output, training, mask) 160 | output = self.dropout(output, training=training) 161 | output = self.avg_pool(output) 162 | output = self.dense(output) 163 | return output 164 | -------------------------------------------------------------------------------- /engines/models/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/11/6 11:29 上午 3 | # @Author : lishouxian 4 | # @Email : lishouxian@cvte.com 5 | # @File : __init__.py.py 6 | # @Software: PyCharm 7 | -------------------------------------------------------------------------------- /engines/predict.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : predict.py 6 | # @Software: PyCharm 7 | import tensorflow as tf 8 | import pandas as pd 9 | import numpy as np 10 | import time 11 | import datetime 12 | from tqdm import tqdm 13 | from engines.utils.metrics import cal_metrics 14 | from config import classifier_config 15 | from texttable import Texttable 16 | from collections import Counter 17 | 18 | 19 | class Predictor: 20 | def __init__(self, data_manager, logger): 21 | self.logger = logger 22 | self.dataManager = data_manager 23 | self.seq_length = data_manager.max_sequence_length 24 | self.embedding_dim = data_manager.embedding_dim 25 | self.reverse_classes = data_manager.reverse_classes 26 | self.checkpoints_dir = classifier_config['checkpoints_dir'] 27 | 28 | if classifier_config['embedding_method'] == 'word2vec': 29 | embeddings_matrix = data_manager.embeddings_matrix 30 | else: 31 | embeddings_matrix = None 32 | classifier = classifier_config['classifier'] 33 | vocab_size = data_manager.vocab_size 34 | num_classes = data_manager.max_label_number 35 | logger.info('loading model parameter') 36 | if classifier == 'TextCNN': 37 | from engines.models.TextCNN import TextCNN 38 | self.model = TextCNN(num_classes, self.embedding_dim, vocab_size, embeddings_matrix) 39 | elif classifier == 'TextRCNN': 40 | from engines.models.TextRCNN import TextRCNN 41 | self.model = TextRCNN(num_classes, self.embedding_dim, vocab_size, embeddings_matrix) 42 | elif classifier == 'TextRNN': 43 | from engines.models.TextRNN import TextRNN 44 | self.model = TextRNN(num_classes, self.embedding_dim, vocab_size, embeddings_matrix) 45 | elif classifier == 'Transformer': 46 | from engines.models.Transformer import Transformer 47 | self.model = Transformer(num_classes, self.embedding_dim, vocab_size, embeddings_matrix) 48 | elif classifier in self.dataManager.support_pretrained_model: 49 | from engines.models.PretrainedModel import PretrainedModelClassification 50 | self.model = PretrainedModelClassification(num_classes, model_type=classifier) 51 | else: 52 | raise Exception('config model is not exist') 53 | # 实例化Checkpoint,设置恢复对象为新建立的模型 54 | checkpoint = tf.train.Checkpoint(model=self.model) 55 | # 从文件恢复模型参数 56 | checkpoint.restore(tf.train.latest_checkpoint(self.checkpoints_dir)) 57 | logger.info('loading model successfully') 58 | 59 | def predict_test(self): 60 | test_file = classifier_config['test_file'] 61 | if test_file == '': 62 | self.logger.info('test dataset does not exist!') 63 | return 64 | test_df = pd.read_csv(test_file) 65 | test_df = test_df.loc[test_df.label.isin(self.dataManager.classes)] 66 | test_dataset = self.dataManager.get_dataset(test_df) 67 | batch_size = self.dataManager.batch_size 68 | y_true, y_pred, probabilities = np.array([]), np.array([]), np.array([]) 69 | start_time = time.time() 70 | for step, batch in tqdm(test_dataset.batch(batch_size).enumerate()): 71 | X_test_batch, y_test_batch = batch 72 | logits = self.model(X_test_batch) 73 | predictions = tf.argmax(logits, axis=-1) 74 | y_test_batch = tf.argmax(y_test_batch, axis=-1) 75 | y_true = np.append(y_true, y_test_batch) 76 | y_pred = np.append(y_pred, predictions) 77 | max_probability = tf.reduce_max(logits, axis=-1) 78 | probabilities = np.append(probabilities, max_probability) 79 | self.logger.info('test time consumption: %.3f(ms)' % ((time.time() - start_time) * 1000)) 80 | measures, each_classes = cal_metrics(y_true=y_true, y_pred=y_pred) 81 | count_map = {self.reverse_classes[str(int(key))]: value for key, value in Counter(y_true).items()} 82 | # 打印不一致的下标 83 | inconsistent = np.argwhere(y_true != y_pred) 84 | if len(inconsistent) > 0: 85 | indices = [i for i in list(inconsistent.ravel())] 86 | y_error_pred = [self.reverse_classes[str(int(i))] for i in list(y_pred[indices])] 87 | data_dict = {'indices': indices, 'y_error_pred': y_error_pred} 88 | for col_name in test_df.columns.values.tolist(): 89 | data_dict[col_name] = test_df.iloc[indices][col_name].tolist() 90 | data_dict['probability'] = list(probabilities[indices]) 91 | indices = [i + 1 for i in indices] 92 | test_result_file = self.checkpoints_dir + '/logs/' + (datetime.datetime.now().strftime('%Y%m%d%H%M%S-badcase.csv')) 93 | result = pd.DataFrame(data_dict) 94 | statics = pd.DataFrame( 95 | result.groupby('label').apply(lambda data: data.y_error_pred.value_counts())).reset_index() 96 | statics = statics.rename(columns={'level_1': 'error_predict', 'y_error_pred': 'count'}) 97 | statics['error_rate'] = statics.apply(lambda row: row['count'] / count_map[row['label']], axis=1) 98 | tb = Texttable() 99 | tb.set_cols_align(['l', 'r', 'r', 'r']) 100 | tb.set_cols_dtype(['t', 't', 'i', 'f']) 101 | tb.header(list(statics.columns)) 102 | tb.add_rows(statics.values, header=False) 103 | result.to_csv(test_result_file, encoding='utf-8', index=False) 104 | self.logger.info('\nerror indices in test dataset:') 105 | self.logger.info(indices) 106 | self.logger.info('\nerror distribution:') 107 | self.logger.info(tb.draw()) 108 | # 打印总的指标 109 | res_str = '' 110 | for k, v in measures.items(): 111 | res_str += (k + ': %.3f ' % v) 112 | self.logger.info('%s' % res_str) 113 | # 打印每一个类别的指标 114 | classes_val_str = '' 115 | for k, v in each_classes.items(): 116 | if k in self.reverse_classes: 117 | classes_val_str += ('\n' + self.reverse_classes[k] + ': ' + str(each_classes[k])) 118 | self.logger.info(classes_val_str) 119 | 120 | def predict_one(self, sentence): 121 | """ 122 | 对输入的句子分类预测 123 | :param sentence: 124 | :return: 125 | """ 126 | start_time = time.time() 127 | vector = self.dataManager.prepare_single_sentence(sentence) 128 | logits = self.model(inputs=vector) 129 | prediction = tf.argmax(logits, axis=-1) 130 | prediction = prediction.numpy()[0] 131 | self.logger.info('predict time consumption: %.3f(ms)' % ((time.time() - start_time)*1000)) 132 | return self.reverse_classes[str(prediction)], logits 133 | 134 | def save_model(self): 135 | tf.saved_model.save(self.model, self.checkpoints_dir, 136 | signatures=self.model.call.get_concrete_function( 137 | tf.TensorSpec([None, self.seq_length], tf.int32, name='inputs'))) 138 | self.logger.info('The model has been saved') 139 | -------------------------------------------------------------------------------- /engines/train.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : train.py 6 | # @Software: PyCharm 7 | import numpy as np 8 | import time 9 | import os 10 | import pandas as pd 11 | import tensorflow as tf 12 | from tqdm import tqdm 13 | from engines.utils.metrics import cal_metrics 14 | from config import classifier_config 15 | tf.keras.backend.set_floatx('float32') 16 | 17 | 18 | class Train: 19 | def __init__(self, data_manager, logger): 20 | self.logger = logger 21 | self.data_manager = data_manager 22 | self.reverse_classes = data_manager.reverse_classes 23 | 24 | self.epoch = classifier_config['epoch'] 25 | self.print_per_batch = classifier_config['print_per_batch'] 26 | self.is_early_stop = classifier_config['is_early_stop'] 27 | self.patient = classifier_config['patient'] 28 | self.use_gan = classifier_config['use_gan'] 29 | self.gan_method = classifier_config['gan_method'] 30 | self.batch_size = self.data_manager.batch_size 31 | 32 | if classifier_config['use_r_drop']: 33 | from engines.utils.losses.rdrop_loss import RDropLoss 34 | self.r_drop_loss = RDropLoss() 35 | 36 | if classifier_config['use_focal_loss']: 37 | from engines.utils.losses.focal_loss import FocalLoss 38 | self.loss_function = FocalLoss() 39 | else: 40 | from tensorflow.keras.losses import CategoricalCrossentropy 41 | if classifier_config['use_focal_loss']: 42 | smooth_factor = classifier_config['smooth_factor'] 43 | self.loss_function = CategoricalCrossentropy(label_smoothing=smooth_factor) 44 | else: 45 | self.loss_function = CategoricalCrossentropy() 46 | 47 | learning_rate = classifier_config['learning_rate'] 48 | if classifier_config['optimizer'] == 'Adagrad': 49 | self.optimizer = tf.keras.optimizers.Adagrad(learning_rate=learning_rate) 50 | elif classifier_config['optimizer'] == 'Adadelta': 51 | self.optimizer = tf.keras.optimizers.Adadelta(learning_rate=learning_rate) 52 | elif classifier_config['optimizer'] == 'RMSprop': 53 | self.optimizer = tf.keras.optimizers.RMSprop(learning_rate=learning_rate) 54 | elif classifier_config['optimizer'] == 'SGD': 55 | self.optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate) 56 | elif classifier_config['optimizer'] == 'Adam': 57 | self.optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate) 58 | elif classifier_config['optimizer'] == 'AdamW': 59 | from tensorflow_addons.optimizers import AdamW 60 | self.optimizer = AdamW(learning_rate=learning_rate, weight_decay=1e-2) 61 | else: 62 | raise Exception('optimizer does not exist') 63 | 64 | # 加入word2vec进行训练 65 | if classifier_config['embedding_method'] == 'word2vec': 66 | embeddings_matrix = data_manager.embeddings_matrix 67 | else: 68 | embeddings_matrix = None 69 | classifier = classifier_config['classifier'] 70 | embedding_dim = data_manager.embedding_dim 71 | num_classes = data_manager.max_label_number 72 | if not os.path.exists(classifier_config['token_file']): 73 | train_file = classifier_config['train_file'] 74 | val_file = classifier_config['val_file'] 75 | df = pd.read_csv(train_file).sample(frac=1) 76 | if not val_file == '': 77 | val_df = pd.read_csv(val_file).sample(frac=1) 78 | df = pd.concat([df, val_df], axis=0) 79 | self.data_manager.build_vocab(df['sentence']) 80 | vocab_size = data_manager.vocab_size 81 | # 载入模型 82 | if classifier == 'TextCNN': 83 | from engines.models.TextCNN import TextCNN 84 | self.model = TextCNN(num_classes, embedding_dim, vocab_size, embeddings_matrix) 85 | elif classifier == 'TextRCNN': 86 | from engines.models.TextRCNN import TextRCNN 87 | self.model = TextRCNN(num_classes, embedding_dim, vocab_size, embeddings_matrix) 88 | elif classifier == 'TextRNN': 89 | from engines.models.TextRNN import TextRNN 90 | self.model = TextRNN(num_classes, embedding_dim, vocab_size, embeddings_matrix) 91 | elif classifier == 'Transformer': 92 | from engines.models.Transformer import Transformer 93 | self.model = Transformer(num_classes, embedding_dim, vocab_size, embeddings_matrix) 94 | elif classifier in self.data_manager.support_pretrained_model: 95 | from engines.models.PretrainedModel import PretrainedModelClassification 96 | self.model = PretrainedModelClassification(num_classes, model_type=classifier) 97 | else: 98 | raise Exception('config model is not exist') 99 | 100 | checkpoints_dir = classifier_config['checkpoints_dir'] 101 | checkpoint_name = classifier_config['checkpoint_name'] 102 | max_to_keep = classifier_config['max_to_keep'] 103 | checkpoint = tf.train.Checkpoint(model=self.model) 104 | self.checkpoint_manager = tf.train.CheckpointManager( 105 | checkpoint, directory=checkpoints_dir, checkpoint_name=checkpoint_name, max_to_keep=max_to_keep) 106 | checkpoint.restore(self.checkpoint_manager.latest_checkpoint) 107 | if self.checkpoint_manager.latest_checkpoint: 108 | print('Restored from {}'.format(self.checkpoint_manager.latest_checkpoint)) 109 | else: 110 | print('Initializing from scratch.') 111 | 112 | def train(self): 113 | train_file = classifier_config['train_file'] 114 | val_file = classifier_config['val_file'] 115 | train_df = pd.read_csv(train_file).sample(frac=1) 116 | 117 | if val_file == '': 118 | self.logger.info('generate validation dataset...') 119 | validation_rate = 0.15 120 | ratio = 1 - validation_rate 121 | # split the data into train and validation set 122 | train_df, val_df = train_df[:int(len(train_df) * ratio)], train_df[int(len(train_df) * ratio):] 123 | val_df = val_df.sample(frac=1) 124 | else: 125 | val_df = pd.read_csv(val_file).sample(frac=1) 126 | 127 | train_dataset = self.data_manager.get_dataset(train_df) 128 | val_dataset = self.data_manager.get_dataset(val_df) 129 | 130 | best_f1_val = 0.0 131 | best_at_epoch = 0 132 | unprocessed = 0 133 | very_start_time = time.time() 134 | 135 | self.logger.info(('+' * 20) + 'training starting' + ('+' * 20)) 136 | for i in range(self.epoch): 137 | start_time = time.time() 138 | self.logger.info('\nepoch:{}/{}'.format(i + 1, self.epoch)) 139 | for step, batch in tqdm(train_dataset.shuffle(len(train_dataset)).batch(self.batch_size).enumerate()): 140 | X_train_batch, y_train_batch = batch 141 | with tf.GradientTape() as tape: 142 | logits = self.model(X_train_batch, training=1) 143 | if classifier_config['use_r_drop']: 144 | logits_2 = self.model(X_train_batch, training=1) 145 | loss = self.r_drop_loss.calculate_loss(logits, logits_2, y_train_batch) 146 | else: 147 | loss_vec = self.loss_function(y_true=y_train_batch, y_pred=logits) 148 | loss = tf.reduce_mean(loss_vec) 149 | # 定义好参加梯度的参数 150 | variables = self.model.trainable_variables 151 | # 将预训练模型里面的pooler层的参数去掉 152 | variables = [var for var in variables if 'pooler' not in var.name] 153 | gradients = tape.gradient(loss, variables) 154 | 155 | if self.use_gan: 156 | if self.gan_method == 'fgm': 157 | # 使用FGM的对抗办法 158 | epsilon = 1.0 159 | embedding = variables[0] 160 | embedding_gradients = gradients[0] 161 | embedding_gradients = tf.zeros_like(embedding) + embedding_gradients 162 | delta = epsilon * embedding_gradients / tf.norm(embedding_gradients, ord=2) 163 | 164 | accum_vars = [tf.Variable(tf.zeros_like(grad), trainable=False) for grad in gradients] 165 | gradients = [accum_vars[i].assign_add(grad) for i, grad in enumerate(gradients)] 166 | variables[0].assign_add(delta) 167 | 168 | with tf.GradientTape() as gan_tape: 169 | logits = self.model(X_train_batch, training=1) 170 | if classifier_config['use_r_drop']: 171 | logits_2 = self.model(X_train_batch, training=1) 172 | loss = self.r_drop_loss.calculate_loss(logits, logits_2, y_train_batch) 173 | else: 174 | loss_vec = self.loss_function(y_true=y_train_batch, y_pred=logits) 175 | loss = tf.reduce_mean(loss_vec) 176 | gan_gradients = gan_tape.gradient(loss, variables) 177 | gradients = [gradients[i].assign_add(grad) for i, grad in enumerate(gan_gradients)] 178 | variables[0].assign_sub(delta) 179 | elif self.gan_method == 'pgd': 180 | # 使用PGD的对抗办法 181 | alpha = 0.3 182 | epsilon = 1 183 | k = classifier_config['attack_round'] 184 | origin_embedding = tf.Variable(variables[0]) 185 | accum_vars = [tf.Variable(tf.zeros_like(grad), trainable=False) for grad in gradients] 186 | origin_gradients = [accum_vars[i].assign_add(grad) for i, grad in enumerate(gradients)] 187 | 188 | for t in range(k): 189 | embedding = variables[0] 190 | embedding_gradients = gradients[0] 191 | embedding_gradients = tf.zeros_like(embedding) + embedding_gradients 192 | delta = alpha * embedding_gradients / tf.norm(embedding_gradients, ord=2) 193 | variables[0].assign_add(delta) 194 | 195 | r = variables[0] - origin_embedding 196 | if tf.norm(r, ord=2) > epsilon: 197 | r = epsilon * r / tf.norm(r, ord=2) 198 | variables[0].assign(origin_embedding + tf.Variable(r)) 199 | 200 | if t != k - 1: 201 | gradients = [tf.Variable(tf.zeros_like(grad), trainable=False) for grad in gradients] 202 | else: 203 | gradients = origin_gradients 204 | with tf.GradientTape() as gan_tape: 205 | logits = self.model(X_train_batch, training=1) 206 | if classifier_config['use_r_drop']: 207 | logits_2 = self.model(X_train_batch, training=1) 208 | loss = self.r_drop_loss.calculate_loss(logits, logits_2, y_train_batch) 209 | else: 210 | loss_vec = self.loss_function(y_true=y_train_batch, y_pred=logits) 211 | loss = tf.reduce_mean(loss_vec) 212 | gan_gradients = gan_tape.gradient(loss, variables) 213 | gradients = [gradients[i].assign_add(grad) for i, grad in enumerate(gan_gradients)] 214 | variables[0].assign(origin_embedding) 215 | 216 | # 反向传播,自动微分计算 217 | self.optimizer.apply_gradients(zip(gradients, variables)) 218 | if step % self.print_per_batch == 0 and step != 0: 219 | predictions = tf.argmax(logits, axis=-1).numpy() 220 | y_train_batch = tf.argmax(y_train_batch, axis=-1).numpy() 221 | measures, _ = cal_metrics(y_true=y_train_batch, y_pred=predictions) 222 | res_str = '' 223 | for k, v in measures.items(): 224 | res_str += (k + ': %.3f ' % v) 225 | self.logger.info('training batch: %5d, loss: %.5f, %s' % (step, loss, res_str)) 226 | 227 | measures = self.validate(val_dataset) 228 | time_span = (time.time() - start_time) / 60 229 | self.logger.info('time consumption:%.2f(min)' % time_span) 230 | 231 | if measures['f1'] > best_f1_val: 232 | unprocessed = 0 233 | best_f1_val = measures['f1'] 234 | best_at_epoch = i + 1 235 | self.checkpoint_manager.save() 236 | self.logger.info('saved the new best model with f1: %.3f' % best_f1_val) 237 | else: 238 | unprocessed += 1 239 | 240 | if self.is_early_stop: 241 | if unprocessed >= self.patient: 242 | self.logger.info('early stopped, no progress obtained within {} epochs'.format(self.patient)) 243 | self.logger.info('overall best f1 is {} at {} epoch'.format(best_f1_val, best_at_epoch)) 244 | self.logger.info('total training time consumption: %.3f(min)' % ((time.time() - very_start_time) / 60)) 245 | return 246 | self.logger.info('overall best f1 is {} at {} epoch'.format(best_f1_val, best_at_epoch)) 247 | self.logger.info('total training time consumption: %.3f(min)' % ((time.time() - very_start_time) / 60)) 248 | 249 | def validate(self, val_dataset): 250 | self.logger.info('start evaluate engines...') 251 | y_true, y_pred = np.array([]), np.array([]) 252 | loss_values = [] 253 | for val_batch in tqdm(val_dataset.batch(self.batch_size)): 254 | X_val_batch, y_val_batch = val_batch 255 | logits = self.model(X_val_batch) 256 | val_loss_vec = self.loss_function(y_true=y_val_batch, y_pred=logits) 257 | val_loss = tf.reduce_mean(val_loss_vec) 258 | predictions = tf.argmax(logits, axis=-1) 259 | y_val_batch = tf.argmax(y_val_batch, axis=-1) 260 | y_true = np.append(y_true, y_val_batch) 261 | y_pred = np.append(y_pred, predictions) 262 | loss_values.append(val_loss) 263 | 264 | measures, each_classes = cal_metrics(y_true=y_true, y_pred=y_pred) 265 | 266 | # 打印每一个类别的指标 267 | classes_val_str = '' 268 | for k, v in each_classes.items(): 269 | if k in self.reverse_classes: 270 | classes_val_str += ('\n' + self.reverse_classes[k] + ': ' + str(each_classes[k])) 271 | self.logger.info(classes_val_str) 272 | # 打印损失函数 273 | val_res_str = 'loss: %.3f ' % np.mean(loss_values) 274 | for k, v in measures.items(): 275 | val_res_str += (k + ': %.3f ' % measures[k]) 276 | self.logger.info(val_res_str) 277 | return measures 278 | -------------------------------------------------------------------------------- /engines/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/12 3:04 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : __init__.py.py 6 | # @Software: PyCharm 7 | -------------------------------------------------------------------------------- /engines/utils/clean_data.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/3/17 16:37 3 | # @Author : Stanley 4 | # @EMail : gzlishouxian@gmail.com 5 | # @File : clean_data.py 6 | # @Software: PyCharm 7 | import re 8 | 9 | 10 | def filter_word(raw_word): 11 | if raw_word.strip() in ['\t', '']: 12 | return False 13 | if not re.search(r'^[\u4e00-\u9fa5_a-zA-Z\d]+$', raw_word): 14 | return False 15 | else: 16 | return True 17 | 18 | 19 | def filter_char(char, remove_sp=True): 20 | if char.strip() in ['\t', '']: 21 | return False 22 | if remove_sp: 23 | if re.search(r'[\u4e00-\u9fa5_a-zA-Z\d]', char): 24 | return True 25 | else: 26 | return False 27 | else: 28 | return True 29 | -------------------------------------------------------------------------------- /engines/utils/logger.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : logger.py 6 | # @Software: PyCharm 7 | import datetime 8 | import logging 9 | 10 | 11 | def get_logger(log_dir, name): 12 | log_file = log_dir + '/' + (datetime.datetime.now().strftime('%Y%m%d%H%M%S-' + name + '.log')) 13 | logger = logging.getLogger(__name__) 14 | logger.setLevel(level=logging.INFO) 15 | formatter = logging.Formatter('%(message)s') 16 | # log into file 17 | handler = logging.FileHandler(log_file) 18 | handler.setLevel(logging.INFO) 19 | handler.setFormatter(formatter) 20 | logger.addHandler(handler) 21 | # log into terminal 22 | console = logging.StreamHandler() 23 | console.setFormatter(formatter) 24 | console.setLevel(logging.INFO) 25 | logger.addHandler(console) 26 | logger.info(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) 27 | return logger 28 | -------------------------------------------------------------------------------- /engines/utils/losses/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/engines/utils/losses/__init__.py -------------------------------------------------------------------------------- /engines/utils/losses/focal_loss.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/11/25 7:51 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : focal_loss.py 6 | # @Software: PyCharm 7 | import tensorflow as tf 8 | from config import classifier_config 9 | 10 | 11 | class FocalLoss(tf.keras.losses.Loss): 12 | """ 13 | Multi-class Focal loss implementation 14 | """ 15 | def __init__(self, gamma=2.0, epsilon=1.e-9): 16 | super(FocalLoss, self).__init__() 17 | self.gamma = gamma 18 | weight = classifier_config['weight'] 19 | self.alpha = tf.reshape(weight, [-1]) if weight else None 20 | self.epsilon = epsilon 21 | self.num_labels = len(classifier_config['classes']) 22 | 23 | def call(self, y_true, y_pred): 24 | y_true = tf.cast(y_true, dtype=tf.int32) 25 | y_pred = tf.cast(y_pred, dtype=tf.float32) 26 | labels = tf.expand_dims(tf.argmax(y_true, axis=-1), axis=-1) 27 | pt = tf.gather(y_pred, labels, batch_dims=1) 28 | pt = tf.clip_by_value(pt, self.epsilon, 1. - self.epsilon) 29 | loss = -tf.multiply(tf.pow(tf.subtract(1., pt), self.gamma), tf.math.log(pt)) 30 | if self.alpha is not None: 31 | alpha = tf.gather(self.alpha, labels, batch_dims=0) 32 | loss = tf.multiply(alpha, loss) 33 | return loss 34 | -------------------------------------------------------------------------------- /engines/utils/losses/rdrop_loss.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/11/26 7:51 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : r_drop_loss.py 6 | # @Software: PyCharm 7 | import tensorflow as tf 8 | from config import classifier_config 9 | 10 | 11 | class RDropLoss: 12 | """ 13 | r drop loss 14 | """ 15 | def __init__(self): 16 | super(RDropLoss, self).__init__() 17 | self.alpha = 4 18 | self.kl_loss = tf.keras.losses.KLDivergence(reduction=tf.keras.losses.Reduction.NONE, name='kl_divergence') 19 | if classifier_config['use_focal_loss']: 20 | from engines.utils.losses.focal_loss import FocalLoss 21 | self.loss = FocalLoss() 22 | else: 23 | from tensorflow.keras.losses import CategoricalCrossentropy 24 | if classifier_config['use_focal_loss']: 25 | smooth_factor = classifier_config['smooth_factor'] 26 | self.loss = CategoricalCrossentropy(label_smoothing=smooth_factor) 27 | else: 28 | self.loss = CategoricalCrossentropy() 29 | 30 | def calculate_loss(self, p, q, y_true): 31 | loss_1 = self.loss(y_true=y_true, y_pred=p) 32 | loss_2 = self.loss(y_true=y_true, y_pred=q) 33 | loss = 0.5 * (loss_1 + loss_2) 34 | loss = tf.reduce_mean(loss) 35 | 36 | kl_loss_1 = self.kl_loss(p, q) 37 | kl_loss_2 = self.kl_loss(q, p) 38 | kl_loss = 0.5 * (kl_loss_1 + kl_loss_2) 39 | kl_loss = tf.reduce_mean(kl_loss) 40 | 41 | loss = loss + self.alpha * kl_loss 42 | return loss 43 | -------------------------------------------------------------------------------- /engines/utils/mask.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/4/6 22:13 3 | # @Author : Stanley 4 | # @EMail : gzlishouxian@gmail.com 5 | # @File : mask.py 6 | # @Software: PyCharm 7 | import tensorflow as tf 8 | 9 | 10 | def create_padding_mask(seq): 11 | """ 12 | 生成mask,mask值为1 13 | """ 14 | seq = tf.cast(tf.math.equal(seq, 0), tf.float32) 15 | # [batch_size, 1, 1, seq_len] 16 | # 执行attention计算时,attention_matrix=[batch_size, num_head, seq_len_q, seq_len_k] 17 | return seq[:, tf.newaxis, tf.newaxis, :] 18 | -------------------------------------------------------------------------------- /engines/utils/metrics.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : metrics.py 6 | # @Software: PyCharm 7 | from sklearn.metrics import accuracy_score, precision_recall_fscore_support, classification_report 8 | from config import classifier_config 9 | import numpy as np 10 | 11 | 12 | def cal_metrics(y_true, y_pred): 13 | """ 14 | 指标计算 15 | """ 16 | y_true = y_true.astype(int) 17 | y_pred = y_pred.astype(int) 18 | average = classifier_config['metrics_average'] 19 | precision, recall, f1, _ = precision_recall_fscore_support(y_true, y_pred, average=average, zero_division=0) 20 | accuracy = accuracy_score(y_true, y_pred) 21 | each_classes = classification_report(y_true, y_pred, output_dict=True, labels=np.unique(y_pred), 22 | zero_division=0) 23 | return {'precision': precision, 'recall': recall, 'f1': f1, 'accuracy': accuracy}, each_classes 24 | -------------------------------------------------------------------------------- /engines/utils/sentence2vec.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/11/19 12:12 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : sentence2vec.py 6 | # @Software: PyCharm 7 | import numpy as np 8 | import pandas as pd 9 | import os 10 | from sklearn.decomposition import PCA 11 | from engines.utils.word2vec import Word2VecUtils 12 | from gensim.models.word2vec import Word2Vec 13 | from tqdm import tqdm 14 | from config import word2vec_config 15 | 16 | 17 | class Sentence2VecUtils: 18 | def __init__(self, logger): 19 | self.w2v_utils = Word2VecUtils(logger) 20 | self.w2v_model = Word2Vec.load(self.w2v_utils.model_path) 21 | model_dir = word2vec_config['model_dir'] 22 | self.pca_vec_path = os.path.join(model_dir, 'pca_u.npy') 23 | self.count_num = 0 24 | for key, value in self.w2v_model.wv.vocab.items(): 25 | self.count_num += value.count 26 | self.logger = logger 27 | self.a = 1e-3 28 | self.u = None 29 | 30 | def calculate_weight(self, sentence): 31 | vs = np.zeros(self.w2v_utils.dim) # add all word2vec values into one vector for the sentence 32 | sentence_length = len(sentence) 33 | for word in sentence: 34 | if word in self.w2v_model.wv.vocab: 35 | p_w = self.w2v_model.wv.vocab[word].count / self.count_num 36 | a_value = self.a / (self.a + p_w) # smooth inverse frequency, SIF 37 | vs = np.add(vs, np.multiply(a_value, np.array(self.w2v_model[word]))) # vs += sif * word_vector 38 | if sentence_length != 0: 39 | vs = np.divide(vs, sentence_length) # weighted average 40 | else: 41 | vs = None 42 | return vs 43 | 44 | def train_pca(self): 45 | sentence_set = [] 46 | # 切词 47 | stop_words = self.w2v_utils.get_stop_words() 48 | train_df = pd.read_csv(self.w2v_utils.train_data, encoding='utf-8') 49 | self.logger.info('cut sentence...') 50 | train_df['sentence'] = train_df.sentence.apply(self.w2v_utils.processing_sentence, args=(stop_words,)) 51 | # 删掉缺失的行 52 | train_df.dropna(inplace=True) 53 | sentence_list = train_df.sentence.to_list() 54 | for sentence in tqdm(sentence_list): 55 | vs = self.calculate_weight(sentence) 56 | if vs is not None: 57 | sentence_set.append(vs) # add to our existing re-calculated set of sentences 58 | else: 59 | continue 60 | 61 | # calculate PCA of this sentence set 62 | pca = PCA(n_components=self.w2v_utils.dim) 63 | self.logger.info('train pca vector...') 64 | pca.fit(np.array(sentence_set)) 65 | u = pca.components_[0] # the PCA vector 66 | u = np.multiply(u, np.transpose(u)) # u x uT 67 | self.logger.info('save pca vector...') 68 | np.save(self.pca_vec_path, u) 69 | 70 | def load_pca_vector(self): 71 | if not os.path.isfile(self.pca_vec_path): 72 | self.logger.info('pca vector not exist...') 73 | raise Exception('pca vector not exist...') 74 | else: 75 | self.u = np.load(self.pca_vec_path) 76 | 77 | def get_sif_vector(self, sentence): 78 | vs = self.calculate_weight(sentence) 79 | sub = np.multiply(self.u, vs) 80 | result_vec = np.subtract(vs, sub) 81 | return result_vec 82 | 83 | def get_average_vector(self, sentence): 84 | vs = np.zeros(self.w2v_utils.dim) # add all word2vec values into one vector for the sentence 85 | sentence_length = len(sentence) 86 | for word in sentence: 87 | if word in self.w2v_model.wv.vocab: 88 | vs = np.add(vs, self.w2v_model[word]) 89 | vs = np.divide(vs, sentence_length) # weighted average 90 | return vs 91 | 92 | def similar_words(self, word): 93 | rtn_list = [] 94 | rtn = self.w2v_model.similar_by_word(word, topn=5) 95 | for item in rtn: 96 | rtn_list.append({item[0]: item[1]}) 97 | return rtn_list 98 | -------------------------------------------------------------------------------- /engines/utils/word2vec.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : word2vec_util.py 6 | # @Software: PyCharm 7 | from tqdm import tqdm 8 | from gensim.models.word2vec import Word2Vec 9 | from config import word2vec_config 10 | import jieba 11 | import multiprocessing 12 | import pandas as pd 13 | import os 14 | 15 | 16 | class Word2VecUtils: 17 | def __init__(self, logger): 18 | self.logger = logger 19 | self.stop_words = word2vec_config['stop_words'] 20 | self.train_data = word2vec_config['train_data'] 21 | model_dir = word2vec_config['model_dir'] 22 | model_name = word2vec_config['model_name'] 23 | self.model_path = os.path.join(model_dir, model_name) 24 | self.dim = word2vec_config['word2vec_dim'] 25 | self.min_count = word2vec_config['min_count'] 26 | # skip-gram(sg=1)是CBOW(sg=0)训练时间的2.5 ~3倍左右 27 | self.sg = 1 if word2vec_config['sg'] == 'skip-gram' else 0 28 | # 使用分级softmax(1)是采用负采样(0)训练时间的1.8~2倍左右 29 | self.hs = 1 30 | 31 | @staticmethod 32 | def processing_sentence(x, stop_words): 33 | cut_word = jieba.cut(str(x).strip()) 34 | if stop_words: 35 | words = [word for word in cut_word if word not in stop_words and word != ' '] 36 | else: 37 | words = list(cut_word) 38 | words = [word for word in words if word != ' '] 39 | return words 40 | 41 | def get_stop_words(self): 42 | stop_words_list = [] 43 | try: 44 | with open(self.stop_words, 'r', encoding='utf-8') as stop_words_file: 45 | for line in stop_words_file: 46 | stop_words_list.append(line.strip()) 47 | except FileNotFoundError: 48 | return stop_words_list 49 | return stop_words_list 50 | 51 | def train_word2vec(self): 52 | train_df = pd.read_csv(self.train_data, encoding='utf-8') 53 | stop_words = self.get_stop_words() 54 | # 切词 55 | self.logger.info('Cut sentence...') 56 | tqdm.pandas(desc='Cut sentence...') 57 | train_df['sentence'] = train_df.sentence.progress_apply(self.processing_sentence, args=(stop_words,)) 58 | # 删掉缺失的行 59 | train_df.dropna(inplace=True) 60 | all_cut_sentence = train_df.sentence.to_list() 61 | # 训练词向量 62 | self.logger.info('Training word2vec...') 63 | w2v_model = Word2Vec(size=self.dim, workers=multiprocessing.cpu_count(), min_count=self.min_count, sg=self.sg) 64 | w2v_model.build_vocab(all_cut_sentence) 65 | w2v_model.train(all_cut_sentence, total_examples=w2v_model.corpus_count, epochs=100) 66 | w2v_model.save(self.model_path) 67 | -------------------------------------------------------------------------------- /img/batch_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/img/batch_test.png -------------------------------------------------------------------------------- /img/bert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/img/bert.png -------------------------------------------------------------------------------- /img/interactive_predict.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/img/interactive_predict.png -------------------------------------------------------------------------------- /img/textcnn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/img/textcnn.png -------------------------------------------------------------------------------- /img/textrcnn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/img/textrcnn.png -------------------------------------------------------------------------------- /img/textrnn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/img/textrnn.png -------------------------------------------------------------------------------- /img/train.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/img/train.png -------------------------------------------------------------------------------- /logs/textcnn-char.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/logs/textcnn-char.log -------------------------------------------------------------------------------- /logs/textcnn-word.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/logs/textcnn-word.log -------------------------------------------------------------------------------- /logs/train_word2vec.log: -------------------------------------------------------------------------------- 1 | 2021-11-05 21:58:51 2 | { 3 | "stop_words": "data/w2v_data/stop_words.txt", 4 | "train_data": "data/w2v_data/dataset.csv", 5 | "model_dir": "model/word2vec_model", 6 | "model_name": "word2vec_model.pkl", 7 | "word2vec_dim": 300 8 | } 9 | mode: train_word2vec 10 | Cut sentence... 11 | Training word2vec... 12 | -------------------------------------------------------------------------------- /logs/transformer-word.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stanleylsx/text_classifier_tf2/8b3150375de92a8d254159369aeb298134ed783d/logs/transformer-word.log -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/10/20 11:03 下午 3 | # @Author : lishouxian 4 | # @Email : gzlishouxian@gmail.com 5 | # @File : main.py 6 | # @Software: PyCharm 7 | from engines.data import DataManager 8 | from engines.utils.logger import get_logger 9 | from engines.train import Train 10 | from engines.predict import Predictor 11 | from engines.utils.word2vec import Word2VecUtils 12 | from engines.utils.sentence2vec import Sentence2VecUtils 13 | from config import mode, classifier_config, word2vec_config, CUDA_VISIBLE_DEVICES 14 | import tensorflow as tf 15 | import json 16 | import os 17 | 18 | 19 | def fold_check(config): 20 | 21 | if config['checkpoints_dir'] == '': 22 | raise Exception('checkpoints_dir did not set...') 23 | 24 | if not os.path.exists(os.path.dirname(config['token_file'])): 25 | print('token fold not found, creating...') 26 | os.makedirs(os.path.dirname(config['token_file'])) 27 | 28 | if not os.path.exists(config['checkpoints_dir']): 29 | print('checkpoints fold not found, creating...') 30 | os.makedirs(config['checkpoints_dir']) 31 | 32 | if not os.path.exists(config['checkpoints_dir'] + '/logs'): 33 | print('log fold not found, creating...') 34 | os.mkdir(config['checkpoints_dir'] + '/logs') 35 | 36 | 37 | if __name__ == '__main__': 38 | fold_check(config=classifier_config) 39 | logger = get_logger(classifier_config['checkpoints_dir'] + '/logs', mode) 40 | if CUDA_VISIBLE_DEVICES != -1: 41 | os.environ['CUDA_VISIBLE_DEVICES'] = str(CUDA_VISIBLE_DEVICES) 42 | physical_devices = tf.config.list_physical_devices('GPU') 43 | tf.config.experimental.set_memory_growth(physical_devices[CUDA_VISIBLE_DEVICES], True) 44 | else: 45 | os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' 46 | os.environ['CUDA_VISIBLE_DEVICES'] = '-1' 47 | 48 | # 训练分类器 49 | if mode == 'train_classifier': 50 | logger.info(json.dumps(classifier_config, indent=2, ensure_ascii=False)) 51 | data_manage = DataManager(logger) 52 | logger.info('mode: train_classifier') 53 | logger.info('model: {}'.format(classifier_config['classifier'])) 54 | train = Train(data_manage, logger) 55 | train.train() 56 | # 测试分类 57 | elif mode == 'interactive_predict': 58 | logger.info(json.dumps(classifier_config, indent=2, ensure_ascii=False)) 59 | data_manage = DataManager(logger) 60 | logger.info('mode: predict_one') 61 | logger.info('model: {}'.format(classifier_config['classifier'])) 62 | predictor = Predictor(data_manage, logger) 63 | predictor.predict_one('warm start') 64 | while True: 65 | logger.info('please input a sentence (enter [exit] to exit.)') 66 | sentence = input() 67 | if sentence == 'exit': 68 | break 69 | results = predictor.predict_one(sentence) 70 | print(results) 71 | # 训练词向量 72 | elif mode == 'train_word2vec': 73 | logger.info(json.dumps(word2vec_config, indent=2, ensure_ascii=False)) 74 | logger.info('mode: train_word2vec') 75 | w2v = Word2VecUtils(logger) 76 | w2v.train_word2vec() 77 | # 训练SIF句向量 78 | elif mode == 'train_sif_sentence_vec': 79 | logger.info(json.dumps(word2vec_config, indent=2, ensure_ascii=False)) 80 | logger.info('mode: train_sif_sentence_vec') 81 | w2v = Word2VecUtils(logger) 82 | sif = Sentence2VecUtils(logger) 83 | sif.train_pca() 84 | # 批量测试 85 | elif mode == 'test': 86 | logger.info('mode: test') 87 | data_manage = DataManager(logger) 88 | predictor = Predictor(data_manage, logger) 89 | predictor.predict_test() 90 | # 保存pb格式的模型用于tf-severing接口 91 | elif mode == 'save_model': 92 | logger.info('mode: save_pb_model') 93 | data_manage = DataManager(logger) 94 | predictor = Predictor(data_manage, logger) 95 | predictor.save_model() 96 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tensorflow-gpu==2.3.0 2 | tensorflow-addons==0.15.0 3 | tqdm==4.50.2 4 | gensim==3.8.3 5 | jieba==0.42.1 6 | pandas==1.1.3 7 | scikit-learn==0.23.2 8 | transformers==4.6.1 9 | texttable==1.6.4 10 | --------------------------------------------------------------------------------