前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图片验证码训练

图片验证码训练

作者头像
小小咸鱼YwY
发布2021-05-24 15:41:37
4.4K0
发布2021-05-24 15:41:37
举报
文章被收录于专栏:python-爬虫

1.项目git地址

代码语言:javascript
复制
https://github.com/kerlomz/captcha_trainer

2.安装模块

代码语言:javascript
复制
pip install -r requirements.txt

3.创建项目

代码语言:javascript
复制
python make_dataset.py img_test
#这时候会报错

4.添加配置文件

代码语言:javascript
复制
cd projects/img_test/ 上传下面的配置文件
代码语言:javascript
复制
# - requirement.txt  -  GPU: tensorflow-gpu, CPU: tensorflow
# - If you use the GPU version, you need to install some additional applications.
# MemoryUsage: 显存占用率,推荐0.6-0.8之间
System:
  MemoryUsage: 0.6
  Version: 2

# CNNNetwork: [CNN5, ResNet50, DenseNet]
# RecurrentNetwork: [CuDNNBiLSTM, CuDNNLSTM, CuDNNGRU, BiLSTM, LSTM, GRU, BiGRU, NoRecurrent]
# - 推荐配置为 不定长问题:CNN5+GRU ,定长:CNN5/DenseNet/ResNet50
# UnitsNum: RNN层的单元数 [16, 64, 128, 256, 512]
# - 神经网络在隐层中使用大量神经元,就是做升维,将纠缠在一起的特征或概念分开。
# Optimizer: 优化器算法 [AdaBound, Adam, Momentum]
# OutputLayer: [LossFunction, Decoder]
# - LossFunction: 损失函数 [CTC, CrossEntropy]
# - Decoder: 解码器 [CTC, CrossEntropy]
NeuralNet:
  CNNNetwork: CNN5
  RecurrentNetwork: GRU
  UnitsNum: 64
  Optimizer: RAdam
  OutputLayer:
    LossFunction: CTC
    Decoder: CTC


# ModelName: 模型名/项目名,同时也对应编译后的pb模型文件名
# ModelField: 模型处理的数据类型,目前只支持图像 [Image, Text]
# ModelScene: 模型处理的场景类型,目前只支持分类场景 [Classification]
# - 目前只支持 “图像分类” 这一种场景.
Model:
  ModelName: YWY
  ModelField: Image
  ModelScene: Classification

# FieldParam 分为 Image, Text 两种,不同数据类型时可配置的参数不同,目前只提供 Image 一种。
# ModelField 为 Image 时:
# - Category: 提供默认的内置解决方案:
# -- [ALPHANUMERIC(含大小写英文数字), ALPHANUMERIC_LOWER(小写英文数字),
# -- ALPHANUMERIC_UPPER(大写英文数字),NUMERIC(数字), ALPHABET_LOWER(小写字母),
# -- ALPHABET_UPPER(大写字母), ALPHABET(大小写字母),
# -- ALPHANUMERIC_CHS_3500_LOWER(小写字母数字混合中文常用3500)]
# - 或者可以自定义指定分类集如下(中文亦可):
# -- ['Cat', 'Lion', 'Tiger', 'Fish', 'BigCat']
# - Resize: 重置尺寸,对应网络的输入: [ImageWidth, ImageHeight/-1, ImageChannel]
# - ImageChannel: 图像通道,3为原图,1为灰度 [1, 3]
# - 为了配合部署服务根据图片尺寸自动选择对应的模型,由此诞生以下参数(ImageWidth,ImageHeight):
# -- ImageWidth: 图片宽度.
# -- ImageHeight: 图片高度.
# - MaxLabelNum: 该参数在使用CTC损失函数时将被忽略,仅用于使用交叉熵作为损失函数/标签数固定时使用
# ModelField 为 Text 时:
# - 该类型暂时不支持
FieldParam:
  Category: ALPHANUMERIC_UPPER
  Resize: [120, 44]
  ImageChannel: 1
  ImageWidth: 88
  ImageHeight: 33
  MaxLabelNum: 4
  OutputSplit: 
  AutoPadding: True


# 该配置应用于数据源的标签获取.
# LabelFrom: 标签来源,目前只支持 从文件名提取 [FileName, XML, LMDB]
# ExtractRegex: 正则提取规则,对应于 从文件名提取 方案 FileName:
# - 默认匹配形如 apple_20181010121212.jpg 的文件.
# - 默认正则为 .*?(?=_.*\.)
# LabelSplit: 该规则仅用于 从文件名提取 方案:
# - 文件名中的分割符形如: cat&big cat&lion_20181010121212.png,那么分隔符为 &
# - The Default is null.
Label:
  LabelFrom: FileName
  ExtractRegex: .*?(?=_)
  LabelSplit: 


# DatasetPath: [Training/Validation], 打包为TFRecords格式的训练集/验证集的本地绝对路径。
# SourcePath:  [Training/Validation], 未打包的训练集/验证集源文件夹的本地绝对路径。
# ValidationSetNum: 验证集数目,仅当未配置验证集源文件夹时用于系统随机抽样用作验证集使用。
# - 该选项用于懒人训练模式,当样本极度不均衡时建议手动设定合理的验证集。
# SavedSteps: 当 Session.run() 被执行一次为一步(1.x版本),保存训练过程的步数,默认为100。
# ValidationSteps: 用于计算准确率,验证模型的步数,默认为每500步验证一次。
# EndAcc: 结束训练的条件之准确率 [EndAcc*100]% 到达该条件时结束任务并编译模型。
# EndCost: 结束训练的条件之Cost值 EndCost 到达该条件时结束任务并编译模型。
# EndEpochs: 结束训练的条件之样本训练轮数 Epoch 到达该条件时结束任务并编译模型。
# BatchSize: 批次大小,每一步用于训练的样本数量,不宜过大或过小,建议64。
# ValidationBatchSize: 验证集批次大小,每个验证准确率步时,用于验证的样本数量。
# LearningRate: 学习率 [0.1, 0.01, 0.001, 0.0001] fine-tuning 时选用较小的学习率。
Trains:
  DatasetPath:
    Training:
      - ./projects/img_test/dataset/Trains.0.tfrecords    #图片TFRecords打包
    Validation:
      - ./projects/img_test/dataset/Validation.0.tfrecords  #图片TFRecords打包
  SourcePath:
    Training: /home/public/img_test/images     #训练集所在路径图片多的
    Validation: /home/public/img_test/images2  #测试集所在路径图片少的
  ValidationSetNum: 100
  SavedSteps: 100
  ValidationSteps: 500
  EndAcc: 0.95
  EndCost: 0.5
  EndEpochs: 2
  BatchSize: 64
  ValidationBatchSize: 100
  LearningRate: 0.001

# 以下为数据增广的配置
# Binaryzation: 该参数为 list 类型,包含二值化的上界和下界,值为 int 类型,参数为 -1 表示未启用。
# MedianBlur: 该参数为 int 类型,参数为 -1 表示未启用。
# GaussianBlur: 该参数为 int 类型,参数为 -1 表示未启用。
# EqualizeHist: 该参数为 bool 类型。
# Laplace: 该参数为 bool 类型。
# WarpPerspective: 该参数为 bool 类型。
# Rotate: 该参数为大于 0 的 int 类型,参数为 -1 表示未启用。
# PepperNoise: 该参数为小于 1 的 float 类型,参数为 -1 表示未启用。
# Brightness: 该参数为 bool 类型。
# Saturation: 该参数为 bool 类型。
# Hue: 该参数为 bool 类型。
# Gamma: 该参数为 bool 类型。
# ChannelSwap: 该参数为 bool 类型。
# RandomBlank: 该参数为大于 0 的 int 类型,参数为 -1 表示未启用。
# RandomTransition: 该参数为大于 0 的 int 类型,参数为 -1 表示未启用。
DataAugmentation:
  Binaryzation: -1
  MedianBlur: -1
  GaussianBlur: -1
  EqualizeHist: False
  Laplace: False
  WarpPerspective: False
  Rotate: -1
  PepperNoise: -1.0
  Brightness: False
  Saturation: False
  Hue: False
  Gamma: False
  ChannelSwap: False
  RandomBlank: -1
  RandomTransition: -1
  RandomCaptcha: 
     Enable: False
     FontPath: 

# 以下为预处理的配置
# Binaryzation: 该参数为 list 类型,包含二值化的上界和下界,值为 int 类型,参数为 -1 表示未启用。
# ReplaceTransparent: 使用白色替换透明背景
# HorizontalStitching: 水平拆分拼接,适用于上下分层
# ConcatFrames: 根据帧索引列表水平合并帧
# BlendFrames: 根据帧索引列表融合帧内容
Pretreatment:
  Binaryzation: -1
  ReplaceTransparent: True
  HorizontalStitching: False
  ConcatFrames: -1
  BlendFrames: -1
  ExecuteMap: {}

5.把图片训练成if格式

代码语言:javascript
复制
python make_dataset.py img_test

6.开始训练

代码语言:javascript
复制
python trains.py img_test

7.运行模型

代码语言:javascript
复制
在项目的out文件吧 pb文件和yaml文件复制到同一目录下

8.脚本

代码语言:javascript
复制
# -*- coding: utf-8 -*-
# @File     : muggle_ocr.py
# @Software : PyCharm
# @Desc     : 模型调用客户端

import io
import os
import cv2
import pickle
import yaml
import binascii
import numpy as np
import PIL.Image as PIL_Image
from enum import Enum, unique
import tensorflow as tf
from tensorflow.python.framework.errors_impl import NotFoundError

init_img = b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x02\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\x1d\x1a\x1c\x1c $.\' ",#\x1c\x1c(7),01444\x1f\'9=82<.342\xff\xdb\x00C\x01\t\t\t\x0c\x0b\x0c\x18\r\r\x182!\x1c!22222222222222222222222222222222222222222222222222\xff\xc0\x00\x11\x08\x00\x1e\x00[\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19\x1a%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02w\x00\x01\x02\x03\x11\x04\x05!1\x06\x12AQ\x07aq\x13"2\x81\x08\x14B\x91\xa1\xb1\xc1\t#3R\xf0\x15br\xd1\n\x16$4\xe1%\xf1\x17\x18\x19\x1a&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf5\xf1P_j6\xfat"I\xd8\x8c\xf0\xaa9,}\xaa\xc0\xac\xad{\\\xd0\xb4\x18a\xb8\xd7.\xe0\xb7Vb"\xf3\x01b\xc7\xbe\xd0\x01\'\xb7ARj\xcb\x9aN\xab\x06\xadlg\x800\n\xdbJ\xb7Pk7Y\xf1;\xe8\xda\xa2[=\xae\xf8J\x07.\x0f g\x06\xbc\xff\x00K\xf1\xfc\xbav\xa3t4\x8f\x0ck:\xad\xbc\x8eH1@\xe9\xb5{\x10\n\x92{zR\xcb\xf1?H\xb9\xf1<GX\xd1u\x8b\x18\xcc\x1eKG=\xb7 \x93\xd4\x8c\xe7\x1f\x85\\\x12\xbe\xa3\x83W\xf7\x8fJ\xbd\xd7\x83X[\xcd\xa6bs<\x9e^\xe5R\xde_\xcaNH\x1c\xf6\xc7\xd4\x8a\x9bJ\xba\x966T\xb9\x9eIE\xc0\xdf\x1bH\x02\x95q\xf7\xa3 p\x08\xf4\xf65\xe6\xban\xbfec{\xfd\xa7\xa5\xea\x16\xcdg\xe6\x05h~\xd2\x85\xf1\xe8\xcb\x9c\x8f\xc4W\xa1#\xc5\xa8Ev-X\x15\x99V\xea\xd9\x87f\xef\xfa\xf5\xfa\x9a\xb9\xd3\xe5\xd5lUJ|\xba\xadQ\xca\\kZ\xfe\xb6\xf6\xabov\xf1\x8dA\xe4\x16\xf6\xb0\x00\x9bcC\x82\xce\xfdG\xd0WK\xa1x\x1a\x1d*\xf2\xce\xfa[\xc7\x92\xe2\xdbv\xc4\x8d\x02F7\x0c7\x1c\x93\x9fRI5\xcb\xe9w\xf0X\xc5\xa7\\\xb3\x8f3K\xbe\x9a;\xb4\x07,\x90\xc9\xf7X\x81\xd8\x1d\xa3\xd3\x83]\xb5\xc7\x8dt\x1bt\xca^\x8b\x96?u-\x94\xc8X\xf6\x03\x15\x89\x89\xd1\x8ap\xac\x7f\r\xeb\x89\xe2\r0\xde,-\x03,\xaf\x1b\xc4\xe7\xe6B\x0f\x7f|b\xb6EP\x87v\xa6\xd2\x9am\x029\xfb\xa3p\xb6s5\xa4q\xc9r\x10\x98\x92V*\xac\xd8\xe0\x12\x01 g\xda\xb2to\r\x8bK\xa3\xaa\xea\xb3.\xa1\xadH0\xd7\x0c\xb8XG\xf7!_\xe0Q\xf9\x9e\xa4\x9a\xdd\x14\xf1Rjq\x93}\xbeo\x12\xad\xfe\x9b\xa7\xce\x92\x01\xb6E\x94\x05\x04\xe3\x19\xfaV\xbd\xa6\x91\xa8\x7fm\xc5\xa8\xde4\x0e|\xa2\x92\x00=\xf28\xf6\xf5\xad\xf1O\x15I\xb4$\xecek>\x15\xd0\xbcE\x11\x8fV\xd2\xad\xae\x81\xe7s\xa6\x1c}\x18`\x8f\xce\xb8\x89>\x13Ma\xab+\xf8c]\xd4\xb4ke\x1b\x90%\xc1\x928\xcfB67\xde\xfcH\xafO\x14\xf1HG\x8f\xddx/\xe2>\x97\xa8\x8dF\xc7Q\xd2\xf5yUJ\x96h\xc5\xbc\xb2\xa9\xea\x18cc\x0f\xa95\x8e<Q\xabi\xd3J<]\xa3x\x93JEb\xad6\x9bn\x9eQ\xf5\xf9\x80\x03\x1e\xe0\x9c\x8a\xf7\xb1O\x14\x12y\xe7\x85~"\xfc<\xb5\xd3E\xa6\x9b\xac\xacX&GI\xe3\x91df=I\xca\xfc\xc7\xe9\x9a\xeb\xb4\x8f\x15\xe9:\xe5\xe1\xb6\xd3\xde\xeaVT.dk)\xa3\x8f\x00\x81\xf7\xd9\x02\x93\xcf@j\xfc\x1au\x8d\xbd\xdc\x97p\xd9[\xc7s \xda\xf3$J\x1d\x87\\\x16\x03$U\xc1L@i\xb4\xa6\x9b@\x1f\xff\xd9'
WORK_PATH = os.path.dirname(__file__)
SPACE_TOKEN = ['']
NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
ALPHA_UPPER = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
               'V', 'W', 'X', 'Y', 'Z']
ALPHA_LOWER = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
               'v', 'w', 'x', 'y', 'z']
ARITHMETIC = ['(', ')', '+', '-', '×', '÷', '=']

CHINESE_3500 = [
    '一', '乙', '二', '十', '丁', '厂', '七', '卜', '人', '入', '八', '九', '几', '儿', '了', '力', '乃', '刀', '又', '三',
    '于', '干', '亏', '士', '工', '土', '才', '寸', '下', '大', '丈', '与', '万', '上', '小', '口', '巾', '山', '千', '乞',
    '川', '亿', '个', '勺', '久', '凡', '及', '夕', '丸', '么', '广', '亡', '门', '义', '之', '尸', '弓', '己', '已', '子',
    '卫', '也', '女', '飞', '刃', '习', '叉', '马', '乡', '丰', '王', '井', '开', '夫', '天', '无', '元', '专', '云', '扎',
    '艺', '木', '五', '支', '厅', '不', '太', '犬', '区', '历', '尤', '友', '匹', '车', '巨', '牙', '屯', '比', '互', '切',
    '瓦', '止', '少', '日', '中', '冈', '贝', '内', '水', '见', '午', '牛', '手', '毛', '气', '升', '长', '仁', '什', '片',
    '仆', '化', '仇', '币', '仍', '仅', '斤', '爪', '反', '介', '父', '从', '今', '凶', '分', '乏', '公', '仓', '月', '氏',
    '勿', '欠', '风', '丹', '匀', '乌', '凤', '勾', '文', '六', '方', '火', '为', '斗', '忆', '订', '计', '户', '认', '心',
    '尺', '引', '丑', '巴', '孔', '队', '办', '以', '允', '予', '劝', '双', '书', '幻', '玉', '刊', '示', '末', '未', '击',
    '打', '巧', '正', '扑', '扒', '功', '扔', '去', '甘', '世', '古', '节', '本', '术', '可', '丙', '左', '厉', '右', '石',
    '布', '龙', '平', '灭', '轧', '东', '卡', '北', '占', '业', '旧', '帅', '归', '且', '旦', '目', '叶', '甲', '申', '叮',
    '电', '号', '田', '由', '史', '只', '央', '兄', '叼', '叫', '另', '叨', '叹', '四', '生', '失', '禾', '丘', '付', '仗',
    '代', '仙', '们', '仪', '白', '仔', '他', '斥', '瓜', '乎', '丛', '令', '用', '甩', '印', '乐', '句', '匆', '册', '犯',
    '外', '处', '冬', '鸟', '务', '包', '饥', '主', '市', '立', '闪', '兰', '半', '汁', '汇', '头', '汉', '宁', '穴', '它',
    '讨', '写', '让', '礼', '训', '必', '议', '讯', '记', '永', '司', '尼', '民', '出', '辽', '奶', '奴', '加', '召', '皮',
    '边', '发', '孕', '圣', '对', '台', '矛', '纠', '母', '幼', '丝', '式', '刑', '动', '扛', '寺', '吉', '扣', '考', '托',
    '老', '执', '巩', '圾', '扩', '扫', '地', '扬', '场', '耳', '共', '芒', '亚', '芝', '朽', '朴', '机', '权', '过', '臣',
    '再', '协', '西', '压', '厌', '在', '有', '百', '存', '而', '页', '匠', '夸', '夺', '灰', '达', '列', '死', '成', '夹',
    '轨', '邪', '划', '迈', '毕', '至', '此', '贞', '师', '尘', '尖', '劣', '光', '当', '早', '吐', '吓', '虫', '曲', '团',
    '同', '吊', '吃', '因', '吸', '吗', '屿', '帆', '岁', '回', '岂', '刚', '则', '肉', '网', '年', '朱', '先', '丢', '舌',
    '竹', '迁', '乔', '伟', '传', '乒', '乓', '休', '伍', '伏', '优', '伐', '延', '件', '任', '伤', '价', '份', '华', '仰',
    '仿', '伙', '伪', '自', '血', '向', '似', '后', '行', '舟', '全', '会', '杀', '合', '兆', '企', '众', '爷', '伞', '创',
    '肌', '朵', '杂', '危', '旬', '旨', '负', '各', '名', '多', '争', '色', '壮', '冲', '冰', '庄', '庆', '亦', '刘', '齐',
    '交', '次', '衣', '产', '决', '充', '妄', '闭', '问', '闯', '羊', '并', '关', '米', '灯', '州', '汗', '污', '江', '池',
    '汤', '忙', '兴', '宇', '守', '宅', '字', '安', '讲', '军', '许', '论', '农', '讽', '设', '访', '寻', '那', '迅', '尽',
    '导', '异', '孙', '阵', '阳', '收', '阶', '阴', '防', '奸', '如', '妇', '好', '她', '妈', '戏', '羽', '观', '欢', '买',
    '红', '纤', '级', '约', '纪', '驰', '巡', '寿', '弄', '麦', '形', '进', '戒', '吞', '远', '违', '运', '扶', '抚', '坛',
    '技', '坏', '扰', '拒', '找', '批', '扯', '址', '走', '抄', '坝', '贡', '攻', '赤', '折', '抓', '扮', '抢', '孝', '均',
    '抛', '投', '坟', '抗', '坑', '坊', '抖', '护', '壳', '志', '扭', '块', '声', '把', '报', '却', '劫', '芽', '花', '芹',
    '芬', '苍', '芳', '严', '芦', '劳', '克', '苏', '杆', '杠', '杜', '材', '村', '杏', '极', '李', '杨', '求', '更', '束',
    '豆', '两', '丽', '医', '辰', '励', '否', '还', '歼', '来', '连', '步', '坚', '旱', '盯', '呈', '时', '吴', '助', '县',
    '里', '呆', '园', '旷', '围', '呀', '吨', '足', '邮', '男', '困', '吵', '串', '员', '听', '吩', '吹', '呜', '吧', '吼',
    '别', '岗', '帐', '财', '针', '钉', '告', '我', '乱', '利', '秃', '秀', '私', '每', '兵', '估', '体', '何', '但', '伸',
    '作', '伯', '伶', '佣', '低', '你', '住', '位', '伴', '身', '皂', '佛', '近', '彻', '役', '返', '余', '希', '坐', '谷',
    '妥', '含', '邻', '岔', '肝', '肚', '肠', '龟', '免', '狂', '犹', '角', '删', '条', '卵', '岛', '迎', '饭', '饮', '系',
    '言', '冻', '状', '亩', '况', '床', '库', '疗', '应', '冷', '这', '序', '辛', '弃', '冶', '忘', '闲', '间', '闷', '判',
    '灶', '灿', '弟', '汪', '沙', '汽', '沃', '泛', '沟', '没', '沈', '沉', '怀', '忧', '快', '完', '宋', '宏', '牢', '究',
    '穷', '灾', '良', '证', '启', '评', '补', '初', '社', '识', '诉', '诊', '词', '译', '君', '灵', '即', '层', '尿', '尾',
    '迟', '局', '改', '张', '忌', '际', '陆', '阿', '陈', '阻', '附', '妙', '妖', '妨', '努', '忍', '劲', '鸡', '驱', '纯',
    '纱', '纳', '纲', '驳', '纵', '纷', '纸', '纹', '纺', '驴', '纽', '奉', '玩', '环', '武', '青', '责', '现', '表', '规',
    '抹', '拢', '拔', '拣', '担', '坦', '押', '抽', '拐', '拖', '拍', '者', '顶', '拆', '拥', '抵', '拘', '势', '抱', '垃',
    '拉', '拦', '拌', '幸', '招', '坡', '披', '拨', '择', '抬', '其', '取', '苦', '若', '茂', '苹', '苗', '英', '范', '直',
    '茄', '茎', '茅', '林', '枝', '杯', '柜', '析', '板', '松', '枪', '构', '杰', '述', '枕', '丧', '或', '画', '卧', '事',
    '刺', '枣', '雨', '卖', '矿', '码', '厕', '奔', '奇', '奋', '态', '欧', '垄', '妻', '轰', '顷', '转', '斩', '轮', '软',
    '到', '非', '叔', '肯', '齿', '些', '虎', '虏', '肾', '贤', '尚', '旺', '具', '果', '味', '昆', '国', '昌', '畅', '明',
    '易', '昂', '典', '固', '忠', '咐', '呼', '鸣', '咏', '呢', '岸', '岩', '帖', '罗', '帜', '岭', '凯', '败', '贩', '购',
    '图', '钓', '制', '知', '垂', '牧', '物', '乖', '刮', '秆', '和', '季', '委', '佳', '侍', '供', '使', '例', '版', '侄',
    '侦', '侧', '凭', '侨', '佩', '货', '依', '的', '迫', '质', '欣', '征', '往', '爬', '彼', '径', '所', '舍', '金', '命',
    '斧', '爸', '采', '受', '乳', '贪', '念', '贫', '肤', '肺', '肢', '肿', '胀', '朋', '股', '肥', '服', '胁', '周', '昏',
    '鱼', '兔', '狐', '忽', '狗', '备', '饰', '饱', '饲', '变', '京', '享', '店', '夜', '庙', '府', '底', '剂', '郊', '废',
    '净', '盲', '放', '刻', '育', '闸', '闹', '郑', '券', '卷', '单', '炒', '炊', '炕', '炎', '炉', '沫', '浅', '法', '泄',
    '河', '沾', '泪', '油', '泊', '沿', '泡', '注', '泻', '泳', '泥', '沸', '波', '泼', '泽', '治', '怖', '性', '怕', '怜',
    '怪', '学', '宝', '宗', '定', '宜', '审', '宙', '官', '空', '帘', '实', '试', '郎', '诗', '肩', '房', '诚', '衬', '衫',
    '视', '话', '诞', '询', '该', '详', '建', '肃', '录', '隶', '居', '届', '刷', '屈', '弦', '承', '孟', '孤', '陕', '降',
    '限', '妹', '姑', '姐', '姓', '始', '驾', '参', '艰', '线', '练', '组', '细', '驶', '织', '终', '驻', '驼', '绍', '经',
    '贯', '奏', '春', '帮', '珍', '玻', '毒', '型', '挂', '封', '持', '项', '垮', '挎', '城', '挠', '政', '赴', '赵', '挡',
    '挺', '括', '拴', '拾', '挑', '指', '垫', '挣', '挤', '拼', '挖', '按', '挥', '挪', '某', '甚', '革', '荐', '巷', '带',
    '草', '茧', '茶', '荒', '茫', '荡', '荣', '故', '胡', '南', '药', '标', '枯', '柄', '栋', '相', '查', '柏', '柳', '柱',
    '柿', '栏', '树', '要', '咸', '威', '歪', '研', '砖', '厘', '厚', '砌', '砍', '面', '耐', '耍', '牵', '残', '殃', '轻',
    '鸦', '皆', '背', '战', '点', '临', '览', '竖', '省', '削', '尝', '是', '盼', '眨', '哄', '显', '哑', '冒', '映', '星',
    '昨', '畏', '趴', '胃', '贵', '界', '虹', '虾', '蚁', '思', '蚂', '虽', '品', '咽', '骂', '哗', '咱', '响', '哈', '咬',
    '咳', '哪', '炭', '峡', '罚', '贱', '贴', '骨', '钞', '钟', '钢', '钥', '钩', '卸', '缸', '拜', '看', '矩', '怎', '牲',
    '选', '适', '秒', '香', '种', '秋', '科', '重', '复', '竿', '段', '便', '俩', '贷', '顺', '修', '保', '促', '侮', '俭',
    '俗', '俘', '信', '皇', '泉', '鬼', '侵', '追', '俊', '盾', '待', '律', '很', '须', '叙', '剑', '逃', '食', '盆', '胆',
    '胜', '胞', '胖', '脉', '勉', '狭', '狮', '独', '狡', '狱', '狠', '贸', '怨', '急', '饶', '蚀', '饺', '饼', '弯', '将',
    '奖', '哀', '亭', '亮', '度', '迹', '庭', '疮', '疯', '疫', '疤', '姿', '亲', '音', '帝', '施', '闻', '阀', '阁', '差',
    '养', '美', '姜', '叛', '送', '类', '迷', '前', '首', '逆', '总', '炼', '炸', '炮', '烂', '剃', '洁', '洪', '洒', '浇',
    '浊', '洞', '测', '洗', '活', '派', '洽', '染', '济', '洋', '洲', '浑', '浓', '津', '恒', '恢', '恰', '恼', '恨', '举',
    '觉', '宣', '室', '宫', '宪', '突', '穿', '窃', '客', '冠', '语', '扁', '袄', '祖', '神', '祝', '误', '诱', '说', '诵',
    '垦', '退', '既', '屋', '昼', '费', '陡', '眉', '孩', '除', '险', '院', '娃', '姥', '姨', '姻', '娇', '怒', '架', '贺',
    '盈', '勇', '怠', '柔', '垒', '绑', '绒', '结', '绕', '骄', '绘', '给', '络', '骆', '绝', '绞', '统', '耕', '耗', '艳',
    '泰', '珠', '班', '素', '蚕', '顽', '盏', '匪', '捞', '栽', '捕', '振', '载', '赶', '起', '盐', '捎', '捏', '埋', '捉',
    '捆', '捐', '损', '都', '哲', '逝', '捡', '换', '挽', '热', '恐', '壶', '挨', '耻', '耽', '恭', '莲', '莫', '荷', '获',
    '晋', '恶', '真', '框', '桂', '档', '桐', '株', '桥', '桃', '格', '校', '核', '样', '根', '索', '哥', '速', '逗', '栗',
    '配', '翅', '辱', '唇', '夏', '础', '破', '原', '套', '逐', '烈', '殊', '顾', '轿', '较', '顿', '毙', '致', '柴', '桌',
    '虑', '监', '紧', '党', '晒', '眠', '晓', '鸭', '晃', '晌', '晕', '蚊', '哨', '哭', '恩', '唤', '啊', '唉', '罢', '峰',
    '圆', '贼', '贿', '钱', '钳', '钻', '铁', '铃', '铅', '缺', '氧', '特', '牺', '造', '乘', '敌', '秤', '租', '积', '秧',
    '秩', '称', '秘', '透', '笔', '笑', '笋', '债', '借', '值', '倚', '倾', '倒', '倘', '俱', '倡', '候', '俯', '倍', '倦',
    '健', '臭', '射', '躬', '息', '徒', '徐', '舰', '舱', '般', '航', '途', '拿', '爹', '爱', '颂', '翁', '脆', '脂', '胸',
    '胳', '脏', '胶', '脑', '狸', '狼', '逢', '留', '皱', '饿', '恋', '桨', '浆', '衰', '高', '席', '准', '座', '脊', '症',
    '病', '疾', '疼', '疲', '效', '离', '唐', '资', '凉', '站', '剖', '竞', '部', '旁', '旅', '畜', '阅', '羞', '瓶', '拳',
    '粉', '料', '益', '兼', '烤', '烘', '烦', '烧', '烛', '烟', '递', '涛', '浙', '涝', '酒', '涉', '消', '浩', '海', '涂',
    '浴', '浮', '流', '润', '浪', '浸', '涨', '烫', '涌', '悟', '悄', '悔', '悦', '害', '宽', '家', '宵', '宴', '宾', '窄',
    '容', '宰', '案', '请', '朗', '诸', '读', '扇', '袜', '袖', '袍', '被', '祥', '课', '谁', '调', '冤', '谅', '谈', '谊',
    '剥', '恳', '展', '剧', '屑', '弱', '陵', '陶', '陷', '陪', '娱', '娘', '通', '能', '难', '预', '桑', '绢', '绣', '验',
    '继', '球', '理', '捧', '堵', '描', '域', '掩', '捷', '排', '掉', '堆', '推', '掀', '授', '教', '掏', '掠', '培', '接',
    '控', '探', '据', '掘', '职', '基', '著', '勒', '黄', '萌', '萝', '菌', '菜', '萄', '菊', '萍', '菠', '营', '械', '梦',
    '梢', '梅', '检', '梳', '梯', '桶', '救', '副', '票', '戚', '爽', '聋', '袭', '盛', '雪', '辅', '辆', '虚', '雀', '堂',
    '常', '匙', '晨', '睁', '眯', '眼', '悬', '野', '啦', '晚', '啄', '距', '跃', '略', '蛇', '累', '唱', '患', '唯', '崖',
    '崭', '崇', '圈', '铜', '铲', '银', '甜', '梨', '犁', '移', '笨', '笼', '笛', '符', '第', '敏', '做', '袋', '悠', '偿',
    '偶', '偷', '您', '售', '停', '偏', '假', '得', '衔', '盘', '船', '斜', '盒', '鸽', '悉', '欲', '彩', '领', '脚', '脖',
    '脸', '脱', '象', '够', '猜', '猪', '猎', '猫', '猛', '馅', '馆', '凑', '减', '毫', '麻', '痒', '痕', '廊', '康', '庸',
    '鹿', '盗', '章', '竟', '商', '族', '旋', '望', '率', '着', '盖', '粘', '粗', '粒', '断', '剪', '兽', '清', '添', '淋',
    '淹', '渠', '渐', '混', '渔', '淘', '液', '淡', '深', '婆', '梁', '渗', '情', '惜', '惭', '悼', '惧', '惕', '惊', '惨',
    '惯', '寇', '寄', '宿', '窑', '密', '谋', '谎', '祸', '谜', '逮', '敢', '屠', '弹', '随', '蛋', '隆', '隐', '婚', '婶',
    '颈', '绩', '绪', '续', '骑', '绳', '维', '绵', '绸', '绿', '琴', '斑', '替', '款', '堪', '搭', '塔', '越', '趁', '趋',
    '超', '提', '堤', '博', '揭', '喜', '插', '揪', '搜', '煮', '援', '裁', '搁', '搂', '搅', '握', '揉', '斯', '期', '欺',
    '联', '散', '惹', '葬', '葛', '董', '葡', '敬', '葱', '落', '朝', '辜', '葵', '棒', '棋', '植', '森', '椅', '椒', '棵',
    '棍', '棉', '棚', '棕', '惠', '惑', '逼', '厨', '厦', '硬', '确', '雁', '殖', '裂', '雄', '暂', '雅', '辈', '悲', '紫',
    '辉', '敞', '赏', '掌', '晴', '暑', '最', '量', '喷', '晶', '喇', '遇', '喊', '景', '践', '跌', '跑', '遗', '蛙', '蛛',
    '蜓', '喝', '喂', '喘', '喉', '幅', '帽', '赌', '赔', '黑', '铸', '铺', '链', '销', '锁', '锄', '锅', '锈', '锋', '锐',
    '短', '智', '毯', '鹅', '剩', '稍', '程', '稀', '税', '筐', '等', '筑', '策', '筛', '筒', '答', '筋', '筝', '傲', '傅',
    '牌', '堡', '集', '焦', '傍', '储', '奥', '街', '惩', '御', '循', '艇', '舒', '番', '释', '禽', '腊', '脾', '腔', '鲁',
    '猾', '猴', '然', '馋', '装', '蛮', '就', '痛', '童', '阔', '善', '羡', '普', '粪', '尊', '道', '曾', '焰', '港', '湖',
    '渣', '湿', '温', '渴', '滑', '湾', '渡', '游', '滋', '溉', '愤', '慌', '惰', '愧', '愉', '慨', '割', '寒', '富', '窜',
    '窝', '窗', '遍', '裕', '裤', '裙', '谢', '谣', '谦', '属', '屡', '强', '粥', '疏', '隔', '隙', '絮', '嫂', '登', '缎',
    '缓', '编', '骗', '缘', '瑞', '魂', '肆', '摄', '摸', '填', '搏', '塌', '鼓', '摆', '携', '搬', '摇', '搞', '塘', '摊',
    '蒜', '勤', '鹊', '蓝', '墓', '幕', '蓬', '蓄', '蒙', '蒸', '献', '禁', '楚', '想', '槐', '榆', '楼', '概', '赖', '酬',
    '感', '碍', '碑', '碎', '碰', '碗', '碌', '雷', '零', '雾', '雹', '输', '督', '龄', '鉴', '睛', '睡', '睬', '鄙', '愚',
    '暖', '盟', '歇', '暗', '照', '跨', '跳', '跪', '路', '跟', '遣', '蛾', '蜂', '嗓', '置', '罪', '罩', '错', '锡', '锣',
    '锤', '锦', '键', '锯', '矮', '辞', '稠', '愁', '筹', '签', '简', '毁', '舅', '鼠', '催', '傻', '像', '躲', '微', '愈',
    '遥', '腰', '腥', '腹', '腾', '腿', '触', '解', '酱', '痰', '廉', '新', '韵', '意', '粮', '数', '煎', '塑', '慈', '煤',
    '煌', '满', '漠', '源', '滤', '滥', '滔', '溪', '溜', '滚', '滨', '粱', '滩', '慎', '誉', '塞', '谨', '福', '群', '殿',
    '辟', '障', '嫌', '嫁', '叠', '缝', '缠', '静', '碧', '璃', '墙', '撇', '嘉', '摧', '截', '誓', '境', '摘', '摔', '聚',
    '蔽', '慕', '暮', '蔑', '模', '榴', '榜', '榨', '歌', '遭', '酷', '酿', '酸', '磁', '愿', '需', '弊', '裳', '颗', '嗽',
    '蜻', '蜡', '蝇', '蜘', '赚', '锹', '锻', '舞', '稳', '算', '箩', '管', '僚', '鼻', '魄', '貌', '膜', '膊', '膀', '鲜',
    '疑', '馒', '裹', '敲', '豪', '膏', '遮', '腐', '瘦', '辣', '竭', '端', '旗', '精', '歉', '熄', '熔', '漆', '漂', '漫',
    '滴', '演', '漏', '慢', '寨', '赛', '察', '蜜', '谱', '嫩', '翠', '熊', '凳', '骡', '缩', '慧', '撕', '撒', '趣', '趟',
    '撑', '播', '撞', '撤', '增', '聪', '鞋', '蕉', '蔬', '横', '槽', '樱', '橡', '飘', '醋', '醉', '震', '霉', '瞒', '题',
    '暴', '瞎', '影', '踢', '踏', '踩', '踪', '蝶', '蝴', '嘱', '墨', '镇', '靠', '稻', '黎', '稿', '稼', '箱', '箭', '篇',
    '僵', '躺', '僻', '德', '艘', '膝', '膛', '熟', '摩', '颜', '毅', '糊', '遵', '潜', '潮', '懂', '额', '慰', '劈', '操',
    '燕', '薯', '薪', '薄', '颠', '橘', '整', '融', '醒', '餐', '嘴', '蹄', '器', '赠', '默', '镜', '赞', '篮', '邀', '衡',
    '膨', '雕', '磨', '凝', '辨', '辩', '糖', '糕', '燃', '澡', '激', '懒', '壁', '避', '缴', '戴', '擦', '鞠', '藏', '霜',
    '霞', '瞧', '蹈', '螺', '穗', '繁', '辫', '赢', '糟', '糠', '燥', '臂', '翼', '骤', '鞭', '覆', '蹦', '镰', '翻', '鹰',
    '警', '攀', '蹲', '颤', '瓣', '爆', '疆', '壤', '耀', '躁', '嚼', '嚷', '籍', '魔', '灌', '蠢', '霸', '露', '囊', '罐',
    '匕', '刁', '丐', '歹', '戈', '夭', '仑', '讥', '冗', '邓', '艾', '夯', '凸', '卢', '叭', '叽', '皿', '凹', '囚', '矢',
    '乍', '尔', '冯', '玄', '邦', '迂', '邢', '芋', '芍', '吏', '夷', '吁', '吕', '吆', '屹', '廷', '迄', '臼', '仲', '伦',
    '伊', '肋', '旭', '匈', '凫', '妆', '亥', '汛', '讳', '讶', '讹', '讼', '诀', '弛', '阱', '驮', '驯', '纫', '玖', '玛',
    '韧', '抠', '扼', '汞', '扳', '抡', '坎', '坞', '抑', '拟', '抒', '芙', '芜', '苇', '芥', '芯', '芭', '杖', '杉', '巫',
    '杈', '甫', '匣', '轩', '卤', '肖', '吱', '吠', '呕', '呐', '吟', '呛', '吻', '吭', '邑', '囤', '吮', '岖', '牡', '佑',
    '佃', '伺', '囱', '肛', '肘', '甸', '狈', '鸠', '彤', '灸', '刨', '庇', '吝', '庐', '闰', '兑', '灼', '沐', '沛', '汰',
    '沥', '沦', '汹', '沧', '沪', '忱', '诅', '诈', '罕', '屁', '坠', '妓', '姊', '妒', '纬', '玫', '卦', '坷', '坯', '拓',
    '坪', '坤', '拄', '拧', '拂', '拙', '拇', '拗', '茉', '昔', '苛', '苫', '苟', '苞', '茁', '苔', '枉', '枢', '枚', '枫',
    '杭', '郁', '矾', '奈', '奄', '殴', '歧', '卓', '昙', '哎', '咕', '呵', '咙', '呻', '咒', '咆', '咖', '帕', '账', '贬',
    '贮', '氛', '秉', '岳', '侠', '侥', '侣', '侈', '卑', '刽', '刹', '肴', '觅', '忿', '瓮', '肮', '肪', '狞', '庞', '疟',
    '疙', '疚', '卒', '氓', '炬', '沽', '沮', '泣', '泞', '泌', '沼', '怔', '怯', '宠', '宛', '衩', '祈', '诡', '帚', '屉',
    '弧', '弥', '陋', '陌', '函', '姆', '虱', '叁', '绅', '驹', '绊', '绎', '契', '贰', '玷', '玲', '珊', '拭', '拷', '拱',
    '挟', '垢', '垛', '拯', '荆', '茸', '茬', '荚', '茵', '茴', '荞', '荠', '荤', '荧', '荔', '栈', '柑', '栅', '柠', '枷',
    '勃', '柬', '砂', '泵', '砚', '鸥', '轴', '韭', '虐', '昧', '盹', '咧', '昵', '昭', '盅', '勋', '哆', '咪', '哟', '幽',
    '钙', '钝', '钠', '钦', '钧', '钮', '毡', '氢', '秕', '俏', '俄', '俐', '侯', '徊', '衍', '胚', '胧', '胎', '狰', '饵',
    '峦', '奕', '咨', '飒', '闺', '闽', '籽', '娄', '烁', '炫', '洼', '柒', '涎', '洛', '恃', '恍', '恬', '恤', '宦', '诫',
    '诬', '祠', '诲', '屏', '屎', '逊', '陨', '姚', '娜', '蚤', '骇', '耘', '耙', '秦', '匿', '埂', '捂', '捍', '袁', '捌',
    '挫', '挚', '捣', '捅', '埃', '耿', '聂', '荸', '莽', '莱', '莉', '莹', '莺', '梆', '栖', '桦', '栓', '桅', '桩', '贾',
    '酌', '砸', '砰', '砾', '殉', '逞', '哮', '唠', '哺', '剔', '蚌', '蚜', '畔', '蚣', '蚪', '蚓', '哩', '圃', '鸯', '唁',
    '哼', '唆', '峭', '唧', '峻', '赂', '赃', '钾', '铆', '氨', '秫', '笆', '俺', '赁', '倔', '殷', '耸', '舀', '豺', '豹',
    '颁', '胯', '胰', '脐', '脓', '逛', '卿', '鸵', '鸳', '馁', '凌', '凄', '衷', '郭', '斋', '疹', '紊', '瓷', '羔', '烙',
    '浦', '涡', '涣', '涤', '涧', '涕', '涩', '悍', '悯', '窍', '诺', '诽', '袒', '谆', '祟', '恕', '娩', '骏', '琐', '麸',
    '琉', '琅', '措', '捺', '捶', '赦', '埠', '捻', '掐', '掂', '掖', '掷', '掸', '掺', '勘', '聊', '娶', '菱', '菲', '萎',
    '菩', '萤', '乾', '萧', '萨', '菇', '彬', '梗', '梧', '梭', '曹', '酝', '酗', '厢', '硅', '硕', '奢', '盔', '匾', '颅',
    '彪', '眶', '晤', '曼', '晦', '冕', '啡', '畦', '趾', '啃', '蛆', '蚯', '蛉', '蛀', '唬', '唾', '啤', '啥', '啸', '崎',
    '逻', '崔', '崩', '婴', '赊', '铐', '铛', '铝', '铡', '铣', '铭', '矫', '秸', '秽', '笙', '笤', '偎', '傀', '躯', '兜',
    '衅', '徘', '徙', '舶', '舷', '舵', '敛', '翎', '脯', '逸', '凰', '猖', '祭', '烹', '庶', '庵', '痊', '阎', '阐', '眷',
    '焊', '焕', '鸿', '涯', '淑', '淌', '淮', '淆', '渊', '淫', '淳', '淤', '淀', '涮', '涵', '惦', '悴', '惋', '寂', '窒',
    '谍', '谐', '裆', '袱', '祷', '谒', '谓', '谚', '尉', '堕', '隅', '婉', '颇', '绰', '绷', '综', '绽', '缀', '巢', '琳',
    '琢', '琼', '揍', '堰', '揩', '揽', '揖', '彭', '揣', '搀', '搓', '壹', '搔', '葫', '募', '蒋', '蒂', '韩', '棱', '椰',
    '焚', '椎', '棺', '榔', '椭', '粟', '棘', '酣', '酥', '硝', '硫', '颊', '雳', '翘', '凿', '棠', '晰', '鼎', '喳', '遏',
    '晾', '畴', '跋', '跛', '蛔', '蜒', '蛤', '鹃', '喻', '啼', '喧', '嵌', '赋', '赎', '赐', '锉', '锌', '甥', '掰', '氮',
    '氯', '黍', '筏', '牍', '粤', '逾', '腌', '腋', '腕', '猩', '猬', '惫', '敦', '痘', '痢', '痪', '竣', '翔', '奠', '遂',
    '焙', '滞', '湘', '渤', '渺', '溃', '溅', '湃', '愕', '惶', '寓', '窖', '窘', '雇', '谤', '犀', '隘', '媒', '媚', '婿',
    '缅', '缆', '缔', '缕', '骚', '瑟', '鹉', '瑰', '搪', '聘', '斟', '靴', '靶', '蓖', '蒿', '蒲', '蓉', '楔', '椿', '楷',
    '榄', '楞', '楣', '酪', '碘', '硼', '碉', '辐', '辑', '频', '睹', '睦', '瞄', '嗜', '嗦', '暇', '畸', '跷', '跺', '蜈',
    '蜗', '蜕', '蛹', '嗅', '嗡', '嗤', '署', '蜀', '幌', '锚', '锥', '锨', '锭', '锰', '稚', '颓', '筷', '魁', '衙', '腻',
    '腮', '腺', '鹏', '肄', '猿', '颖', '煞', '雏', '馍', '馏', '禀', '痹', '廓', '痴', '靖', '誊', '漓', '溢', '溯', '溶',
    '滓', '溺', '寞', '窥', '窟', '寝', '褂', '裸', '谬', '媳', '嫉', '缚', '缤', '剿', '赘', '熬', '赫', '蔫', '摹', '蔓',
    '蔗', '蔼', '熙', '蔚', '兢', '榛', '榕', '酵', '碟', '碴', '碱', '碳', '辕', '辖', '雌', '墅', '嘁', '踊', '蝉', '嘀',
    '幔', '镀', '舔', '熏', '箍', '箕', '箫', '舆', '僧', '孵', '瘩', '瘟', '彰', '粹', '漱', '漩', '漾', '慷', '寡', '寥',
    '谭', '褐', '褪', '隧', '嫡', '缨', '撵', '撩', '撮', '撬', '擒', '墩', '撰', '鞍', '蕊', '蕴', '樊', '樟', '橄', '敷',
    '豌', '醇', '磕', '磅', '碾', '憋', '嘶', '嘲', '嘹', '蝠', '蝎', '蝌', '蝗', '蝙', '嘿', '幢', '镊', '镐', '稽', '篓',
    '膘', '鲤', '鲫', '褒', '瘪', '瘤', '瘫', '凛', '澎', '潭', '潦', '澳', '潘', '澈', '澜', '澄', '憔', '懊', '憎', '翩',
    '褥', '谴', '鹤', '憨', '履', '嬉', '豫', '缭', '撼', '擂', '擅', '蕾', '薛', '薇', '擎', '翰', '噩', '橱', '橙', '瓢',
    '蟥', '霍', '霎', '辙', '冀', '踱', '蹂', '蟆', '螃', '螟', '噪', '鹦', '黔', '穆', '篡', '篷', '篙', '篱', '儒', '膳',
    '鲸', '瘾', '瘸', '糙', '燎', '濒', '憾', '懈', '窿', '缰', '壕', '藐', '檬', '檐', '檩', '檀', '礁', '磷', '了', '瞬',
    '瞳', '瞪', '曙', '蹋', '蟋', '蟀', '嚎', '赡', '镣', '魏', '簇', '儡', '徽', '爵', '朦', '臊', '鳄', '糜', '癌', '懦',
    '豁', '臀', '藕', '藤', '瞻', '嚣', '鳍', '癞', '瀑', '襟', '璧', '戳', '攒', '孽', '蘑', '藻', '鳖', '蹭', '蹬', '簸',
    '簿', '蟹', '靡', '癣', '羹', '鬓', '攘', '蠕', '巍', '鳞', '糯', '譬', '霹', '躏', '髓', '蘸', '镶', '瓤', '矗', '圳',
    '珏', '蕙', '旻', '涅', '攸', '嘛', '醪', '缪', '噗', '瞨', '靳', '帷', '徨',
]

FLOAT = ['.']

DOCUMENT_SYMBOLS = [
    '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[',
    ']', '^', '_', '`', '{', '|', '}', '~', '°', '±', '·', '×', 'à', 'é', '÷', 'ü', 'α', 'β', 'О', 'П', 'Р', '–', '—',
    '―', '‘', '’', '“', '”', '…', '‰', '′', '※', '℃', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', '→', '↓', '∈', '√', '∩', '∵', '∶', '≠',
    '≤', '≥', '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑴', '⑵', '⑶', '⑾', '⑿', '⒀', '⒁', '⒂', '⒃',
    '⒄', '⒅', '⒆', '⒈', '⒉', '⒊', '─', '━', '│', '┌', '┐', '╱', '■', '□', '▲', '△', '◆', '◇', '○', '◎', '●',
    '★', '☆', '、', '。', '〇', '〈', '〉', '《', '》', '「', '」', '『', '』', '【', '】', '〔', '〕', '︰', '﹐',
    '﹑', '﹒', '﹔', '﹖', '(', ')', '+', ',', '.', '~', '¥'
]

DOCUMENT_CHS = [
    '一', '丁', '七', '万', '丈', '三', '上', '下', '不', '与', '丐', '丑', '专', '且', '丕', '世', '丘', '丙', '业', '丛',
    '东', '丝', '丞', '丢', '两', '严', '丧', '个', '丫', '中', '丰', '串', '临', '丸', '丹', '为', '主', '丽', '举', '乂',
    '乃', '久', '么', '义', '之', '乌', '乍', '乎', '乏', '乐', '乒', '乓', '乔', '乖', '乘', '乙', '九', '乞', '也', '习',
    '乡', '书', '乩', '买', '乱', '乳', '乾', '了', '予', '争', '事', '二', '于', '亏', '云', '互', '亓', '五', '井', '亘',
    '亚', '些', '亟', '亡', '亢', '交', '亥', '亦', '产', '亨', '亩', '享', '京', '亭', '亮', '亲', '亳', '亵', '亶', '亹',
    '人', '亿', '什', '仁', '仃', '仄', '仅', '仆', '仇', '今', '介', '仍', '从', '仑', '仓', '仔', '仕', '他', '仗', '付',
    '仙', '仞', '仡', '代', '令', '以', '仪', '仫', '们', '仰', '仲', '件', '价', '任', '份', '仿', '企', '伉', '伊', '伋',
    '伍', '伎', '伏', '伐', '休', '众', '优', '伙', '会', '伛', '伞', '伟', '传', '伤', '伦', '伧', '伪', '伫', '伯', '估',
    '伴', '伶', '伸', '伺', '伻', '似', '伽', '佃', '但', '佈', '位', '低', '住', '佐', '佑', '体', '何', '佗', '佘', '余',
    '佚', '佛', '作', '佝', '佞', '佟', '你', '佣', '佤', '佩', '佬', '佯', '佰', '佳', '佶', '佻', '佼', '使', '侃', '侄',
    '侈', '例', '侍', '侏', '侑', '侔', '侗', '供', '依', '侠', '侣', '侥', '侦', '侧', '侨', '侩', '侪', '侬', '侮', '侯',
    '侵', '便', '促', '俄', '俅', '俊', '俎', '俏', '俐', '俑', '俗', '俘', '俚', '俛', '保', '俞', '俟', '信', '俦', '俨',
    '俩', '俪', '俭', '修', '俯', '俱', '俳', '俸', '俺', '俾', '倍', '倏', '倒', '倔', '倘', '候', '倚', '倜', '借', '倡',
    '倦', '倨', '倩', '倪', '倬', '倭', '债', '值', '倾', '偃', '假', '偈', '偌', '偎', '偏', '偕', '做', '停', '健', '偶',
    '傕', '傣', '傥', '储', '傩', '催', '傲', '傻', '僇', '僊', '像', '僖', '僚', '僦', '僧', '僭', '僮', '僰', '僳', '僵',
    '價', '僻', '儆', '儇', '儋', '儒', '儙', '儡', '儣', '儿', '兀', '允', '元', '兄', '充', '兆', '先', '光', '克', '免',
    '兑', '兒', '兔', '兕', '兖', '党', '兜', '兢', '入', '全', '八', '公', '六', '兮', '兰', '共', '关', '兴', '兵', '其',
    '具', '典', '兹', '养', '兼', '兽', '冀', '冁', '内', '冈', '冉', '册', '再', '冏', '冑', '冒', '冕', '冗', '写', '军',
    '农', '冠', '冢', '冤', '冥', '冬', '冯', '冰', '冲', '决', '况', '冶', '冷', '冻', '冽', '净', '凄', '准', '凇', '凉',
    '凋', '凌', '减', '凑', '凛', '凝', '几', '凡', '凤', '凫', '凭', '凯', '凰', '凳', '凶', '凸', '凹', '出', '击', '函',
    '凿', '刀', '刁', '刃', '分', '切', '刈', '刊', '刍', '刎', '刑', '划', '刓', '刖', '列', '刘', '则', '刚', '创', '初',
    '删', '判', '刨', '利', '别', '刭', '刮', '到', '刳', '制', '刷', '券', '刹', '刺', '刻', '刽', '剁', '剂', '剃', '削',
    '剌', '前', '剎', '剐', '剑', '剔', '剖', '剜', '剥', '剧', '剩', '剪', '副', '割', '剽', '剿', '劈', '劓', '劙', '力',
    '劝', '办', '功', '加', '务', '劣', '动', '助', '努', '劫', '劬', '劭', '励', '劲', '劳', '劾', '势', '勃', '勇', '勉',
    '勋', '勐', '勒', '勖', '勘', '募', '勤', '勺', '勾', '勿', '匀', '包', '匆', '匈', '匍', '匏', '匐', '匕', '化', '北',
    '匙', '匝', '匠', '匡', '匣', '匪', '匮', '匳', '匹', '区', '医', '匾', '匿', '十', '千', '卅', '升', '午', '卉', '半',
    '华', '协', '卑', '卒', '卓', '单', '卖', '南', '博', '卜', '卞', '占', '卡', '卢', '卤', '卦', '卧', '卫', '卬', '卮',
    '卯', '印', '危', '即', '却', '卵', '卷', '卸', '卺', '卿', '厂', '厄', '厅', '历', '厉', '压', '厌', '厍', '厕', '厘',
    '厚', '厝', '原', '厢', '厥', '厦', '厨', '厩', '厮', '去', '县', '参', '又', '叉', '及', '友', '双', '反', '发', '叔',
    '取', '受', '变', '叙', '叛', '叟', '叠', '叡', '口', '古', '句', '另', '叨', '叩', '只', '叫', '召', '叭', '叮', '可',
    '台', '叱', '史', '右', '叵', '叶', '号', '司', '叹', '叼', '叽', '吁', '吃', '各', '吆', '合', '吉', '吊', '同', '名',
    '后', '吏', '吐', '向', '吒', '吓', '吕', '吗', '君', '吝', '吞', '吟', '吠', '否', '吧', '吨', '吩', '含', '听', '吭',
    '吮', '启', '吱', '吴', '吵', '吸', '吹', '吻', '吼', '吾', '呀', '呃', '呆', '呈', '告', '呐', '呓', '呕', '呗', '员',
    '呛', '呜', '呢', '呤', '呦', '周', '呱', '味', '呵', '呶', '呷', '呻', '呼', '命', '咀', '咂', '咄', '咆', '咋', '和',
    '咎', '咏', '咐', '咒', '咔', '咕', '咖', '咙', '咚', '咛', '咣', '咤', '咦', '咧', '咨', '咪', '咫', '咬', '咯', '咱',
    '咳', '咸', '咻', '咽', '咿', '哀', '品', '哂', '哄', '哆', '哇', '哈', '哉', '哌', '响', '哎', '哏', '哑', '哗', '哙',
    '哝', '哟', '哥', '哦', '哧', '哨', '哩', '哪', '哭', '哮', '哲', '哺', '哼', '哽', '唁', '唆', '唇', '唉', '唏', '唐',
    '唑', '唔', '唠', '唢', '唤', '唧', '唬', '售', '唯', '唱', '唳', '唶', '唾', '唿', '啁', '啃', '啄', '商', '啊', '啐',
    '啕', '啖', '啜', '啡', '啤', '啥', '啦', '啧', '啪', '啬', '啮', '啰', '啱', '啶', '啸', '啻', '啼', '啾', '喀', '喁',
    '喂', '喃', '善', '喆', '喇', '喉', '喊', '喋', '喏', '喑', '喔', '喘', '喙', '喜', '喝', '喟', '喧', '喱', '喳', '喷',
    '喹', '喻', '喽', '喾', '嗄', '嗅', '嗌', '嗑', '嗒', '嗓', '嗔', '嗖', '嗛', '嗜', '嗝', '嗟', '嗡', '嗣', '嗤', '嗥',
    '嗦', '嗨', '嗪', '嗫', '嗯', '嗲', '嗳', '嗷', '嗽', '嗾', '嘀', '嘈', '嘉', '嘌', '嘎', '嘘', '嘛', '嘟', '嘤', '嘭',
    '嘱', '嘲', '嘴', '嘶', '嘹', '嘻', '嘿', '噉', '噌', '噎', '噔', '噗', '噙', '噜', '噢', '噤', '器', '噩', '噪', '噫',
    '噬', '噭', '噱', '噶', '噻', '嚅', '嚋', '嚎', '嚏', '嚓', '嚣', '嚬', '嚭', '嚰', '嚷', '嚼', '囊', '囐', '囔', '囚',
    '四', '回', '因', '团', '囤', '囫', '园', '困', '囱', '围', '囵', '囹', '固', '国', '图', '囿', '圃', '圄', '圆', '圈',
    '圉', '圜', '土', '圣', '在', '圩', '圭', '圯', '地', '圳', '圹', '场', '圾', '址', '坂', '均', '坊', '坌', '坍', '坎',
    '坏', '坐', '坑', '块', '坚', '坛', '坝', '坞', '坟', '坠', '坡', '坤', '坦', '坨', '坪', '坭', '坯', '坳', '坷', '坻',
    '坼', '垂', '垃', '垄', '型', '垒', '垓', '垛', '垝', '垠', '垢', '垣', '垦', '垩', '垫', '垮', '埃', '埋', '城', '埒',
    '埔', '域', '埠', '埤', '埶', '培', '基', '埽', '堂', '堃', '堆', '堑', '堕', '堙', '堡', '堤', '堪', '堰', '堵', '塌',
    '塑', '塔', '塘', '塞', '填', '塾', '墀', '境', '墅', '墉', '墓', '墙', '增', '墟', '墠', '墨', '墩', '壁', '壅', '壑',
    '壕', '壖', '壤', '士', '壬', '壮', '声', '壳', '壶', '壹', '处', '备', '复', '夏', '夔', '夕', '外', '夙', '多', '夜',
    '够', '夡', '夤', '夥', '大', '天', '太', '夫', '夭', '央', '夯', '失', '头', '夷', '夸', '夹', '夺', '奁', '奂', '奄',
    '奇', '奈', '奉', '奋', '奎', '奏', '契', '奔', '奕', '奖', '套', '奘', '奚', '奠', '奡', '奢', '奥', '奭', '女', '奴',
    '奶', '奸', '她', '好', '妁', '如', '妃', '妄', '妆', '妇', '妈', '妊', '妍', '妒', '妓', '妖', '妗', '妙', '妞', '妤',
    '妥', '妨', '妩', '妪', '妫', '妮', '妲', '妳', '妹', '妻', '妾', '姁', '姆', '姊', '始', '姐', '姑', '姒', '姓', '委',
    '姗', '姚', '姜', '姝', '姞', '姣', '姥', '姨', '姬', '姮', '姹', '姻', '姿', '娀', '威', '娃', '娄', '娅', '娆', '娇',
    '娈', '娉', '娑', '娓', '娘', '娜', '娟', '娠', '娡', '娣', '娥', '娩', '娱', '娲', '娴', '娶', '娼', '婀', '婆', '婉',
    '婊', '婕', '婚', '婢', '婧', '婪', '婴', '婶', '婷', '婺', '婿', '媒', '媚', '媛', '媢', '媪', '媲', '媳', '媵', '媸',
    '媾', '嫁', '嫂', '嫄', '嫉', '嫌', '嫔', '嫖', '嫚', '嫜', '嫡', '嫣', '嫦', '嫩', '嫪', '嫱', '嬃', '嬉', '嬖', '嬗',
    '嬛', '嬴', '孀', '子', '孑', '孔', '孕', '字', '存', '孙', '孚', '孛', '孜', '孝', '孟', '孢', '季', '孤', '孥', '学',
    '孩', '孪', '孰', '孱', '孳', '孵', '孺', '孽', '宁', '它', '宅', '宇', '守', '安', '宋', '完', '宏', '宓', '宕', '宗',
    '官', '宙', '定', '宛', '宜', '宝', '实', '宠', '审', '客', '宣', '室', '宥', '宦', '宪', '宫', '宰', '害', '宴', '宵',
    '家', '宸', '容', '宽', '宾', '宿', '寂', '寄', '寅', '密', '寇', '富', '寐', '寒', '寓', '寖', '寘', '寝', '寞', '察',
    '寡', '寤', '寥', '寨', '寰', '寸', '对', '寺', '寻', '导', '寿', '封', '射', '将', '尉', '尊', '小', '少', '尔', '尖',
    '尘', '尚', '尝', '尤', '尧', '尬', '就', '尴', '尸', '尹', '尺', '尻', '尼', '尽', '尾', '尿', '局', '屁', '层', '居',
    '屈', '屉', '届', '屋', '屎', '屏', '屑', '展', '属', '屠', '屡', '屣', '履', '屦', '屯', '山', '屹', '屿', '岁', '岂',
    '岌', '岐', '岑', '岔', '岖', '岗', '岚', '岛', '岩', '岫', '岬', '岭', '岱', '岳', '岷', '岸', '岿', '峄', '峇', '峋',
    '峒', '峙', '峡', '峣', '峤', '峥', '峦', '峨', '峪', '峭', '峰', '峻', '崂', '崃', '崆', '崇', '崎', '崔', '崖', '崚',
    '崛', '崧', '崩', '崭', '崴', '嵋', '嵌', '嵘', '嵩', '嵬', '嵯', '嶂', '嶓', '嶙', '嶲', '嶶', '嶷', '巂', '巅', '巉',
    '巍', '川', '州', '巡', '巢', '工', '左', '巧', '巨', '巩', '巫', '差', '己', '已', '巳', '巴', '巷', '巽', '巾', '巿',
    '币', '市', '布', '帅', '帆', '帇', '师', '希', '帏', '帐', '帑', '帔', '帕', '帖', '帘', '帚', '帛', '帜', '帝', '带',
    '帧', '帨', '席', '帮', '帷', '常', '帼', '帽', '幂', '幄', '幅', '幌', '幔', '幕', '幛', '幞', '幡', '幢', '幤', '干',
    '平', '年', '并', '幸', '幺', '幻', '幼', '幽', '广', '庄', '庆', '庇', '床', '序', '庐', '庑', '库', '应', '底', '庖',
    '店', '庙', '庚', '府', '庞', '废', '庠', '庥', '度', '座', '庭', '庳', '庵', '庶', '康', '庸', '庾', '廉', '廊', '廓',
    '廖', '廛', '廨', '廪', '延', '廷', '建', '廿', '开', '弁', '异', '弃', '弄', '弈', '弊', '弋', '式', '弑', '弒', '弓',
    '引', '弗', '弘', '弛', '弟', '张', '弢', '弥', '弦', '弧', '弩', '弭', '弯', '弱', '張', '弹', '强', '弼', '彀', '彊',
    '归', '当', '录', '彗', '彘', '彝', '形', '彤', '彦', '彩', '彪', '彬', '彭', '彰', '影', '彷', '役', '彻', '彼', '往',
    '征', '徂', '径', '待', '徇', '很', '徉', '徊', '律', '後', '徐', '徒', '徕', '得', '徘', '徙', '徜', '御', '徨', '循',
    '徭', '微', '徳', '徵', '德', '徼', '徽', '心', '必', '忆', '忌', '忍', '忏', '忐', '忑', '忒', '忖', '志', '忘', '忙',
    '忝', '忠', '忡', '忤', '忧', '忪', '快', '忱', '念', '忻', '忽', '忿', '怀', '态', '怂', '怅', '怆', '怍', '怎', '怏',
    '怒', '怔', '怕', '怖', '怙', '怛', '怜', '思', '怠', '怡', '急', '怦', '性', '怨', '怪', '怫', '怯', '怵', '总', '怼',
    '怿', '恂', '恃', '恋', '恍', '恐', '恒', '恕', '恙', '恚', '恝', '恢', '恣', '恤', '恨', '恩', '恪', '恫', '恬', '恭',
    '息', '恰', '恳', '恶', '恸', '恹', '恺', '恻', '恼', '恽', '恿', '悄', '悉', '悌', '悍', '悒', '悔', '悖', '悚', '悝',
    '悞', '悟', '悠', '患', '悦', '您', '悫', '悬', '悭', '悯', '悲', '悴', '悸', '悻', '悼', '情', '惆', '惇', '惊', '惋',
    '惑', '惕', '惘', '惚', '惜', '惟', '惠', '惦', '惧', '惨', '惩', '惫', '惬', '惭', '惮', '惯', '惰', '想', '惴', '惶',
    '惹', '惺', '愀', '愁', '愆', '愈', '愉', '愍', '愎', '意', '愕', '愚', '愛', '感', '愠', '愣', '愤', '愦', '愧', '愫',
    '愬', '愿', '慈', '慌', '慎', '慑', '慕', '慙', '慝', '慢', '慧', '慨', '慰', '慵', '慷', '憋', '憎', '憔', '憧', '憨',
    '憩', '憬', '憾', '懂', '懈', '懊', '懋', '懑', '懒', '懜', '懦', '懵', '懿', '戆', '戈', '戊', '戌', '戍', '戎', '戏',
    '成', '我', '戒', '戕', '或', '戗', '战', '戚', '戛', '戟', '戢', '截', '戮', '戳', '戴', '户', '戾', '房', '所', '扁',
    '扃', '扇', '扈', '扉', '手', '扌', '才', '扎', '扑', '扒', '打', '扔', '托', '扛', '扞', '扢', '扣', '执', '扩', '扪',
    '扫', '扬', '扭', '扮', '扯', '扰', '扳', '扶', '批', '扼', '找', '承', '技', '抄', '抉', '把', '抑', '抒', '抓', '投',
    '抖', '抗', '折', '抚', '抛', '抟', '抠', '抡', '抢', '护', '报', '抨', '披', '抬', '抱', '抵', '抹', '押', '抽', '抿',
    '拂', '拄', '担', '拆', '拇', '拈', '拉', '拊', '拌', '拍', '拎', '拐', '拒', '拓', '拔', '拖', '拗', '拘', '拙', '拚',
    '招', '拜', '拟', '拢', '拣', '拥', '拦', '拧', '拨', '择', '括', '拭', '拮', '拯', '拱', '拳', '拴', '拷', '拼', '拽',
    '拾', '拿', '持', '挂', '指', '挈', '按', '挎', '挑', '挖', '挚', '挛', '挝', '挞', '挟', '挠', '挡', '挣', '挤', '挥',
    '挨', '挪', '挫', '振', '挹', '挺', '挽', '捂', '捅', '捆', '捉', '捋', '捍', '捎', '捏', '捐', '捕', '捞', '损', '捡',
    '换', '捣', '捧', '捭', '据', '捱', '捶', '捷', '捺', '捻', '捽', '掀', '掂', '掇', '授', '掉', '掌', '掏', '掐', '排',
    '掖', '掘', '掠', '探', '掣', '接', '控', '推', '掩', '措', '掬', '掰', '掳', '掷', '掺', '掼', '掾', '揄', '揆', '揉',
    '揍', '描', '提', '插', '揖', '揜', '握', '揣', '揩', '揪', '揭', '援', '揶', '揽', '搀', '搁', '搂', '搅', '搏', '搐',
    '搒', '搓', '搔', '搜', '搞', '搠', '搢', '搤', '搪', '搬', '搭', '搴', '携', '搽', '摁', '摄', '摆', '摇', '摈', '摊',
    '摒', '摔', '摘', '摞', '摧', '摩', '摸', '摹', '撂', '撇', '撑', '撒', '撕', '撝', '撞', '撤', '撩', '撬', '播', '撮',
    '撰', '撵', '撷', '撺', '撼', '擂', '擅', '操', '擎', '擒', '擘', '擞', '擢', '擦', '攀', '攒', '攘', '攥', '攫', '支',
    '收', '攸', '改', '攻', '放', '政', '故', '效', '敌', '敏', '救', '敕', '敖', '教', '敛', '敝', '敞', '敢', '散', '敦',
    '敬', '数', '敲', '整', '敷', '斄', '文', '斋', '斌', '斐', '斑', '斓', '斗', '料', '斛', '斜', '斟', '斡', '斤', '斥',
    '斧', '斩', '斫', '断', '斯', '新', '斲', '方', '於', '施', '旁', '旃', '旄', '旅', '旋', '旌', '旎', '族', '旒', '旖',
    '旗', '旘', '无', '既', '日', '旦', '旧', '旨', '早', '旬', '旭', '旱', '旳', '时', '旷', '旺', '旻', '昀', '昂', '昃',
    '昆', '昇', '昊', '昌', '明', '昏', '易', '昔', '昕', '昙', '星', '映', '春', '昧', '昨', '昭', '是', '昱', '昴', '昵',
    '昼', '显', '晁', '晃', '晋', '晌', '晏', '晒', '晓', '晔', '晕', '晖', '晗', '晚', '晞', '晟', '晡', '晤', '晦', '晨',
    '普', '景', '晰', '晴', '晶', '智', '晾', '暂', '暄', '暇', '暑', '暖', '暗', '暧', '暨', '暮', '暲', '暴', '暹', '暾',
    '曙', '曛', '曜', '曝', '曦', '曩', '曪', '曰', '曲', '曳', '更', '曷', '書', '曹', '曼', '曾', '替', '最', '月', '有',
    '朋', '服', '朐', '朔', '朕', '朗', '望', '朝', '期', '朦', '木', '未', '末', '本', '札', '术', '朱', '朴', '朵', '机',
    '朽', '杀', '杂', '权', '杅', '杆', '杉', '杌', '李', '杏', '材', '村', '杓', '杖', '杜', '杞', '束', '杠', '条', '来',
    '杨', '杪', '杭', '杯', '杰', '杲', '杳', '杵', '杷', '杼', '松', '板', '极', '构', '枇', '枉', '枋', '析', '枕', '林',
    '枚', '果', '枝', '枞', '枢', '枣', '枥', '枪', '枫', '枭', '枯', '枰', '枳', '枵', '架', '枷', '枸', '柄', '柈', '柏',
    '某', '柑', '染', '柔', '柘', '柚', '柜', '柞', '柠', '柢', '查', '柩', '柬', '柯', '柰', '柱', '柳', '柴', '柿', '栀',
    '栅', '标', '栈', '栉', '栋', '栎', '栏', '树', '栓', '栖', '栗', '校', '栩', '株', '样', '核', '根', '格', '栽', '栾',
    '桀', '桂', '桃', '桅', '框', '案', '桌', '桎', '桐', '桑', '桓', '桔', '桞', '桠', '桡', '桢', '档', '桥', '桦', '桧',
    '桨', '桩', '桶', '梁', '梃', '梅', '梆', '梏', '梓', '梗', '梢', '梦', '梧', '梨', '梭', '梯', '械', '梳', '梵', '检',
    '棂', '棉', '棋', '棍', '棒', '棓', '棕', '棘', '棚', '棠', '棣', '森', '棰', '棱', '棵', '棹', '棺', '椀', '椁', '椅',
    '植', '椎', '椐', '椒', '椟', '椭', '椰', '椹', '椽', '椿', '楂', '楔', '楗', '楚', '楞', '楠', '楣', '楫', '楮', '楯',
    '楷', '楸', '楹', '楼', '概', '榄', '榆', '榇', '榈', '榔', '榕', '榛', '榜', '榧', '榨', '榫', '榭', '榱', '榴', '榷',
    '榻', '榼', '槁', '槃', '槊', '槌', '槐', '槛', '槟', '槽', '槿', '樊', '樗', '樟', '模', '横', '樭', '樯', '樱', '樵',
    '樽', '樾', '橄', '橇', '橐', '橘', '橙', '橡', '橪', '橱', '橹', '檀', '檄', '檇', '檐', '檠', '檬', '欃', '欠', '次',
    '欢', '欣', '欤', '欧', '欲', '欷', '欺', '欻', '款', '歃', '歆', '歇', '歉', '歌', '歔', '歘', '歙', '止', '正', '此',
    '步', '武', '歧', '歪', '歹', '死', '歼', '殁', '殂', '殃', '殄', '殆', '殇', '殉', '殊', '残', '殒', '殓', '殖', '殚',
    '殛', '殡', '殪', '殴', '段', '殷', '殽', '殿', '毁', '毂', '毅', '毋', '母', '每', '毐', '毒', '毓', '比', '毕', '毗',
    '毙', '毛', '毡', '毫', '毯', '毶', '氅', '氆', '氇', '氏', '氐', '民', '氓', '气', '氖', '氛', '氟', '氡', '氢', '氤',
    '氦', '氧', '氨', '氩', '氮', '氯', '氰', '氲', '水', '永', '汀', '汁', '求', '汇', '汉', '汐', '汕', '汗', '汛', '汜',
    '汝', '汞', '江', '池', '污', '汤', '汧', '汨', '汩', '汪', '汭', '汰', '汲', '汴', '汶', '汹', '汽', '汾', '沁', '沂',
    '沃', '沅', '沇', '沈', '沉', '沌', '沐', '沓', '沔', '沕', '沙', '沛', '沟', '没', '沣', '沥', '沦', '沧', '沪', '沫',
    '沬', '沮', '沱', '河', '沸', '油', '治', '沼', '沽', '沾', '沿', '泄', '泅', '泉', '泊', '泌', '泓', '法', '泗', '泛',
    '泞', '泠', '泡', '波', '泣', '泥', '注', '泪', '泫', '泮', '泯', '泰', '泱', '泳', '泵', '泷', '泸', '泻', '泼', '泽',
    '泾', '洁', '洋', '洒', '洗', '洙', '洛', '洞', '洟', '津', '洪', '洫', '洮', '洱', '洲', '洹', '洺', '活', '洼', '洽',
    '派', '流', '浃', '浅', '浆', '浇', '浊', '测', '浍', '济', '浏', '浐', '浑', '浒', '浓', '浔', '浙', '浚', '浜', '浞',
    '浣', '浦', '浩', '浪', '浮', '浴', '海', '浸', '浼', '浿', '涂', '涅', '消', '涉', '涌', '涎', '涒', '涓', '涔', '涕',
    '涛', '涝', '涟', '涡', '涣', '涤', '润', '涧', '涨', '涩', '涪', '涮', '涯', '液', '涵', '涸', '涿', '淀', '淄', '淅',
    '淆', '淇', '淋', '淌', '淑', '淖', '淘', '淙', '淞', '淡', '淤', '淫', '淬', '淮', '深', '淳', '混', '淹', '添', '淼',
    '清', '渊', '渍', '渎', '渐', '渑', '渔', '渖', '渗', '渚', '渝', '渠', '渡', '渣', '渤', '渥', '温', '渭', '港', '渲',
    '渴', '游', '渺', '湃', '湄', '湍', '湎', '湖', '湘', '湛', '湟', '湫', '湮', '湾', '湿', '溃', '溅', '溉', '溊', '溍',
    '源', '溜', '溟', '溢', '溥', '溧', '溪', '溯', '溲', '溴', '溶', '溷', '溺', '滁', '滂', '滇', '滈', '滋', '滑', '滓',
    '滔', '滕', '滚', '滞', '满', '滤', '滥', '滦', '滨', '滩', '滴', '漂', '漆', '漉', '漏', '漓', '演', '漕', '漠', '漦',
    '漩', '漪', '漫', '漯', '漱', '漳', '漾', '潇', '潍', '潏', '潘', '潜', '潞', '潢', '潦', '潭', '潮', '潴', '潸', '潺',
    '潼', '澄', '澈', '澍', '澎', '澙', '澜', '澝', '澡', '澧', '澳', '澹', '激', '濂', '濑', '濒', '濞', '濠', '濡', '濩',
    '濮', '濯', '瀑', '瀚', '瀛', '瀹', '灊', '灌', '灞', '火', '灭', '灯', '灰', '灵', '灶', '灸', '灼', '灾', '灿', '炀',
    '炉', '炊', '炎', '炒', '炔', '炕', '炖', '炙', '炜', '炟', '炫', '炬', '炭', '炮', '炯', '炳', '炷', '炸', '点', '炼',
    '炽', '烁', '烂', '烈', '烘', '烙', '烛', '烜', '烝', '烟', '烤', '烦', '烧', '烨', '烩', '烫', '烬', '热', '烯', '烷',
    '烹', '烽', '焉', '焊', '焒', '焕', '焖', '焘', '焙', '焚', '焜', '焦', '焯', '焰', '焱', '然', '焻', '煅', '煊', '煌',
    '煎', '煜', '煞', '煤', '煦', '照', '煨', '煮', '煲', '煽', '熄', '熊', '熏', '熔', '熙', '熛', '熟', '熠', '熨', '熬',
    '熹', '燃', '燎', '燔', '燕', '燠', '燥', '燧', '燮', '燹', '爆', '爇', '爨', '爪', '爬', '爰', '爱', '爲', '爵', '父',
    '爷', '爸', '爹', '爻', '爽', '牂', '片', '版', '牌', '牍', '牒', '牖', '牙', '牛', '牝', '牟', '牡', '牢', '牦', '牧',
    '物', '牯', '牲', '牵', '特', '牺', '犀', '犁', '犊', '犍', '犒', '犨', '犬', '犯', '犴', '状', '犷', '犹', '狁', '狂',
    '狃', '狄', '狈', '狎', '狐', '狒', '狗', '狙', '狝', '狞', '狠', '狡', '狩', '独', '狭', '狮', '狰', '狱', '狲', '狸',
    '狻', '狼', '猃', '猊', '猎', '猕', '猖', '猗', '猛', '猜', '猝', '猢', '猥', '猩', '猪', '猫', '猬', '献', '猱', '猴',
    '猷', '猾', '猿', '獐', '獗', '獘', '獠', '獬', '獭', '獾', '玃', '玄', '率', '玉', '玊', '王', '玑', '玕', '玛', '玦',
    '玩', '玫', '玮', '环', '现', '玲', '玳', '玷', '玺', '玻', '珀', '珂', '珅', '珈', '珊', '珍', '珏', '珐', '珑', '珞',
    '珠', '珥', '珩', '珪', '班', '珮', '珰', '球', '琅', '理', '琉', '琏', '琐', '琖', '琛', '琢', '琥', '琦', '琨', '琪',
    '琮', '琰', '琳', '琴', '琵', '琶', '琼', '瑁', '瑕', '瑙', '瑚', '瑛', '瑜', '瑞', '瑟', '瑰', '瑶', '瑾', '璀', '璃',
    '璆', '璇', '璋', '璐', '璜', '璞', '璟', '璧', '璨', '瓒', '瓜', '瓠', '瓢', '瓣', '瓦', '瓮', '瓯', '瓴', '瓶', '瓷',
    '瓻', '甄', '甑', '甘', '甙', '甚', '甜', '生', '産', '甥', '用', '甩', '甫', '甬', '甭', '田', '由', '甲', '申', '电',
    '男', '甸', '町', '画', '甾', '畀', '畅', '界', '畎', '畏', '畑', '畔', '留', '畜', '畤', '略', '畦', '番', '畲', '畴',
    '畸', '畼', '畿', '疃', '疆', '疋', '疏', '疑', '疗', '疙', '疚', '疝', '疟', '疡', '疣', '疤', '疥', '疫', '疮', '疯',
    '疱', '疲', '疴', '疵', '疸', '疹', '疼', '疽', '疾', '痂', '病', '症', '痈', '痉', '痊', '痍', '痒', '痔', '痕', '痘',
    '痛', '痞', '痢', '痣', '痤', '痧', '痪', '痫', '痰', '痴', '痹', '痼', '痿', '瘀', '瘁', '瘐', '瘗', '瘘', '瘙', '瘟',
    '瘠', '瘢', '瘤', '瘥', '瘦', '瘩', '瘪', '瘫', '瘳', '瘴', '瘵', '瘸', '瘾', '癀', '癌', '癔', '癖', '癜', '癞', '癣',
    '癫', '癸', '登', '白', '百', '皁', '皂', '的', '皆', '皇', '皈', '皋', '皎', '皑', '皓', '皖', '皙', '皤', '皮', '皱',
    '皴', '皿', '盂', '盅', '盆', '盈', '益', '盍', '盎', '盏', '盐', '监', '盒', '盔', '盖', '盗', '盘', '盛', '盟', '盥',
    '目', '盯', '盱', '盲', '直', '相', '盹', '盼', '盾', '省', '眇', '眈', '眉', '看', '眙', '眛', '真', '眠', '眢', '眦',
    '眨', '眩', '眯', '眶', '眷', '眸', '眺', '眼', '着', '睁', '睇', '睐', '睑', '睒', '睚', '睛', '睡', '睢', '督', '睦',
    '睨', '睪', '睫', '睬', '睹', '睽', '睾', '睿', '瞀', '瞄', '瞅', '瞋', '瞌', '瞎', '瞑', '瞒', '瞟', '瞠', '瞥', '瞧',
    '瞩', '瞪', '瞬', '瞭', '瞰', '瞳', '瞻', '瞽', '瞾', '瞿', '矗', '矛', '矜', '矢', '矣', '知', '矩', '矫', '短', '矮',
    '石', '矶', '矽', '矾', '矿', '砀', '码', '砂', '砌', '砍', '砒', '研', '砖', '砚', '砝', '砣', '砥', '砧', '砭', '砰',
    '破', '砷', '砸', '砺', '砾', '础', '硅', '硒', '硕', '硝', '硫', '硬', '确', '硼', '碁', '碉', '碌', '碍', '碎', '碑',
    '碓', '碗', '碘', '碛', '碟', '碣', '碧', '碰', '碱', '碳', '碴', '碾', '磁', '磅', '磊', '磋', '磐', '磔', '磕', '磛',
    '磨', '磬', '磷', '磺', '礁', '礴', '礶', '示', '礻', '礼', '社', '祀', '祁', '祇', '祈', '祉', '祊', '祎', '祐', '祓',
    '祖', '祗', '祚', '祛', '祜', '祝', '神', '祟', '祠', '祥', '祧', '票', '祭', '祯', '祷', '祸', '祺', '禀', '禁', '禄',
    '禅', '福', '禧', '禨', '禳', '禹', '禺', '离', '禽', '禾', '秀', '私', '秃', '秉', '秋', '种', '秏', '科', '秒', '秘',
    '租', '秤', '秦', '秧', '秩', '积', '称', '秸', '移', '秽', '稀', '程', '稍', '税', '稔', '稗', '稚', '稞', '稠', '稣',
    '稳', '稷', '稻', '稼', '稽', '稿', '穆', '穑', '穗', '穰', '穴', '究', '穷', '穹', '空', '穿', '突', '窃', '窄', '窈',
    '窋', '窍', '窎', '窑', '窒', '窕', '窖', '窗', '窘', '窜', '窝', '窟', '窠', '窣', '窥', '窦', '窬', '窭', '窳', '窴',
    '窿', '立', '竖', '站', '竞', '竟', '章', '竣', '童', '竭', '端', '竹', '竺', '竽', '竿', '笃', '笄', '笆', '笈', '笋',
    '笑', '笔', '笙', '笛', '笞', '笠', '笤', '笥', '符', '笨', '笫', '第', '笮', '笺', '笼', '等', '筋', '筏', '筐', '筑',
    '筒', '答', '策', '筛', '筝', '筠', '筮', '筰', '筱', '筴', '筵', '筷', '筹', '签', '简', '箍', '箔', '箕', '算', '管',
    '箦', '箧', '箩', '箫', '箭', '箱', '箴', '箸', '篁', '篃', '篆', '篇', '篑', '篓', '篙', '篝', '篡', '篮', '篱', '篷',
    '篾', '簇', '簋', '簌', '簏', '簧', '簪', '簸', '簿', '籁', '籍', '米', '类', '籽', '粉', '粑', '粒', '粕', '粗', '粘',
    '粜', '粝', '粟', '粤', '粥', '粪', '粮', '粱', '粲', '粳', '粹', '粼', '粽', '精', '糁', '糅', '糊', '糌', '糍', '糕',
    '糖', '糗', '糙', '糜', '糟', '糠', '糯', '系', '紊', '素', '索', '紧', '紫', '紬', '累', '絜', '絮', '絷', '綦', '緃',
    '縠', '縢', '縯', '縻', '繁', '繇', '繻', '纂', '纔', '纠', '纡', '红', '纣', '纤', '纥', '约', '级', '纨', '纪', '纫',
    '纬', '纭', '纮', '纯', '纰', '纱', '纲', '纳', '纵', '纶', '纷', '纸', '纹', '纺', '纻', '纽', '纾', '线', '绀', '绁',
    '练', '组', '绅', '细', '织', '终', '绊', '绌', '绍', '绎', '经', '绐', '绑', '绒', '结', '绔', '绕', '绖', '绘', '给',
    '绚', '绛', '络', '绝', '绞', '统', '绠', '绡', '绢', '绣', '绥', '绦', '继', '绨', '绩', '绪', '绫', '续', '绮', '绯',
    '绰', '绳', '维', '绵', '绶', '绷', '绸', '绺', '绻', '综', '绽', '绾', '绿', '缀', '缁', '缄', '缅', '缆', '缇', '缈',
    '缉', '缎', '缑', '缒', '缓', '缔', '缕', '编', '缗', '缘', '缙', '缚', '缜', '缝', '缞', '缟', '缠', '缢', '缤', '缥',
    '缧', '缨', '缩', '缪', '缭', '缮', '缯', '缰', '缱', '缳', '缴', '缵', '缶', '缸', '缺', '罂', '罃', '罄', '罅', '罐',
    '网', '罔', '罕', '罗', '罘', '罚', '罡', '罢', '罥', '罩', '罪', '置', '署', '罴', '罹', '羁', '羊', '羌', '美', '羑',
    '羔', '羖', '羚', '羞', '羟', '羡', '群', '羯', '羲', '羸', '羹', '羽', '羿', '翁', '翅', '翊', '翌', '翎', '翔', '翕',
    '翘', '翟', '翠', '翡', '翦', '翩', '翮', '翰', '翱', '翳', '翻', '翼', '耀', '老', '考', '耄', '者', '耆', '耋', '而',
    '耍', '耎', '耐', '耕', '耗', '耘', '耙', '耜', '耦', '耨', '耳', '耶', '耸', '耻', '耽', '耿', '聂', '聆', '聊', '聋',
    '职', '聒', '联', '聘', '聚', '聩', '聪', '肃', '肄', '肆', '肇', '肉', '肋', '肌', '肓', '肖', '肘', '肚', '肛', '肝',
    '肠', '股', '肢', '肣', '肤', '肥', '肩', '肪', '肮', '肯', '肱', '育', '肴', '肸', '肺', '肽', '肾', '肿', '胀', '胁',
    '胃', '胄', '胆', '背', '胎', '胖', '胙', '胚', '胜', '胝', '胞', '胡', '胤', '胥', '胧', '胪', '胫', '胭', '胯', '胰',
    '胱', '胳', '胶', '胸', '胺', '能', '胾', '脁', '脂', '脆', '脉', '脊', '脍', '脏', '脐', '脑', '脓', '脔', '脖', '脚',
    '脯', '脱', '脲', '脸', '脾', '腆', '腈', '腉', '腊', '腋', '腌', '腐', '腑', '腓', '腔', '腕', '腥', '腩', '腭', '腮',
    '腰', '腱', '腴', '腹', '腺', '腻', '腼', '腾', '腿', '膀', '膈', '膊', '膏', '膑', '膘', '膛', '膜', '膝', '膦', '膨',
    '膳', '膺', '膻', '臀', '臂', '臃', '臆', '臊', '臛', '臣', '臧', '自', '臬', '臭', '臱', '至', '致', '臻', '臼', '臾',
    '舀', '舁', '舂', '舄', '舅', '舆', '舌', '舍', '舐', '舒', '舔', '舛', '舜', '舞', '舟', '舡', '航', '舫', '般', '舰',
    '舱', '舵', '舶', '舷', '船', '艇', '艘', '艮', '良', '艰', '色', '艳', '艺', '艾', '节', '芈', '芋', '芍', '芎', '芒',
    '芘', '芙', '芜', '芝', '芡', '芥', '芦', '芪', '芫', '芬', '芭', '芮', '芯', '花', '芳', '芷', '芸', '芹', '芽', '苄',
    '苇', '苋', '苌', '苍', '苎', '苏', '苑', '苒', '苓', '苔', '苕', '苗', '苛', '苞', '苟', '苡', '苣', '若', '苦', '苫',
    '苯', '英', '苴', '苷', '苹', '苻', '茀', '茁', '茂', '范', '茄', '茅', '茆', '茉', '茎', '茏', '茔', '茕', '茗', '茜',
    '茧', '茨', '茫', '茬', '茭', '茯', '茱', '茴', '茵', '茶', '茸', '茹', '荀', '荃', '荆', '草', '荏', '荐', '荒', '荔',
    '荚', '荜', '荞', '荟', '荠', '荡', '荣', '荤', '荥', '荦', '荧', '荪', '荫', '药', '荷', '荻', '荼', '莅', '莆', '莉',
    '莎', '莒', '莓', '莘', '莜', '莞', '莠', '莨', '莩', '莫', '莱', '莲', '莴', '获', '莹', '莺', '莽', '菁', '菅', '菇',
    '菊', '菌', '菏', '菑', '菜', '菟', '菠', '菡', '菩', '菱', '菲', '菽', '萃', '萄', '萌', '萍', '萎', '萝', '萤', '营',
    '萦', '萧', '萨', '萸', '落', '葆', '著', '葛', '葡', '董', '葩', '葫', '葬', '葭', '葱', '葳', '葴', '葵', '葺', '蒂',
    '蒉', '蒋', '蒍', '蒗', '蒙', '蒜', '蒯', '蒲', '蒸', '蒺', '蒽', '蒿', '蓄', '蓉', '蓍', '蓐', '蓓', '蓖', '蓝', '蓟',
    '蓦', '蓬', '蓺', '蓼', '蓿', '蔑', '蔓', '蔗', '蔚', '蔟', '蔡', '蔫', '蔬', '蔷', '蔺', '蔼', '蔽', '蕃', '蕉', '蕊',
    '蕙', '蕤', '蕨', '蕲', '蕴', '蕾', '薄', '薇', '薏', '薛', '薜', '薤', '薨', '薪', '薮', '薯', '薰', '藁', '藉', '藏',
    '藐', '藓', '藕', '藜', '藤', '藩', '藻', '藿', '蘑', '蘧', '蘸', '虎', '虏', '虐', '虑', '虔', '虚', '虞', '虢', '虫',
    '虬', '虮', '虱', '虹', '虺', '虽', '虾', '蚀', '蚁', '蚂', '蚊', '蚌', '蚓', '蚕', '蚝', '蚡', '蚣', '蚤', '蚩', '蚯',
    '蚰', '蛀', '蛆', '蛇', '蛊', '蛋', '蛎', '蛐', '蛔', '蛙', '蛛', '蛟', '蛤', '蛩', '蛭', '蛮', '蛰', '蛲', '蛹', '蛾',
    '蜀', '蜂', '蜃', '蜇', '蜈', '蜍', '蜒', '蜓', '蜔', '蜕', '蜗', '蜘', '蜚', '蜜', '蜡', '蜥', '蜴', '蜷', '蜻', '蜿',
    '蝄', '蝇', '蝉', '蝎', '蝗', '蝙', '蝠', '蝮', '蝴', '蝶', '蝼', '螂', '螃', '融', '螨', '螫', '螭', '螳', '螺', '螾',
    '蟆', '蟋', '蟒', '蟜', '蟠', '蟭', '蟹', '蟾', '蠕', '蠡', '蠢', '蠹', '血', '衅', '行', '衍', '衔', '街', '衙', '衡',
    '衢', '衣', '补', '表', '衩', '衫', '衬', '衮', '衰', '衲', '衷', '衽', '衾', '衿', '袁', '袂', '袄', '袅', '袈', '袋',
    '袍', '袒', '袖', '袜', '袤', '被', '袭', '袱', '袴', '裀', '裁', '裂', '装', '裆', '裔', '裕', '裘', '裙', '裟', '裤',
    '裨', '裰', '裱', '裳', '裴', '裸', '裹', '裾', '褂', '褊', '褐', '褒', '褓', '褚', '褛', '褥', '褪', '褫', '褴', '褶',
    '襁', '襄', '襆', '襜', '襟', '襦', '西', '要', '覃', '覆', '见', '观', '规', '觅', '视', '觇', '览', '觉', '觊', '觌',
    '觎', '觐', '觑', '角', '觖', '觚', '觜', '觞', '解', '觥', '触', '觳', '觽', '言', '訇', '訾', '詈', '詹', '誉', '誓',
    '譄', '警', '譬', '讙', '计', '订', '讣', '认', '讥', '讦', '讧', '讨', '让', '讪', '讫', '训', '议', '讯', '记', '讲',
    '讳', '讴', '讵', '讶', '讷', '许', '讹', '论', '讼', '讽', '设', '访', '诀', '证', '诂', '诃', '评', '诅', '识', '诈',
    '诉', '诊', '诋', '词', '诎', '诏', '译', '诒', '试', '诗', '诘', '诙', '诚', '诛', '话', '诞', '诟', '诠', '诡', '询',
    '诣', '诤', '该', '详', '诧', '诨', '诩', '诫', '诬', '语', '诮', '误', '诰', '诱', '诲', '诳', '说', '诵', '请', '诸',
    '诺', '读', '诽', '课', '诿', '谀', '谁', '调', '谄', '谅', '谆', '谇', '谈', '谊', '谋', '谍', '谎', '谏', '谐', '谑',
    '谒', '谓', '谔', '谕', '谗', '谙', '谚', '谛', '谜', '谟', '谢', '谣', '谤', '谥', '谦', '谧', '谨', '谩', '谪', '谬',
    '谭', '谮', '谯', '谱', '谲', '谳', '谴', '谶', '谷', '谸', '豁', '豆', '豉', '豌', '豕', '豚', '象', '豢', '豨', '豪',
    '豫', '豭', '豳', '豸', '豹', '豺', '貂', '貉', '貊', '貋', '貌', '貔', '贇', '贝', '贞', '负', '贡', '财', '责', '贤',
    '败', '账', '货', '质', '贩', '贪', '贫', '贬', '购', '贮', '贯', '贰', '贱', '贲', '贳', '贴', '贵', '贷', '贸', '费',
    '贺', '贻', '贼', '贽', '贾', '贿', '赀', '赁', '赂', '赃', '资', '赅', '赇', '赈', '赉', '赊', '赋', '赌', '赍', '赎',
    '赏', '赐', '赔', '赖', '赘', '赚', '赛', '赜', '赝', '赞', '赟', '赠', '赡', '赢', '赣', '赤', '赦', '赧', '赪', '赫',
    '赭', '走', '赳', '赴', '赵', '赶', '起', '趁', '趄', '超', '越', '趋', '趟', '趣', '趱', '足', '趴', '趵', '趸', '趹',
    '趺', '趾', '跂', '跃', '跄', '跆', '跋', '跌', '跑', '跖', '跚', '跛', '距', '跟', '跣', '跤', '跨', '跪', '跬', '路',
    '跳', '践', '跷', '跸', '跹', '跺', '跻', '跽', '踉', '踊', '踌', '踏', '踔', '踝', '踞', '踟', '踢', '踣', '踧', '踩',
    '踪', '踯', '踰', '踱', '踵', '踹', '踽', '蹀', '蹂', '蹄', '蹇', '蹈', '蹉', '蹊', '蹋', '蹑', '蹒', '蹙', '蹦', '蹩',
    '蹬', '蹭', '蹰', '蹲', '蹴', '蹶', '蹻', '蹿', '躁', '躅', '躇', '躏', '躞', '身', '躬', '躯', '躲', '躺', '轘', '车',
    '轧', '轨', '轩', '轫', '转', '轮', '软', '轰', '轲', '轴', '轵', '轶', '轸', '轺', '轻', '轼', '载', '轿', '辂', '较',
    '辄', '辅', '辆', '辇', '辈', '辉', '辍', '辎', '辐', '辑', '输', '辔', '辕', '辖', '辗', '辘', '辙', '辛', '辜', '辞',
    '辟', '辣', '辨', '辩', '辫', '辰', '辱', '边', '辽', '达', '迁', '迂', '迄', '迅', '过', '迈', '迎', '运', '近', '迓',
    '返', '迕', '还', '这', '进', '远', '违', '连', '迟', '迢', '迤', '迥', '迦', '迨', '迩', '迪', '迫', '迭', '述', '迷',
    '迸', '迹', '追', '退', '送', '适', '逃', '逅', '逆', '选', '逊', '逋', '逍', '透', '逐', '逑', '递', '途', '逖', '逗',
    '通', '逛', '逝', '逞', '速', '造', '逡', '逢', '逦', '逮', '逵', '逶', '逸', '逻', '逼', '逾', '遁', '遂', '遇', '遍',
    '遏', '遐', '遑', '遒', '道', '遗', '遘', '遛', '遢', '遣', '遥', '遨', '遫', '遭', '遮', '遴', '遵', '遶', '遹', '遽',
    '避', '邀', '邂', '邃', '邈', '邋', '邑', '邓', '邕', '邘', '邛', '邠', '邢', '那', '邦', '邪', '邬', '邮', '邯', '邰',
    '邱', '邳', '邴', '邵', '邸', '邹', '邺', '邻', '邽', '邾', '郁', '郄', '郅', '郇', '郈', '郊', '郎', '郏', '郐', '郑',
    '郓', '郕', '郜', '郝', '郡', '郢', '郦', '郧', '部', '郪', '郫', '郭', '郯', '郴', '郸', '都', '郾', '郿', '鄂', '鄄',
    '鄏', '鄗', '鄙', '鄜', '鄠', '鄢', '鄣', '鄱', '鄳', '酆', '酇', '酉', '酊', '酋', '酌', '配', '酎', '酒', '酗', '酚',
    '酝', '酞', '酡', '酢', '酣', '酤', '酥', '酩', '酪', '酬', '酮', '酯', '酰', '酱', '酵', '酶', '酷', '酸', '酹', '酺',
    '酿', '醇', '醉', '醋', '醍', '醒', '醚', '醛', '醢', '醦', '醪', '醮', '醳', '醴', '醵', '醺', '釂', '采', '釉', '释',
    '里', '重', '野', '量', '釐', '金', '釜', '鈇', '鉏', '鉴', '銮', '鏖', '鐘', '鑙', '鑫', '针', '钉', '钊', '钎', '钏',
    '钒', '钓', '钗', '钙', '钚', '钛', '钜', '钝', '钞', '钟', '钠', '钡', '钢', '钤', '钥', '钦', '钧', '钨', '钩', '钮',
    '钯', '钰', '钱', '钲', '钳', '钴', '钵', '钹', '钺', '钻', '钼', '钾', '钿', '铀', '铁', '铂', '铃', '铄', '铅', '铆',
    '铉', '铎', '铐', '铙', '铚', '铛', '铜', '铝', '铠', '铢', '铣', '铤', '铨', '铩', '铬', '铭', '铮', '铲', '铳', '铵',
    '银', '铸', '铺', '链', '铿', '销', '锁', '锂', '锄', '锅', '锈', '锉', '锋', '锌', '锏', '锐', '锑', '锗', '错', '锚',
    '锡', '锢', '锣', '锤', '锥', '锦', '锭', '键', '锯', '锰', '锱', '锲', '锵', '锷', '锹', '锺', '锻', '锽', '锾', '镀',
    '镁', '镂', '镇', '镉', '镊', '镌', '镍', '镐', '镑', '镒', '镕', '镖', '镛', '镜', '镝', '镞', '镣', '镪', '镬', '镭',
    '镯', '镰', '镳', '镵', '镶', '长', '開', '間', '闇', '闟', '门', '闪', '闫', '闭', '问', '闯', '闰', '闱', '闲', '闳',
    '间', '闵', '闷', '闸', '闹', '闺', '闻', '闼', '闽', '闾', '阀', '阁', '阂', '阃', '阅', '阆', '阈', '阉', '阊', '阍',
    '阎', '阏', '阐', '阑', '阔', '阕', '阖', '阗', '阙', '阚', '阜', '队', '阡', '阪', '阮', '阱', '防', '阳', '阴', '阵',
    '阶', '阻', '阿', '陀', '陂', '附', '际', '陆', '陇', '陈', '陉', '陋', '陌', '降', '限', '陕', '陛', '陟', '陡', '院',
    '除', '陨', '险', '陪', '陬', '陲', '陵', '陶', '陷', '隅', '隆', '隋', '隍', '随', '隐', '隔', '隗', '隘', '隙', '障',
    '隧', '隰', '隳', '隶', '隼', '隽', '难', '雀', '雁', '雄', '雅', '集', '雇', '雉', '雌', '雍', '雎', '雏', '雒', '雕',
    '雠', '雨', '雩', '雪', '雯', '雳', '零', '雷', '雹', '雾', '需', '霁', '霄', '霆', '震', '霉', '霍', '霎', '霓', '霖',
    '霜', '霞', '霣', '霭', '露', '霸', '霹', '霾', '青', '靓', '靖', '静', '靛', '非', '靠', '靡', '面', '靥', '革', '靳',
    '靴', '靶', '鞅', '鞋', '鞍', '鞑', '鞘', '鞚', '鞠', '鞣', '鞫', '鞭', '鞮', '韂', '韦', '韧', '韩', '韪', '韬', '韭',
    '音', '韵', '韶', '頉', '頫', '顒', '页', '顶', '顷', '项', '顺', '须', '顼', '顽', '顾', '顿', '颀', '颁', '颂', '预',
    '颅', '领', '颇', '颈', '颉', '颊', '颌', '颍', '颐', '频', '颓', '颔', '颖', '颗', '题', '颚', '颛', '颜', '额', '颠',
    '颡', '颤', '颦', '颧', '风', '飒', '飓', '飕', '飘', '飙', '飚', '飞', '食', '飧', '飨', '餍', '餐', '餮', '饕', '饟',
    '饥', '饦', '饪', '饬', '饭', '饮', '饯', '饰', '饱', '饲', '饴', '饵', '饶', '饷', '饺', '饼', '饽', '饿', '馀', '馁',
    '馅', '馆', '馈', '馋', '馍', '馎', '馏', '馐', '馒', '馓', '馔', '馕', '首', '香', '馥', '馨', '駆', '駹', '騠', '騳',
    '驩', '马', '驭', '驮', '驯', '驰', '驱', '驳', '驴', '驵', '驶', '驷', '驸', '驹', '驺', '驻', '驼', '驽', '驾', '驿',
    '骀', '骁', '骂', '骃', '骄', '骅', '骆', '骇', '骈', '骊', '骋', '验', '骍', '骏', '骐', '骑', '骖', '骗', '骘', '骚',
    '骛', '骜', '骞', '骠', '骡', '骤', '骥', '骧', '骨', '骰', '骶', '骷', '骸', '骼', '髀', '髃', '髅', '髋', '髑', '髓',
    '高', '髡', '髦', '髫', '髭', '髯', '髻', '鬃', '鬓', '鬟', '鬣', '鬲', '鬻', '鬼', '魁', '魂', '魄', '魅', '魇', '魉',
    '魋', '魍', '魏', '魑', '魔', '魭', '鮼', '鱼', '鱿', '鲁', '鲇', '鲋', '鲍', '鲐', '鲑', '鲔', '鲛', '鲜', '鲠', '鲤',
    '鲧', '鲨', '鲰', '鲲', '鲸', '鳃', '鳄', '鳌', '鳍', '鳏', '鳖', '鳜', '鳝', '鳞', '鴈', '鷪', '鸟', '鸠', '鸡', '鸢',
    '鸣', '鸥', '鸦', '鸨', '鸩', '鸬', '鸭', '鸮', '鸯', '鸱', '鸳', '鸵', '鸷', '鸽', '鸾', '鸿', '鹂', '鹃', '鹄', '鹅',
    '鹆', '鹉', '鹊', '鹏', '鹑', '鹖', '鹗', '鹘', '鹚', '鹜', '鹞', '鹣', '鹤', '鹦', '鹫', '鹭', '鹰', '鹳', '鹿', '麂',
    '麃', '麋', '麒', '麓', '麝', '麟', '麤', '麦', '麻', '麽', '麾', '黄', '黍', '黎', '黏', '黑', '黔', '默', '黙', '黛',
    '黜', '黝', '黟', '黠', '黡', '黥', '黯', '黾', '鼋', '鼍', '鼎', '鼓', '鼠', '鼻', '鼾', '齐', '齮', '齿', '龁', '龂',
    '龄', '龈', '龊', '龋', '龌', '龏', '龙', '龚', '龛', '龟', '偷', '偻', '偿', '傀', '傅', '傈', '傍', '傒'
]

SIMPLE_CATEGORY_MODEL = dict(
    NUMERIC=NUMBER,
    ALPHANUMERIC=NUMBER + ALPHA_LOWER + ALPHA_UPPER,
    ALPHANUMERIC_LOWER=NUMBER + ALPHA_LOWER,
    ALPHANUMERIC_UPPER=NUMBER + ALPHA_UPPER,
    ALPHABET_LOWER=ALPHA_LOWER,
    ALPHABET_UPPER=ALPHA_UPPER,
    ALPHABET=ALPHA_LOWER + ALPHA_UPPER,
    ARITHMETIC=NUMBER + ARITHMETIC,
    FLOAT=NUMBER + FLOAT,
    CHS_3500=CHINESE_3500,
    # Older Version
    ALPHANUMERIC_MIX_CHS_3500_LOWER=NUMBER + ALPHA_LOWER + CHINESE_3500,
    # Current Version
    ALPHANUMERIC_CHS_3500_LOWER=NUMBER + ALPHA_LOWER + CHINESE_3500,
    DOCUMENT_OCR=NUMBER + ALPHA_LOWER + ALPHA_UPPER + DOCUMENT_SYMBOLS + DOCUMENT_CHS
)


def encode_maps(source):
    return {category: i for i, category in enumerate(source, 0)}


@unique
class ModelScene(Enum):
    """模型场景枚举"""
    Classification = 'Classification'


@unique
class ModelField(Enum):
    """模型类别枚举"""
    Image = 'Image'
    Text = 'Text'


@unique
class ModelType(Enum):
    """识别类别枚举"""
    Captcha = 'Image'
    OCR = 'Text'


MODEL_SCENE_MAP = {
    'Classification': ModelScene.Classification
}

MODEL_FIELD_MAP = {
    'Image': ModelField.Image,
    'Text': ModelField.Text
}


class ModelConfig(object):

    @staticmethod
    def category_extract(param):
        if isinstance(param, list):
            return param
        if isinstance(param, str):
            if param in SIMPLE_CATEGORY_MODEL.keys():
                return SIMPLE_CATEGORY_MODEL.get(param)
            raise ValueError(
                "Category set configuration error, customized category set should be list type"
            )

    @property
    def model_conf(self) -> dict:
        if self.model_content:
            return self.model_content
        with open(self.model_conf_path, 'r', encoding="utf-8") as sys_fp:
            sys_stream = sys_fp.read()
            return yaml.load(sys_stream, Loader=yaml.SafeLoader)

    def __init__(self, model_conf_path=None, model_content=None):
        self.model_content = model_content
        self.model_path = model_conf_path
        self.graph_path = os.path.dirname(self.model_path) if model_conf_path else ""
        self.model_conf_path = model_conf_path
        self.model_conf_demo = 'model_demo.yaml'

        """MODEL"""
        self.model_root: dict = self.model_conf['Model']
        self.model_name: str = self.model_root.get('ModelName')
        self.model_version: float = self.model_root.get('Version')
        self.model_version = self.model_version if self.model_version else 1.0
        self.model_field_param: str = self.model_root.get('ModelField')
        self.model_field: ModelField = self.param_convert(
            source=self.model_field_param,
            param_map=MODEL_FIELD_MAP,
            text="Current model field ({model_field}) is not supported".format(model_field=self.model_field_param),
            code=50002
        )

        self.model_scene_param: str = self.model_root.get('ModelScene')

        self.model_scene: ModelScene = self.param_convert(
            source=self.model_scene_param,
            param_map=MODEL_SCENE_MAP,
            text="Current model scene ({model_scene}) is not supported".format(model_scene=self.model_scene_param),
            code=50001
        )

        """SYSTEM"""
        self.checkpoint_tag = 'checkpoint'
        self.system_root: dict = self.model_conf['System']
        self.memory_usage: float = self.system_root.get('MemoryUsage')

        """FIELD PARAM - IMAGE"""
        self.field_root: dict = self.model_conf['FieldParam']
        self.category_param = self.field_root.get('Category')
        self.category_value = self.category_extract(self.category_param)
        if self.category_value is None:
            raise Exception(
                "The category set type does not exist, there is no category set named {}".format(self.category_param),
            )
        self.category: list = SPACE_TOKEN + self.category_value
        self.category_num: int = len(self.category)
        self.image_channel: int = self.field_root.get('ImageChannel')
        self.image_width: int = self.field_root.get('ImageWidth')
        self.image_height: int = self.field_root.get('ImageHeight')
        self.resize: list = self.field_root.get('Resize')
        self.output_split = self.field_root.get('OutputSplit')
        self.output_split = self.output_split if self.output_split else ""
        self.corp_params = self.field_root.get('CorpParams')
        self.output_coord = self.field_root.get('OutputCoord')
        self.batch_model = self.field_root.get('BatchModel')

        """PRETREATMENT"""
        self.pretreatment_root = self.model_conf.get('Pretreatment')
        self.pre_binaryzation = self.get_var(self.pretreatment_root, 'Binaryzation', -1)
        self.pre_replace_transparent = self.get_var(self.pretreatment_root, 'ReplaceTransparent', True)
        self.pre_horizontal_stitching = self.get_var(self.pretreatment_root, 'HorizontalStitching', False)
        self.pre_concat_frames = self.get_var(self.pretreatment_root, 'ConcatFrames', -1)
        self.pre_blend_frames = self.get_var(self.pretreatment_root, 'BlendFrames', -1)
        self.exec_map = self.pretreatment_root.get('ExecuteMap')

        """COMPILE_MODEL"""
        if self.graph_path:
            self.compile_model_path = os.path.join(self.graph_path, '{}.pb'.format(self.model_name))
            if not os.path.exists(self.compile_model_path):
                if not os.path.exists(self.graph_path):
                    os.makedirs(self.graph_path)
                raise ValueError(
                    '{} not found, please put the trained model in the current directory.'.format(
                        self.compile_model_path)
                )
            else:
                self.model_exists = True
        else:
            self.model_exists = True if self.model_content else False
            self.compile_model_path = ""

    @staticmethod
    def param_convert(source, param_map: dict, text, code, default=None):
        if source is None:
            return default
        if source not in param_map.keys():
            raise Exception(text)
        return param_map[source]

    def size_match(self, size_str):
        return size_str == self.size_string

    @staticmethod
    def get_var(src: dict, name: str, default=None):
        if not src:
            return default
        return src.get(name)

    @property
    def size_string(self):
        return "{}x{}".format(self.image_width, self.image_height)


class Model(object):
    model_conf: ModelConfig
    graph_bytes: object

    def __init__(self, conf_path: str, source_bytes: bytes = None, key=None):
        if conf_path:
            self.model_conf = ModelConfig(model_conf_path=conf_path)
            self.graph_bytes = None
        if source_bytes:
            model_conf, self.graph_bytes = self.parse_model(source_bytes, key)
            self.model_conf = ModelConfig(model_content=model_conf)

    @staticmethod
    def parse_model(source_bytes: bytes, key=None):
        split_tag = b'-#||#-'

        if not key:
            key = [b"_____" + i.encode("utf8") + b"_____" for i in "&coriander"]
        if isinstance(key, str):
            key = [b"_____" + i.encode("utf8") + b"_____" for i in key]
        key_len_int = len(key)
        model_bytes_list = []
        graph_bytes_list = []
        slice_index = source_bytes.index(key[0])
        split_tag_len = len(split_tag)
        slice_0 = source_bytes[0: slice_index].split(split_tag)
        model_slice_len = len(slice_0[1])
        graph_slice_len = len(slice_0[0])
        slice_len = split_tag_len + model_slice_len + graph_slice_len

        for i in range(key_len_int - 1):
            slice_index = source_bytes.index(key[i])
            slices = source_bytes[slice_index - slice_len: slice_index].split(split_tag)
            model_bytes_list.append(slices[1])
            graph_bytes_list.append(slices[0])
        slices = source_bytes.split(key[-2])[1][:-len(key[-1])].split(split_tag)

        model_bytes_list.append(slices[1])
        graph_bytes_list.append(slices[0])
        model_bytes = b"".join(model_bytes_list)
        model_conf: dict = pickle.loads(model_bytes)
        graph_bytes: bytes = b"".join(graph_bytes_list)
        return model_conf, graph_bytes


class GraphSession(object):
    def __init__(self, model: Model):
        self.model = model
        self.model_conf = model.model_conf
        self.size_str = self.model_conf.size_string
        self.model_name = self.model_conf.model_name
        self.graph_name = self.model_conf.model_name
        self.version = self.model_conf.model_version
        self.graph = tf.Graph()
        self.sess = tf.compat.v1.Session(
            graph=self.graph,
            config=tf.compat.v1.ConfigProto(

                # allow_soft_placement=True,
                # log_device_placement=True,
                gpu_options=tf.compat.v1.GPUOptions(
                    # allocator_type='BFC',
                    allow_growth=True,  # it will cause fragmentation.
                    # per_process_gpu_memory_fraction=self.model_conf.device_usage
                    per_process_gpu_memory_fraction=0.1
                )
            )
        )
        self.graph_def = self.graph.as_graph_def()
        self.loaded = self.load_model()

    def load_model(self):
        # Here is for debugging, positioning error source use.
        # with self.graph.as_default():
        #     saver = tf.train.import_meta_graph('graph/***.meta')
        #     saver.restore(self.sess, tf.train.latest_checkpoint('graph'))
        if not self.model_conf.model_exists:
            self.destroy()
            return False
        try:
            if self.model.graph_bytes:
                graph_def_file = self.model.graph_bytes
            else:
                with tf.io.gfile.GFile(
                        self.model_conf.compile_model_path, "rb"
                ) as f:
                    graph_def_file = f.read()
            self.graph_def.ParseFromString(graph_def_file)
            with self.graph.as_default():
                self.sess.run(tf.compat.v1.global_variables_initializer())
                _ = tf.import_graph_def(self.graph_def, name="")

            print('MuggleOCR Session [{}] Loaded.'.format(self.model_conf.model_name))
            return True
        except NotFoundError:
            print('The system cannot find the model specified.')
            self.destroy()
            return False

    @property
    def session(self):
        return self.sess

    def destroy(self):
        self.sess.close()
        del self.sess


class Interface(object):

    def __init__(self, graph_session: GraphSession):
        self.graph_sess = graph_session
        self.model_conf = graph_session.model_conf
        self.size_str = self.model_conf.size_string
        self.graph_name = self.graph_sess.graph_name
        self.version = self.graph_sess.version
        self.model_category = self.model_conf.category
        if self.graph_sess.loaded:
            self.sess = self.graph_sess.session
            self.dense_decoded = self.sess.graph.get_tensor_by_name("dense_decoded:0")
            self.x = self.sess.graph.get_tensor_by_name('input:0')
            self.sess.graph.finalize()

    @property
    def name(self):
        return self.graph_name

    @property
    def size(self):
        return self.size_str

    def destroy(self):
        self.graph_sess.destroy()

    def predict_batch(self, image_batch, output_split=None):
        predict_text = self.predict_func(
            image_batch,
            self.sess,
            self.dense_decoded,
            self.x,
            self.model_conf,
            output_split
        )
        return predict_text

    @staticmethod
    def decode_maps(categories):
        return {index: category for index, category in enumerate(categories, 0)}

    def predict_func(self, image_batch, _sess, dense_decoded, op_input, model: ModelConfig, output_split=None):

        if output_split is None:
            output_split = model.output_split

        dense_decoded_code = _sess.run(dense_decoded, feed_dict={
            op_input: image_batch,
        })
        decoded_expression = []
        for item in dense_decoded_code:
            expression = ''

            for i in item:
                if i == -1 or i == model.category_num:
                    expression += ''
                else:
                    expression += self.decode_maps(model.category)[i]
            decoded_expression.append(expression)
        return output_split.join(decoded_expression) if len(decoded_expression) > 1 else decoded_expression[0]


class Pretreatment(object):

    def __init__(self, origin):
        self.origin = origin

    def get(self):
        return self.origin

    def binarization(self, value, modify=False):
        ret, _binarization = cv2.threshold(self.origin, value, 255, cv2.THRESH_BINARY)
        if modify:
            self.origin = _binarization
        return _binarization

    @staticmethod
    def preprocessing(image, binaryzation=-1):
        pretreatment = Pretreatment(image)
        if binaryzation > 0:
            pretreatment.binarization(binaryzation, True)
        return pretreatment.get()

    @staticmethod
    def preprocessing_by_func(exec_map, key, src_arr):
        if not exec_map:
            return src_arr
        target_arr = cv2.cvtColor(src_arr, cv2.COLOR_RGB2BGR)
        for sentence in exec_map.get(key):
            if sentence.startswith("@@"):
                target_arr = eval(sentence[2:])
            elif sentence.startswith("$$"):
                exec(sentence[2:])
        return cv2.cvtColor(target_arr, cv2.COLOR_BGR2RGB)


class ImageUtils(object):

    @staticmethod
    def get_bytes_batch(image_bytes):
        try:
            bytes_batch = [image_bytes]
        except binascii.Error:
            return None, "INVALID_BASE64_STRING"
        what_img = [ImageUtils.test_image(i) for i in bytes_batch]
        if None in what_img:
            return None, "INVALID_IMAGE_FORMAT"
        return bytes_batch, "SUCCESS"

    @staticmethod
    def get_image_batch(model: ModelConfig, bytes_batch, param_key=None):
        # Note that there are two return objects here.
        # 1.image_batch, 2.response

        def load_image(image_bytes):
            data_stream = io.BytesIO(image_bytes)
            pil_image = PIL_Image.open(data_stream)

            if pil_image.mode == 'P':
                pil_image = pil_image.convert('RGB')

            rgb = pil_image.split()
            size = pil_image.size

            gif_handle = model.pre_concat_frames != -1 or model.pre_blend_frames != -1

            if len(rgb) > 3 and model.pre_replace_transparent and not gif_handle:
                background = PIL_Image.new('RGB', pil_image.size, (255, 255, 255))
                background.paste(pil_image, (0, 0, size[0], size[1]), pil_image)
                pil_image = background

            im = np.asarray(pil_image)

            if model.image_channel == 1 and len(im.shape) == 3:
                im = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)

            im = Pretreatment.preprocessing_by_func(
                exec_map=model.exec_map,
                key=param_key,
                src_arr=im
            )

            im = Pretreatment.preprocessing(
                image=im,
                binaryzation=model.pre_binaryzation,
            )

            if model.pre_horizontal_stitching:
                up_slice = im[0: int(size[1] / 2), 0: size[0]]
                down_slice = im[int(size[1] / 2): size[1], 0: size[0]]
                im = np.concatenate((up_slice, down_slice), axis=1)

            image = im.astype(np.float32)
            if model.resize[0] == -1:
                ratio = model.resize[1] / size[1]
                resize_width = int(ratio * size[0])
                image = cv2.resize(image, (resize_width, model.resize[1]))
            else:
                image = cv2.resize(image, (model.resize[0], model.resize[1]))
            image = image.swapaxes(0, 1)
            return (image[:, :, np.newaxis] if model.image_channel == 1 else image[:, :]) / 255.

        try:
            image_batch = [load_image(i) for i in bytes_batch]
            return image_batch, "SUCCESS"
        except OSError:
            return None, "IMAGE_DAMAGE"
        except ValueError as _e:
            print(_e)
            return None, "IMAGE_SIZE_NOT_MATCH_GRAPH"

    @staticmethod
    def size_of_image(image_bytes: bytes):
        _null_size = tuple((-1, -1))
        try:
            data_stream = io.BytesIO(image_bytes)
            size = PIL_Image.open(data_stream).size
            return size
        except OSError:
            return _null_size
        except ValueError:
            return _null_size

    @staticmethod
    def test_image(h):
        """JPEG"""
        if h[:3] == b"\xff\xd8\xff":
            return 'jpeg'
        """PNG"""
        if h[:8] == b"\211PNG\r\n\032\n":
            return 'png'
        """GIF ('87 and '89 variants)"""
        if h[:6] in (b'GIF87a', b'GIF89a'):
            return 'gif'
        """TIFF (can be in Motorola or Intel byte order)"""
        if h[:2] in (b'MM', b'II'):
            return 'tiff'
        if h[:2] == b'BM':
            return 'bmp'
        """SGI image library"""
        if h[:2] == b'\001\332':
            return 'rgb'
        """PBM (portable bitmap)"""
        if len(h) >= 3 and \
                h[0] == b'P' and h[1] in b'14' and h[2] in b' \t\n\r':
            return 'pbm'
        """PGM (portable graymap)"""
        if len(h) >= 3 and \
                h[0] == b'P' and h[1] in b'25' and h[2] in b' \t\n\r':
            return 'pgm'
        """PPM (portable pixmap)"""
        if len(h) >= 3 and h[0] == b'P' and h[1] in b'36' and h[2] in b' \t\n\r':
            return 'ppm'
        """Sun raster file"""
        if h[:4] == b'\x59\xA6\x6A\x95':
            return 'rast'
        """X bitmap (X10 or X11)"""
        s = b'#define '
        if h[:len(s)] == s:
            return 'xbm'
        return None


class SDK(object):

    def __init__(self, model_type, conf_path=None):
        """
        :param model_type: 指定预置模型类型
        :param conf_path: 指定自定义模型yaml配置文件(绝对路径)
        注: 若 conf_path 不为 None, 则优先使用 conf_path 的值
        """
        if model_type == ModelType.Captcha:
            _conf_path = "./captcha.yaml"
        elif model_type == ModelType.OCR:
            _conf_path = "./ocr.yaml"
        else:
            raise ValueError("参数 model_type 不支持, 只能是 [OCR, Captcha] 之一")

        _conf_path = os.path.join(WORK_PATH, _conf_path)
        self.model = Model(conf_path=conf_path if conf_path else _conf_path)
        self.model_conf = self.model.model_conf
        self.graph_session = GraphSession(self.model)
        self.interface = Interface(self.graph_session)
        self.predict(init_img)

    def predict(self, image_bytes, param_key=None):
        bytes_batch, message = ImageUtils.get_bytes_batch(image_bytes)
        if not bytes_batch:
            raise ValueError(message)
        image_batch, message = ImageUtils.get_image_batch(self.model_conf, bytes_batch, param_key=param_key)
        if not image_batch:
            raise ValueError(message)
        result = self.interface.predict_batch(image_batch, None)
        return result

if __name__ == '__main__':
    with open(r"C:\Users\yuanshi\Desktop\打码测试\2ABE_dc91cb71a5126af47301eee0ccc7e4bd.jpg","rb") as fr:
        content =fr.read()

    sdk = SDK(model_type=ModelType.Captcha, conf_path=r"C:\Users\yuanshi\Desktop\打码测试\model\YWY_model.yaml")
    text = sdk.predict(image_bytes=content)
    print(text)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.项目git地址
  • 2.安装模块
  • 3.创建项目
  • 4.添加配置文件
  • 5.把图片训练成if格式
  • 6.开始训练
  • 7.运行模型
  • 8.脚本
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档