From 44812534699af020527afc0739d07cdc47dcc6fd Mon Sep 17 00:00:00 2001 From: zstar <65890619+zstar1003@users.noreply.github.com> Date: Sat, 31 May 2025 14:09:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?docs(README):=20=E6=9B=B4=E6=96=B0=20Docker?= =?UTF-8?q?=20Compose=20=E8=BF=90=E8=A1=8C=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加了使用 GPU 运行的详细步骤 - 调整了 CPU 和 GPU 运行的说明结构 - 统一了代码块的格式 - 删除了部分冗余信息 --- README.md | 53 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 52dbe95..3d41807 100644 --- a/README.md +++ b/README.md @@ -76,23 +76,32 @@ ollama pull bge-m3:latest #### 1. 使用Docker Compose运行 -在项目根目录下执行 +- 使用GPU运行(需保证首张显卡有6GB以上剩余显存): -使用GPU运行: -```bash -docker compose -f docker/docker-compose_gpu.yml up -d -``` + 1. 在宿主机安装nvidia-container-runtime,让 Docker 自动挂载 GPU 设备和驱动: -使用CPU运行: -```bash -docker compose -f docker/docker-compose.yml up -d -``` + ```bash + sudo apt install -y nvidia-container-runtime + ``` + + 2. 在项目根目录下执行 + + ```bash + docker compose -f docker/docker-compose_gpu.yml up -d + ``` + +- 使用CPU运行: + + 在项目根目录下执行 + + ```bash + docker compose -f docker/docker-compose.yml up -d + ``` 访问地址:`服务器ip:80`,进入到前台界面 访问地址:`服务器ip:8888`,进入到后台管理界面 -图文教程:[https://blog.csdn.net/qq1198768105/article/details/147475488](https://blog.csdn.net/qq1198768105/article/details/147475488) #### 2. 源码运行(mysql、minio、es等组件仍需docker启动) @@ -100,29 +109,29 @@ docker compose -f docker/docker-compose.yml up -d - 启动后端:进入到`management/server`,执行: -```bash -python app.py -``` + ```bash + python app.py + ``` - 启动前端:进入到`management\web`,执行: -```bash -pnpm dev -``` + ```bash + pnpm dev + ``` 2. 启动前台交互系统: - 启动后端:项目根目录下执行: -```bash -python -m api.ragflow_server -``` + ```bash + python -m api.ragflow_server + ``` - 启动前端:进入到`web`,执行: -```bash -pnpm dev -``` + ```bash + pnpm dev + ``` > [!NOTE] > 源码部署需要注意:如果用到MinerU后台解析,需要参考MinerU的文档下载模型文件,并安装LibreOffice,配置环境变量,以适配支持除pdf之外的类型文件。 From d847d1ddadc2280cad1e5c60bb19351cec917eb5 Mon Sep 17 00:00:00 2001 From: zstar <65890619+zstar1003@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:46:29 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor(tokenizer):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=88=86=E8=AF=8D=EF=BC=8C=E5=92=8C=E5=8E=9F?= =?UTF-8?q?=E7=89=88=E5=88=86=E8=AF=8D=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 RagTokenizer 类,实现中英文混合文本的分词功能 - 优化文档解析过程中的分词操作,提高处理效率和准确性 - 移除知识图谱相关无用代码,简化文档结构 - 添加 tokenizer 依赖到 requirements.txt --- .gitignore | 1 + api/apps/chunk_app.py | 171 +- management/server/database.py | 4 +- management/server/requirements.txt | 3 +- .../knowledgebases/document_parser.py | 84 +- .../services/knowledgebases/rag_tokenizer.py | 412 + .../server/services/knowledgebases/service.py | 586 +- rag/app/tag.py | 73 +- rag/nlp/query.py | 187 +- rag/nlp/rag_tokenizer.py | 166 +- rag/nlp/search.py | 315 +- rag/nlp/synonym.py | 28 +- rag/nlp/term_weight.py | 113 +- rag/prompts.py | 66 +- rag/res/synonym.json | 10542 +--------------- 15 files changed, 1356 insertions(+), 11395 deletions(-) create mode 100644 management/server/services/knowledgebases/rag_tokenizer.py diff --git a/.gitignore b/.gitignore index f538abe..97c992a 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ docker/models management/web/types/auto web/node_modules/.cache/logger/umi.log management/models--slanet_plus +node_modules/.cache/logger/umi.log diff --git a/api/apps/chunk_app.py b/api/apps/chunk_app.py index aff1ba8..2680058 100644 --- a/api/apps/chunk_app.py +++ b/api/apps/chunk_app.py @@ -22,7 +22,8 @@ from flask_login import login_required, current_user from rag.app.qa import rmPrefix, beAdoc from rag.app.tag import label_question from rag.nlp import search, rag_tokenizer -from rag.prompts import keyword_extraction + +# from rag.prompts import keyword_extraction, cross_languages from rag.settings import PAGERANK_FLD from rag.utils import rmSpace from api.db import LLMType, ParserType @@ -37,9 +38,9 @@ import xxhash import re -@manager.route('/list', methods=['POST']) # noqa: F821 +@manager.route("/list", methods=["POST"]) # noqa: F821 @login_required -@validate_request("doc_id") +@validate_request("doc_id") # 验证请求中必须包含 doc_id 参数 def list_chunk(): req = request.json doc_id = req["doc_id"] @@ -54,9 +55,7 @@ def list_chunk(): if not e: return get_data_error_result(message="Document not found!") kb_ids = KnowledgebaseService.get_kb_ids(tenant_id) - query = { - "doc_ids": [doc_id], "page": page, "size": size, "question": question, "sort": True - } + query = {"doc_ids": [doc_id], "page": page, "size": size, "question": question, "sort": True} if "available_int" in req: query["available_int"] = int(req["available_int"]) sres = settings.retrievaler.search(query, search.index_name(tenant_id), kb_ids, highlight=True) @@ -64,9 +63,7 @@ def list_chunk(): for id in sres.ids: d = { "chunk_id": id, - "content_with_weight": rmSpace(sres.highlight[id]) if question and id in sres.highlight else sres.field[ - id].get( - "content_with_weight", ""), + "content_with_weight": rmSpace(sres.highlight[id]) if question and id in sres.highlight else sres.field[id].get("content_with_weight", ""), "doc_id": sres.field[id]["doc_id"], "docnm_kwd": sres.field[id]["docnm_kwd"], "important_kwd": sres.field[id].get("important_kwd", []), @@ -81,12 +78,11 @@ def list_chunk(): return get_json_result(data=res) except Exception as e: if str(e).find("not_found") > 0: - return get_json_result(data=False, message='No chunk found!', - code=settings.RetCode.DATA_ERROR) + return get_json_result(data=False, message="No chunk found!", code=settings.RetCode.DATA_ERROR) return server_error_response(e) -@manager.route('/get', methods=['GET']) # noqa: F821 +@manager.route("/get", methods=["GET"]) # noqa: F821 @login_required def get(): chunk_id = request.args["chunk_id"] @@ -112,19 +108,16 @@ def get(): return get_json_result(data=chunk) except Exception as e: if str(e).find("NotFoundError") >= 0: - return get_json_result(data=False, message='Chunk not found!', - code=settings.RetCode.DATA_ERROR) + return get_json_result(data=False, message="Chunk not found!", code=settings.RetCode.DATA_ERROR) return server_error_response(e) -@manager.route('/set', methods=['POST']) # noqa: F821 +@manager.route("/set", methods=["POST"]) # noqa: F821 @login_required @validate_request("doc_id", "chunk_id", "content_with_weight") def set(): req = request.json - d = { - "id": req["chunk_id"], - "content_with_weight": req["content_with_weight"]} + d = {"id": req["chunk_id"], "content_with_weight": req["content_with_weight"]} d["content_ltks"] = rag_tokenizer.tokenize(req["content_with_weight"]) d["content_sm_ltks"] = rag_tokenizer.fine_grained_tokenize(d["content_ltks"]) if "important_kwd" in req: @@ -153,13 +146,9 @@ def set(): return get_data_error_result(message="Document not found!") if doc.parser_id == ParserType.QA: - arr = [ - t for t in re.split( - r"[\n\t]", - req["content_with_weight"]) if len(t) > 1] + arr = [t for t in re.split(r"[\n\t]", req["content_with_weight"]) if len(t) > 1] q, a = rmPrefix(arr[0]), rmPrefix("\n".join(arr[1:])) - d = beAdoc(d, q, a, not any( - [rag_tokenizer.is_chinese(t) for t in q + a])) + d = beAdoc(d, q, a, not any([rag_tokenizer.is_chinese(t) for t in q + a])) v, c = embd_mdl.encode([doc.name, req["content_with_weight"] if not d.get("question_kwd") else "\n".join(d["question_kwd"])]) v = 0.1 * v[0] + 0.9 * v[1] if doc.parser_id != ParserType.QA else v[1] @@ -170,7 +159,7 @@ def set(): return server_error_response(e) -@manager.route('/switch', methods=['POST']) # noqa: F821 +@manager.route("/switch", methods=["POST"]) # noqa: F821 @login_required @validate_request("chunk_ids", "available_int", "doc_id") def switch(): @@ -180,20 +169,19 @@ def switch(): if not e: return get_data_error_result(message="Document not found!") for cid in req["chunk_ids"]: - if not settings.docStoreConn.update({"id": cid}, - {"available_int": int(req["available_int"])}, - search.index_name(DocumentService.get_tenant_id(req["doc_id"])), - doc.kb_id): + if not settings.docStoreConn.update({"id": cid}, {"available_int": int(req["available_int"])}, search.index_name(DocumentService.get_tenant_id(req["doc_id"])), doc.kb_id): return get_data_error_result(message="Index updating failure") return get_json_result(data=True) except Exception as e: return server_error_response(e) -@manager.route('/rm', methods=['POST']) # noqa: F821 +@manager.route("/rm", methods=["POST"]) # noqa: F821 @login_required @validate_request("chunk_ids", "doc_id") def rm(): + from rag.utils.storage_factory import STORAGE_IMPL + req = request.json try: e, doc = DocumentService.get_by_id(req["doc_id"]) @@ -204,19 +192,21 @@ def rm(): deleted_chunk_ids = req["chunk_ids"] chunk_number = len(deleted_chunk_ids) DocumentService.decrement_chunk_num(doc.id, doc.kb_id, 1, chunk_number, 0) + for cid in deleted_chunk_ids: + if STORAGE_IMPL.obj_exist(doc.kb_id, cid): + STORAGE_IMPL.rm(doc.kb_id, cid) return get_json_result(data=True) except Exception as e: return server_error_response(e) -@manager.route('/create', methods=['POST']) # noqa: F821 +@manager.route("/create", methods=["POST"]) # noqa: F821 @login_required @validate_request("doc_id", "content_with_weight") def create(): req = request.json chunck_id = xxhash.xxh64((req["content_with_weight"] + req["doc_id"]).encode("utf-8")).hexdigest() - d = {"id": chunck_id, "content_ltks": rag_tokenizer.tokenize(req["content_with_weight"]), - "content_with_weight": req["content_with_weight"]} + d = {"id": chunck_id, "content_ltks": rag_tokenizer.tokenize(req["content_with_weight"]), "content_with_weight": req["content_with_weight"]} d["content_sm_ltks"] = rag_tokenizer.fine_grained_tokenize(d["content_ltks"]) d["important_kwd"] = req.get("important_kwd", []) d["important_tks"] = rag_tokenizer.tokenize(" ".join(req.get("important_kwd", []))) @@ -252,14 +242,35 @@ def create(): d["q_%d_vec" % len(v)] = v.tolist() settings.docStoreConn.insert([d], search.index_name(tenant_id), doc.kb_id) - DocumentService.increment_chunk_num( - doc.id, doc.kb_id, c, 1, 0) + DocumentService.increment_chunk_num(doc.id, doc.kb_id, c, 1, 0) return get_json_result(data={"chunk_id": chunck_id}) except Exception as e: return server_error_response(e) -@manager.route('/retrieval_test', methods=['POST']) # noqa: F821 +""" +{ + "similarity_threshold": 0.2, + "vector_similarity_weight": 0.30000000000000004, + "question": "香港", + "doc_ids": [], + "kb_id": "4b071030bc8e43f1bfb8b7831f320d2f", + "page": 1, + "size": 10 +}, +{ + "similarity_threshold": 0.2, + "vector_similarity_weight": 0.30000000000000004, + "question": "显著优势", + "doc_ids": [], + "kb_id": "1848bc54384611f0b33e4e66786d0323", + "page": 1, + "size": 10 +} +""" + + +@manager.route("/retrieval_test", methods=["POST"]) # noqa: F821 @login_required @validate_request("kb_id", "question") def retrieval_test(): @@ -268,57 +279,53 @@ def retrieval_test(): size = int(req.get("size", 30)) question = req["question"] kb_ids = req["kb_id"] + # 如果kb_ids是字符串,将其转换为列表 if isinstance(kb_ids, str): kb_ids = [kb_ids] doc_ids = req.get("doc_ids", []) similarity_threshold = float(req.get("similarity_threshold", 0.0)) vector_similarity_weight = float(req.get("vector_similarity_weight", 0.3)) - use_kg = req.get("use_kg", False) top = int(req.get("top_k", 1024)) + # langs = req.get("cross_languages", []) # 获取跨语言设定 tenant_ids = [] try: + # 查询当前用户所属的租户 tenants = UserTenantService.query(user_id=current_user.id) + # 验证知识库权限 for kb_id in kb_ids: for tenant in tenants: - if KnowledgebaseService.query( - tenant_id=tenant.tenant_id, id=kb_id): + if KnowledgebaseService.query(tenant_id=tenant.tenant_id, id=kb_id): tenant_ids.append(tenant.tenant_id) break else: - return get_json_result( - data=False, message='Only owner of knowledgebase authorized for this operation.', - code=settings.RetCode.OPERATING_ERROR) - + return get_json_result(data=False, message="Only owner of knowledgebase authorized for this operation.", code=settings.RetCode.OPERATING_ERROR) + # 获取知识库信息 e, kb = KnowledgebaseService.get_by_id(kb_ids[0]) if not e: return get_data_error_result(message="Knowledgebase not found!") + # if langs: + # question = cross_languages(kb.tenant_id, None, question, langs) # 跨语言处理 + + # 加载嵌入模型 embd_mdl = LLMBundle(kb.tenant_id, LLMType.EMBEDDING.value, llm_name=kb.embd_id) + # 加载重排序模型(如果指定) rerank_mdl = None if req.get("rerank_id"): rerank_mdl = LLMBundle(kb.tenant_id, LLMType.RERANK.value, llm_name=req["rerank_id"]) - if req.get("keyword", False): - chat_mdl = LLMBundle(kb.tenant_id, LLMType.CHAT) - question += keyword_extraction(chat_mdl, question) + # 对问题进行标签化 + # labels = label_question(question, [kb]) + labels = None - labels = label_question(question, [kb]) - ranks = settings.retrievaler.retrieval(question, embd_mdl, tenant_ids, kb_ids, page, size, - similarity_threshold, vector_similarity_weight, top, - doc_ids, rerank_mdl=rerank_mdl, highlight=req.get("highlight"), - rank_feature=labels - ) - if use_kg: - ck = settings.kg_retrievaler.retrieval(question, - tenant_ids, - kb_ids, - embd_mdl, - LLMBundle(kb.tenant_id, LLMType.CHAT)) - if ck["content_with_weight"]: - ranks["chunks"].insert(0, ck) + # 执行检索操作 + ranks = settings.retrievaler.retrieval( + question, embd_mdl, tenant_ids, kb_ids, page, size, similarity_threshold, vector_similarity_weight, top, doc_ids, rerank_mdl=rerank_mdl, highlight=req.get("highlight"), rank_feature=labels + ) + # 移除不必要的向量信息 for c in ranks["chunks"]: c.pop("vector", None) ranks["labels"] = labels @@ -326,47 +333,5 @@ def retrieval_test(): return get_json_result(data=ranks) except Exception as e: if str(e).find("not_found") > 0: - return get_json_result(data=False, message='No chunk found! Check the chunk status please!', - code=settings.RetCode.DATA_ERROR) + return get_json_result(data=False, message="No chunk found! Check the chunk status please!", code=settings.RetCode.DATA_ERROR) return server_error_response(e) - - -@manager.route('/knowledge_graph', methods=['GET']) # noqa: F821 -@login_required -def knowledge_graph(): - doc_id = request.args["doc_id"] - tenant_id = DocumentService.get_tenant_id(doc_id) - kb_ids = KnowledgebaseService.get_kb_ids(tenant_id) - req = { - "doc_ids": [doc_id], - "knowledge_graph_kwd": ["graph", "mind_map"] - } - sres = settings.retrievaler.search(req, search.index_name(tenant_id), kb_ids) - obj = {"graph": {}, "mind_map": {}} - for id in sres.ids[:2]: - ty = sres.field[id]["knowledge_graph_kwd"] - try: - content_json = json.loads(sres.field[id]["content_with_weight"]) - except Exception: - continue - - if ty == 'mind_map': - node_dict = {} - - def repeat_deal(content_json, node_dict): - if 'id' in content_json: - if content_json['id'] in node_dict: - node_name = content_json['id'] - content_json['id'] += f"({node_dict[content_json['id']]})" - node_dict[node_name] += 1 - else: - node_dict[content_json['id']] = 1 - if 'children' in content_json and content_json['children']: - for item in content_json['children']: - repeat_deal(item, node_dict) - - repeat_deal(content_json, node_dict) - - obj[ty] = content_json - - return get_json_result(data=obj) diff --git a/management/server/database.py b/management/server/database.py index 58d4c0f..84ca343 100644 --- a/management/server/database.py +++ b/management/server/database.py @@ -4,9 +4,11 @@ import redis from minio import Minio from dotenv import load_dotenv from elasticsearch import Elasticsearch +from pathlib import Path # 加载环境变量 -load_dotenv("../../docker/.env") +env_path = Path(__file__).parent.parent.parent / "docker" / ".env" +load_dotenv(env_path) # 检测是否在Docker容器中运行 diff --git a/management/server/requirements.txt b/management/server/requirements.txt index 2b434c9..4386116 100644 --- a/management/server/requirements.txt +++ b/management/server/requirements.txt @@ -24,4 +24,5 @@ pyclipper==1.3.0.post6 omegaconf==2.3.0 rapid-table==1.0.3 openai==1.70.0 -redis==6.2.0 \ No newline at end of file +redis==6.2.0 +tokenizer==3.4.5 \ No newline at end of file diff --git a/management/server/services/knowledgebases/document_parser.py b/management/server/services/knowledgebases/document_parser.py index 4060751..28dfffa 100644 --- a/management/server/services/knowledgebases/document_parser.py +++ b/management/server/services/knowledgebases/document_parser.py @@ -2,12 +2,12 @@ import os import tempfile import shutil import json -from bs4 import BeautifulSoup import mysql.connector import time import traceback import re import requests +from bs4 import BeautifulSoup from io import BytesIO from datetime import datetime from database import MINIO_CONFIG, DB_CONFIG, get_minio_client, get_es_client @@ -17,17 +17,18 @@ from magic_pdf.model.doc_analyze_by_custom_model import doc_analyze from magic_pdf.config.enums import SupportedPdfParseMethod from magic_pdf.data.read_api import read_local_office, read_local_images from utils import generate_uuid +from .rag_tokenizer import RagTokenizer + + +tknzr = RagTokenizer() -# 自定义tokenizer和文本处理函数,替代rag.nlp中的功能 def tokenize_text(text): - """将文本分词,替代rag_tokenizer功能""" - # 简单实现,未来可能需要改成更复杂的分词逻辑 - return text.split() + return tknzr.tokenize(text) def merge_chunks(sections, chunk_token_num=128, delimiter="\n。;!?"): - """合并文本块,替代naive_merge功能""" + """合并文本块,替代naive_merge功能(预留函数)""" if not sections: return [] @@ -149,25 +150,7 @@ def _create_task_record(doc_id, chunk_ids_list): progress, progress_msg, retry_count, digest, chunk_ids, task_type, priority ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """ - task_params = [ - task_id, - current_timestamp, - current_date_only, - current_timestamp, - current_date_only, - doc_id, - 0, - 1, - None, - 0.0, - 1.0, - "MinerU解析完成", - 1, - digest, - chunk_ids_str, - "", - 0 - ] + task_params = [task_id, current_timestamp, current_date_only, current_timestamp, current_date_only, doc_id, 0, 1, None, 0.0, 1.0, "MinerU解析完成", 1, digest, chunk_ids_str, "", 0] cursor.execute(task_insert, task_params) conn.commit() print(f"[Parser-INFO] Task记录创建成功,Task ID: {task_id}") @@ -204,54 +187,55 @@ def get_bbox_from_block(block): def process_table_content(content_list): """ 处理表格内容,将每一行分开存储 - + Args: content_list: 原始内容列表 - + Returns: 处理后的内容列表 """ new_content_list = [] - + for item in content_list: - if 'table_body' in item and item['table_body']: + if "table_body" in item and item["table_body"]: # 使用BeautifulSoup解析HTML表格 - soup = BeautifulSoup(item['table_body'], 'html.parser') - table = soup.find('table') - + soup = BeautifulSoup(item["table_body"], "html.parser") + table = soup.find("table") + if table: - rows = table.find_all('tr') + rows = table.find_all("tr") # 获取表头(第一行) header_row = rows[0] if rows else None - + # 处理每一行,从第二行开始(跳过表头) for i, row in enumerate(rows): # 创建新的内容项 new_item = item.copy() - + # 创建只包含当前行的表格 - new_table = soup.new_tag('table') - + new_table = soup.new_tag("table") + # 如果有表头,添加表头 if header_row and i > 0: new_table.append(header_row) - + # 添加当前行 new_table.append(row) - + # 创建新的HTML结构 new_html = f"{str(new_table)}" - new_item['table_body'] = f"\n\n{new_html}\n\n" - + new_item["table_body"] = f"\n\n{new_html}\n\n" + # 添加到新的内容列表 new_content_list.append(new_item) else: new_content_list.append(item) else: new_content_list.append(item) - + return new_content_list + def perform_parse(doc_id, doc_info, file_info, embedding_config): """ 执行文档解析的核心逻辑 @@ -305,7 +289,7 @@ def perform_parse(doc_id, doc_info, file_info, embedding_config): if normalized_base_url.endswith("/v1"): # 如果 base_url 已经是 http://host/v1 形式 embedding_url = normalized_base_url + "/" + endpoint_segment - elif normalized_base_url.endswith('/embeddings'): + elif normalized_base_url.endswith("/embeddings"): # 如果 base_url 已经是 http://host/embeddings 形式(比如硅基流动API,无需再进行处理) embedding_url = normalized_base_url else: @@ -403,7 +387,7 @@ def perform_parse(doc_id, doc_info, file_info, embedding_config): middle_content = pipe_result.get_middle_json() middle_json_content = json.loads(middle_content) # 对excel文件单独进行处理 - elif file_type.endswith("excel") : + elif file_type.endswith("excel"): update_progress(0.3, "使用MinerU解析器") # 创建临时文件保存文件内容 temp_dir = tempfile.gettempdir() @@ -441,7 +425,7 @@ def perform_parse(doc_id, doc_info, file_info, embedding_config): # 使用MinerU处理 ds = read_local_images(temp_file_path)[0] infer_result = ds.apply(doc_analyze, ocr=True) - + update_progress(0.3, "分析PDF类型") is_ocr = ds.classify() == SupportedPdfParseMethod.OCR mode_msg = "OCR模式" if is_ocr else "文本模式" @@ -613,7 +597,6 @@ def perform_parse(doc_id, doc_info, file_info, embedding_config): ) # 准备ES文档 - content_tokens = tokenize_text(content) # 分词 current_time_es = datetime.now().strftime("%Y-%m-%d %H:%M:%S") current_timestamp_es = datetime.now().timestamp() @@ -625,11 +608,11 @@ def perform_parse(doc_id, doc_info, file_info, embedding_config): "doc_id": doc_id, "kb_id": kb_id, "docnm_kwd": doc_info["name"], - "title_tks": doc_info["name"], - "title_sm_tks": doc_info["name"], + "title_tks": tokenize_text(doc_info["name"]), + "title_sm_tks": tokenize_text(doc_info["name"]), "content_with_weight": content, - "content_ltks": " ".join(content_tokens), # 字符串类型 - "content_sm_ltks": " ".join(content_tokens), # 字符串类型 + "content_ltks": tokenize_text(content), + "content_sm_ltks": tokenize_text(content), "page_num_int": [page_idx + 1], "position_int": [[page_idx + 1] + bbox_reordered], # 格式: [[page, x1, x2, y1, y2]] "top_int": [1], @@ -755,7 +738,6 @@ def perform_parse(doc_id, doc_info, file_info, embedding_config): traceback.print_exc() # 打印详细错误堆栈 # 更新文档状态为失败 _update_document_progress(doc_id, status="1", run="0", message=error_message, process_duration=process_duration) # status=1表示完成,run=0表示失败 - # 不抛出异常,让调用者知道任务已结束(但失败) return {"success": False, "error": error_message} finally: diff --git a/management/server/services/knowledgebases/rag_tokenizer.py b/management/server/services/knowledgebases/rag_tokenizer.py new file mode 100644 index 0000000..2bff5c3 --- /dev/null +++ b/management/server/services/knowledgebases/rag_tokenizer.py @@ -0,0 +1,412 @@ +import logging +import copy +import datrie +import math +import os +import re +import string +from hanziconv import HanziConv +from nltk import word_tokenize +from nltk.stem import PorterStemmer, WordNetLemmatizer + + +# def get_project_base_directory(): +# return os.path.abspath( +# os.path.join( +# os.path.dirname(os.path.realpath(__file__)), +# os.pardir, +# os.pardir, +# ) +# ) + + +class RagTokenizer: + def key_(self, line): + return str(line.lower().encode("utf-8"))[2:-1] + + def rkey_(self, line): + return str(("DD" + (line[::-1].lower())).encode("utf-8"))[2:-1] + + def loadDict_(self, fnm): + print(f"[HUQIE]:Build trie from {fnm}") + try: + of = open(fnm, "r", encoding="utf-8") + while True: + line = of.readline() + if not line: + break + line = re.sub(r"[\r\n]+", "", line) + line = re.split(r"[ \t]", line) + k = self.key_(line[0]) + F = int(math.log(float(line[1]) / self.DENOMINATOR) + 0.5) + if k not in self.trie_ or self.trie_[k][0] < F: + self.trie_[self.key_(line[0])] = (F, line[2]) + self.trie_[self.rkey_(line[0])] = 1 + + dict_file_cache = fnm + ".trie" + print(f"[HUQIE]:Build trie cache to {dict_file_cache}") + self.trie_.save(dict_file_cache) + of.close() + except Exception: + logging.exception(f"[HUQIE]:Build trie {fnm} failed") + + def __init__(self): + self.DENOMINATOR = 1000000 + self.DIR_ = os.path.join(os.path.dirname(os.path.realpath(__file__)), "res", "huqie") + + self.stemmer = PorterStemmer() + self.lemmatizer = WordNetLemmatizer() + + self.SPLIT_CHAR = r"([ ,\.<>/?;:'\[\]\\`!@#$%^&*\(\)\{\}\|_+=《》,。?、;‘’:“”【】~!¥%……()——-]+|[a-zA-Z0-9,\.-]+)" + + trie_file_name = self.DIR_ + ".txt.trie" + # check if trie file existence + if os.path.exists(trie_file_name): + try: + # load trie from file + self.trie_ = datrie.Trie.load(trie_file_name) + return + except Exception: + # fail to load trie from file, build default trie + logging.exception(f"[HUQIE]:Fail to load trie file {trie_file_name}, build the default trie file") + self.trie_ = datrie.Trie(string.printable) + else: + # file not exist, build default trie + print(f"[HUQIE]:Trie file {trie_file_name} not found, build the default trie file") + self.trie_ = datrie.Trie(string.printable) + + # load data from dict file and save to trie file + self.loadDict_(self.DIR_ + ".txt") + + def _strQ2B(self, ustring): + """全角转半角,转小写""" + rstring = "" + for uchar in ustring: + inside_code = ord(uchar) + if inside_code == 0x3000: + inside_code = 0x0020 + else: + inside_code -= 0xFEE0 + if inside_code < 0x0020 or inside_code > 0x7E: # After the conversion, if it's not a half-width character, return the original character. + rstring += uchar + else: + rstring += chr(inside_code) + return rstring + + def _tradi2simp(self, line): + """繁体转简体""" + return HanziConv.toSimplified(line) + + def dfs_(self, chars, s, preTks, tkslist): + res = s + # if s > MAX_L or s>= len(chars): + if s >= len(chars): + tkslist.append(preTks) + return res + + # pruning + S = s + 1 + if s + 2 <= len(chars): + t1, t2 = "".join(chars[s : s + 1]), "".join(chars[s : s + 2]) + if self.trie_.has_keys_with_prefix(self.key_(t1)) and not self.trie_.has_keys_with_prefix(self.key_(t2)): + S = s + 2 + if len(preTks) > 2 and len(preTks[-1][0]) == 1 and len(preTks[-2][0]) == 1 and len(preTks[-3][0]) == 1: + t1 = preTks[-1][0] + "".join(chars[s : s + 1]) + if self.trie_.has_keys_with_prefix(self.key_(t1)): + S = s + 2 + + for e in range(S, len(chars) + 1): + t = "".join(chars[s:e]) + k = self.key_(t) + + if e > s + 1 and not self.trie_.has_keys_with_prefix(k): + break + + if k in self.trie_: + pretks = copy.deepcopy(preTks) + if k in self.trie_: + pretks.append((t, self.trie_[k])) + else: + pretks.append((t, (-12, ""))) + res = max(res, self.dfs_(chars, e, pretks, tkslist)) + + if res > s: + return res + + t = "".join(chars[s : s + 1]) + k = self.key_(t) + if k in self.trie_: + preTks.append((t, self.trie_[k])) + else: + preTks.append((t, (-12, ""))) + + return self.dfs_(chars, s + 1, preTks, tkslist) + + def freq(self, tk): + k = self.key_(tk) + if k not in self.trie_: + return 0 + return int(math.exp(self.trie_[k][0]) * self.DENOMINATOR + 0.5) + + def score_(self, tfts): + B = 30 + F, L, tks = 0, 0, [] + for tk, (freq, tag) in tfts: + F += freq + L += 0 if len(tk) < 2 else 1 + tks.append(tk) + # F /= len(tks) + L /= len(tks) + logging.debug("[SC] {} {} {} {} {}".format(tks, len(tks), L, F, B / len(tks) + L + F)) + return tks, B / len(tks) + L + F + + def sortTks_(self, tkslist): + res = [] + for tfts in tkslist: + tks, s = self.score_(tfts) + res.append((tks, s)) + return sorted(res, key=lambda x: x[1], reverse=True) + + def merge_(self, tks): + # if split chars is part of token + res = [] + tks = re.sub(r"[ ]+", " ", tks).split() + s = 0 + while True: + if s >= len(tks): + break + E = s + 1 + for e in range(s + 2, min(len(tks) + 2, s + 6)): + tk = "".join(tks[s:e]) + if re.search(self.SPLIT_CHAR, tk) and self.freq(tk): + E = e + res.append("".join(tks[s:E])) + s = E + + return " ".join(res) + + def maxForward_(self, line): + res = [] + s = 0 + while s < len(line): + e = s + 1 + t = line[s:e] + while e < len(line) and self.trie_.has_keys_with_prefix(self.key_(t)): + e += 1 + t = line[s:e] + + while e - 1 > s and self.key_(t) not in self.trie_: + e -= 1 + t = line[s:e] + + if self.key_(t) in self.trie_: + res.append((t, self.trie_[self.key_(t)])) + else: + res.append((t, (0, ""))) + + s = e + + return self.score_(res) + + def maxBackward_(self, line): + res = [] + s = len(line) - 1 + while s >= 0: + e = s + 1 + t = line[s:e] + while s > 0 and self.trie_.has_keys_with_prefix(self.rkey_(t)): + s -= 1 + t = line[s:e] + + while s + 1 < e and self.key_(t) not in self.trie_: + s += 1 + t = line[s:e] + + if self.key_(t) in self.trie_: + res.append((t, self.trie_[self.key_(t)])) + else: + res.append((t, (0, ""))) + + s -= 1 + + return self.score_(res[::-1]) + + def _split_by_lang(self, line): + """根据语言进行切分""" + txt_lang_pairs = [] + arr = re.split(self.SPLIT_CHAR, line) + for a in arr: + if not a: + continue + s = 0 + e = s + 1 + zh = is_chinese(a[s]) + while e < len(a): + _zh = is_chinese(a[e]) + if _zh == zh: + e += 1 + continue + txt_lang_pairs.append((a[s:e], zh)) + s = e + e = s + 1 + zh = _zh + if s >= len(a): + continue + txt_lang_pairs.append((a[s:e], zh)) + return txt_lang_pairs + + def tokenize(self, line: str) -> str: + """ + 对输入文本进行分词,支持中英文混合处理。 + + 分词流程: + 1. 预处理: + - 将所有非单词字符(字母、数字、下划线以外的)替换为空格。 + - 全角字符转半角。 + - 转换为小写。 + - 繁体中文转简体中文。 + 2. 按语言切分: + - 将预处理后的文本按语言(中文/非中文)分割成多个片段。 + 3. 分段处理: + - 对于非中文(通常是英文)片段: + - 使用 NLTK 的 `word_tokenize` 进行分词。 + - 对分词结果进行词干提取 (PorterStemmer) 和词形还原 (WordNetLemmatizer)。 + - 对于中文片段: + - 如果片段过短(长度<2)或为纯粹的英文/数字模式(如 "abc-def", "123.45"),则直接保留该片段。 + - 否则,采用基于词典的混合分词策略: + a. 执行正向最大匹配 (FMM) 和逆向最大匹配 (BMM) 得到两组分词结果 (`tks` 和 `tks1`)。 + b. 比较 FMM 和 BMM 的结果: + i. 找到两者从开头开始最长的相同分词序列,这部分通常是无歧义的,直接加入结果。 + ii. 对于 FMM 和 BMM 结果不一致的歧义部分(即从第一个不同点开始的子串): + - 提取出这段有歧义的原始文本。 + - 调用 `self.dfs_` (深度优先搜索) 在这段文本上探索所有可能的分词组合。 + - `self.dfs_` 会利用Trie词典,并由 `self.sortTks_` 对所有组合进行评分和排序。 + - 选择得分最高的分词方案作为该歧义段落的结果。 + iii.继续处理 FMM 和 BMM 结果中歧义段落之后的部分,重复步骤 i 和 ii,直到两个序列都处理完毕。 + c. 如果在比较完所有对应部分后,FMM 或 BMM 仍有剩余(理论上如果实现正确且输入相同,剩余部分也应相同), + 则对这部分剩余的原始文本同样使用 `self.dfs_` 进行最优分词。 + 4. 后处理: + - 将所有处理过的片段(英文词元、中文词元)用空格连接起来。 + - 调用 `self.merge_` 对连接后的结果进行进一步的合并操作, + 尝试合并一些可能被错误分割但实际是一个完整词的片段(基于词典检查)。 + 5. 返回最终分词结果字符串(词元间用空格分隔)。 + + Args: + line (str): 待分词的原始输入字符串。 + + Returns: + str: 分词后的字符串,词元之间用空格分隔。 + """ + # 1. 预处理 + line = re.sub(r"\W+", " ", line) # 将非字母数字下划线替换为空格 + line = self._strQ2B(line).lower() # 全角转半角,转小写 + line = self._tradi2simp(line) # 繁体转简体 + + # 2. 按语言切分 + arr = self._split_by_lang(line) # 将文本分割成 (文本片段, 是否为中文) 的列表 + res = [] # 存储最终分词结果的列表 + + # 3. 分段处理 + for L, lang in arr: # L 是文本片段,lang 是布尔值表示是否为中文 + if not lang: # 如果不是中文 + # 使用NLTK进行分词、词干提取和词形还原 + res.extend([self.stemmer.stem(self.lemmatizer.lemmatize(t)) for t in word_tokenize(L)]) + continue # 处理下一个片段 + + # 如果是中文,但长度小于2或匹配纯英文/数字模式,则直接添加,不进一步切分 + if len(L) < 2 or re.match(r"[a-z\.-]+$", L) or re.match(r"[0-9\.-]+$", L): + res.append(L) + continue # 处理下一个片段 + + # 对较长的中文片段执行FMM和BMM + tks, s = self.maxForward_(L) # tks: FMM结果列表, s: FMM评分 FMM (Forward Maximum Matching - 正向最大匹配) + tks1, s1 = self.maxBackward_(L) # tks1: BMM结果列表, s1: BMM评分 BMM (Backward Maximum Matching - 逆向最大匹配) + + # 初始化用于比较FMM和BMM结果的指针 + i, j = 0, 0 # i 指向 tks1 (BMM), j 指向 tks (FMM) + _i, _j = 0, 0 # _i, _j 记录上一段歧义处理的结束位置 + + # 3.b.i. 查找 FMM 和 BMM 从头开始的最长相同前缀 + same = 0 # 相同词元的数量 + while i + same < len(tks1) and j + same < len(tks) and tks1[i + same] == tks[j + same]: + same += 1 + if same > 0: # 如果存在相同前缀 + res.append(" ".join(tks[j : j + same])) # 将FMM中的相同部分加入结果 + + # 更新指针到不同部分的开始 + _i = i + same + _j = j + same + # 准备开始处理可能存在的歧义部分 + j = _j + 1 # FMM指针向后移动一位(或多位,取决于下面tk的构造) + i = _i + 1 # BMM指针向后移动一位(或多位) + + # 3.b.ii. 迭代处理 FMM 和 BMM 结果中的歧义部分 + while i < len(tks1) and j < len(tks): + # tk1 是 BMM 从上一个同步点 _i 到当前指针 i 形成的字符串 + # tk 是 FMM 从上一个同步点 _j 到当前指针 j 形成的字符串 + tk1, tk = "".join(tks1[_i:i]), "".join(tks[_j:j]) + + if tk1 != tk: # 如果这两个子串不相同,说明FMM和BMM的切分路径出现分叉 + # 尝试通过移动较短子串的指针来寻找下一个可能的同步点 + if len(tk1) > len(tk): + j += 1 + else: + i += 1 + continue # 继续外层while循环 + + # 如果子串相同,但当前位置的单个词元不同,则这也是一个需要DFS解决的歧义点 + if tks1[i] != tks[j]: # 注意:这里比较的是tks1[i]和tks[j],而不是tk1和tk的最后一个词 + i += 1 + j += 1 + continue + + # 从_j到j (不包括j处的词) 这段 FMM 产生的文本是歧义的,需要用DFS解决。 + tkslist = [] + self.dfs_("".join(tks[_j:j]), 0, [], tkslist) # 对这段FMM子串进行DFS + if tkslist: # 确保DFS有结果 + res.append(" ".join(self.sortTks_(tkslist)[0][0])) # 取最优DFS结果 + + # 处理当前这个相同的词元 (tks[j] 或 tks1[i]) 以及之后连续相同的词元 + same = 1 + while i + same < len(tks1) and j + same < len(tks) and tks1[i + same] == tks[j + same]: + same += 1 + res.append(" ".join(tks[j : j + same])) # 将FMM中从j开始的连续相同部分加入结果 + + # 更新指针到下一个不同部分的开始 + _i = i + same + _j = j + same + j = _j + 1 + i = _i + 1 + + # 3.c. 处理 FMM 或 BMM 可能的尾部剩余部分 + # 如果 _i (BMM的已处理指针) 还没有到达 tks1 的末尾 + # (并且假设 _j (FMM的已处理指针) 也未到 tks 的末尾,且剩余部分代表相同的原始文本) + if _i < len(tks1): + # 断言确保FMM的已处理指针也未到末尾 + assert _j < len(tks) + # 断言FMM和BMM的剩余部分代表相同的原始字符串 + assert "".join(tks1[_i:]) == "".join(tks[_j:]) + # 对FMM的剩余部分(代表了原始文本的尾部)进行DFS分词 + tkslist = [] + self.dfs_("".join(tks[_j:]), 0, [], tkslist) + if tkslist: # 确保DFS有结果 + res.append(" ".join(self.sortTks_(tkslist)[0][0])) + + # 4. 后处理 + res_str = " ".join(res) # 将所有分词结果用空格连接 + return self.merge_(res_str) # 返回经过合并处理的最终分词结果 + + +def is_chinese(s): + if s >= "\u4e00" and s <= "\u9fa5": + return True + else: + return False + + +if __name__ == "__main__": + tknzr = RagTokenizer() + tks = tknzr.tokenize("基于动态视觉相机的光流估计研究_孙文义.pdf") + print(tks) + tks = tknzr.tokenize("图3-1 事件流输入表征。(a)事件帧;(b)时间面;(c)体素网格\n(a)\n(b)\n(c)") + print(tks) diff --git a/management/server/services/knowledgebases/service.py b/management/server/services/knowledgebases/service.py index b989f36..ee16a59 100644 --- a/management/server/services/knowledgebases/service.py +++ b/management/server/services/knowledgebases/service.py @@ -1,12 +1,13 @@ import mysql.connector import json -import threading +import threading import requests import traceback import time from datetime import datetime from utils import generate_uuid -from database import DB_CONFIG +from database import DB_CONFIG + # 解析相关模块 from .document_parser import perform_parse, _update_document_progress @@ -14,19 +15,19 @@ from .document_parser import perform_parse, _update_document_progress # 结构: { kb_id: {"status": "running/completed/failed", "total": N, "current": M, "message": "...", "start_time": timestamp} } SEQUENTIAL_BATCH_TASKS = {} + class KnowledgebaseService: - @classmethod def _get_db_connection(cls): """创建数据库连接""" return mysql.connector.connect(**DB_CONFIG) @classmethod - def get_knowledgebase_list(cls, page=1, size=10, name='', sort_by="create_time", sort_order="desc"): + def get_knowledgebase_list(cls, page=1, size=10, name="", sort_by="create_time", sort_order="desc"): """获取知识库列表""" conn = cls._get_db_connection() cursor = conn.cursor(dictionary=True) - + # 验证排序字段 valid_sort_fields = ["name", "create_time", "create_date"] if sort_by not in valid_sort_fields: @@ -48,57 +49,54 @@ class KnowledgebaseService: FROM knowledgebase k """ params = [] - + if name: query += " WHERE k.name LIKE %s" params.append(f"%{name}%") - + # 添加查询排序条件 query += f" {sort_clause}" query += " LIMIT %s OFFSET %s" - params.extend([size, (page-1)*size]) - + params.extend([size, (page - 1) * size]) + cursor.execute(query, params) results = cursor.fetchall() - + # 处理结果 for result in results: # 处理空描述 - if not result.get('description'): - result['description'] = "暂无描述" + if not result.get("description"): + result["description"] = "暂无描述" # 处理时间格式 - if result.get('create_date'): - if isinstance(result['create_date'], datetime): - result['create_date'] = result['create_date'].strftime('%Y-%m-%d %H:%M:%S') - elif isinstance(result['create_date'], str): + if result.get("create_date"): + if isinstance(result["create_date"], datetime): + result["create_date"] = result["create_date"].strftime("%Y-%m-%d %H:%M:%S") + elif isinstance(result["create_date"], str): try: # 尝试解析已有字符串格式 - datetime.strptime(result['create_date'], '%Y-%m-%d %H:%M:%S') + datetime.strptime(result["create_date"], "%Y-%m-%d %H:%M:%S") except ValueError: - result['create_date'] = "" + result["create_date"] = "" # 获取总数 count_query = "SELECT COUNT(*) as total FROM knowledgebase" if name: count_query += " WHERE name LIKE %s" cursor.execute(count_query, params[:1] if name else []) - total = cursor.fetchone()['total'] - + total = cursor.fetchone()["total"] + cursor.close() conn.close() - - return { - 'list': results, - 'total': total - } + + return {"list": results, "total": total} @classmethod def get_knowledgebase_detail(cls, kb_id): """获取知识库详情""" conn = cls._get_db_connection() cursor = conn.cursor(dictionary=True) - + query = """ SELECT k.id, @@ -112,24 +110,24 @@ class KnowledgebaseService: """ cursor.execute(query, (kb_id,)) result = cursor.fetchone() - + if result: # 处理空描述 - if not result.get('description'): - result['description'] = "暂无描述" + if not result.get("description"): + result["description"] = "暂无描述" # 处理时间格式 - if result.get('create_date'): - if isinstance(result['create_date'], datetime): - result['create_date'] = result['create_date'].strftime('%Y-%m-%d %H:%M:%S') - elif isinstance(result['create_date'], str): + if result.get("create_date"): + if isinstance(result["create_date"], datetime): + result["create_date"] = result["create_date"].strftime("%Y-%m-%d %H:%M:%S") + elif isinstance(result["create_date"], str): try: - datetime.strptime(result['create_date'], '%Y-%m-%d %H:%M:%S') + datetime.strptime(result["create_date"], "%Y-%m-%d %H:%M:%S") except ValueError: - result['create_date'] = "" - + result["create_date"] = "" + cursor.close() conn.close() - + return result @classmethod @@ -137,7 +135,7 @@ class KnowledgebaseService: """检查知识库名称是否已存在""" conn = cls._get_db_connection() cursor = conn.cursor() - + query = """ SELECT COUNT(*) as count FROM knowledgebase @@ -145,10 +143,10 @@ class KnowledgebaseService: """ cursor.execute(query, (name,)) result = cursor.fetchone() - + cursor.close() conn.close() - + return result[0] > 0 @classmethod @@ -157,17 +155,17 @@ class KnowledgebaseService: try: # 检查知识库名称是否已存在 - exists = cls._check_name_exists(data['name']) + exists = cls._check_name_exists(data["name"]) if exists: raise Exception("知识库名称已存在") - + conn = cls._get_db_connection() cursor = conn.cursor(dictionary=True) - + # 使用传入的 creator_id 作为 tenant_id 和 created_by - tenant_id = data.get('creator_id') - created_by = data.get('creator_id') - + tenant_id = data.get("creator_id") + created_by = data.get("creator_id") + if not tenant_id: # 如果没有提供 creator_id,则使用默认值 print("未提供 creator_id,尝试获取最早用户 ID") @@ -179,10 +177,10 @@ class KnowledgebaseService: """ cursor.execute(query_earliest_user) earliest_user = cursor.fetchone() - + if earliest_user: - tenant_id = earliest_user['id'] - created_by = earliest_user['id'] + tenant_id = earliest_user["id"] + created_by = earliest_user["id"] print(f"使用创建时间最早的用户ID作为tenant_id和created_by: {tenant_id}") else: # 如果找不到用户,使用默认值 @@ -195,11 +193,10 @@ class KnowledgebaseService: created_by = "system" else: print(f"使用传入的 creator_id 作为 tenant_id 和 created_by: {tenant_id}") - # --- 获取动态 embd_id --- dynamic_embd_id = None - default_embd_id = 'bge-m3' # Fallback default + default_embd_id = "bge-m3" # Fallback default try: query_embedding_model = """ SELECT llm_name @@ -211,8 +208,8 @@ class KnowledgebaseService: cursor.execute(query_embedding_model) embedding_model = cursor.fetchone() - if embedding_model and embedding_model.get('llm_name'): - dynamic_embd_id = embedding_model['llm_name'] + if embedding_model and embedding_model.get("llm_name"): + dynamic_embd_id = embedding_model["llm_name"] # 对硅基流动平台进行特异性处理 if dynamic_embd_id == "netease-youdao/bce-embedding-base_v1": dynamic_embd_id = "BAAI/bge-m3" @@ -223,14 +220,14 @@ class KnowledgebaseService: except Exception as e: dynamic_embd_id = default_embd_id print(f"查询 embedding 模型失败: {str(e)},使用默认值: {dynamic_embd_id}") - traceback.print_exc() # Log the full traceback for debugging + traceback.print_exc() # Log the full traceback for debugging current_time = datetime.now() - create_date = current_time.strftime('%Y-%m-%d %H:%M:%S') + create_date = current_time.strftime("%Y-%m-%d %H:%M:%S") create_time = int(current_time.timestamp() * 1000) # 毫秒级时间戳 update_date = create_date update_time = create_time - + # 完整的字段列表 query = """ INSERT INTO knowledgebase ( @@ -247,52 +244,57 @@ class KnowledgebaseService: %s, %s ) """ - + # 设置默认值 - default_parser_config = json.dumps({ - "layout_recognize": "MinerU", - "chunk_token_num": 512, - "delimiter": "\n!?;。;!?", - "auto_keywords": 0, - "auto_questions": 0, - "html4excel": False, - "raptor": {"use_raptor": False}, - "graphrag": {"use_graphrag": False} - }) - + default_parser_config = json.dumps( + { + "layout_recognize": "MinerU", + "chunk_token_num": 512, + "delimiter": "\n!?;。;!?", + "auto_keywords": 0, + "auto_questions": 0, + "html4excel": False, + "raptor": {"use_raptor": False}, + "graphrag": {"use_graphrag": False}, + } + ) + kb_id = generate_uuid() - cursor.execute(query, ( - kb_id, # id - create_time, # create_time - create_date, # create_date - update_time, # update_time - update_date, # update_date - None, # avatar - tenant_id, # tenant_id - data['name'], # name - data.get('language', 'Chinese'), # language - data.get('description', ''), # description - dynamic_embd_id, # embd_id - data.get('permission', 'me'), # permission - created_by, # created_by - 使用内部获取的值 - 0, # doc_num - 0, # token_num - 0, # chunk_num - 0.7, # similarity_threshold - 0.3, # vector_similarity_weight - 'naive', # parser_id - default_parser_config, # parser_config - 0, # pagerank - '1' # status - )) + cursor.execute( + query, + ( + kb_id, # id + create_time, # create_time + create_date, # create_date + update_time, # update_time + update_date, # update_date + None, # avatar + tenant_id, # tenant_id + data["name"], # name + data.get("language", "Chinese"), # language + data.get("description", ""), # description + dynamic_embd_id, # embd_id + data.get("permission", "me"), # permission + created_by, # created_by - 使用内部获取的值 + 0, # doc_num + 0, # token_num + 0, # chunk_num + 0.7, # similarity_threshold + 0.3, # vector_similarity_weight + "naive", # parser_id + default_parser_config, # parser_config + 0, # pagerank + "1", # status + ), + ) conn.commit() - + cursor.close() conn.close() - + # 返回创建后的知识库详情 return cls.get_knowledgebase_detail(kb_id) - + except Exception as e: print(f"创建知识库失败: {str(e)}") raise Exception(f"创建知识库失败: {str(e)}") @@ -305,59 +307,59 @@ class KnowledgebaseService: kb = cls.get_knowledgebase_detail(kb_id) if not kb: return None - + conn = cls._get_db_connection() cursor = conn.cursor() - + # 如果要更新名称,先检查名称是否已存在 - if data.get('name') and data['name'] != kb['name']: - exists = cls._check_name_exists(data['name']) + if data.get("name") and data["name"] != kb["name"]: + exists = cls._check_name_exists(data["name"]) if exists: raise Exception("知识库名称已存在") - + # 构建更新语句 update_fields = [] params = [] - - if data.get('name'): - update_fields.append("name = %s") - params.append(data['name']) - - if 'description' in data: - update_fields.append("description = %s") - params.append(data['description']) - if 'permission' in data: + if data.get("name"): + update_fields.append("name = %s") + params.append(data["name"]) + + if "description" in data: + update_fields.append("description = %s") + params.append(data["description"]) + + if "permission" in data: update_fields.append("permission = %s") - params.append(data['permission']) - + params.append(data["permission"]) + # 更新时间 current_time = datetime.now() - update_date = current_time.strftime('%Y-%m-%d %H:%M:%S') + update_date = current_time.strftime("%Y-%m-%d %H:%M:%S") update_fields.append("update_date = %s") params.append(update_date) - + # 如果没有要更新的字段,直接返回 if not update_fields: return kb_id - + # 构建并执行更新语句 query = f""" UPDATE knowledgebase - SET {', '.join(update_fields)} + SET {", ".join(update_fields)} WHERE id = %s """ params.append(kb_id) - + cursor.execute(query, params) conn.commit() - + cursor.close() conn.close() - + # 返回更新后的知识库详情 return cls.get_knowledgebase_detail(kb_id) - + except Exception as e: print(f"更新知识库失败: {str(e)}") raise Exception(f"更新知识库失败: {str(e)}") @@ -368,21 +370,21 @@ class KnowledgebaseService: try: conn = cls._get_db_connection() cursor = conn.cursor() - + # 先检查知识库是否存在 check_query = "SELECT id FROM knowledgebase WHERE id = %s" cursor.execute(check_query, (kb_id,)) if not cursor.fetchone(): raise Exception("知识库不存在") - + # 执行删除 delete_query = "DELETE FROM knowledgebase WHERE id = %s" cursor.execute(delete_query, (kb_id,)) conn.commit() - + cursor.close() conn.close() - + return True except Exception as e: print(f"删除知识库失败: {str(e)}") @@ -394,44 +396,42 @@ class KnowledgebaseService: try: conn = cls._get_db_connection() cursor = conn.cursor() - + # 检查所有ID是否存在 - check_query = "SELECT id FROM knowledgebase WHERE id IN (%s)" % \ - ','.join(['%s'] * len(kb_ids)) + check_query = "SELECT id FROM knowledgebase WHERE id IN (%s)" % ",".join(["%s"] * len(kb_ids)) cursor.execute(check_query, kb_ids) existing_ids = [row[0] for row in cursor.fetchall()] - + if len(existing_ids) != len(kb_ids): missing_ids = set(kb_ids) - set(existing_ids) raise Exception(f"以下知识库不存在: {', '.join(missing_ids)}") - + # 执行批量删除 - delete_query = "DELETE FROM knowledgebase WHERE id IN (%s)" % \ - ','.join(['%s'] * len(kb_ids)) + delete_query = "DELETE FROM knowledgebase WHERE id IN (%s)" % ",".join(["%s"] * len(kb_ids)) cursor.execute(delete_query, kb_ids) conn.commit() - + cursor.close() conn.close() - + return len(kb_ids) except Exception as e: print(f"批量删除知识库失败: {str(e)}") raise Exception(f"批量删除知识库失败: {str(e)}") @classmethod - def get_knowledgebase_documents(cls, kb_id, page=1, size=10, name='', sort_by="create_time", sort_order="desc"): + def get_knowledgebase_documents(cls, kb_id, page=1, size=10, name="", sort_by="create_time", sort_order="desc"): """获取知识库下的文档列表""" try: conn = cls._get_db_connection() cursor = conn.cursor(dictionary=True) - + # 先检查知识库是否存在 check_query = "SELECT id FROM knowledgebase WHERE id = %s" cursor.execute(check_query, (kb_id,)) if not cursor.fetchone(): raise Exception("知识库不存在") - + # 验证排序字段 valid_sort_fields = ["name", "size", "create_time", "create_date"] if sort_by not in valid_sort_fields: @@ -457,24 +457,24 @@ class KnowledgebaseService: WHERE d.kb_id = %s """ params = [kb_id] - + if name: query += " AND d.name LIKE %s" params.append(f"%{name}%") - + # 添加查询排序条件 query += f" {sort_clause}" query += " LIMIT %s OFFSET %s" - params.extend([size, (page-1)*size]) - + params.extend([size, (page - 1) * size]) + cursor.execute(query, params) results = cursor.fetchall() # 处理日期时间格式 for result in results: - if result.get('create_date'): - result['create_date'] = result['create_date'].strftime('%Y-%m-%d %H:%M:%S') + if result.get("create_date"): + result["create_date"] = result["create_date"].strftime("%Y-%m-%d %H:%M:%S") # 获取总数 count_query = "SELECT COUNT(*) as total FROM document WHERE kb_id = %s" @@ -482,18 +482,15 @@ class KnowledgebaseService: if name: count_query += " AND name LIKE %s" count_params.append(f"%{name}%") - + cursor.execute(count_query, count_params) - total = cursor.fetchone()['total'] - + total = cursor.fetchone()["total"] + cursor.close() conn.close() - - return { - 'list': results, - 'total': total - } - + + return {"list": results, "total": total} + except Exception as e: print(f"获取知识库文档列表失败: {str(e)}") raise Exception(f"获取知识库文档列表失败: {str(e)}") @@ -503,12 +500,12 @@ class KnowledgebaseService: """添加文档到知识库""" try: print(f"[DEBUG] 开始添加文档,参数: kb_id={kb_id}, file_ids={file_ids}") - + # 如果没有传入created_by,则获取最早的用户ID if created_by is None: conn = cls._get_db_connection() cursor = conn.cursor(dictionary=True) - + # 查询创建时间最早的用户ID query_earliest_user = """ SELECT id FROM user @@ -517,37 +514,37 @@ class KnowledgebaseService: """ cursor.execute(query_earliest_user) earliest_user = cursor.fetchone() - + if earliest_user: - created_by = earliest_user['id'] + created_by = earliest_user["id"] print(f"使用创建时间最早的用户ID: {created_by}") else: - created_by = 'system' + created_by = "system" print("未找到用户, 使用默认用户ID: system") - + cursor.close() conn.close() - + # 检查知识库是否存在 kb = cls.get_knowledgebase_detail(kb_id) print(f"[DEBUG] 知识库检查结果: {kb}") if not kb: print(f"[ERROR] 知识库不存在: {kb_id}") raise Exception("知识库不存在") - + conn = cls._get_db_connection() cursor = conn.cursor() - + # 获取文件信息 file_query = """ SELECT id, name, location, size, type FROM file WHERE id IN (%s) - """ % ','.join(['%s'] * len(file_ids)) - + """ % ",".join(["%s"] * len(file_ids)) + print(f"[DEBUG] 执行文件查询SQL: {file_query}") print(f"[DEBUG] 查询参数: {file_ids}") - + try: cursor.execute(file_query, file_ids) files = cursor.fetchall() @@ -555,22 +552,22 @@ class KnowledgebaseService: except Exception as e: print(f"[ERROR] 文件查询失败: {str(e)}") raise - + if len(files) != len(file_ids): print(f"部分文件不存在: 期望={len(file_ids)}, 实际={len(files)}") raise Exception("部分文件不存在") - + # 添加文档记录 added_count = 0 for file in files: file_id = file[0] file_name = file[1] print(f"处理文件: id={file_id}, name={file_name}") - + file_location = file[2] file_size = file[3] file_type = file[4] - + # 检查文档是否已存在于知识库 check_query = """ SELECT COUNT(*) @@ -580,34 +577,32 @@ class KnowledgebaseService: """ cursor.execute(check_query, (kb_id, file_id)) exists = cursor.fetchone()[0] > 0 - + if exists: continue # 跳过已存在的文档 - + # 创建文档记录 doc_id = generate_uuid() current_datetime = datetime.now() create_time = int(current_datetime.timestamp() * 1000) # 毫秒级时间戳 current_date = current_datetime.strftime("%Y-%m-%d %H:%M:%S") # 格式化日期字符串 - + # 设置默认值 default_parser_id = "naive" - default_parser_config = json.dumps({ - "layout_recognize": "MinerU", - "chunk_token_num": 512, - "delimiter": "\n!?;。;!?", - "auto_keywords": 0, - "auto_questions": 0, - "html4excel": False, - "raptor": { - "use_raptor": False - }, - "graphrag": { - "use_graphrag": False + default_parser_config = json.dumps( + { + "layout_recognize": "MinerU", + "chunk_token_num": 512, + "delimiter": "\n!?;。;!?", + "auto_keywords": 0, + "auto_questions": 0, + "html4excel": False, + "raptor": {"use_raptor": False}, + "graphrag": {"use_graphrag": False}, } - }) + ) default_source_type = "local" - + # 插入document表 doc_query = """ INSERT INTO document ( @@ -624,17 +619,36 @@ class KnowledgebaseService: %s, %s, %s, %s ) """ - + doc_params = [ - doc_id, create_time, current_date, create_time, current_date, # ID和时间 - None, kb_id, default_parser_id, default_parser_config, default_source_type, # thumbnail到source_type - file_type, created_by, file_name, file_location, file_size, # type到size - 0, 0, 0.0, None, None, # token_num到process_begin_at - 0.0, None, '0', '1' # process_duation到status + doc_id, + create_time, + current_date, + create_time, + current_date, # ID和时间 + None, + kb_id, + default_parser_id, + default_parser_config, + default_source_type, # thumbnail到source_type + file_type, + created_by, + file_name, + file_location, + file_size, # type到size + 0, + 0, + 0.0, + None, + None, # token_num到process_begin_at + 0.0, + None, + "0", + "1", # process_duation到status ] - + cursor.execute(doc_query, doc_params) - + # 创建文件到文档的映射 f2d_id = generate_uuid() f2d_query = """ @@ -646,16 +660,13 @@ class KnowledgebaseService: %s, %s ) """ - - f2d_params = [ - f2d_id, create_time, current_date, create_time, current_date, - file_id, doc_id - ] - + + f2d_params = [f2d_id, create_time, current_date, create_time, current_date, file_id, doc_id] + cursor.execute(f2d_query, f2d_params) - + added_count += 1 - + # 更新知识库文档数量 if added_count > 0: try: @@ -669,18 +680,17 @@ class KnowledgebaseService: conn.commit() # 先提交更新操作 except Exception as e: print(f"[WARNING] 更新知识库文档数量失败,但文档已添加: {str(e)}") - + cursor.close() conn.close() - - return { - "added_count": added_count - } - + + return {"added_count": added_count} + except Exception as e: print(f"[ERROR] 添加文档失败: {str(e)}") print(f"[ERROR] 错误类型: {type(e)}") import traceback + print(f"[ERROR] 堆栈信息: {traceback.format_exc()}") raise Exception(f"添加文档到知识库失败: {str(e)}") @@ -690,25 +700,25 @@ class KnowledgebaseService: try: conn = cls._get_db_connection() cursor = conn.cursor() - + # 先检查文档是否存在 check_query = "SELECT kb_id FROM document WHERE id = %s" cursor.execute(check_query, (doc_id,)) result = cursor.fetchone() - + if not result: raise Exception("文档不存在") - + kb_id = result[0] - + # 删除文件到文档的映射 f2d_query = "DELETE FROM file2document WHERE document_id = %s" cursor.execute(f2d_query, (doc_id,)) - + # 删除文档 doc_query = "DELETE FROM document WHERE id = %s" cursor.execute(doc_query, (doc_id,)) - + # 更新知识库文档数量 update_query = """ UPDATE knowledgebase @@ -718,13 +728,13 @@ class KnowledgebaseService: """ current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S") cursor.execute(update_query, (current_date, kb_id)) - + conn.commit() cursor.close() conn.close() - + return True - + except Exception as e: print(f"[ERROR] 删除文档失败: {str(e)}") raise Exception(f"删除文档失败: {str(e)}") @@ -757,7 +767,7 @@ class KnowledgebaseService: f2d_result = cursor.fetchone() if not f2d_result: raise Exception("无法找到文件到文档的映射关系") - file_id = f2d_result['file_id'] + file_id = f2d_result["file_id"] file_query = "SELECT parent_id FROM file WHERE id = %s" cursor.execute(file_query, (file_id,)) @@ -767,10 +777,10 @@ class KnowledgebaseService: cursor.close() conn.close() - conn = None # 确保连接已关闭 + conn = None # 确保连接已关闭 # 2. 更新文档状态为处理中 (使用 parser 模块的函数) - _update_document_progress(doc_id, status='2', run='1', progress=0.0, message='开始解析') + _update_document_progress(doc_id, status="2", run="1", progress=0.0, message="开始解析") # 3. 调用后台解析函数 embedding_config = cls.get_system_embedding_config() @@ -783,9 +793,9 @@ class KnowledgebaseService: print(f"文档解析启动或执行过程中出错 (Doc ID: {doc_id}): {str(e)}") # 确保在异常时更新状态为失败 try: - _update_document_progress(doc_id, status='1', run='0', message=f"解析失败: {str(e)}") + _update_document_progress(doc_id, status="1", run="0", message=f"解析失败: {str(e)}") except Exception as update_err: - print(f"更新文档失败状态时出错 (Doc ID: {doc_id}): {str(update_err)}") + print(f"更新文档失败状态时出错 (Doc ID: {doc_id}): {str(update_err)}") # raise Exception(f"文档解析失败: {str(e)}") return {"success": False, "error": f"文档解析失败: {str(e)}"} @@ -801,25 +811,24 @@ class KnowledgebaseService: try: # 启动后台线程执行同步的 parse_document 方法 thread = threading.Thread(target=cls.parse_document, args=(doc_id,)) - thread.daemon = True # 设置为守护线程,主程序退出时线程也退出 + thread.daemon = True # 设置为守护线程,主程序退出时线程也退出 thread.start() # 立即返回,表示任务已提交 return { - "task_id": doc_id, # 使用 doc_id 作为任务标识符 + "task_id": doc_id, # 使用 doc_id 作为任务标识符 "status": "processing", - "message": "文档解析任务已提交到后台处理" + "message": "文档解析任务已提交到后台处理", } except Exception as e: print(f"启动异步解析任务失败 (Doc ID: {doc_id}): {str(e)}") - # 可以在这里尝试更新文档状态为失败 try: - _update_document_progress(doc_id, status='1', run='0', message=f"启动解析失败: {str(e)}") + _update_document_progress(doc_id, status="1", run="0", message=f"启动解析失败: {str(e)}") except Exception as update_err: - print(f"更新文档启动失败状态时出错 (Doc ID: {doc_id}): {str(update_err)}") + print(f"更新文档启动失败状态时出错 (Doc ID: {doc_id}): {str(update_err)}") raise Exception(f"启动异步解析任务失败: {str(e)}") - @classmethod + @classmethod def get_document_parse_progress(cls, doc_id): """获取文档解析进度""" conn = None @@ -845,12 +854,12 @@ class KnowledgebaseService: try: progress_value = float(result["progress"]) except (ValueError, TypeError): - progress_value = 0.0 # 或记录错误 + progress_value = 0.0 # 或记录错误 return { "progress": progress_value, "message": result.get("progress_msg", ""), - "status": result.get("status", "0"), + "status": result.get("status", "0"), "running": result.get("run", "0"), } @@ -876,7 +885,7 @@ class KnowledgebaseService: cursor.execute(query) result = cursor.fetchone() if result: - return result[0] # 返回用户 ID + return result[0] # 返回用户 ID else: print("警告: 数据库中没有用户!") return None @@ -904,27 +913,27 @@ class KnowledgebaseService: payload = {"input": ["Test connection"], "model": model_name} - if not base_url.startswith(('http://', 'https://')): - base_url = 'http://' + base_url - if not base_url.endswith('/'): - base_url += '/' - + if not base_url.startswith(("http://", "https://")): + base_url = "http://" + base_url + if not base_url.endswith("/"): + base_url += "/" + # --- URL 拼接优化 --- endpoint_segment = "embeddings" full_endpoint_path = "v1/embeddings" # 移除末尾斜杠以方便判断 - normalized_base_url = base_url.rstrip('/') + normalized_base_url = base_url.rstrip("/") - if normalized_base_url.endswith('/v1'): + if normalized_base_url.endswith("/v1"): # 如果 base_url 已经是 http://host/v1 形式 - current_test_url = normalized_base_url + '/' + endpoint_segment - elif normalized_base_url.endswith('/embeddings'): + current_test_url = normalized_base_url + "/" + endpoint_segment + elif normalized_base_url.endswith("/embeddings"): # 如果 base_url 已经是 http://host/embeddings 形式(比如硅基流动API,无需再进行处理) current_test_url = normalized_base_url else: # 如果 base_url 是 http://host 或 http://host/api 形式 - current_test_url = normalized_base_url + '/' + full_endpoint_path - + current_test_url = normalized_base_url + "/" + full_endpoint_path + # --- 结束 URL 拼接优化 --- print(f"尝试请求 URL: {current_test_url}") try: @@ -933,16 +942,17 @@ class KnowledgebaseService: if response.status_code == 200: res_json = response.json() - if ("data" in res_json and isinstance(res_json["data"], list) and len(res_json["data"]) > 0 and "embedding" in res_json["data"][0] and len(res_json["data"][0]["embedding"]) > 0) or \ - (isinstance(res_json, list) and len(res_json) > 0 and isinstance(res_json[0], list) and len(res_json[0]) > 0): + if ( + "data" in res_json and isinstance(res_json["data"], list) and len(res_json["data"]) > 0 and "embedding" in res_json["data"][0] and len(res_json["data"][0]["embedding"]) > 0 + ) or (isinstance(res_json, list) and len(res_json) > 0 and isinstance(res_json[0], list) and len(res_json[0]) > 0): print(f"连接测试成功: {current_test_url}") return True, "连接成功" else: print(f"连接成功但响应格式不正确于 {current_test_url}") - + except Exception as json_e: print(f"解析 JSON 响应失败于 {current_test_url}: {json_e}") - + return False, "连接失败: 响应错误" except Exception as e: @@ -958,7 +968,7 @@ class KnowledgebaseService: cursor = None try: conn = cls._get_db_connection() - cursor = conn.cursor(dictionary=True) # 使用字典游标方便访问列名 + cursor = conn.cursor(dictionary=True) # 使用字典游标方便访问列名 # 1. 找到最早创建的用户ID query_earliest_user = """ @@ -971,13 +981,9 @@ class KnowledgebaseService: if not earliest_user: # 如果没有用户,返回空配置 - return { - "llm_name": "", - "api_key": "", - "api_base": "" - } + return {"llm_name": "", "api_key": "", "api_base": ""} - earliest_user_id = earliest_user['id'] + earliest_user_id = earliest_user["id"] # 2. 根据最早用户ID查询 tenant_llm 表中 model_type 为 embedding 的配置 query_embedding_config = """ @@ -995,9 +1001,9 @@ class KnowledgebaseService: api_key = config.get("api_key", "") api_base = config.get("api_base", "") # 对模型名称进行处理 (可选,根据需要保留或移除) - if llm_name and '___' in llm_name: - llm_name = llm_name.split('___')[0] - + if llm_name and "___" in llm_name: + llm_name = llm_name.split("___")[0] + # (对硅基流动平台进行特异性处理) if llm_name == "netease-youdao/bce-embedding-base_v1": llm_name = "BAAI/bge-m3" @@ -1007,18 +1013,10 @@ class KnowledgebaseService: api_base = "https://api.siliconflow.cn/v1/embeddings" # 如果有配置,返回 - return { - "llm_name": llm_name, - "api_key": api_key, - "api_base": api_base - } + return {"llm_name": llm_name, "api_key": api_key, "api_base": api_base} else: # 如果最早的用户没有 embedding 配置,返回空 - return { - "llm_name": "", - "api_key": "", - "api_base": "" - } + return {"llm_name": "", "api_key": "", "api_base": ""} except Exception as e: print(f"获取系统 Embedding 配置时出错: {e}") traceback.print_exc() @@ -1029,7 +1027,7 @@ class KnowledgebaseService: cursor.close() if conn and conn.is_connected(): conn.close() - + # --- 设置系统 Embedding 配置 --- @classmethod def set_system_embedding_config(cls, llm_name, api_base, api_key): @@ -1037,14 +1035,10 @@ class KnowledgebaseService: tenant_id = cls._get_earliest_user_tenant_id() if not tenant_id: raise Exception("无法找到系统基础用户") - + print(f"开始设置系统 Embedding 配置: {llm_name}, {api_base}, {api_key}") # 执行连接测试 - is_connected, message = cls._test_embedding_connection( - base_url=api_base, - model_name=llm_name, - api_key=api_key - ) + is_connected, message = cls._test_embedding_connection(base_url=api_base, model_name=llm_name, api_key=api_key) if not is_connected: # 返回具体的测试失败原因给调用者(路由层)处理 @@ -1098,10 +1092,10 @@ class KnowledgebaseService: # # 返回 False 和错误信息给路由层 # return False, f"保存配置时数据库出错: {e}" # finally: - # if cursor: - # cursor.close() - # if conn and conn.is_connected(): - # conn.close() + # if cursor: + # cursor.close() + # if conn and conn.is_connected(): + # conn.close() # 顺序批量解析 (核心逻辑,在后台线程运行) @classmethod @@ -1111,7 +1105,7 @@ class KnowledgebaseService: task_info = SEQUENTIAL_BATCH_TASKS.get(kb_id) if not task_info: print(f"[Seq Batch ERROR] Task info for KB {kb_id} not found at start.") - return # 理论上不应发生 + return # 理论上不应发生 conn = None cursor = None @@ -1139,7 +1133,7 @@ class KnowledgebaseService: task_info["message"] = f"共找到 {total_count} 个文档待解析。" task_info["start_time"] = time.time() start_time = time.time() - SEQUENTIAL_BATCH_TASKS[kb_id] = task_info # 更新字典 + SEQUENTIAL_BATCH_TASKS[kb_id] = task_info # 更新字典 if not documents_to_parse: task_info["status"] = "completed" @@ -1152,14 +1146,14 @@ class KnowledgebaseService: # 按顺序解析每个文档 for i, doc in enumerate(documents_to_parse): - doc_id = doc['id'] - doc_name = doc['name'] + doc_id = doc["id"] + doc_name = doc["name"] # 更新当前进度 task_info["current"] = i + 1 - task_info["message"] = f"正在解析: {doc_name} ({i+1}/{total_count})" + task_info["message"] = f"正在解析: {doc_name} ({i + 1}/{total_count})" SEQUENTIAL_BATCH_TASKS[kb_id] = task_info - print(f"[Seq Batch] KB {kb_id}: ({i+1}/{total_count}) Parsing {doc_name} (ID: {doc_id})...") + print(f"[Seq Batch] KB {kb_id}: ({i + 1}/{total_count}) Parsing {doc_name} (ID: {doc_id})...") try: # 调用同步的 parse_document 方法 @@ -1172,16 +1166,15 @@ class KnowledgebaseService: failed_count += 1 error_msg = result.get("message", "未知错误") if result else "未知错误" print(f"[Seq Batch] KB {kb_id}: Document {doc_id} parsing failed: {error_msg}") - # 即使单个失败,也继续处理下一个 except Exception as e: failed_count += 1 print(f"[Seq Batch ERROR] KB {kb_id}: Error calling parse_document for {doc_id}: {str(e)}") traceback.print_exc() - # 尝试更新文档状态为失败,以防 parse_document 内部未处理 + # 更新文档状态为失败 try: - _update_document_progress(doc_id, status='1', run='0', progress=0.0, message=f"批量任务中解析失败: {str(e)[:255]}") + _update_document_progress(doc_id, status="1", run="0", progress=0.0, message=f"批量任务中解析失败: {str(e)[:255]}") except Exception as update_err: - print(f"[Service-ERROR] 更新文档 {doc_id} 失败状态时出错: {str(update_err)}") + print(f"[Service-ERROR] 更新文档 {doc_id} 失败状态时出错: {str(update_err)}") # 任务完成 end_time = time.time() @@ -1189,7 +1182,7 @@ class KnowledgebaseService: final_message = f"批量顺序解析完成。总计 {total_count} 个,成功 {parsed_count} 个,失败 {failed_count} 个。耗时 {duration} 秒。" task_info["status"] = "completed" task_info["message"] = final_message - task_info["current"] = total_count # 确保 current 等于 total + task_info["current"] = total_count SEQUENTIAL_BATCH_TASKS[kb_id] = task_info print(f"[Seq Batch] KB {kb_id}: {final_message}") @@ -1217,13 +1210,7 @@ class KnowledgebaseService: # 初始化任务状态 start_time = time.time() - SEQUENTIAL_BATCH_TASKS[kb_id] = { - "status": "starting", - "total": 0, - "current": 0, - "message": "任务准备启动...", - "start_time": start_time - } + SEQUENTIAL_BATCH_TASKS[kb_id] = {"status": "starting", "total": 0, "current": 0, "message": "任务准备启动...", "start_time": start_time} try: # 启动后台线程执行顺序解析逻辑 @@ -1239,13 +1226,7 @@ class KnowledgebaseService: print(f"[Seq Batch ERROR] KB {kb_id}: {error_message}") traceback.print_exc() # 更新任务状态为失败 - SEQUENTIAL_BATCH_TASKS[kb_id] = { - "status": "failed", - "total": 0, - "current": 0, - "message": error_message, - "start_time": start_time - } + SEQUENTIAL_BATCH_TASKS[kb_id] = {"status": "failed", "total": 0, "current": 0, "message": error_message, "start_time": start_time} return {"success": False, "message": error_message} # 获取顺序批量解析进度 @@ -1294,10 +1275,7 @@ class KnowledgebaseService: doc["status"] = doc.get("status", "0") doc["run"] = doc.get("run", "0") - - return { - "documents": documents_status - } + return {"documents": documents_status} except Exception as e: print(f"获取知识库 {kb_id} 文档进度失败: {str(e)}") diff --git a/rag/app/tag.py b/rag/app/tag.py index 7263bee..c9a6527 100644 --- a/rag/app/tag.py +++ b/rag/app/tag.py @@ -35,22 +35,19 @@ def beAdoc(d, q, a, eng, row_num=-1): def chunk(filename, binary=None, lang="Chinese", callback=None, **kwargs): """ - Excel and csv(txt) format files are supported. - If the file is in excel format, there should be 2 column content and tags without header. - And content column is ahead of tags column. - And it's O.K if it has multiple sheets as long as the columns are rightly composed. + Excel and csv(txt) format files are supported. + If the file is in excel format, there should be 2 column content and tags without header. + And content column is ahead of tags column. + And it's O.K if it has multiple sheets as long as the columns are rightly composed. - If it's in csv format, it should be UTF-8 encoded. Use TAB as delimiter to separate content and tags. + If it's in csv format, it should be UTF-8 encoded. Use TAB as delimiter to separate content and tags. - All the deformed lines will be ignored. - Every pair will be treated as a chunk. + All the deformed lines will be ignored. + Every pair will be treated as a chunk. """ eng = lang.lower() == "english" res = [] - doc = { - "docnm_kwd": filename, - "title_tks": rag_tokenizer.tokenize(re.sub(r"\.[a-zA-Z]+$", "", filename)) - } + doc = {"docnm_kwd": filename, "title_tks": rag_tokenizer.tokenize(re.sub(r"\.[a-zA-Z]+$", "", filename))} if re.search(r"\.xlsx?$", filename, re.IGNORECASE): callback(0.1, "Start to parse.") excel_parser = Excel() @@ -83,11 +80,9 @@ def chunk(filename, binary=None, lang="Chinese", callback=None, **kwargs): content = "" i += 1 if len(res) % 999 == 0: - callback(len(res) * 0.6 / len(lines), ("Extract TAG: {}".format(len(res)) + ( - f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) + callback(len(res) * 0.6 / len(lines), ("Extract TAG: {}".format(len(res)) + (f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) - callback(0.6, ("Extract TAG: {}".format(len(res)) + ( - f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) + callback(0.6, ("Extract TAG: {}".format(len(res)) + (f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) return res @@ -110,40 +105,61 @@ def chunk(filename, binary=None, lang="Chinese", callback=None, **kwargs): res.append(beAdoc(deepcopy(doc), content, row[1], eng, i)) content = "" if len(res) % 999 == 0: - callback(len(res) * 0.6 / len(lines), ("Extract Tags: {}".format(len(res)) + ( - f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) + callback(len(res) * 0.6 / len(lines), ("Extract Tags: {}".format(len(res)) + (f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) - callback(0.6, ("Extract TAG : {}".format(len(res)) + ( - f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) + callback(0.6, ("Extract TAG : {}".format(len(res)) + (f"{len(fails)} failure, line: %s..." % (",".join(fails[:3])) if fails else ""))) return res - raise NotImplementedError( - "Excel, csv(txt) format files are supported.") + raise NotImplementedError("Excel, csv(txt) format files are supported.") def label_question(question, kbs): + """ + 标记问题的标签。 + + 该函数通过给定的问题和知识库列表,对问题进行标签标记。它首先确定哪些知识库配置了标签, + 然后从缓存中获取这些标签,必要时从设置中检索标签。最后,使用这些标签对问题进行标记。 + + 参数: + question (str): 需要标记的问题。 + kbs (list): 知识库对象列表,用于标签标记。 + + 返回: + list: 与问题相关的标签列表。 + """ from api.db.services.knowledgebase_service import KnowledgebaseService from graphrag.utils import get_tags_from_cache, set_tags_to_cache from api import settings + + # 初始化标签和标签知识库ID列表 tags = None tag_kb_ids = [] + + # 遍历知识库,收集所有标签知识库ID for kb in kbs: if kb.parser_config.get("tag_kb_ids"): tag_kb_ids.extend(kb.parser_config["tag_kb_ids"]) + + # 如果存在标签知识库ID,则进一步处理 if tag_kb_ids: + # 尝试从缓存中获取所有标签 all_tags = get_tags_from_cache(tag_kb_ids) + + # 如果缓存中没有标签,从设置中检索标签,并设置缓存 if not all_tags: all_tags = settings.retrievaler.all_tags_in_portion(kb.tenant_id, tag_kb_ids) set_tags_to_cache(all_tags, tag_kb_ids) else: + # 如果缓存中获取到标签,将其解析为JSON格式 all_tags = json.loads(all_tags) + + # 根据标签知识库ID获取对应的标签知识库 tag_kbs = KnowledgebaseService.get_by_ids(tag_kb_ids) - tags = settings.retrievaler.tag_query(question, - list(set([kb.tenant_id for kb in tag_kbs])), - tag_kb_ids, - all_tags, - kb.parser_config.get("topn_tags", 3) - ) + + # 使用设置中的检索器对问题进行标签标记 + tags = settings.retrievaler.tag_query(question, list(set([kb.tenant_id for kb in tag_kbs])), tag_kb_ids, all_tags, kb.parser_config.get("topn_tags", 3)) + + # 返回标记的标签 return tags @@ -152,4 +168,5 @@ if __name__ == "__main__": def dummy(prog=None, msg=""): pass - chunk(sys.argv[1], from_page=0, to_page=10, callback=dummy) \ No newline at end of file + + chunk(sys.argv[1], from_page=0, to_page=10, callback=dummy) diff --git a/rag/nlp/query.py b/rag/nlp/query.py index 8e1aca3..38a3c67 100644 --- a/rag/nlp/query.py +++ b/rag/nlp/query.py @@ -53,6 +53,16 @@ class FulltextQueryer: @staticmethod def rmWWW(txt): + """ + 移除文本中的WWW(WHAT、WHO、WHERE等疑问词)。 + + 本函数通过一系列正则表达式模式来识别并替换文本中的疑问词,以简化文本或为后续处理做准备。 + 参数: + - txt: 待处理的文本字符串。 + + 返回: + - 处理后的文本字符串,如果所有疑问词都被移除且文本为空,则返回原始文本。 + """ patts = [ ( r"是*(什么样的|哪家|一下|那家|请问|啥样|咋样了|什么时候|何时|何地|何人|是否|是不是|多少|哪里|怎么|哪儿|怎么样|如何|哪些|是啥|啥是|啊|吗|呢|吧|咋|什么|有没有|呀|谁|哪位|哪个)是*", @@ -61,7 +71,8 @@ class FulltextQueryer: (r"(^| )(what|who|how|which|where|why)('re|'s)? ", " "), ( r"(^| )('s|'re|is|are|were|was|do|does|did|don't|doesn't|didn't|has|have|be|there|you|me|your|my|mine|just|please|may|i|should|would|wouldn't|will|won't|done|go|for|with|so|the|a|an|by|i'm|it's|he's|she's|they|they're|you're|as|by|on|in|at|up|out|down|of|to|or|and|if) ", - " ") + " ", + ), ] otxt = txt for r, p in patts: @@ -70,28 +81,53 @@ class FulltextQueryer: txt = otxt return txt + @staticmethod + def add_space_between_eng_zh(txt): + """ + 在英文和中文之间添加空格。 + + 该函数通过正则表达式匹配文本中英文和中文相邻的情况,并在它们之间插入空格。 + 这样做可以改善文本的可读性,特别是在混合使用英文和中文时。 + + 参数: + txt (str): 需要处理的文本字符串。 + + 返回: + str: 处理后的文本字符串,其中英文和中文之间添加了空格。 + """ + # (ENG/ENG+NUM) + ZH + txt = re.sub(r"([A-Za-z]+[0-9]+)([\u4e00-\u9fa5]+)", r"\1 \2", txt) + # ENG + ZH + txt = re.sub(r"([A-Za-z])([\u4e00-\u9fa5]+)", r"\1 \2", txt) + # ZH + (ENG/ENG+NUM) + txt = re.sub(r"([\u4e00-\u9fa5]+)([A-Za-z]+[0-9]+)", r"\1 \2", txt) + txt = re.sub(r"([\u4e00-\u9fa5]+)([A-Za-z])", r"\1 \2", txt) + return txt + def question(self, txt, tbl="qa", min_match: float = 0.6): """ - 处理用户问题并生成全文检索表达式 - + 根据输入的文本生成查询表达式,用于在数据库中匹配相关问题。 + 参数: - txt: 原始问题文本 - tbl: 查询表名(默认"qa") - min_match: 最小匹配阈值(默认0.6) - + - txt (str): 输入的文本。 + - tbl (str): 数据表名,默认为"qa"。 + - min_match (float): 最小匹配度,默认为0.6。 + 返回: - MatchTextExpr: 全文检索表达式对象 - list: 提取的关键词列表 + - MatchTextExpr: 生成的查询表达式对象。 + - keywords (list): 提取的关键词列表。 """ - # 1. 文本预处理:去除特殊字符、繁体转简体、全角转半角、转小写 + txt = FulltextQueryer.add_space_between_eng_zh(txt) # 在英文和中文之间添加空格 + # 使用正则表达式替换特殊字符为单个空格,并将文本转换为简体中文和小写 txt = re.sub( r"[ :|\r\n\t,,。??/`!!&^%%()\[\]{}<>]+", " ", rag_tokenizer.tradi2simp(rag_tokenizer.strQ2B(txt.lower())), ).strip() - txt = FulltextQueryer.rmWWW(txt) # 去除停用词 + otxt = txt + txt = FulltextQueryer.rmWWW(txt) - # 2. 非中文文本处理 + # 如果文本不是中文,则进行英文处理 if not self.isChinese(txt): txt = FulltextQueryer.rmWWW(txt) tks = rag_tokenizer.tokenize(txt).split() @@ -106,11 +142,10 @@ class FulltextQueryer: syn = self.syn.lookup(tk) syn = rag_tokenizer.tokenize(" ".join(syn)).split() keywords.extend(syn) - syn = ["\"{}\"^{:.4f}".format(s, w / 4.) for s in syn if s.strip()] + syn = ['"{}"^{:.4f}'.format(s, w / 4.0) for s in syn if s.strip()] syns.append(" ".join(syn)) - q = ["({}^{:.4f}".format(tk, w) + " {})".format(syn) for (tk, w), syn in zip(tks_w, syns) if - tk and not re.match(r"[.^+\(\)-]", tk)] + q = ["({}^{:.4f}".format(tk, w) + " {})".format(syn) for (tk, w), syn in zip(tks_w, syns) if tk and not re.match(r"[.^+\(\)-]", tk)] for i in range(1, len(tks_w)): left, right = tks_w[i - 1][0].strip(), tks_w[i][0].strip() if not left or not right: @@ -126,48 +161,53 @@ class FulltextQueryer: if not q: q.append(txt) query = " ".join(q) - return MatchTextExpr( - self.query_fields, query, 100 - ), keywords + return MatchTextExpr(self.query_fields, query, 100), keywords def need_fine_grained_tokenize(tk): """ - 判断是否需要细粒度分词 + 判断是否需要对词进行细粒度分词。 + 参数: - tk: 待判断的词条 + - tk (str): 待判断的词。 + 返回: - bool: True表示需要细粒度分词 + - bool: 是否需要进行细粒度分词。 """ + # 长度小于3的词不处理 if len(tk) < 3: return False + # 匹配特定模式的词不处理(如数字、字母、符号组合) if re.match(r"[0-9a-z\.\+#_\*-]+$", tk): return False return True - txt = FulltextQueryer.rmWWW(txt) # 二次去除停用词 - qs, keywords = [], [] # 初始化查询表达式和关键词列表 - # 3. 中文文本处理(最多处理256个词) - for tt in self.tw.split(txt)[:256]: # .split(): + txt = FulltextQueryer.rmWWW(txt) + qs, keywords = [], [] + # 遍历文本分割后的前256个片段(防止处理过长文本) + for tt in self.tw.split(txt)[:256]: # 注:这个split似乎是对英文设计,中文不起作用 if not tt: continue - # 3.1 基础关键词收集 + # 将当前片段加入关键词列表 keywords.append(tt) - twts = self.tw.weights([tt]) # 获取词权重 - syns = self.syn.lookup(tt) # 查询同义词 - # 3.2 同义词扩展(最多扩展到32个关键词) + # 获取当前片段的权重 + twts = self.tw.weights([tt]) + # 查找同义词 + syns = self.syn.lookup(tt) + # 如果有同义词且关键词数量未超过32,将同义词加入关键词列表 if syns and len(keywords) < 32: keywords.extend(syns) + # 调试日志:输出权重信息 logging.debug(json.dumps(twts, ensure_ascii=False)) + # 初始化查询条件列表 tms = [] - # 3.3 处理每个词及其权重 + # 按权重降序排序处理每个token for tk, w in sorted(twts, key=lambda x: x[1] * -1): - # 3.3.1 细粒度分词处理 - sm = ( - rag_tokenizer.fine_grained_tokenize(tk).split() - if need_fine_grained_tokenize(tk) - else [] - ) - # 3.3.2 清洗分词结果 + # 如果需要细粒度分词,则进行分词处理 + sm = rag_tokenizer.fine_grained_tokenize(tk).split() if need_fine_grained_tokenize(tk) else [] + # 对每个分词结果进行清洗: + # 1. 去除标点符号和特殊字符 + # 2. 使用subSpecialChar进一步处理 + # 3. 过滤掉长度<=1的词 sm = [ re.sub( r"[ ,\./;'\[\]\\`~!@#$%\^&\*\(\)=\+_<>\?:\"\{\}\|,。;‘’【】、!¥……()——《》?:“”-]+", @@ -178,59 +218,65 @@ class FulltextQueryer: ] sm = [FulltextQueryer.subSpecialChar(m) for m in sm if len(m) > 1] sm = [m for m in sm if len(m) > 1] - # 3.3.3 收集关键词(不超过32个) + + # 如果关键词数量未达上限,添加处理后的token和分词结果 if len(keywords) < 32: - keywords.append(re.sub(r"[ \\\"']+", "", tk)) - keywords.extend(sm) - - # 3.3.4 同义词处理 + keywords.append(re.sub(r"[ \\\"']+", "", tk)) # 去除转义字符 + keywords.extend(sm) # 添加分词结果 + # 获取当前token的同义词并进行处理 tk_syns = self.syn.lookup(tk) tk_syns = [FulltextQueryer.subSpecialChar(s) for s in tk_syns] + # 添加有效同义词到关键词列表 if len(keywords) < 32: keywords.extend([s for s in tk_syns if s]) + # 对同义词进行分词处理,并为包含空格的同义词添加引号 tk_syns = [rag_tokenizer.fine_grained_tokenize(s) for s in tk_syns if s] - tk_syns = [f"\"{s}\"" if s.find(" ") > 0 else s for s in tk_syns] - # 关键词数量限制 + tk_syns = [f'"{s}"' if s.find(" ") > 0 else s for s in tk_syns] + + # 关键词数量达到上限则停止处理 if len(keywords) >= 32: break - - # 3.3.5 构建查询表达式 + + # 处理当前token用于构建查询条件: + # 1. 特殊字符处理 + # 2. 为包含空格的token添加引号 + # 3. 如果有同义词,构建OR条件并降低权重 + # 4. 如果有分词结果,添加OR条件 tk = FulltextQueryer.subSpecialChar(tk) if tk.find(" ") > 0: - tk = '"%s"' % tk # 处理短语查询 + tk = '"%s"' % tk if tk_syns: - tk = f"({tk} OR (%s)^0.2)" % " ".join(tk_syns) # 添加同义词查询 + tk = f"({tk} OR (%s)^0.2)" % " ".join(tk_syns) if sm: - tk = f'{tk} OR "%s" OR ("%s"~2)^0.5' % (" ".join(sm), " ".join(sm)) # 添加细粒度分词查询 + tk = f'{tk} OR "%s" OR ("%s"~2)^0.5' % (" ".join(sm), " ".join(sm)) if tk.strip(): - tms.append((tk, w)) # 保存带权重的查询表达式 - - # 3.4 合并当前词的查询表达式 + tms.append((tk, w)) + + # 将处理后的查询条件按权重组合成字符串 tms = " ".join([f"({t})^{w}" for t, w in tms]) - # 3.5 添加相邻词组合查询(提升短语匹配权重) + # 如果有多个权重项,添加短语搜索条件(提高相邻词匹配的权重) if len(twts) > 1: tms += ' ("%s"~2)^1.5' % rag_tokenizer.tokenize(tt) - # 3.6 处理同义词查询表达式 - syns = " OR ".join( - [ - '"%s"' - % rag_tokenizer.tokenize(FulltextQueryer.subSpecialChar(s)) - for s in syns - ] - ) + # 处理同义词的查询条件 + syns = " OR ".join(['"%s"' % rag_tokenizer.tokenize(FulltextQueryer.subSpecialChar(s)) for s in syns]) + # 组合主查询条件和同义词条件 if syns and tms: tms = f"({tms})^5 OR ({syns})^0.7" + # 将最终查询条件加入列表 + qs.append(tms) - qs.append(tms) # 添加到最终查询列表 - - # 4. 生成最终查询表达式 - if qs: + # 处理所有查询条件 + if qs: + # 组合所有查询条件为OR关系 query = " OR ".join([f"({t})" for t in qs if t]) - return MatchTextExpr( - self.query_fields, query, 100, {"minimum_should_match": min_match} - ), keywords + # 如果查询条件为空,使用原始文本 + if not query: + query = otxt + # 返回匹配文本表达式和关键词 + return MatchTextExpr(self.query_fields, query, 100, {"minimum_should_match": min_match}), keywords + # 如果没有生成查询条件,只返回关键词 return None, keywords def hybrid_similarity(self, avec, bvecs, atks, btkss, tkweight=0.3, vtweight=0.7): @@ -282,7 +328,7 @@ class FulltextQueryer: tk_syns = self.syn.lookup(tk) tk_syns = [FulltextQueryer.subSpecialChar(s) for s in tk_syns] tk_syns = [rag_tokenizer.fine_grained_tokenize(s) for s in tk_syns if s] - tk_syns = [f"\"{s}\"" if s.find(" ") > 0 else s for s in tk_syns] + tk_syns = [f'"{s}"' if s.find(" ") > 0 else s for s in tk_syns] tk = FulltextQueryer.subSpecialChar(tk) if tk.find(" ") > 0: tk = '"%s"' % tk @@ -291,5 +337,4 @@ class FulltextQueryer: if tk: keywords.append(f"{tk}^{w}") - return MatchTextExpr(self.query_fields, " ".join(keywords), 100, - {"minimum_should_match": min(3, len(keywords) / 10)}) + return MatchTextExpr(self.query_fields, " ".join(keywords), 100, {"minimum_should_match": min(3, len(keywords) / 10)}) diff --git a/rag/nlp/rag_tokenizer.py b/rag/nlp/rag_tokenizer.py index c262ca9..93f3705 100644 --- a/rag/nlp/rag_tokenizer.py +++ b/rag/nlp/rag_tokenizer.py @@ -22,9 +22,12 @@ import os import re import string import sys +from pathlib import Path from hanziconv import HanziConv from nltk import word_tokenize from nltk.stem import PorterStemmer, WordNetLemmatizer + +sys.path.append(str(Path(__file__).parent.parent.parent)) from api.utils.file_utils import get_project_base_directory @@ -38,7 +41,7 @@ class RagTokenizer: def loadDict_(self, fnm): logging.info(f"[HUQIE]:Build trie from {fnm}") try: - of = open(fnm, "r", encoding='utf-8') + of = open(fnm, "r", encoding="utf-8") while True: line = of.readline() if not line: @@ -46,7 +49,7 @@ class RagTokenizer: line = re.sub(r"[\r\n]+", "", line) line = re.split(r"[ \t]", line) k = self.key_(line[0]) - F = int(math.log(float(line[1]) / self.DENOMINATOR) + .5) + F = int(math.log(float(line[1]) / self.DENOMINATOR) + 0.5) if k not in self.trie_ or self.trie_[k][0] < F: self.trie_[self.key_(line[0])] = (F, line[2]) self.trie_[self.rkey_(line[0])] = 1 @@ -106,8 +109,8 @@ class RagTokenizer: if inside_code == 0x3000: inside_code = 0x0020 else: - inside_code -= 0xfee0 - if inside_code < 0x0020 or inside_code > 0x7e: # After the conversion, if it's not a half-width character, return the original character. + inside_code -= 0xFEE0 + if inside_code < 0x0020 or inside_code > 0x7E: # After the conversion, if it's not a half-width character, return the original character. rstring += uchar else: rstring += chr(inside_code) @@ -126,13 +129,11 @@ class RagTokenizer: # pruning S = s + 1 if s + 2 <= len(chars): - t1, t2 = "".join(chars[s:s + 1]), "".join(chars[s:s + 2]) - if self.trie_.has_keys_with_prefix(self.key_(t1)) and not self.trie_.has_keys_with_prefix( - self.key_(t2)): + t1, t2 = "".join(chars[s : s + 1]), "".join(chars[s : s + 2]) + if self.trie_.has_keys_with_prefix(self.key_(t1)) and not self.trie_.has_keys_with_prefix(self.key_(t2)): S = s + 2 - if len(preTks) > 2 and len( - preTks[-1][0]) == 1 and len(preTks[-2][0]) == 1 and len(preTks[-3][0]) == 1: - t1 = preTks[-1][0] + "".join(chars[s:s + 1]) + if len(preTks) > 2 and len(preTks[-1][0]) == 1 and len(preTks[-2][0]) == 1 and len(preTks[-3][0]) == 1: + t1 = preTks[-1][0] + "".join(chars[s : s + 1]) if self.trie_.has_keys_with_prefix(self.key_(t1)): S = s + 2 @@ -149,18 +150,18 @@ class RagTokenizer: if k in self.trie_: pretks.append((t, self.trie_[k])) else: - pretks.append((t, (-12, ''))) + pretks.append((t, (-12, ""))) res = max(res, self.dfs_(chars, e, pretks, tkslist)) if res > s: return res - t = "".join(chars[s:s + 1]) + t = "".join(chars[s : s + 1]) k = self.key_(t) if k in self.trie_: preTks.append((t, self.trie_[k])) else: - preTks.append((t, (-12, ''))) + preTks.append((t, (-12, ""))) return self.dfs_(chars, s + 1, preTks, tkslist) @@ -183,7 +184,7 @@ class RagTokenizer: F += freq L += 0 if len(tk) < 2 else 1 tks.append(tk) - #F /= len(tks) + # F /= len(tks) L /= len(tks) logging.debug("[SC] {} {} {} {} {}".format(tks, len(tks), L, F, B / len(tks) + L + F)) return tks, B / len(tks) + L + F @@ -219,8 +220,7 @@ class RagTokenizer: while s < len(line): e = s + 1 t = line[s:e] - while e < len(line) and self.trie_.has_keys_with_prefix( - self.key_(t)): + while e < len(line) and self.trie_.has_keys_with_prefix(self.key_(t)): e += 1 t = line[s:e] @@ -231,7 +231,7 @@ class RagTokenizer: if self.key_(t) in self.trie_: res.append((t, self.trie_[self.key_(t)])) else: - res.append((t, (0, ''))) + res.append((t, (0, ""))) s = e @@ -254,7 +254,7 @@ class RagTokenizer: if self.key_(t) in self.trie_: res.append((t, self.trie_[self.key_(t)])) else: - res.append((t, (0, ''))) + res.append((t, (0, ""))) s -= 1 @@ -277,13 +277,13 @@ class RagTokenizer: if _zh == zh: e += 1 continue - txt_lang_pairs.append((a[s: e], zh)) + txt_lang_pairs.append((a[s:e], zh)) s = e e = s + 1 zh = _zh if s >= len(a): continue - txt_lang_pairs.append((a[s: e], zh)) + txt_lang_pairs.append((a[s:e], zh)) return txt_lang_pairs def tokenize(self, line): @@ -293,12 +293,11 @@ class RagTokenizer: arr = self._split_by_lang(line) res = [] - for L,lang in arr: + for L, lang in arr: if not lang: res.extend([self.stemmer.stem(self.lemmatizer.lemmatize(t)) for t in word_tokenize(L)]) continue - if len(L) < 2 or re.match( - r"[a-z\.-]+$", L) or re.match(r"[0-9\.-]+$", L): + if len(L) < 2 or re.match(r"[a-z\.-]+$", L) or re.match(r"[0-9\.-]+$", L): res.append(L) continue @@ -314,7 +313,7 @@ class RagTokenizer: while i + same < len(tks1) and j + same < len(tks) and tks1[i + same] == tks[j + same]: same += 1 if same > 0: - res.append(" ".join(tks[j: j + same])) + res.append(" ".join(tks[j : j + same])) _i = i + same _j = j + same j = _j + 1 @@ -341,7 +340,7 @@ class RagTokenizer: same = 1 while i + same < len(tks1) and j + same < len(tks) and tks1[i + same] == tks[j + same]: same += 1 - res.append(" ".join(tks[j: j + same])) + res.append(" ".join(tks[j : j + same])) _i = i + same _j = j + same j = _j + 1 @@ -359,31 +358,64 @@ class RagTokenizer: return self.merge_(res) def fine_grained_tokenize(self, tks): + """ + 细粒度分词方法,根据文本特征(中英文比例、数字符号等)动态选择分词策略 + + 参数: + tks (str): 待分词的文本字符串 + + 返回: + str: 分词后的结果(用空格连接的词序列) + + 处理逻辑: + 1. 先按空格初步切分文本 + 2. 根据中文占比决定是否启用细粒度分词 + 3. 对特殊格式(短词、纯数字等)直接保留原样 + 4. 对长词或复杂词使用DFS回溯算法寻找最优切分 + 5. 对英文词进行额外校验和规范化处理 + """ + # 初始切分:按空格分割输入文本 tks = tks.split() + # 计算中文词占比(判断是否主要包含中文内容) zh_num = len([1 for c in tks if c and is_chinese(c[0])]) + # 如果中文占比低于20%,则按简单规则处理(主要处理英文混合文本) if zh_num < len(tks) * 0.2: res = [] for tk in tks: res.extend(tk.split("/")) return " ".join(res) + # 中文或复杂文本处理流程 res = [] for tk in tks: + # 规则1:跳过短词(长度<3)或纯数字/符号组合(如"3.14") if len(tk) < 3 or re.match(r"[0-9,\.-]+$", tk): res.append(tk) continue + + # 初始化候选分词列表 tkslist = [] + + # 规则2:超长词(长度>10)直接保留不切分 if len(tk) > 10: tkslist.append(tk) else: + # 使用DFS回溯算法寻找所有可能的分词组合 self.dfs_(tk, 0, [], tkslist) + + # 规则3:若无有效切分方案则保留原词 if len(tkslist) < 2: res.append(tk) continue + + # 从候选方案中选择最优切分(通过sortTks_排序) stk = self.sortTks_(tkslist)[1][0] + + # 规则4:若切分结果与原词长度相同则视为无效切分 if len(stk) == len(tk): stk = tk else: + # 英文特殊处理:检查子词长度是否合法 if re.match(r"[a-z\.-]+$", tk): for t in stk: if len(t) < 3: @@ -393,29 +425,28 @@ class RagTokenizer: stk = " ".join(stk) else: stk = " ".join(stk) - + # 中文词直接拼接结果 res.append(stk) return " ".join(self.english_normalize_(res)) def is_chinese(s): - if s >= u'\u4e00' and s <= u'\u9fa5': + if s >= "\u4e00" and s <= "\u9fa5": return True else: return False def is_number(s): - if s >= u'\u0030' and s <= u'\u0039': + if s >= "\u0030" and s <= "\u0039": return True else: return False def is_alphabet(s): - if (s >= u'\u0041' and s <= u'\u005a') or ( - s >= u'\u0061' and s <= u'\u007a'): + if (s >= "\u0041" and s <= "\u005a") or (s >= "\u0061" and s <= "\u007a"): return True else: return False @@ -424,8 +455,7 @@ def is_alphabet(s): def naiveQie(txt): tks = [] for t in txt.split(): - if tks and re.match(r".*[a-zA-Z]$", tks[-1] - ) and re.match(r".*[a-zA-Z]$", t): + if tks and re.match(r".*[a-zA-Z]$", tks[-1]) and re.match(r".*[a-zA-Z]$", t): tks.append(" ") tks.append(t) return tks @@ -441,43 +471,41 @@ addUserDict = tokenizer.addUserDict tradi2simp = tokenizer._tradi2simp strQ2B = tokenizer._strQ2B -if __name__ == '__main__': +if __name__ == "__main__": tknzr = RagTokenizer(debug=True) # huqie.addUserDict("/tmp/tmp.new.tks.dict") + tks = tknzr.tokenize("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈") + # logging.info(tknzr.fine_grained_tokenize(tks)) + print(tks) tks = tknzr.tokenize( - "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize( - "公开征求意见稿提出,境外投资者可使用自有人民币或外汇投资。使用外汇投资的,可通过债券持有人在香港人民币业务清算行及香港地区经批准可进入境内银行间外汇市场进行交易的境外人民币业务参加行(以下统称香港结算行)办理外汇资金兑换。香港结算行由此所产生的头寸可到境内银行间外汇市场平盘。使用外汇投资的,在其投资的债券到期或卖出后,原则上应兑换回外汇。") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize( - "多校划片就是一个小区对应多个小学初中,让买了学区房的家庭也不确定到底能上哪个学校。目的是通过这种方式为学区房降温,把就近入学落到实处。南京市长江大桥") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize( - "实际上当时他们已经将业务中心偏移到安全部门和针对政府企业的部门 Scripts are compiled and cached aaaaaaaaa") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize("虽然我不怎么玩") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize("蓝月亮如何在外资夹击中生存,那是全宇宙最有意思的") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize( - "涡轮增压发动机num最大功率,不像别的共享买车锁电子化的手段,我们接过来是否有意义,黄黄爱美食,不过,今天阿奇要讲到的这家农贸市场,说实话,还真蛮有特色的!不仅环境好,还打出了") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize("这周日你去吗?这周日你有空吗?") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize("Unity3D开发经验 测试开发工程师 c++双11双11 985 211 ") - logging.info(tknzr.fine_grained_tokenize(tks)) - tks = tknzr.tokenize( - "数据分析项目经理|数据分析挖掘|数据分析方向|商品数据分析|搜索数据分析 sql python hive tableau Cocos2d-") - logging.info(tknzr.fine_grained_tokenize(tks)) - if len(sys.argv) < 2: - sys.exit() - tknzr.DEBUG = False - tknzr.loadUserDict(sys.argv[1]) - of = open(sys.argv[2], "r") - while True: - line = of.readline() - if not line: - break - logging.info(tknzr.tokenize(line)) - of.close() + "公开征求意见稿提出,境外投资者可使用自有人民币或外汇投资。使用外汇投资的,可通过债券持有人在香港人民币业务清算行及香港地区经批准可进入境内银行间外汇市场进行交易的境外人民币业务参加行(以下统称香港结算行)办理外汇资金兑换。香港结算行由此所产生的头寸可到境内银行间外汇市场平盘。使用外汇投资的,在其投资的债券到期或卖出后,原则上应兑换回外汇。" + ) + print(tks) + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("多校划片就是一个小区对应多个小学初中,让买了学区房的家庭也不确定到底能上哪个学校。目的是通过这种方式为学区房降温,把就近入学落到实处。南京市长江大桥") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("实际上当时他们已经将业务中心偏移到安全部门和针对政府企业的部门 Scripts are compiled and cached aaaaaaaaa") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("虽然我不怎么玩") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("蓝月亮如何在外资夹击中生存,那是全宇宙最有意思的") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("涡轮增压发动机num最大功率,不像别的共享买车锁电子化的手段,我们接过来是否有意义,黄黄爱美食,不过,今天阿奇要讲到的这家农贸市场,说实话,还真蛮有特色的!不仅环境好,还打出了") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("这周日你去吗?这周日你有空吗?") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("Unity3D开发经验 测试开发工程师 c++双11双11 985 211 ") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # tks = tknzr.tokenize("数据分析项目经理|数据分析挖掘|数据分析方向|商品数据分析|搜索数据分析 sql python hive tableau Cocos2d-") + # logging.info(tknzr.fine_grained_tokenize(tks)) + # if len(sys.argv) < 2: + # sys.exit() + # tknzr.DEBUG = False + # tknzr.loadUserDict(sys.argv[1]) + # of = open(sys.argv[2], "r") + # while True: + # line = of.readline() + # if not line: + # break + # logging.info(tknzr.tokenize(line)) + # of.close() diff --git a/rag/nlp/search.py b/rag/nlp/search.py index a98c965..080bfeb 100644 --- a/rag/nlp/search.py +++ b/rag/nlp/search.py @@ -15,6 +15,7 @@ # import logging import re +import math from dataclasses import dataclass from rag.settings import TAG_FLD, PAGERANK_FLD @@ -24,7 +25,8 @@ import numpy as np from rag.utils.doc_store_conn import DocStoreConnection, MatchDenseExpr, FusionExpr, OrderByExpr -def index_name(uid): return f"ragflow_{uid}" +def index_name(uid): + return f"ragflow_{uid}" class Dealer: @@ -47,11 +49,10 @@ class Dealer: qv, _ = emb_mdl.encode_queries(txt) shape = np.array(qv).shape if len(shape) > 1: - raise Exception( - f"Dealer.get_vector returned array's shape {shape} doesn't match expectation(exact one dimension).") + raise Exception(f"Dealer.get_vector returned array's shape {shape} doesn't match expectation(exact one dimension).") embedding_data = [float(v) for v in qv] vector_column_name = f"q_{len(embedding_data)}_vec" - return MatchDenseExpr(vector_column_name, embedding_data, 'float', 'cosine', topk, {"similarity": similarity}) + return MatchDenseExpr(vector_column_name, embedding_data, "float", "cosine", topk, {"similarity": similarity}) def get_filters(self, req): condition = dict() @@ -64,15 +65,10 @@ class Dealer: condition[key] = req[key] return condition - def search(self, req, idx_names: str | list[str], - kb_ids: list[str], - emb_mdl=None, - highlight=False, - rank_feature: dict | None = None - ): + def search(self, req, idx_names: str | list[str], kb_ids: list[str], emb_mdl=None, highlight=False, rank_feature: dict | None = None): """ 执行混合检索(全文检索+向量检索) - + 参数: req: 请求参数字典,包含: - page: 页码 @@ -86,7 +82,7 @@ class Dealer: emb_mdl: 嵌入模型,用于向量检索 highlight: 是否返回高亮内容 rank_feature: 排序特征配置 - + 返回: SearchResult对象,包含: - total: 匹配总数 @@ -106,20 +102,39 @@ class Dealer: topk = int(req.get("topk", 1024)) ps = int(req.get("size", topk)) offset, limit = pg * ps, ps - + # 3. 设置返回字段(默认包含文档名、内容等核心字段) - src = req.get("fields", - ["docnm_kwd", "content_ltks", "kb_id", "img_id", "title_tks", "important_kwd", "position_int", - "doc_id", "page_num_int", "top_int", "create_timestamp_flt", "knowledge_graph_kwd", - "question_kwd", "question_tks", - "available_int", "content_with_weight", PAGERANK_FLD, TAG_FLD]) - kwds = set([]) + src = req.get( + "fields", + [ + "docnm_kwd", + "content_ltks", + "kb_id", + "img_id", + "title_tks", + "important_kwd", + "position_int", + "doc_id", + "page_num_int", + "top_int", + "create_timestamp_flt", + "knowledge_graph_kwd", + "question_kwd", + "question_tks", + "available_int", + "content_with_weight", + PAGERANK_FLD, + TAG_FLD, + ], + ) + kwds = set([]) # 初始化关键词集合 # 4. 处理查询问题 - qst = req.get("question", "") - q_vec = [] + qst = req.get("question", "") # 获取查询问题文本 + print(f"收到前端问题:{qst}") + q_vec = [] # 初始化查询向量(如需向量检索) if not qst: - # 4.1 无查询文本时的处理(按文档排序) + # 4.1 若查询文本为空,执行默认排序检索(通常用于无搜索条件浏览)(注:前端测试检索时会禁止空文本的提交) if req.get("sort"): orderBy.asc("page_num_int") orderBy.asc("top_int") @@ -128,44 +143,58 @@ class Dealer: total = self.dataStore.getTotal(res) logging.debug("Dealer.search TOTAL: {}".format(total)) else: - # 4.2 有查询文本时的处理 - highlightFields = ["content_ltks", "title_tks"] if highlight else [] - + # 4.2 若存在查询文本,进入全文/混合检索流程 + highlightFields = ["content_ltks", "title_tks"] if highlight else [] # highlight当前会一直为False,不起作用 # 4.2.1 生成全文检索表达式和关键词 matchText, keywords = self.qryr.question(qst, min_match=0.3) + print(f"matchText.matching_text: {matchText.matching_text}") + print(f"keywords: {keywords}\n") if emb_mdl is None: - # 4.2.2 纯全文检索模式 + # 4.2.2 纯全文检索模式 (未提供向量模型,正常情况不会进入) matchExprs = [matchText] - res = self.dataStore.search(src, highlightFields, filters, matchExprs, orderBy, offset, limit, - idx_names, kb_ids, rank_feature=rank_feature) + res = self.dataStore.search(src, highlightFields, filters, matchExprs, orderBy, offset, limit, idx_names, kb_ids, rank_feature=rank_feature) total = self.dataStore.getTotal(res) logging.debug("Dealer.search TOTAL: {}".format(total)) else: - # 4.2.3 混合检索模式(全文+向量) - # 生成查询向量 + # 4.2.3 混合检索模式(全文+向量) + # 生成查询向量 matchDense = self.get_vector(qst, emb_mdl, topk, req.get("similarity", 0.1)) q_vec = matchDense.embedding_data + # 在返回字段中加入查询向量字段 src.append(f"q_{len(q_vec)}_vec") - # 设置混合检索权重(全文5% + 向量95%) + # 创建融合表达式:设置向量匹配为95%,全文为5%(可以调整权重) fusionExpr = FusionExpr("weighted_sum", topk, {"weights": "0.05, 0.95"}) + # 构建混合查询表达式 matchExprs = [matchText, matchDense, fusionExpr] # 执行混合检索 - res = self.dataStore.search(src, highlightFields, filters, matchExprs, orderBy, offset, limit, - idx_names, kb_ids, rank_feature=rank_feature) + res = self.dataStore.search(src, highlightFields, filters, matchExprs, orderBy, offset, limit, idx_names, kb_ids, rank_feature=rank_feature) total = self.dataStore.getTotal(res) logging.debug("Dealer.search TOTAL: {}".format(total)) - # If result is empty, try again with lower min_match - if total == 0: - matchText, _ = self.qryr.question(qst, min_match=0.1) - filters.pop("doc_ids", None) - matchDense.extra_options["similarity"] = 0.17 - res = self.dataStore.search(src, highlightFields, filters, [matchText, matchDense, fusionExpr], - orderBy, offset, limit, idx_names, kb_ids, rank_feature=rank_feature) - total = self.dataStore.getTotal(res) - logging.debug("Dealer.search 2 TOTAL: {}".format(total)) + print(f"共查询到: {total} 条信息") + # print(f"查询信息结果: {res}\n") + # 若未找到结果,则尝试降低匹配门槛后重试 + if total == 0: + if filters.get("doc_id"): + # 有特定文档ID时执行无条件查询 + res = self.dataStore.search(src, [], filters, [], orderBy, offset, limit, idx_names, kb_ids) + total = self.dataStore.getTotal(res) + print(f"针对选中文档,共查询到: {total} 条信息") + # print(f"查询信息结果: {res}\n") + else: + # 否则调整全文和向量匹配参数再次搜索 + matchText, _ = self.qryr.question(qst, min_match=0.1) + filters.pop("doc_id", None) + matchDense.extra_options["similarity"] = 0.17 + res = self.dataStore.search(src, highlightFields, filters, [matchText, matchDense, fusionExpr], orderBy, offset, limit, idx_names, kb_ids, rank_feature=rank_feature) + total = self.dataStore.getTotal(res) + logging.debug("Dealer.search 2 TOTAL: {}".format(total)) + print(f"再次查询,共查询到: {total} 条信息") + # print(f"查询信息结果: {res}\n") + + # 4.3 处理关键词(对关键词进行更细粒度的切词) for k in keywords: kwds.add(k) for kk in rag_tokenizer.fine_grained_tokenize(k).split(): @@ -175,27 +204,23 @@ class Dealer: continue kwds.add(kk) + # 5. 提取检索结果中的ID、字段、聚合和高亮信息 logging.debug(f"TOTAL: {total}") - ids = self.dataStore.getChunkIds(res) - keywords = list(kwds) - highlight = self.dataStore.getHighlight(res, keywords, "content_with_weight") - aggs = self.dataStore.getAggregation(res, "docnm_kwd") - return self.SearchResult( - total=total, - ids=ids, - query_vector=q_vec, - aggregation=aggs, - highlight=highlight, - field=self.dataStore.getFields(res, src), - keywords=keywords - ) + ids = self.dataStore.getChunkIds(res) # 提取匹配chunk的ID + keywords = list(kwds) # 转为列表格式返回 + highlight = self.dataStore.getHighlight(res, keywords, "content_with_weight") # 获取高亮内容 + aggs = self.dataStore.getAggregation(res, "docnm_kwd") # 执行基于文档名的聚合分析 + print(f"ids:{ids}") + print(f"keywords:{keywords}") + print(f"highlight:{highlight}") + print(f"aggs:{aggs}") + return self.SearchResult(total=total, ids=ids, query_vector=q_vec, aggregation=aggs, highlight=highlight, field=self.dataStore.getFields(res, src), keywords=keywords) @staticmethod def trans2floats(txt): return [float(t) for t in txt.split("\t")] - def insert_citations(self, answer, chunks, chunk_v, - embd_mdl, tkweight=0.1, vtweight=0.9): + def insert_citations(self, answer, chunks, chunk_v, embd_mdl, tkweight=0.1, vtweight=0.9): assert len(chunks) == len(chunk_v) if not chunks: return answer, set([]) @@ -211,12 +236,9 @@ class Dealer: i += 1 if i < len(pieces): i += 1 - pieces_.append("".join(pieces[st: i]) + "\n") + pieces_.append("".join(pieces[st:i]) + "\n") else: - pieces_.extend( - re.split( - r"([^\|][;。?!!\n]|[a-z][.?;!][ \n])", - pieces[i])) + pieces_.extend(re.split(r"([^\|][;。?!!\n]|[a-z][.?;!][ \n])", pieces[i])) i += 1 pieces = pieces_ else: @@ -239,30 +261,22 @@ class Dealer: ans_v, _ = embd_mdl.encode(pieces_) for i in range(len(chunk_v)): if len(ans_v[0]) != len(chunk_v[i]): - chunk_v[i] = [0.0]*len(ans_v[0]) + chunk_v[i] = [0.0] * len(ans_v[0]) logging.warning("The dimension of query and chunk do not match: {} vs. {}".format(len(ans_v[0]), len(chunk_v[i]))) - assert len(ans_v[0]) == len(chunk_v[0]), "The dimension of query and chunk do not match: {} vs. {}".format( - len(ans_v[0]), len(chunk_v[0])) + assert len(ans_v[0]) == len(chunk_v[0]), "The dimension of query and chunk do not match: {} vs. {}".format(len(ans_v[0]), len(chunk_v[0])) - chunks_tks = [rag_tokenizer.tokenize(self.qryr.rmWWW(ck)).split() - for ck in chunks] + chunks_tks = [rag_tokenizer.tokenize(self.qryr.rmWWW(ck)).split() for ck in chunks] cites = {} thr = 0.63 while thr > 0.3 and len(cites.keys()) == 0 and pieces_ and chunks_tks: for i, a in enumerate(pieces_): - sim, tksim, vtsim = self.qryr.hybrid_similarity(ans_v[i], - chunk_v, - rag_tokenizer.tokenize( - self.qryr.rmWWW(pieces_[i])).split(), - chunks_tks, - tkweight, vtweight) + sim, tksim, vtsim = self.qryr.hybrid_similarity(ans_v[i], chunk_v, rag_tokenizer.tokenize(self.qryr.rmWWW(pieces_[i])).split(), chunks_tks, tkweight, vtweight) mx = np.max(sim) * 0.99 logging.debug("{} SIM: {}".format(pieces_[i], mx)) if mx < thr: continue - cites[idx[i]] = list( - set([str(ii) for ii in range(len(chunk_v)) if sim[ii] > mx]))[:4] + cites[idx[i]] = list(set([str(ii) for ii in range(len(chunk_v)) if sim[ii] > mx]))[:4] thr *= 0.8 res = "" @@ -294,7 +308,7 @@ class Dealer: if not query_rfea: return np.array([0 for _ in range(len(search_res.ids))]) + pageranks - q_denor = np.sqrt(np.sum([s*s for t,s in query_rfea.items() if t != PAGERANK_FLD])) + q_denor = np.sqrt(np.sum([s * s for t, s in query_rfea.items() if t != PAGERANK_FLD])) for i in search_res.ids: nor, denor = 0, 0 for t, sc in eval(search_res.field[i].get(TAG_FLD, "{}")).items(): @@ -304,13 +318,10 @@ class Dealer: if denor == 0: rank_fea.append(0) else: - rank_fea.append(nor/np.sqrt(denor)/q_denor) - return np.array(rank_fea)*10. + pageranks + rank_fea.append(nor / np.sqrt(denor) / q_denor) + return np.array(rank_fea) * 10.0 + pageranks - def rerank(self, sres, query, tkweight=0.3, - vtweight=0.7, cfield="content_ltks", - rank_feature: dict | None = None - ): + def rerank(self, sres, query, tkweight=0.3, vtweight=0.7, cfield="content_ltks", rank_feature: dict | None = None): _, keywords = self.qryr.question(query) vector_size = len(sres.query_vector) vector_column = f"q_{vector_size}_vec" @@ -339,16 +350,11 @@ class Dealer: ## For rank feature(tag_fea) scores. rank_fea = self._rank_feature_scores(rank_feature, sres) - sim, tksim, vtsim = self.qryr.hybrid_similarity(sres.query_vector, - ins_embd, - keywords, - ins_tw, tkweight, vtweight) + sim, tksim, vtsim = self.qryr.hybrid_similarity(sres.query_vector, ins_embd, keywords, ins_tw, tkweight, vtweight) return sim + rank_fea, tksim, vtsim - def rerank_by_model(self, rerank_mdl, sres, query, tkweight=0.3, - vtweight=0.7, cfield="content_ltks", - rank_feature: dict | None = None): + def rerank_by_model(self, rerank_mdl, sres, query, tkweight=0.3, vtweight=0.7, cfield="content_ltks", rank_feature: dict | None = None): _, keywords = self.qryr.question(query) for i in sres.ids: @@ -367,21 +373,31 @@ class Dealer: ## For rank feature(tag_fea) scores. rank_fea = self._rank_feature_scores(rank_feature, sres) - return tkweight * (np.array(tksim)+rank_fea) + vtweight * vtsim, tksim, vtsim + return tkweight * (np.array(tksim) + rank_fea) + vtweight * vtsim, tksim, vtsim def hybrid_similarity(self, ans_embd, ins_embd, ans, inst): - return self.qryr.hybrid_similarity(ans_embd, - ins_embd, - rag_tokenizer.tokenize(ans).split(), - rag_tokenizer.tokenize(inst).split()) + return self.qryr.hybrid_similarity(ans_embd, ins_embd, rag_tokenizer.tokenize(ans).split(), rag_tokenizer.tokenize(inst).split()) - def retrieval(self, question, embd_mdl, tenant_ids, kb_ids, page, page_size, similarity_threshold=0.2, - vector_similarity_weight=0.3, top=1024, doc_ids=None, aggs=True, - rerank_mdl=None, highlight=False, - rank_feature: dict | None = {PAGERANK_FLD: 10}): + def retrieval( + self, + question, + embd_mdl, + tenant_ids, + kb_ids, + page, + page_size, + similarity_threshold=0.2, + vector_similarity_weight=0.3, + top=1024, + doc_ids=None, + aggs=True, + rerank_mdl=None, + highlight=False, + rank_feature: dict | None = {PAGERANK_FLD: 10}, + ): """ 执行检索操作,根据问题查询相关文档片段 - + 参数说明: - question: 用户输入的查询问题 - embd_mdl: 嵌入模型,用于将文本转换为向量 @@ -397,68 +413,58 @@ class Dealer: - rerank_mdl: 重排序模型 - highlight: 是否高亮匹配内容 - rank_feature: 排序特征,如PageRank值 - + 返回: 包含检索结果的字典,包括总数、文档片段和文档聚合信息 """ - # 初始化结果字典 + # 初始化结果字典 ranks = {"total": 0, "chunks": [], "doc_aggs": {}} if not question: return ranks # 设置重排序页面限制 - RERANK_PAGE_LIMIT = 3 + RERANK_LIMIT = 64 + RERANK_LIMIT = int(RERANK_LIMIT // page_size + ((RERANK_LIMIT % page_size) / (page_size * 1.0) + 0.5)) * page_size if page_size > 1 else 1 + if RERANK_LIMIT < 1: + RERANK_LIMIT = 1 # 构建检索请求参数 - req = {"kb_ids": kb_ids, "doc_ids": doc_ids, "size": max(page_size * RERANK_PAGE_LIMIT, 128), - "question": question, "vector": True, "topk": top, - "similarity": similarity_threshold, - "available_int": 1} - - # 如果页码超过重排序限制,直接请求指定页的数据 - if page > RERANK_PAGE_LIMIT: - req["page"] = page - req["size"] = page_size + req = { + "kb_ids": kb_ids, + "doc_ids": doc_ids, + "page": math.ceil(page_size * page / RERANK_LIMIT), + "size": RERANK_LIMIT, + "question": question, + "vector": True, + "topk": top, + "similarity": similarity_threshold, + "available_int": 1, + } # 处理租户ID格式 if isinstance(tenant_ids, str): tenant_ids = tenant_ids.split(",") - + # 执行搜索操作 - sres = self.search(req, [index_name(tid) for tid in tenant_ids], - kb_ids, embd_mdl, highlight, rank_feature=rank_feature) - ranks["total"] = sres.total - - # 根据页码决定是否需要重排序 - if page <= RERANK_PAGE_LIMIT: - # 前几页需要重排序以提高结果质量 - if rerank_mdl and sres.total > 0: - # 使用重排序模型进行重排序 - sim, tsim, vsim = self.rerank_by_model(rerank_mdl, - sres, question, 1 - vector_similarity_weight, - vector_similarity_weight, - rank_feature=rank_feature) - else: - # 使用默认方法进行重排序 - sim, tsim, vsim = self.rerank( - sres, question, 1 - vector_similarity_weight, vector_similarity_weight, - rank_feature=rank_feature) - # 根据相似度降序排序,并选择当前页的结果 - idx = np.argsort(sim * -1)[(page - 1) * page_size:page * page_size] + sres = self.search(req, [index_name(tid) for tid in tenant_ids], kb_ids, embd_mdl, highlight, rank_feature=rank_feature) + + if rerank_mdl and sres.total > 0: + sim, tsim, vsim = self.rerank_by_model(rerank_mdl, sres, question, 1 - vector_similarity_weight, vector_similarity_weight, rank_feature=rank_feature) else: - # 后续页面不需要重排序,直接使用搜索结果 - sim = tsim = vsim = [1] * len(sres.ids) - idx = list(range(len(sres.ids))) - - # 获取向量维度和列名 + sim, tsim, vsim = self.rerank(sres, question, 1 - vector_similarity_weight, vector_similarity_weight, rank_feature=rank_feature) + # Already paginated in search function + idx = np.argsort(sim * -1)[(page - 1) * page_size : page * page_size] + dim = len(sres.query_vector) vector_column = f"q_{dim}_vec" zero_vector = [0.0] * dim - - # 处理每个检索结果 + if doc_ids: + similarity_threshold = 0 + page_size = 30 + sim_np = np.array(sim) + filtered_count = (sim_np >= similarity_threshold).sum() + ranks["total"] = int(filtered_count) # Convert from np.int64 to Python int otherwise JSON serializable error for i in idx: - # 过滤低于阈值的结果 if sim[i] < similarity_threshold: break - # 控制返回结果数量 if len(ranks["chunks"]) >= page_size: if aggs: continue @@ -468,7 +474,6 @@ class Dealer: dnm = chunk.get("docnm_kwd", "") did = chunk.get("doc_id", "") position_int = chunk.get("position_int", []) - # 构建结果字典 d = { "chunk_id": id, "content_ltks": chunk["content_ltks"], @@ -483,9 +488,8 @@ class Dealer: "term_similarity": tsim[i], "vector": chunk.get(vector_column, zero_vector), "positions": position_int, + "doc_type_kwd": chunk.get("doc_type_kwd", ""), } - - # 处理高亮内容 if highlight and sres.highlight: if id in sres.highlight: d["highlight"] = rmSpace(sres.highlight[id]) @@ -495,12 +499,7 @@ class Dealer: if dnm not in ranks["doc_aggs"]: ranks["doc_aggs"][dnm] = {"doc_id": did, "count": 0} ranks["doc_aggs"][dnm]["count"] += 1 - # 将文档聚合信息转换为列表格式,并按计数降序排序 - ranks["doc_aggs"] = [{"doc_name": k, - "doc_id": v["doc_id"], - "count": v["count"]} for k, - v in sorted(ranks["doc_aggs"].items(), - key=lambda x: x[1]["count"] * -1)] + ranks["doc_aggs"] = [{"doc_name": k, "doc_id": v["doc_id"], "count": v["count"]} for k, v in sorted(ranks["doc_aggs"].items(), key=lambda x: x[1]["count"] * -1)] ranks["chunks"] = ranks["chunks"][:page_size] return ranks @@ -509,16 +508,12 @@ class Dealer: tbl = self.dataStore.sql(sql, fetch_size, format) return tbl - def chunk_list(self, doc_id: str, tenant_id: str, - kb_ids: list[str], max_count=1024, - offset=0, - fields=["docnm_kwd", "content_with_weight", "img_id"]): + def chunk_list(self, doc_id: str, tenant_id: str, kb_ids: list[str], max_count=1024, offset=0, fields=["docnm_kwd", "content_with_weight", "img_id"]): condition = {"doc_id": doc_id} res = [] bs = 128 for p in range(offset, max_count, bs): - es_res = self.dataStore.search(fields, [], condition, [], OrderByExpr(), p, bs, index_name(tenant_id), - kb_ids) + es_res = self.dataStore.search(fields, [], condition, [], OrderByExpr(), p, bs, index_name(tenant_id), kb_ids) dict_chunks = self.dataStore.getFields(es_res, fields) for id, doc in dict_chunks.items(): doc["id"] = id @@ -548,8 +543,7 @@ class Dealer: if not aggs: return False cnt = np.sum([c for _, c in aggs]) - tag_fea = sorted([(a, round(0.1*(c + 1) / (cnt + S) / max(1e-6, all_tags.get(a, 0.0001)))) for a, c in aggs], - key=lambda x: x[1] * -1)[:topn_tags] + tag_fea = sorted([(a, round(0.1 * (c + 1) / (cnt + S) / max(1e-6, all_tags.get(a, 0.0001)))) for a, c in aggs], key=lambda x: x[1] * -1)[:topn_tags] doc[TAG_FLD] = {a: c for a, c in tag_fea if c > 0} return True @@ -564,6 +558,5 @@ class Dealer: if not aggs: return {} cnt = np.sum([c for _, c in aggs]) - tag_fea = sorted([(a, round(0.1*(c + 1) / (cnt + S) / max(1e-6, all_tags.get(a, 0.0001)))) for a, c in aggs], - key=lambda x: x[1] * -1)[:topn_tags] - return {a: max(1, c) for a, c in tag_fea} + tag_fea = sorted([(a, round(0.1 * (c + 1) / (cnt + S) / max(1e-6, all_tags.get(a, 0.0001)))) for a, c in aggs], key=lambda x: x[1] * -1)[:topn_tags] + return {a.replace(".", "_"): max(1, c) for a, c in tag_fea} diff --git a/rag/nlp/synonym.py b/rag/nlp/synonym.py index a826a32..8c2418b 100644 --- a/rag/nlp/synonym.py +++ b/rag/nlp/synonym.py @@ -25,20 +25,18 @@ from api.utils.file_utils import get_project_base_directory class Dealer: def __init__(self, redis=None): - self.lookup_num = 100000000 self.load_tm = time.time() - 1000000 self.dictionary = None path = os.path.join(get_project_base_directory(), "rag/res", "synonym.json") try: - self.dictionary = json.load(open(path, 'r')) + self.dictionary = json.load(open(path, "r")) except Exception: logging.warning("Missing synonym.json") self.dictionary = {} if not redis: - logging.warning( - "Realtime synonym is disabled, since no redis connection.") + logging.warning("Realtime synonym is disabled, since no redis connection.") if not len(self.dictionary.keys()): logging.warning("Fail to load synonym") @@ -67,18 +65,36 @@ class Dealer: logging.error("Fail to load synonym!" + str(e)) def lookup(self, tk, topn=8): + """ + 查找输入词条(tk)的同义词,支持英文和中文混合处理 + + 参数: + tk (str): 待查询的词条(如"happy"或"苹果") + topn (int): 最多返回的同义词数量,默认为8 + + 返回: + list: 同义词列表,可能为空(无同义词时) + + 处理逻辑: + 1. 英文单词:使用WordNet语义网络查询 + 2. 中文/其他:从预加载的自定义词典查询 + """ + # 英文单词处理分支 if re.match(r"[a-z]+$", tk): res = list(set([re.sub("_", " ", syn.name().split(".")[0]) for syn in wordnet.synsets(tk)]) - set([tk])) return [t for t in res if t] + # 中文/其他词条处理 self.lookup_num += 1 - self.load() + self.load() # 自定义词典 + # 从字典获取同义词,默认返回空列表 res = self.dictionary.get(re.sub(r"[ \t]+", " ", tk.lower()), []) + # 兼容处理:如果字典值是字符串,转为单元素列表 if isinstance(res, str): res = [res] return res[:topn] -if __name__ == '__main__': +if __name__ == "__main__": dl = Dealer() print(dl.dictionary) diff --git a/rag/nlp/term_weight.py b/rag/nlp/term_weight.py index 97c3d99..df4d2a9 100644 --- a/rag/nlp/term_weight.py +++ b/rag/nlp/term_weight.py @@ -1,4 +1,4 @@ - # +# # Copyright 2024 The InfiniFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,37 +26,41 @@ from api.utils.file_utils import get_project_base_directory class Dealer: def __init__(self): - self.stop_words = set(["请问", - "您", - "你", - "我", - "他", - "是", - "的", - "就", - "有", - "于", - "及", - "即", - "在", - "为", - "最", - "有", - "从", - "以", - "了", - "将", - "与", - "吗", - "吧", - "中", - "#", - "什么", - "怎么", - "哪个", - "哪些", - "啥", - "相关"]) + self.stop_words = set( + [ + "请问", + "您", + "你", + "我", + "他", + "是", + "的", + "就", + "有", + "于", + "及", + "即", + "在", + "为", + "最", + "有", + "从", + "以", + "了", + "将", + "与", + "吗", + "吧", + "中", + "#", + "什么", + "怎么", + "哪个", + "哪些", + "啥", + "相关", + ] + ) def load_dict(fnm): res = {} @@ -90,50 +94,45 @@ class Dealer: logging.warning("Load term.freq FAIL!") def pretoken(self, txt, num=False, stpwd=True): - patt = [ - r"[~—\t @#%!<>,\.\?\":;'\{\}\[\]_=\(\)\|,。?》•●○↓《;‘’:“”【¥ 】…¥!、·()×`&\\/「」\\]" - ] - rewt = [ - ] + patt = [r"[~—\t @#%!<>,\.\?\":;'\{\}\[\]_=\(\)\|,。?》•●○↓《;‘’:“”【¥ 】…¥!、·()×`&\\/「」\\]"] + rewt = [] for p, r in rewt: txt = re.sub(p, r, txt) res = [] for t in rag_tokenizer.tokenize(txt).split(): tk = t - if (stpwd and tk in self.stop_words) or ( - re.match(r"[0-9]$", tk) and not num): + if (stpwd and tk in self.stop_words) or (re.match(r"[0-9]$", tk) and not num): continue for p in patt: if re.match(p, t): tk = "#" break - #tk = re.sub(r"([\+\\-])", r"\\\1", tk) + # tk = re.sub(r"([\+\\-])", r"\\\1", tk) if tk != "#" and tk: res.append(tk) return res def tokenMerge(self, tks): - def oneTerm(t): return len(t) == 1 or re.match(r"[0-9a-z]{1,2}$", t) + def oneTerm(t): + return len(t) == 1 or re.match(r"[0-9a-z]{1,2}$", t) res, i = [], 0 while i < len(tks): j = i - if i == 0 and oneTerm(tks[i]) and len( - tks) > 1 and (len(tks[i + 1]) > 1 and not re.match(r"[0-9a-zA-Z]", tks[i + 1])): # 多 工位 + if i == 0 and oneTerm(tks[i]) and len(tks) > 1 and (len(tks[i + 1]) > 1 and not re.match(r"[0-9a-zA-Z]", tks[i + 1])): # 多 工位 res.append(" ".join(tks[0:2])) i = 2 continue - while j < len( - tks) and tks[j] and tks[j] not in self.stop_words and oneTerm(tks[j]): + while j < len(tks) and tks[j] and tks[j] not in self.stop_words and oneTerm(tks[j]): j += 1 if j - i > 1: if j - i < 5: res.append(" ".join(tks[i:j])) i = j else: - res.append(" ".join(tks[i:i + 2])) + res.append(" ".join(tks[i : i + 2])) i = i + 2 else: if len(tks[i]) > 0: @@ -153,15 +152,13 @@ class Dealer: 特殊分词方法,主要处理连续英文单词的合并 参数: txt: 待分词的文本字符串 - + 返回: 处理后的词条列表 """ tks = [] for t in re.sub(r"[ \t]+", " ", txt).split(): - if tks and re.match(r".*[a-zA-Z]$", tks[-1]) and \ - re.match(r".*[a-zA-Z]$", t) and tks and \ - self.ne.get(t, "") != "func" and self.ne.get(tks[-1], "") != "func": + if tks and re.match(r".*[a-zA-Z]$", tks[-1]) and re.match(r".*[a-zA-Z]$", t) and tks and self.ne.get(t, "") != "func" and self.ne.get(tks[-1], "") != "func": tks[-1] = tks[-1] + " " + t else: tks.append(t) @@ -180,8 +177,7 @@ class Dealer: return 0.01 if not self.ne or t not in self.ne: return 1 - m = {"toxic": 2, "func": 1, "corp": 3, "loca": 3, "sch": 3, "stock": 3, - "firstnm": 1} + m = {"toxic": 2, "func": 1, "corp": 3, "loca": 3, "sch": 3, "stock": 3, "firstnm": 1} return m[self.ne[t]] def postag(t): @@ -208,7 +204,7 @@ class Dealer: if not s and len(t) >= 4: s = [tt for tt in rag_tokenizer.fine_grained_tokenize(t).split() if len(tt) > 1] if len(s) > 1: - s = np.min([freq(tt) for tt in s]) / 6. + s = np.min([freq(tt) for tt in s]) / 6.0 else: s = 0 @@ -224,18 +220,18 @@ class Dealer: elif len(t) >= 4: s = [tt for tt in rag_tokenizer.fine_grained_tokenize(t).split() if len(tt) > 1] if len(s) > 1: - return max(3, np.min([df(tt) for tt in s]) / 6.) + return max(3, np.min([df(tt) for tt in s]) / 6.0) return 3 - def idf(s, N): return math.log10(10 + ((N - s + 0.5) / (s + 0.5))) + def idf(s, N): + return math.log10(10 + ((N - s + 0.5) / (s + 0.5))) tw = [] if not preprocess: idf1 = np.array([idf(freq(t), 10000000) for t in tks]) idf2 = np.array([idf(df(t), 1000000000) for t in tks]) - wts = (0.3 * idf1 + 0.7 * idf2) * \ - np.array([ner(t) * postag(t) for t in tks]) + wts = (0.3 * idf1 + 0.7 * idf2) * np.array([ner(t) * postag(t) for t in tks]) wts = [s for s in wts] tw = list(zip(tks, wts)) else: @@ -243,8 +239,7 @@ class Dealer: tt = self.tokenMerge(self.pretoken(tk, True)) idf1 = np.array([idf(freq(t), 10000000) for t in tt]) idf2 = np.array([idf(df(t), 1000000000) for t in tt]) - wts = (0.3 * idf1 + 0.7 * idf2) * \ - np.array([ner(t) * postag(t) for t in tt]) + wts = (0.3 * idf1 + 0.7 * idf2) * np.array([ner(t) * postag(t) for t in tt]) wts = [s for s in wts] tw.extend(zip(tt, wts)) diff --git a/rag/prompts.py b/rag/prompts.py index 2e2723c..34e6499 100644 --- a/rag/prompts.py +++ b/rag/prompts.py @@ -42,6 +42,10 @@ def chunks_format(reference): "image_id": get_value(chunk, "image_id", "img_id"), "positions": get_value(chunk, "positions", "position_int"), "url": chunk.get("url"), + "similarity": chunk.get("similarity"), + "vector_similarity": chunk.get("vector_similarity"), + "term_similarity": chunk.get("term_similarity"), + "doc_type": chunk.get("doc_type_kwd"), } for chunk in reference.get("chunks", []) ] @@ -145,15 +149,17 @@ def kb_prompt(kbinfos, max_tokens): doc2chunks = defaultdict(lambda: {"chunks": [], "meta": []}) for i, ck in enumerate(kbinfos["chunks"][:chunks_num]): - doc2chunks[ck["docnm_kwd"]]["chunks"].append((f"URL: {ck['url']}\n" if "url" in ck else "") + f"ID: {i}\n" + ck["content_with_weight"]) + cnt = f"---\nID: {i}\n" + (f"URL: {ck['url']}\n" if "url" in ck else "") + cnt += ck["content_with_weight"] + doc2chunks[ck["docnm_kwd"]]["chunks"].append(cnt) doc2chunks[ck["docnm_kwd"]]["meta"] = docs.get(ck["doc_id"], {}) knowledges = [] for nm, cks_meta in doc2chunks.items(): - txt = f"\nDocument: {nm} \n" + txt = f"\n文档: {nm} \n" for k, v in cks_meta["meta"].items(): txt += f"{k}: {v}\n" - txt += "Relevant fragments as following:\n" + txt += "相关片段如下:\n" for i, chunk in enumerate(cks_meta["chunks"], 1): txt += f"{chunk}\n" knowledges.append(txt) @@ -388,3 +394,57 @@ Output: except Exception as e: logging.exception(f"JSON parsing error: {result} -> {e}") raise e + + +def vision_llm_describe_prompt(page=None) -> str: + prompt_en = """ +INSTRUCTION: +Transcribe the content from the provided PDF page image into clean Markdown format. +- Only output the content transcribed from the image. +- Do NOT output this instruction or any other explanation. +- If the content is missing or you do not understand the input, return an empty string. + +RULES: +1. Do NOT generate examples, demonstrations, or templates. +2. Do NOT output any extra text such as 'Example', 'Example Output', or similar. +3. Do NOT generate any tables, headings, or content that is not explicitly present in the image. +4. Transcribe content word-for-word. Do NOT modify, translate, or omit any content. +5. Do NOT explain Markdown or mention that you are using Markdown. +6. Do NOT wrap the output in ```markdown or ``` blocks. +7. Only apply Markdown structure to headings, paragraphs, lists, and tables, strictly based on the layout of the image. Do NOT create tables unless an actual table exists in the image. +8. Preserve the original language, information, and order exactly as shown in the image. +""" + + if page is not None: + prompt_en += f"\nAt the end of the transcription, add the page divider: `--- Page {page} ---`." + + prompt_en += """ +FAILURE HANDLING: +- If you do not detect valid content in the image, return an empty string. +""" + return prompt_en + + +def vision_llm_figure_describe_prompt() -> str: + prompt = """ +You are an expert visual data analyst. Analyze the image and provide a comprehensive description of its content. Focus on identifying the type of visual data representation (e.g., bar chart, pie chart, line graph, table, flowchart), its structure, and any text captions or labels included in the image. + +Tasks: +1. Describe the overall structure of the visual representation. Specify if it is a chart, graph, table, or diagram. +2. Identify and extract any axes, legends, titles, or labels present in the image. Provide the exact text where available. +3. Extract the data points from the visual elements (e.g., bar heights, line graph coordinates, pie chart segments, table rows and columns). +4. Analyze and explain any trends, comparisons, or patterns shown in the data. +5. Capture any annotations, captions, or footnotes, and explain their relevance to the image. +6. Only include details that are explicitly present in the image. If an element (e.g., axis, legend, or caption) does not exist or is not visible, do not mention it. + +Output format (include only sections relevant to the image content): +- Visual Type: [Type] +- Title: [Title text, if available] +- Axes / Legends / Labels: [Details, if available] +- Data Points: [Extracted data] +- Trends / Insights: [Analysis and interpretation] +- Captions / Annotations: [Text and relevance, if available] + +Ensure high accuracy, clarity, and completeness in your analysis, and includes only the information present in the image. Avoid unnecessary statements about missing elements. +""" + return prompt diff --git a/rag/res/synonym.json b/rag/res/synonym.json index 369ba17..4414baf 100644 --- a/rag/res/synonym.json +++ b/rag/res/synonym.json @@ -1,10539 +1,5 @@ { -"阿为特": "873693", -"873693": "阿为特", -"卓兆点胶": "873726", -"873726": "卓兆点胶", -"骑士乳业": "832786", -"832786": "骑士乳业", -"中集环科": "301559", -"301559": "中集环科", -"N浩辰": "688657", -"688657": "N浩辰", -"三态股份": "301558", -"301558": "三态股份", -"爱科赛博": "688719", -"688719": "爱科赛博", -"万邦医药": "301520", -"301520": "万邦医药", -"飞南资源": "301500", -"301500": "飞南资源", -"盛科通信": "688702", -"688702": "盛科通信", -"中巨芯": "688549", -"688549": "中巨芯", -"视声智能": "870976", -"870976": "视声智能", -"德福科技": "301511", -"301511": "德福科技", -"宏裕包材": "837174", -"837174": "宏裕包材", -"盟固利": "301487", -"301487": "盟固利", -"鸿智科技": "870726", -"870726": "鸿智科技", -"舜禹股份": "301519", -"301519": "舜禹股份", -"锦波生物": "832982", -"832982": "锦波生物", -"英华特": "301272", -"301272": "英华特", -"时创能源": "688429", -"688429": "时创能源", -"致欧科技": "301376", -"301376": "致欧科技", -"智翔金泰": "688443", -"688443": "智翔金泰", -"阿特斯": "688472", -"688472": "阿特斯", -"中科飞测": "688361", -"688361": "中科飞测", -"慧智微": "688512", -"688512": "慧智微", -"中芯集成": "688469", -"688469": "中芯集成", -"华原股份": "838837", -"838837": "华原股份", -"陕西能源": "001286", -"001286": "陕西能源", -"云天励飞": "688343", -"688343": "云天励飞", -"彩蝶实业": "603073", -"603073": "彩蝶实业", -"康乐卫士": "833575", -"833575": "康乐卫士", -"百甲科技": "835857", -"835857": "百甲科技", -"绿通科技": "301322", -"301322": "绿通科技", -"一彬科技": "001278", -"001278": "一彬科技", -"华人健康": "301408", -"301408": "华人健康", -"真兰仪表": "301303", -"301303": "真兰仪表", -"和泰机电": "001225", -"001225": "和泰机电", -"阿莱德": "301419", -"301419": "阿莱德", -"裕太微": "688515", -"688515": "裕太微", -"江瀚新材": "603281", -"603281": "江瀚新材", -"田野股份": "832023", -"832023": "田野股份", -"百利天恒": "688506", -"688506": "百利天恒", -"太湖雪": "838262", -"838262": "太湖雪", -"鸿铭股份": "301105", -"301105": "鸿铭股份", -"凯华材料": "831526", -"831526": "凯华材料", -"柏星龙": "833075", -"833075": "柏星龙", -"宁波远洋": "601022", -"601022": "宁波远洋", -"方盛股份": "832662", -"832662": "方盛股份", -"甬矽电子": "688362", -"688362": "甬矽电子", -"南方路机": "603280", -"603280": "南方路机", -"麒麟信安": "688152", -"688152": "麒麟信安", -"箭牌家居": "001322", -"001322": "箭牌家居", -"三柏硕": "001300", -"001300": "三柏硕", -"星环科技": "688031", -"688031": "星环科技", -"卓创资讯": "301299", -"301299": "卓创资讯", -"哈铁科技": "688459", -"688459": "哈铁科技", -"硅烷科技": "838402", -"838402": "硅烷科技", -"信科移动": "688387", -"688387": "信科移动", -"诺诚健华": "688428", -"688428": "诺诚健华", -"联动科技": "301369", -"301369": "联动科技", -"帕瓦股份": "688184", -"688184": "帕瓦股份", -"捷邦科技": "301326", -"301326": "捷邦科技", -"锡装股份": "001332", -"001332": "锡装股份", -"信德新材": "301349", -"301349": "信德新材", -"奥浦迈": "688293", -"688293": "奥浦迈", -"微电生理": "688351", -"688351": "微电生理", -"振华风光": "688439", -"688439": "振华风光", -"丛麟科技": "688370", -"688370": "丛麟科技", -"鼎际得": "603255", -"603255": "鼎际得", -"农心科技": "001231", -"001231": "农心科技", -"易点天下": "301171", -"301171": "易点天下", -"浩瀚深度": "688292", -"688292": "浩瀚深度", -"盟科药业": "688373", -"688373": "盟科药业", -"北路智控": "301195", -"301195": "北路智控", -"英诺特": "688253", -"688253": "英诺特", -"益方生物": "688382", -"688382": "益方生物", -"天新药业": "603235", -"603235": "天新药业", -"奥比中光": "688322", -"688322": "奥比中光", -"中科环保": "301175", -"301175": "中科环保", -"联合精密": "001268", -"001268": "联合精密", -"龙芯中科": "688047", -"688047": "龙芯中科", -"天润科技": "430564", -"430564": "天润科技", -"井松智能": "688251", -"688251": "井松智能", -"荣亿精密": "873223", -"873223": "荣亿精密", -"云从科技": "688327", -"688327": "云从科技", -"东田微": "301183", -"301183": "东田微", -"思特威": "688213", -"688213": "思特威", -"阳光乳业": "001318", -"001318": "阳光乳业", -"中国海油": "600938", -"600938": "中国海油", -"清研环境": "301288", -"301288": "清研环境", -"经纬恒润": "688326", -"688326": "经纬恒润", -"联盛化学": "301212", -"301212": "联盛化学", -"海创药业": "688302", -"688302": "海创药业", -"瑞德智能": "301135", -"301135": "瑞德智能", -"七丰精工": "873169", -"873169": "七丰精工", -"泰恩康": "301263", -"301263": "泰恩康", -"富士莱": "301258", -"301258": "富士莱", -"兴通股份": "603209", -"603209": "兴通股份", -"首药控股": "688197", -"688197": "首药控股", -"和顺科技": "301237", -"301237": "和顺科技", -"均普智能": "688306", -"688306": "均普智能", -"路斯股份": "832419", -"832419": "路斯股份", -"浙江恒威": "301222", -"301222": "浙江恒威", -"凯德石英": "835179", -"835179": "凯德石英", -"金徽股份": "603132", -"603132": "金徽股份", -"纽泰格": "301229", -"301229": "纽泰格", -"标榜股份": "301181", -"301181": "标榜股份", -"采纳股份": "301122", -"301122": "采纳股份", -"奕东电子": "301123", -"301123": "奕东电子", -"希荻微": "688173", -"688173": "希荻微", -"翱捷科技": "688220", -"688220": "翱捷科技", -"迈威生物": "688062", -"688062": "迈威生物", -"亚虹医药": "688176", -"688176": "亚虹医药", -"国芯科技": "688262", -"688262": "国芯科技", -"品高股份": "688227", -"688227": "品高股份", -"雅艺科技": "301113", -"301113": "雅艺科技", -"迪阿股份": "301177", -"301177": "迪阿股份", -"百济神州": "688235", -"688235": "百济神州", -"迪哲医药": "688192", -"688192": "迪哲医药", -"泽宇智能": "301179", -"301179": "泽宇智能", -"鼎阳科技": "688112", -"688112": "鼎阳科技", -"观想科技": "301213", -"301213": "观想科技", -"万祥科技": "301180", -"301180": "万祥科技", -"恒光股份": "301118", -"301118": "恒光股份", -"中寰股份": "836260", -"836260": "中寰股份", -"镇洋发展": "603213", -"603213": "镇洋发展", -"隆华新材": "301149", -"301149": "隆华新材", -"科达自控": "831832", -"831832": "科达自控", -"零点有数": "301169", -"301169": "零点有数", -"瑞纳智能": "301129", -"301129": "瑞纳智能", -"精进电动": "688280", -"688280": "精进电动", -"新锐股份": "688257", -"688257": "新锐股份", -"汇宇制药": "688553", -"688553": "汇宇制药", -"汉鑫科技": "837092", -"837092": "汉鑫科技", -"德昌股份": "605555", -"605555": "德昌股份", -"海希通讯": "831305", -"831305": "海希通讯", -"*ST富吉": "688272", -"688272": "*ST富吉", -"珠海冠宇": "688772", -"688772": "珠海冠宇", -"春雪食品": "605567", -"605567": "春雪食品", -"海锅股份": "301063", -"301063": "海锅股份", -"中粮科工": "301058", -"301058": "中粮科工", -"张小泉": "301055", -"301055": "张小泉", -"艾为电子": "688798", -"688798": "艾为电子", -"沪农商行": "601825", -"601825": "沪农商行", -"天禄科技": "301045", -"301045": "天禄科技", -"海天瑞声": "688787", -"688787": "海天瑞声", -"冠石科技": "605588", -"605588": "冠石科技", -"双乐股份": "301036", -"301036": "双乐股份", -"大全能源": "688303", -"688303": "大全能源", -"仕净科技": "301030", -"301030": "仕净科技", -"立达信": "605365", -"605365": "立达信", -"东亚机械": "301028", -"301028": "东亚机械", -"威腾电气": "688226", -"688226": "威腾电气", -"英诺激光": "301021", -"301021": "英诺激光", -"密封科技": "301020", -"301020": "密封科技", -"星辰科技": "832885", -"832885": "星辰科技", -"杭州热电": "605011", -"605011": "杭州热电", -"海泰科": "301022", -"301022": "海泰科", -"工大高科": "688367", -"688367": "工大高科", -"力芯微": "688601", -"688601": "力芯微", -"瑞丰银行": "601528", -"601528": "瑞丰银行", -"晶雪节能": "301010", -"301010": "晶雪节能", -"爱威科技": "688067", -"688067": "爱威科技", -"德迈仕": "301007", -"301007": "德迈仕", -"宏昌科技": "301008", -"301008": "宏昌科技", -"东航物流": "601156", -"601156": "东航物流", -"超捷股份": "301005", -"301005": "超捷股份", -"江苏博云": "301003", -"301003": "江苏博云", -"凯淳股份": "301001", -"301001": "凯淳股份", -"和辉光电": "688538", -"688538": "和辉光电", -"爱慕股份": "603511", -"603511": "爱慕股份", -"电气风电": "688660", -"688660": "电气风电", -"南侨食品": "605339", -"605339": "南侨食品", -"盛航股份": "001205", -"001205": "盛航股份", -"大中矿业": "001203", -"001203": "大中矿业", -"财达证券": "600906", -"600906": "财达证券", -"华利集团": "300979", -"300979": "华利集团", -"祥源新材": "300980", -"300980": "祥源新材", -"杭州柯林": "688611", -"688611": "杭州柯林", -"华绿生物": "300970", -"300970": "华绿生物", -"中洲特材": "300963", -"300963": "中洲特材", -"中农联合": "003042", -"003042": "中农联合", -"线上线下": "300959", -"300959": "线上线下", -"震裕科技": "300953", -"300953": "震裕科技", -"青云科技": "688316", -"688316": "青云科技", -"菱电电控": "688667", -"688667": "菱电电控", -"四方新材": "605122", -"605122": "四方新材", -"联德股份": "605060", -"605060": "联德股份", -"园林股份": "605303", -"605303": "园林股份", -"华锐精密": "688059", -"688059": "华锐精密", -"中国黄金": "600916", -"600916": "中国黄金", -"长虹能源": "836239", -"836239": "长虹能源", -"三友联众": "300932", -"300932": "三友联众", -"南网能源": "003035", -"003035": "南网能源", -"江天化学": "300927", -"300927": "江天化学", -"博俊科技": "300926", -"300926": "博俊科技", -"祖名股份": "003030", -"003030": "祖名股份", -"法本信息": "300925", -"300925": "法本信息", -"振邦智能": "003028", -"003028": "振邦智能", -"福立旺": "688678", -"688678": "福立旺", -"立方制药": "003020", -"003020": "立方制药", -"杭华股份": "688571", -"688571": "杭华股份", -"兆威机电": "003021", -"003021": "兆威机电", -"九号公司": "689009", -"689009": "九号公司", -"前沿生物": "688221", -"688221": "前沿生物", -"东来技术": "688129", -"688129": "东来技术", -"日久光电": "003015", -"003015": "日久光电", -"地铁设计": "003013", -"003013": "地铁设计", -"巴比食品": "605338", -"605338": "巴比食品", -"天臣医疗": "688013", -"688013": "天臣医疗", -"丽人丽妆": "605136", -"605136": "丽人丽妆", -"长华集团": "605018", -"605018": "长华集团", -"铜牛信息": "300895", -"300895": "铜牛信息", -"科前生物": "688526", -"688526": "科前生物", -"思瑞浦": "688536", -"688536": "思瑞浦", -"海目星": "688559", -"688559": "海目星", -"圣湘生物": "688289", -"688289": "圣湘生物", -"维康药业": "300878", -"300878": "维康药业", -"南大环境": "300864", -"300864": "南大环境", -"格林达": "603931", -"603931": "格林达", -"捷强装备": "300875", -"300875": "捷强装备", -"冠盛股份": "605088", -"605088": "冠盛股份", -"凯赛生物": "688065", -"688065": "凯赛生物", -"亿华通": "688339", -"688339": "亿华通", -"华达新材": "605158", -"605158": "华达新材", -"赛科希德": "688338", -"688338": "赛科希德", -"盟升电子": "688311", -"688311": "盟升电子", -"天地在线": "002995", -"002995": "天地在线", -"甘源食品": "002991", -"002991": "甘源食品", -"起帆电缆": "605222", -"605222": "起帆电缆", -"国联证券": "601456", -"601456": "国联证券", -"旭杰科技": "836149", -"836149": "旭杰科技", -"奇安信": "688561", -"688561": "奇安信", -"大唐药业": "836433", -"836433": "大唐药业", -"泰祥股份": "833874", -"833874": "泰祥股份", -"寒武纪": "688256", -"688256": "寒武纪", -"美瑞新材": "300848", -"300848": "美瑞新材", -"埃夫特": "688165", -"688165": "埃夫特", -"苏轴股份": "430418", -"430418": "苏轴股份", -"君实生物": "688180", -"688180": "君实生物", -"佳先股份": "430489", -"430489": "佳先股份", -"颖泰生物": "833819", -"833819": "颖泰生物", -"天智航": "688277", -"688277": "天智航", -"秦川物联": "688528", -"688528": "秦川物联", -"神州细胞": "688520", -"688520": "神州细胞", -"宇新股份": "002986", -"002986": "宇新股份", -"凯迪股份": "605288", -"605288": "凯迪股份", -"中泰证券": "600918", -"600918": "中泰证券", -"佰奥智能": "300836", -"300836": "佰奥智能", -"长源东谷": "603950", -"603950": "长源东谷", -"湘佳股份": "002982", -"002982": "湘佳股份", -"华润微": "688396", -"688396": "华润微", -"耐普矿机": "300818", -"300818": "耐普矿机", -"泽璟制药": "688266", -"688266": "泽璟制药", -"优刻得": "688158", -"688158": "优刻得", -"易天股份": "300812", -"300812": "易天股份", -"佰仁医疗": "688198", -"688198": "佰仁医疗", -"硕世生物": "688399", -"688399": "硕世生物", -"通达电气": "603390", -"603390": "通达电气", -"矩子科技": "300802", -"300802": "矩子科技", -"筑博设计": "300564", -"300564": "筑博设计", -"奥福环保": "688021", -"688021": "奥福环保", -"*ST左江": "300799", -"300799": "*ST左江", -"祥鑫科技": "002965", -"002965": "祥鑫科技", -"米奥会展": "300795", -"300795": "米奥会展", -"唐源电气": "300789", -"300789": "唐源电气", -"中国广核": "003816", -"003816": "中国广核", -"柏楚电子": "688188", -"688188": "柏楚电子", -"神马电力": "603530", -"603530": "神马电力", -"景津装备": "603279", -"603279": "景津装备", -"嘉元科技": "688388", -"688388": "嘉元科技", -"航天宏图": "688066", -"688066": "航天宏图", -"天宜上佳": "688033", -"688033": "天宜上佳", -"沃尔德": "688028", -"688028": "沃尔德", -"西部超导": "688122", -"688122": "西部超导", -"乐鑫科技": "688018", -"688018": "乐鑫科技", -"福蓉科技": "603327", -"603327": "福蓉科技", -"三角防务": "300775", -"300775": "三角防务", -"新城市": "300778", -"300778": "新城市", -"拉卡拉": "300773", -"300773": "拉卡拉", -"德方纳米": "300769", -"300769": "德方纳米", -"上海瀚讯": "300762", -"300762": "上海瀚讯", -"福莱特": "601865", -"601865": "福莱特", -"明阳智能": "601615", -"601615": "明阳智能", -"青岛港": "601298", -"601298": "青岛港", -"蔚蓝生物": "603739", -"603739": "蔚蓝生物", -"利通电子": "603629", -"603629": "利通电子", -"新疆交建": "002941", -"002941": "新疆交建", -"迈为股份": "300751", -"300751": "迈为股份", -"鹏鼎控股": "002938", -"002938": "鹏鼎控股", -"雅运股份": "603790", -"603790": "雅运股份", -"中铝国际": "601068", -"601068": "中铝国际", -"新兴装备": "002933", -"002933": "新兴装备", -"康辰药业": "603590", -"603590": "康辰药业", -"江苏新能": "603693", -"603693": "江苏新能", -"宁德时代": "300750", -"300750": "宁德时代", -"福达合金": "603045", -"603045": "福达合金", -"彩讯股份": "300634", -"300634": "彩讯股份", -"倍加洁": "603059", -"603059": "倍加洁", -"今创集团": "603680", -"603680": "今创集团", -"泰永长征": "002927", -"002927": "泰永长征", -"中源家居": "603709", -"603709": "中源家居", -"嘉友国际": "603871", -"603871": "嘉友国际", -"华菱精工": "603356", -"603356": "华菱精工", -"万兴科技": "300624", -"300624": "万兴科技", -"德邦股份": "603056", -"603056": "德邦股份", -"西菱动力": "300733", -"300733": "西菱动力", -"中石科技": "300684", -"300684": "中石科技", -"名臣健康": "002919", -"002919": "名臣健康", -"华能水电": "600025", -"600025": "华能水电", -"深南电路": "002916", -"002916": "深南电路", -"水星家纺": "603365", -"603365": "水星家纺", -"山东出版": "601019", -"601019": "山东出版", -"怡达股份": "300721", -"300721": "怡达股份", -"振江股份": "603507", -"603507": "振江股份", -"广哈通信": "300711", -"300711": "广哈通信", -"合盛硅业": "603260", -"603260": "合盛硅业", -"晶华新材": "603683", -"603683": "晶华新材", -"万隆光电": "300710", -"300710": "万隆光电", -"洛凯股份": "603829", -"603829": "洛凯股份", -"翔港科技": "603499", -"603499": "翔港科技", -"傲农生物": "603363", -"603363": "傲农生物", -"台华新材": "603055", -"603055": "台华新材", -"原尚股份": "603813", -"603813": "原尚股份", -"京能热力": "002893", -"002893": "京能热力", -"英派斯": "002899", -"002899": "英派斯", -"畅联股份": "603648", -"603648": "畅联股份", -"银都股份": "603277", -"603277": "银都股份", -"建研院": "603183", -"603183": "建研院", -"光威复材": "300699", -"300699": "光威复材", -"川恒股份": "002895", -"002895": "川恒股份", -"爱乐达": "300696", -"300696": "爱乐达", -"中宠股份": "002891", -"002891": "中宠股份", -"秦港股份": "601326", -"601326": "秦港股份", -"中广天择": "603721", -"603721": "中广天择", -"勘设股份": "603458", -"603458": "勘设股份", -"海特生物": "300683", -"300683": "海特生物", -"弘宇股份": "002890", -"002890": "弘宇股份", -"电连技术": "300679", -"300679": "电连技术", -"岱美股份": "603730", -"603730": "岱美股份", -"禾望电气": "603063", -"603063": "禾望电气", -"国科微": "300672", -"300672": "国科微", -"富满微": "300671", -"300671": "富满微", -"三孚股份": "603938", -"603938": "三孚股份", -"迪生力": "603335", -"603335": "迪生力", -"菲林格尔": "603226", -"603226": "菲林格尔", -"科蓝软件": "300663", -"300663": "科蓝软件", -"圣邦股份": "300661", -"300661": "圣邦股份", -"艾艾精工": "603580", -"603580": "艾艾精工", -"弘信电子": "300657", -"300657": "弘信电子", -"正海生物": "300653", -"300653": "正海生物", -"金牌厨柜": "603180", -"603180": "金牌厨柜", -"金能科技": "603113", -"603113": "金能科技", -"先达股份": "603086", -"603086": "先达股份", -"万通智控": "300643", -"300643": "万通智控", -"绿康生化": "002868", -"002868": "绿康生化", -"周大生": "002867", -"002867": "周大生", -"三超新材": "300554", -"300554": "三超新材", -"今飞凯达": "002863", -"002863": "今飞凯达", -"开立医疗": "300633", -"300633": "开立医疗", -"金麒麟": "603586", -"603586": "金麒麟", -"华测导航": "300627", -"300627": "华测导航", -"*ST碳元": "603133", -"603133": "*ST碳元", -"捷捷微电": "300623", -"300623": "捷捷微电", -"克来机电": "603960", -"603960": "克来机电", -"至正股份": "603991", -"603991": "至正股份", -"诺邦股份": "603238", -"603238": "诺邦股份", -"安正时尚": "603839", -"603839": "安正时尚", -"江山欧派": "603208", -"603208": "江山欧派", -"科森科技": "603626", -"603626": "科森科技", -"会畅通讯": "300578", -"300578": "会畅通讯", -"华达科技": "603358", -"603358": "华达科技", -"集友股份": "603429", -"603429": "集友股份", -"吉大通信": "300597", -"300597": "吉大通信", -"张家港行": "002839", -"002839": "张家港行", -"中国银河": "601881", -"601881": "中国银河", -"诚迈科技": "300598", -"300598": "诚迈科技", -"艾迪精密": "603638", -"603638": "艾迪精密", -"杰克股份": "603337", -"603337": "杰克股份", -"天马科技": "603668", -"603668": "天马科技", -"贝斯特": "300580", -"300580": "贝斯特", -"天龙股份": "603266", -"603266": "天龙股份", -"德新科技": "603032", -"603032": "德新科技", -"晨曦航空": "300581", -"300581": "晨曦航空", -"亚振家居": "603389", -"603389": "亚振家居", -"裕同科技": "002831", -"002831": "裕同科技", -"星网宇达": "002829", -"002829": "星网宇达", -"森特股份": "603098", -"603098": "森特股份", -"名雕股份": "002830", -"002830": "名雕股份", -"桂发祥": "002820", -"002820": "桂发祥", -"国检集团": "603060", -"603060": "国检集团", -"丝路视觉": "300556", -"300556": "丝路视觉", -"中富通": "300560", -"300560": "中富通", -"五洲新春": "603667", -"603667": "五洲新春", -"能科科技": "603859", -"603859": "能科科技", -"梦百合": "603313", -"603313": "梦百合", -"常熟银行": "601128", -"601128": "常熟银行", -"安图生物": "603658", -"603658": "安图生物", -"山东赫达": "002810", -"002810": "山东赫达", -"ST花王": "603007", -"603007": "ST花王", -"欧普照明": "603515", -"603515": "欧普照明", -"上海电影": "601595", -"601595": "上海电影", -"优博讯": "300531", -"300531": "优博讯", -"江苏银行": "600919", -"600919": "江苏银行", -"海波重科": "300517", -"300517": "海波重科", -"赛力斯": "601127", -"601127": "赛力斯", -"中国核建": "601611", -"601611": "中国核建", -"三棵树": "603737", -"603737": "三棵树", -"恒实科技": "300513", -"300513": "恒实科技", -"中亚股份": "300512", -"300512": "中亚股份", -"第一创业": "002797", -"002797": "第一创业", -"苏奥传感": "300507", -"300507": "苏奥传感", -"飞科电器": "603868", -"603868": "飞科电器", -"金徽酒": "603919", -"603919": "金徽酒", -"司太立": "603520", -"603520": "司太立", -"桃李面包": "603866", -"603866": "桃李面包", -"*ST美尚": "300495", -"300495": "*ST美尚", -"沐邦高科": "603398", -"603398": "沐邦高科", -"恒通股份": "603223", -"603223": "恒通股份", -"音飞储存": "603066", -"603066": "音飞储存", -"星徽股份": "300464", -"300464": "星徽股份", -"南兴股份": "002757", -"002757": "南兴股份", -"先导智能": "300450", -"300450": "先导智能", -"奥赛康": "002755", -"002755": "奥赛康", -"山河药辅": "300452", -"300452": "山河药辅", -"创业慧康": "300451", -"300451": "创业慧康", -"鹏辉能源": "300438", -"300438": "鹏辉能源", -"乐凯新材": "300446", -"300446": "乐凯新材", -"鲍斯股份": "300441", -"300441": "鲍斯股份", -"腾龙股份": "603158", -"603158": "腾龙股份", -"*ST全筑": "603030", -"603030": "*ST全筑", -"国光股份": "002749", -"002749": "国光股份", -"立霸股份": "603519", -"603519": "立霸股份", -"银龙股份": "603969", -"603969": "银龙股份", -"好莱客": "603898", -"603898": "好莱客", -"火炬电子": "603678", -"603678": "火炬电子", -"迦南科技": "300412", -"300412": "迦南科技", -"金盾股份": "300411", -"300411": "金盾股份", -"方盛制药": "603998", -"603998": "方盛制药", -"海南矿业": "601969", -"601969": "海南矿业", -"柳药集团": "603368", -"603368": "柳药集团", -"凯发电气": "300407", -"300407": "凯发电气", -"福达股份": "603166", -"603166": "福达股份", -"中电电机": "603988", -"603988": "中电电机", -"九强生物": "300406", -"300406": "九强生物", -"华懋科技": "603306", -"603306": "华懋科技", -"节能风电": "601016", -"601016": "节能风电", -"迪瑞医疗": "300396", -"300396": "迪瑞医疗", -"福斯特": "603806", -"603806": "福斯特", -"长药控股": "300391", -"300391": "长药控股", -"艾比森": "300389", -"300389": "艾比森", -"北特科技": "603009", -"603009": "北特科技", -"一心堂": "002727", -"002727": "一心堂", -"联明股份": "603006", -"603006": "联明股份", -"登云股份": "002715", -"002715": "登云股份", -"斯莱克": "300382", -"300382": "斯莱克", -"安硕信息": "300380", -"300380": "安硕信息", -"易事特": "300376", -"300376": "易事特", -"金贵银业": "002716", -"002716": "金贵银业", -"牧原股份": "002714", -"002714": "牧原股份", -"恒华科技": "300365", -"300365": "恒华科技", -"新宝股份": "002705", -"002705": "新宝股份", -"浙江世宝": "002703", -"002703": "浙江世宝", -"北信源": "300352", -"300352": "北信源", -"博实股份": "002698", -"002698": "博实股份", -"吉翔股份": "603399", -"603399": "吉翔股份", -"双成药业": "002693", -"002693": "双成药业", -"天银机电": "300342", -"300342": "天银机电", -"乔治白": "002687", -"002687": "乔治白", -"迪森股份": "300335", -"300335": "迪森股份", -"中信重工": "601608", -"601608": "中信重工", -"龙洲股份": "002682", -"002682": "龙洲股份", -"福建金森": "002679", -"002679": "福建金森", -"东诚药业": "002675", -"002675": "东诚药业", -"东江环保": "002672", -"002672": "东江环保", -"慈星股份": "300307", -"300307": "慈星股份", -"首航高科": "002665", -"002665": "首航高科", -"聚飞光电": "300303", -"300303": "聚飞光电", -"普邦股份": "002663", -"002663": "普邦股份", -"吉视传媒": "601929", -"601929": "吉视传媒", -"仁东控股": "002647", -"002647": "仁东控股", -"公元股份": "002641", -"002641": "公元股份", -"三丰智能": "300276", -"300276": "三丰智能", -"德尔未来": "002631", -"002631": "德尔未来", -"玉龙股份": "601028", -"601028": "玉龙股份", -"光启技术": "002625", -"002625": "光启技术", -"中国电建": "601669", -"601669": "中国电建", -"瑞和股份": "002620", -"002620": "瑞和股份", -"隆华科技": "300263", -"300263": "隆华科技", -"佳创视讯": "300264", -"300264": "佳创视讯", -"奥佳华": "002614", -"002614": "奥佳华", -"京运通": "601908", -"601908": "京运通", -"东方精工": "002611", -"002611": "东方精工", -"林洋能源": "601222", -"601222": "林洋能源", -"金信诺": "300252", -"300252": "金信诺", -"融捷健康": "300247", -"300247": "融捷健康", -"世纪华通": "002602", -"002602": "世纪华通", -"海南瑞泽": "002596", -"002596": "海南瑞泽", -"永利股份": "300230", -"300230": "永利股份", -"富瑞特装": "300228", -"300228": "富瑞特装", -"银禧科技": "300221", -"300221": "银禧科技", -"未名医药": "002581", -"002581": "未名医药", -"雷柏科技": "002577", -"002577": "雷柏科技", -"群兴玩具": "002575", -"002575": "群兴玩具", -"明牌珠宝": "002574", -"002574": "明牌珠宝", -"清新环境": "002573", -"002573": "清新环境", -"益盛药业": "002566", -"002566": "益盛药业", -"兄弟科技": "002562", -"002562": "兄弟科技", -"南方精工": "002553", -"002553": "南方精工", -"宝鼎科技": "002552", -"002552": "宝鼎科技", -"力源信息": "300184", -"300184": "力源信息", -"金隅集团": "601992", -"601992": "金隅集团", -"四方达": "300179", -"300179": "四方达", -"汉得信息": "300170", -"300170": "汉得信息", -"博威合金": "601137", -"601137": "博威合金", -"中化岩土": "002542", -"002542": "中化岩土", -"万达信息": "300168", -"300168": "万达信息", -"天瑞仪器": "300165", -"300165": "天瑞仪器", -"亚太科技": "002540", -"002540": "亚太科技", -"海联金汇": "002537", -"002537": "海联金汇", -"飞龙股份": "002536", -"002536": "飞龙股份", -"亚星锚链": "601890", -"601890": "亚星锚链", -"香雪制药": "300147", -"300147": "香雪制药", -"天桥起重": "002523", -"002523": "天桥起重", -"银河电子": "002519", -"002519": "银河电子", -"利源股份": "002501", -"002501": "利源股份", -"节能环境": "300140", -"300140": "节能环境", -"通鼎互联": "002491", -"002491": "通鼎互联", -"浙江永强": "002489", -"002489": "浙江永强", -"英唐智控": "300131", -"300131": "英唐智控", -"兴业证券": "601377", -"601377": "兴业证券", -"嘉麟杰": "002486", -"002486": "嘉麟杰", -"聆达股份": "300125", -"300125": "聆达股份", -"江海股份": "002484", -"002484": "江海股份", -"润邦股份": "002483", -"002483": "润邦股份", -"经纬辉开": "300120", -"300120": "经纬辉开", -"*ST吉药": "300108", -"300108": "*ST吉药", -"龙源技术": "300105", -"300105": "龙源技术", -"晶澳科技": "002459", -"002459": "晶澳科技", -"启明星辰": "002439", -"002439": "启明星辰", -"江苏神通": "002438", -"002438": "江苏神通", -"云南锗业": "002428", -"002428": "云南锗业", -"长信科技": "300088", -"300088": "长信科技", -"多氟多": "002407", -"002407": "多氟多", -"中远海科": "002401", -"002401": "中远海科", -"梦洁股份": "002397", -"002397": "梦洁股份", -"力生制药": "002393", -"002393": "力生制药", -"航天彩虹": "002389", -"002389": "航天彩虹", -"双箭股份": "002381", -"002381": "双箭股份", -"三川智慧": "300066", -"300066": "三川智慧", -"天龙集团": "300063", -"300063": "天龙集团", -"东方财富": "300059", -"300059": "东方财富", -"伟星新材": "002372", -"002372": "伟星新材", -"亚太药业": "002370", -"002370": "亚太药业", -"融发核电": "002366", -"002366": "融发核电", -"汉王科技": "002362", -"002362": "汉王科技", -"中创环保": "300056", -"300056": "中创环保", -"万邦达": "300055", -"300055": "万邦达", -"航宇微": "300053", -"300053": "航宇微", -"杰瑞股份": "002353", -"002353": "杰瑞股份", -"巨力索具": "002342", -"002342": "巨力索具", -"新纶新材": "002341", -"002341": "新纶新材", -"积成电子": "002339", -"002339": "积成电子", -"世纪鼎利": "300050", -"300050": "世纪鼎利", -"星辉娱乐": "300043", -"300043": "星辉娱乐", -"皖新传媒": "601801", -"601801": "皖新传媒", -"奥普光电": "002338", -"002338": "奥普光电", -"赛象科技": "002337", -"002337": "赛象科技", -"英威腾": "002334", -"002334": "英威腾", -"宏德股份": "301163", -"301163": "宏德股份", -"美迪凯": "688079", -"688079": "美迪凯", -"欧菲光": "002456", -"002456": "欧菲光", -"天奇股份": "002009", -"002009": "天奇股份", -"中航重机": "600765", -"600765": "中航重机", -"银河磁体": "300127", -"300127": "银河磁体", -"小崧股份": "002723", -"002723": "小崧股份", -"朗威股份": "301202", -"301202": "朗威股份", -"洲明科技": "300232", -"300232": "洲明科技", -"三七互娱": "002555", -"002555": "三七互娱", -"麦迪科技": "603990", -"603990": "麦迪科技", -"新华传媒": "600825", -"600825": "新华传媒", -"和邦生物": "603077", -"603077": "和邦生物", -"国际实业": "000159", -"000159": "国际实业", -"紫金银行": "601860", -"601860": "紫金银行", -"沪电股份": "002463", -"002463": "沪电股份", -"芯动联科": "688582", -"688582": "芯动联科", -"康冠科技": "001308", -"001308": "康冠科技", -"锐科激光": "300747", -"300747": "锐科激光", -"安居宝": "300155", -"300155": "安居宝", -"东睦股份": "600114", -"600114": "东睦股份", -"中国外运": "601598", -"601598": "中国外运", -"濮耐股份": "002225", -"002225": "濮耐股份", -"华致酒行": "300755", -"300755": "华致酒行", -"晓鸣股份": "300967", -"300967": "晓鸣股份", -"一博科技": "301366", -"301366": "一博科技", -"湖北宜化": "000422", -"000422": "湖北宜化", -"青岛金王": "002094", -"002094": "青岛金王", -"福昕软件": "688095", -"688095": "福昕软件", -"盛运退": "300090", -"300090": "盛运退", -"春立医疗": "688236", -"688236": "春立医疗", -"圆通速递": "600233", -"600233": "圆通速递", -"乖宝宠物": "301498", -"301498": "乖宝宠物", -"亚宝药业": "600351", -"600351": "亚宝药业", -"光峰科技": "688007", -"688007": "光峰科技", -"兆易创新": "603986", -"603986": "兆易创新", -"霍莱沃": "688682", -"688682": "霍莱沃", -"贤丰控股": "002141", -"002141": "贤丰控股", -"中捷精工": "301072", -"301072": "中捷精工", -"迪尔化工": "831304", -"831304": "迪尔化工", -"潞安环能": "601699", -"601699": "潞安环能", -"唯万密封": "301161", -"301161": "唯万密封", -"呈和科技": "688625", -"688625": "呈和科技", -"上海环境": "601200", -"601200": "上海环境", -"凯腾精工": "871553", -"871553": "凯腾精工", -"佛山照明": "000541", -"000541": "佛山照明", -"传音控股": "688036", -"688036": "传音控股", -"奥普特": "688686", -"688686": "奥普特", -"当升科技": "300073", -"300073": "当升科技", -"新金路": "000510", -"000510": "新金路", -"永兴材料": "002756", -"002756": "永兴材料", -"克明食品": "002661", -"002661": "克明食品", -"TCL通讯": "000542", -"000542": "TCL通讯", -"南京熊猫": "600775", -"600775": "南京熊猫", -"永鼎股份": "600105", -"600105": "永鼎股份", -"南纺股份": "600250", -"600250": "南纺股份", -"聚辰股份": "688123", -"688123": "聚辰股份", -"林州重机": "002535", -"002535": "林州重机", -"红蜻蜓": "603116", -"603116": "红蜻蜓", -"川宁生物": "301301", -"301301": "川宁生物", -"长亮科技": "300348", -"300348": "长亮科技", -"联环药业": "600513", -"600513": "联环药业", -"云涌科技": "688060", -"688060": "云涌科技", -"招商积余": "001914", -"001914": "招商积余", -"超图软件": "300036", -"300036": "超图软件", -"首药控股-U": "688197", -"688197": "首药控股-U", -"利尔化学": "002258", -"002258": "利尔化学", -"移为通信": "300590", -"300590": "移为通信", -"锴威特": "688693", -"688693": "锴威特", -"焦点科技": "002315", -"002315": "焦点科技", -"内蒙一机": "600967", -"600967": "内蒙一机", -"神火股份": "000933", -"000933": "神火股份", -"申昊科技": "300853", -"300853": "申昊科技", -"协鑫能科": "002015", -"002015": "协鑫能科", -"太平洋": "601099", -"601099": "太平洋", -"中岩大地": "003001", -"003001": "中岩大地", -"佳士科技": "300193", -"300193": "佳士科技", -"*ST搜特": "002503", -"002503": "*ST搜特", -"*ST宜生": "600978", -"600978": "*ST宜生", -"道恩股份": "002838", -"002838": "道恩股份", -"挖金客": "301380", -"301380": "挖金客", -"侨源股份": "301286", -"301286": "侨源股份", -"诺思兰德": "430047", -"430047": "诺思兰德", -"科信技术": "300565", -"300565": "科信技术", -"欣旺达": "300207", -"300207": "欣旺达", -"三维天地": "301159", -"301159": "三维天地", -"三全食品": "002216", -"002216": "三全食品", -"亨通光电": "600487", -"600487": "亨通光电", -"正泰电器": "601877", -"601877": "正泰电器", -"退市中房": "600890", -"600890": "退市中房", -"光弘科技": "300735", -"300735": "光弘科技", -"众业达": "002441", -"002441": "众业达", -"大烨智能": "300670", -"300670": "大烨智能", -"万德斯": "688178", -"688178": "万德斯", -"华联控股": "000036", -"000036": "华联控股", -"海兴电力": "603556", -"603556": "海兴电力", -"东莞控股": "000828", -"000828": "东莞控股", -"均瑶健康": "605388", -"605388": "均瑶健康", -"中材节能": "603126", -"603126": "中材节能", -"*ST华仪": "600290", -"600290": "*ST华仪", -"雪人股份": "002639", -"002639": "雪人股份", -"旺成科技": "830896", -"830896": "旺成科技", -"威迈斯": "688612", -"688612": "威迈斯", -"长城军工": "601606", -"601606": "长城军工", -"*ST同达": "600647", -"600647": "*ST同达", -"聚合顺": "605166", -"605166": "聚合顺", -"露笑科技": "002617", -"002617": "露笑科技", -"浙江交科": "002061", -"002061": "浙江交科", -"东晶电子": "002199", -"002199": "东晶电子", -"泓博医药": "301230", -"301230": "泓博医药", -"四会富仕": "300852", -"300852": "四会富仕", -"力量钻石": "301071", -"301071": "力量钻石", -"鼎泰高科": "301377", -"301377": "鼎泰高科", -"太辰光": "300570", -"300570": "太辰光", -"东方智造": "002175", -"002175": "东方智造", -"创力集团": "603012", -"603012": "创力集团", -"基蛋生物": "603387", -"603387": "基蛋生物", -"氯碱化工": "600618", -"600618": "氯碱化工", -"滨江集团": "002244", -"002244": "滨江集团", -"苏豪弘业": "600128", -"600128": "苏豪弘业", -"*ST中期": "000996", -"000996": "*ST中期", -"华友钴业": "603799", -"603799": "华友钴业", -"利元亨": "688499", -"688499": "利元亨", -"旗天科技": "300061", -"300061": "旗天科技", -"绿亨科技": "870866", -"870866": "绿亨科技", -"横店东磁": "002056", -"002056": "横店东磁", -"海创药业-U": "688302", -"688302": "海创药业-U", -"和顺电气": "300141", -"300141": "和顺电气", -"宁水集团": "603700", -"603700": "宁水集团", -"蒙娜丽莎": "002918", -"002918": "蒙娜丽莎", -"瑞贝卡": "600439", -"600439": "瑞贝卡", -"中广核技": "000881", -"000881": "中广核技", -"浙江国祥": "603361", -"603361": "浙江国祥", -"通策医疗": "600763", -"600763": "通策医疗", -"ST康美": "600518", -"600518": "ST康美", -"中环环保": "300692", -"300692": "中环环保", -"上海沪工": "603131", -"603131": "上海沪工", -"青海春天": "600381", -"600381": "青海春天", -"克莱特": "831689", -"831689": "克莱特", -"金陵药业": "000919", -"000919": "金陵药业", -"钢研高纳": "300034", -"300034": "钢研高纳", -"万控智造": "603070", -"603070": "万控智造", -"二六三": "002467", -"002467": "二六三", -"仁和药业": "000650", -"000650": "仁和药业", -"山东矿机": "002526", -"002526": "山东矿机", -"陇神戎发": "300534", -"300534": "陇神戎发", -"中视传媒": "600088", -"600088": "中视传媒", -"成都燃气": "603053", -"603053": "成都燃气", -"汇金通": "603577", -"603577": "汇金通", -"厚普股份": "300471", -"300471": "厚普股份", -"曲江文旅": "600706", -"600706": "曲江文旅", -"辰安科技": "300523", -"300523": "辰安科技", -"永吉股份": "603058", -"603058": "永吉股份", -"鲁银投资": "600784", -"600784": "鲁银投资", -"深高速": "600548", -"600548": "深高速", -"巨星农牧": "603477", -"603477": "巨星农牧", -"复旦张江": "688505", -"688505": "复旦张江", -"东华能源": "002221", -"002221": "东华能源", -"众智科技": "301361", -"301361": "众智科技", -"富安娜": "002327", -"002327": "富安娜", -"趣睡科技": "301336", -"301336": "趣睡科技", -"恒基达鑫": "002492", -"002492": "恒基达鑫", -"明微电子": "688699", -"688699": "明微电子", -"联创光电": "600363", -"600363": "联创光电", -"聚杰微纤": "300819", -"300819": "聚杰微纤", -"南国置业": "002305", -"002305": "南国置业", -"中金辐照": "300962", -"300962": "中金辐照", -"宁波韵升": "600366", -"600366": "宁波韵升", -"天罡股份": "832651", -"832651": "天罡股份", -"汇金科技": "300561", -"300561": "汇金科技", -"浙江众成": "002522", -"002522": "浙江众成", -"威士顿": "301315", -"301315": "威士顿", -"宝德退": "300023", -"300023": "宝德退", -"同益股份": "300538", -"300538": "同益股份", -"蜀道装备": "300540", -"300540": "蜀道装备", -"东方钽业": "000962", -"000962": "东方钽业", -"湖北能源": "000883", -"000883": "湖北能源", -"龙泉股份": "002671", -"002671": "龙泉股份", -"福光股份": "688010", -"688010": "福光股份", -"ST八菱": "002592", -"002592": "ST八菱", -"赛隆药业": "002898", -"002898": "赛隆药业", -"豪鹏科技": "001283", -"001283": "豪鹏科技", -"永和智控": "002795", -"002795": "永和智控", -"纳川股份": "300198", -"300198": "纳川股份", -"华大智造": "688114", -"688114": "华大智造", -"上海贝岭": "600171", -"600171": "上海贝岭", -"连云港": "601008", -"601008": "连云港", -"汉仪股份": "301270", -"301270": "汉仪股份", -"国海证券": "000750", -"000750": "国海证券", -"富煌钢构": "002743", -"002743": "富煌钢构", -"金枫酒业": "600616", -"600616": "金枫酒业", -"宝新能源": "000690", -"000690": "宝新能源", -"世荣兆业": "002016", -"002016": "世荣兆业", -"卓然股份": "688121", -"688121": "卓然股份", -"宏柏新材": "605366", -"605366": "宏柏新材", -"瑜欣电子": "301107", -"301107": "瑜欣电子", -"奥联电子": "300585", -"300585": "奥联电子", -"三湘印象": "000863", -"000863": "三湘印象", -"东方电子": "000682", -"000682": "东方电子", -"益方生物-U": "688382", -"688382": "益方生物-U", -"海得控制": "002184", -"002184": "海得控制", -"天力锂能": "301152", -"301152": "天力锂能", -"泸天化": "000912", -"000912": "泸天化", -"晶晨股份": "688099", -"688099": "晶晨股份", -"德赛西威": "002920", -"002920": "德赛西威", -"百胜智能": "301083", -"301083": "百胜智能", -"江丰电子": "300666", -"300666": "江丰电子", -"南网科技": "688248", -"688248": "南网科技", -"中船防务": "600685", -"600685": "中船防务", -"合纵科技": "300477", -"300477": "合纵科技", -"会稽山": "601579", -"601579": "会稽山", -"海油发展": "600968", -"600968": "海油发展", -"ST奥康": "603001", -"603001": "ST奥康", -"元隆雅图": "002878", -"002878": "元隆雅图", -"天虹股份": "002419", -"002419": "天虹股份", -"绿茵生态": "002887", -"002887": "绿茵生态", -"ST浩源": "002700", -"002700": "ST浩源", -"汉邦高科": "300449", -"300449": "汉邦高科", -"京北方": "002987", -"002987": "京北方", -"海峡创新": "300300", -"300300": "海峡创新", -"鼎龙股份": "300054", -"300054": "鼎龙股份", -"盐湖股份": "000792", -"000792": "盐湖股份", -"贝肯能源": "002828", -"002828": "贝肯能源", -"浪潮信息": "000977", -"000977": "浪潮信息", -"中科蓝讯": "688332", -"688332": "中科蓝讯", -"高德红外": "002414", -"002414": "高德红外", -"通裕重工": "300185", -"300185": "通裕重工", -"粤电力A": "000539", -"000539": "粤电力A", -"溢多利": "300381", -"300381": "溢多利", -"天纺标": "871753", -"871753": "天纺标", -"新锦动力": "300157", -"300157": "新锦动力", -"金地集团": "600383", -"600383": "金地集团", -"三美股份": "603379", -"603379": "三美股份", -"皇台酒业": "000995", -"000995": "皇台酒业", -"国创高新": "002377", -"002377": "国创高新", -"凯大催化": "830974", -"830974": "凯大催化", -"爱朋医疗": "300753", -"300753": "爱朋医疗", -"珠江股份": "600684", -"600684": "珠江股份", -"莎普爱思": "603168", -"603168": "莎普爱思", -"金宏气体": "688106", -"688106": "金宏气体", -"欧亚集团": "600697", -"600697": "欧亚集团", -"*ST三盛": "300282", -"300282": "*ST三盛", -"绿岛风": "301043", -"301043": "绿岛风", -"博通集成": "603068", -"603068": "博通集成", -"PT粤金曼": "000588", -"000588": "PT粤金曼", -"兴源环境": "300266", -"300266": "兴源环境", -"泰坦股份": "003036", -"003036": "泰坦股份", -"宝塔实业": "000595", -"000595": "宝塔实业", -"龙源电力": "001289", -"001289": "龙源电力", -"昱能科技": "688348", -"688348": "昱能科技", -"奇精机械": "603677", -"603677": "奇精机械", -"皓宸医疗": "002622", -"002622": "皓宸医疗", -"东望时代": "600052", -"600052": "东望时代", -"中复神鹰": "688295", -"688295": "中复神鹰", -"海鸥住工": "002084", -"002084": "海鸥住工", -"潍柴重机": "000880", -"000880": "潍柴重机", -"海洋王": "002724", -"002724": "海洋王", -"海正生材": "688203", -"688203": "海正生材", -"醋化股份": "603968", -"603968": "醋化股份", -"瑞泰新材": "301238", -"301238": "瑞泰新材", -"北京银行": "601169", -"601169": "北京银行", -"西部材料": "002149", -"002149": "西部材料", -"格力博": "301260", -"301260": "格力博", -"埃夫特-U": "688165", -"688165": "埃夫特-U", -"华光环能": "600475", -"600475": "华光环能", -"同力股份": "834599", -"834599": "同力股份", -"大商股份": "600694", -"600694": "大商股份", -"森马服饰": "002563", -"002563": "森马服饰", -"云里物里": "872374", -"872374": "云里物里", -"碧水源": "300070", -"300070": "碧水源", -"信雅达": "600571", -"600571": "信雅达", -"荣信文化": "301231", -"301231": "荣信文化", -"海信家电": "000921", -"000921": "海信家电", -"青岛啤酒": "600600", -"600600": "青岛啤酒", -"崇德科技": "301548", -"301548": "崇德科技", -"紫天科技": "300280", -"300280": "紫天科技", -"退市厦华": "600870", -"600870": "退市厦华", -"海泰新光": "688677", -"688677": "海泰新光", -"天津普林": "002134", -"002134": "天津普林", -"百合花": "603823", -"603823": "百合花", -"红塔证券": "601236", -"601236": "红塔证券", -"*ST数码": "600700", -"600700": "*ST数码", -"万凯新材": "301216", -"301216": "万凯新材", -"云天化": "600096", -"600096": "云天化", -"ST有棵树": "300209", -"300209": "ST有棵树", -"朗博科技": "603655", -"603655": "朗博科技", -"科泰电源": "300153", -"300153": "科泰电源", -"赛伍技术": "603212", -"603212": "赛伍技术", -"金科环境": "688466", -"688466": "金科环境", -"方正电机": "002196", -"002196": "方正电机", -"金春股份": "300877", -"300877": "金春股份", -"神通科技": "605228", -"605228": "神通科技", -"宝立食品": "603170", -"603170": "宝立食品", -"视源股份": "002841", -"002841": "视源股份", -"海联讯": "300277", -"300277": "海联讯", -"贝泰妮": "300957", -"300957": "贝泰妮", -"正弦电气": "688395", -"688395": "正弦电气", -"凤凰股份": "600716", -"600716": "凤凰股份", -"浙商中拓": "000906", -"000906": "浙商中拓", -"宏发股份": "600885", -"600885": "宏发股份", -"鼎汉技术": "300011", -"300011": "鼎汉技术", -"凯瑞德": "002072", -"002072": "凯瑞德", -"浔兴股份": "002098", -"002098": "浔兴股份", -"盈趣科技": "002925", -"002925": "盈趣科技", -"寒武纪-U": "688256", -"688256": "寒武纪-U", -"波导股份": "600130", -"600130": "波导股份", -"正帆科技": "688596", -"688596": "正帆科技", -"桂林三金": "002275", -"002275": "桂林三金", -"金证股份": "600446", -"600446": "金证股份", -"晋西车轴": "600495", -"600495": "晋西车轴", -"浙版传媒": "601921", -"601921": "浙版传媒", -"康力电梯": "002367", -"002367": "康力电梯", -"图南股份": "300855", -"300855": "图南股份", -"新疆天业": "600075", -"600075": "新疆天业", -"纳微科技": "688690", -"688690": "纳微科技", -"退市辅仁": "600781", -"600781": "退市辅仁", -"奥泰生物": "688606", -"688606": "奥泰生物", -"桐昆股份": "601233", -"601233": "桐昆股份", -"五矿发展": "600058", -"600058": "五矿发展", -"山石网科": "688030", -"688030": "山石网科", -"财信发展": "000838", -"000838": "财信发展", -"荣泰健康": "603579", -"603579": "荣泰健康", -"伊力特": "600197", -"600197": "伊力特", -"双一科技": "300690", -"300690": "双一科技", -"力盛体育": "002858", -"002858": "力盛体育", -"天地源": "600665", -"600665": "天地源", -"赢合科技": "300457", -"300457": "赢合科技", -"长华化学": "301518", -"301518": "长华化学", -"佳合科技": "872392", -"872392": "佳合科技", -"青海华鼎": "600243", -"600243": "青海华鼎", -"汇隆活塞": "833455", -"833455": "汇隆活塞", -"科德数控": "688305", -"688305": "科德数控", -"麦克奥迪": "300341", -"300341": "麦克奥迪", -"新华百货": "600785", -"600785": "新华百货", -"华信新材": "300717", -"300717": "华信新材", -"新农开发": "600359", -"600359": "新农开发", -"盛视科技": "002990", -"002990": "盛视科技", -"星辉环材": "300834", -"300834": "星辉环材", -"星环科技-U": "688031", -"688031": "星环科技-U", -"皇马科技": "603181", -"603181": "皇马科技", -"兰剑智能": "688557", -"688557": "兰剑智能", -"苏盐井神": "603299", -"603299": "苏盐井神", -"天马新材": "838971", -"838971": "天马新材", -"金雷股份": "300443", -"300443": "金雷股份", -"沙河股份": "000014", -"000014": "沙河股份", -"东百集团": "600693", -"600693": "东百集团", -"亚邦股份": "603188", -"603188": "亚邦股份", -"国光电器": "002045", -"002045": "国光电器", -"合肥百货": "000417", -"000417": "合肥百货", -"保丽洁": "832802", -"832802": "保丽洁", -"康华生物": "300841", -"300841": "康华生物", -"中微公司": "688012", -"688012": "中微公司", -"和胜股份": "002824", -"002824": "和胜股份", -"新洁能": "605111", -"605111": "新洁能", -"美能能源": "001299", -"001299": "美能能源", -"司尔特": "002538", -"002538": "司尔特", -"全柴动力": "600218", -"600218": "全柴动力", -"佳华科技": "688051", -"688051": "佳华科技", -"金海高科": "603311", -"603311": "金海高科", -"曼卡龙": "300945", -"300945": "曼卡龙", -"时代万恒": "600241", -"600241": "时代万恒", -"云鼎科技": "000409", -"000409": "云鼎科技", -"高新兴": "300098", -"300098": "高新兴", -"恒为科技": "603496", -"603496": "恒为科技", -"诺德股份": "600110", -"600110": "诺德股份", -"国城矿业": "000688", -"000688": "国城矿业", -"新天科技": "300259", -"300259": "新天科技", -"江铃汽车": "000550", -"000550": "江铃汽车", -"迈普医学": "301033", -"301033": "迈普医学", -"禾昌聚合": "832089", -"832089": "禾昌聚合", -"华控赛格": "000068", -"000068": "华控赛格", -"炬光科技": "688167", -"688167": "炬光科技", -"壶化股份": "003002", -"003002": "壶化股份", -"理邦仪器": "300206", -"300206": "理邦仪器", -"凯迪退": "000939", -"000939": "凯迪退", -"光华股份": "001333", -"001333": "光华股份", -"西点药业": "301130", -"301130": "西点药业", -"中国西电": "601179", -"601179": "中国西电", -"诺唯赞": "688105", -"688105": "诺唯赞", -"捷顺科技": "002609", -"002609": "捷顺科技", -"唯捷创芯": "688153", -"688153": "唯捷创芯", -"奥精医疗": "688613", -"688613": "奥精医疗", -"中集车辆": "301039", -"301039": "中集车辆", -"华胜天成": "600410", -"600410": "华胜天成", -"芯朋微": "688508", -"688508": "芯朋微", -"丸美股份": "603983", -"603983": "丸美股份", -"垒知集团": "002398", -"002398": "垒知集团", -"万方发展": "000638", -"000638": "万方发展", -"劲拓股份": "300400", -"300400": "劲拓股份", -"甘肃能化": "000552", -"000552": "甘肃能化", -"中国核电": "601985", -"601985": "中国核电", -"前沿生物-U": "688221", -"688221": "前沿生物-U", -"英特科技": "301399", -"301399": "英特科技", -"蓝思科技": "300433", -"300433": "蓝思科技", -"远翔新材": "301300", -"301300": "远翔新材", -"实朴检测": "301228", -"301228": "实朴检测", -"初灵信息": "300250", -"300250": "初灵信息", -"赛微电子": "300456", -"300456": "赛微电子", -"顺网科技": "300113", -"300113": "顺网科技", -"丰光精密": "430510", -"430510": "丰光精密", -"八亿时空": "688181", -"688181": "八亿时空", -"恒达新材": "301469", -"301469": "恒达新材", -"威力传动": "300904", -"300904": "威力传动", -"亚厦股份": "002375", -"002375": "亚厦股份", -"山东钢铁": "600022", -"600022": "山东钢铁", -"安彩高科": "600207", -"600207": "安彩高科", -"恒宇信通": "300965", -"300965": "恒宇信通", -"美腾科技": "688420", -"688420": "美腾科技", -"鹭燕医药": "002788", -"002788": "鹭燕医药", -"新文退": "300336", -"300336": "新文退", -"美迪西": "688202", -"688202": "美迪西", -"汇源通信": "000586", -"000586": "汇源通信", -"中信金属": "601061", -"601061": "中信金属", -"天铁股份": "300587", -"300587": "天铁股份", -"珀莱雅": "603605", -"603605": "珀莱雅", -"*ST金一": "002721", -"002721": "*ST金一", -"东方铁塔": "002545", -"002545": "东方铁塔", -"明冠新材": "688560", -"688560": "明冠新材", -"中润光学": "688307", -"688307": "中润光学", -"甘肃能源": "000791", -"000791": "甘肃能源", -"晶华微": "688130", -"688130": "晶华微", -"万事利": "301066", -"301066": "万事利", -"中颖电子": "300327", -"300327": "中颖电子", -"西安旅游": "000610", -"000610": "西安旅游", -"田中精机": "300461", -"300461": "田中精机", -"美邦股份": "605033", -"605033": "美邦股份", -"杭氧股份": "002430", -"002430": "杭氧股份", -"开开实业": "600272", -"600272": "开开实业", -"怡": "002183", -"002183": "怡", -"翔鹭钨业": "002842", -"002842": "翔鹭钨业", -"航锦科技": "000818", -"000818": "航锦科技", -"ST金时": "002951", -"002951": "ST金时", -"可靠股份": "301009", -"301009": "可靠股份", -"新宁物流": "300013", -"300013": "新宁物流", -"威高骨科": "688161", -"688161": "威高骨科", -"退市游久": "600652", -"600652": "退市游久", -"华伍股份": "300095", -"300095": "华伍股份", -"洪汇新材": "002802", -"002802": "洪汇新材", -"中青旅": "600138", -"600138": "中青旅", -"北矿科技": "600980", -"600980": "北矿科技", -"玲珑轮胎": "601966", -"601966": "玲珑轮胎", -"金石资源": "603505", -"603505": "金石资源", -"西山科技": "688576", -"688576": "西山科技", -"陕西黑猫": "601015", -"601015": "陕西黑猫", -"三峡新材": "600293", -"600293": "三峡新材", -"深圳机场": "000089", -"000089": "深圳机场", -"中电港": "001287", -"001287": "中电港", -"宝钢包装": "601968", -"601968": "宝钢包装", -"山外山": "688410", -"688410": "山外山", -"航材股份": "688563", -"688563": "航材股份", -"康恩贝": "600572", -"600572": "康恩贝", -"永东股份": "002753", -"002753": "永东股份", -"通宝能源": "600780", -"600780": "通宝能源", -"掌阅科技": "603533", -"603533": "掌阅科技", -"华塑股份": "600935", -"600935": "华塑股份", -"奥雅股份": "300949", -"300949": "奥雅股份", -"华远地产": "600743", -"600743": "华远地产", -"宁波能源": "600982", -"600982": "宁波能源", -"中远海控": "601919", -"601919": "中远海控", -"正元智慧": "300645", -"300645": "正元智慧", -"中谷物流": "603565", -"603565": "中谷物流", -"国机精工": "002046", -"002046": "国机精工", -"悦达投资": "600805", -"600805": "悦达投资", -"工大科雅": "301197", -"301197": "工大科雅", -"大众公用": "600635", -"600635": "大众公用", -"杰普特": "688025", -"688025": "杰普特", -"众源新材": "603527", -"603527": "众源新材", -"农业银行": "601288", -"601288": "农业银行", -"中钢洛耐": "688119", -"688119": "中钢洛耐", -"伟创电气": "688698", -"688698": "伟创电气", -"华恒生物": "688639", -"688639": "华恒生物", -"S湘火炬": "000549", -"000549": "S湘火炬", -"中国汽研": "601965", -"601965": "中国汽研", -"江苏有线": "600959", -"600959": "江苏有线", -"恒润股份": "603985", -"603985": "恒润股份", -"正元地信": "688509", -"688509": "正元地信", -"艾迪药业": "688488", -"688488": "艾迪药业", -"哈尔斯": "002615", -"002615": "哈尔斯", -"安道麦A": "000553", -"000553": "安道麦A", -"中国神华": "601088", -"601088": "中国神华", -"金马集团": "000602", -"000602": "金马集团", -"科拓生物": "300858", -"300858": "科拓生物", -"威帝股份": "603023", -"603023": "威帝股份", -"信质集团": "002664", -"002664": "信质集团", -"安博通": "688168", -"688168": "安博通", -"赞宇科技": "002637", -"002637": "赞宇科技", -"杭萧钢构": "600477", -"600477": "杭萧钢构", -"聚赛龙": "301131", -"301131": "聚赛龙", -"PT中浩A": "000015", -"000015": "PT中浩A", -"莱伯泰科": "688056", -"688056": "莱伯泰科", -"阿拉丁": "688179", -"688179": "阿拉丁", -"兴齐眼药": "300573", -"300573": "兴齐眼药", -"惠程科技": "002168", -"002168": "惠程科技", -"鹿得医疗": "832278", -"832278": "鹿得医疗", -"新宙邦": "300037", -"300037": "新宙邦", -"中色股份": "000758", -"000758": "中色股份", -"卓胜微": "300782", -"300782": "卓胜微", -"众兴菌业": "002772", -"002772": "众兴菌业", -"*ST和科": "002816", -"002816": "*ST和科", -"安孚科技": "603031", -"603031": "安孚科技", -"中信博": "688408", -"688408": "中信博", -"唯赛勃": "688718", -"688718": "唯赛勃", -"千味央厨": "001215", -"001215": "千味央厨", -"维科技术": "600152", -"600152": "维科技术", -"洁美科技": "002859", -"002859": "洁美科技", -"*ST弘高": "002504", -"002504": "*ST弘高", -"大连友谊": "000679", -"000679": "大连友谊", -"*ST花雕": "600659", -"600659": "*ST花雕", -"宏辉果蔬": "603336", -"603336": "宏辉果蔬", -"德创环保": "603177", -"603177": "德创环保", -"ST美讯": "600898", -"600898": "ST美讯", -"浙江建投": "002761", -"002761": "浙江建投", -"有友食品": "603697", -"603697": "有友食品", -"云南铜业": "000878", -"000878": "云南铜业", -"龙佰集团": "002601", -"002601": "龙佰集团", -"嘉和美康": "688246", -"688246": "嘉和美康", -"计通退": "300330", -"300330": "计通退", -"罗莱生活": "002293", -"002293": "罗莱生活", -"顺利退": "000606", -"000606": "顺利退", -"ST实华": "000637", -"000637": "ST实华", -"三晖电气": "002857", -"002857": "三晖电气", -"亿晶光电": "600537", -"600537": "亿晶光电", -"中望软件": "688083", -"688083": "中望软件", -"欧晶科技": "001269", -"001269": "欧晶科技", -"得邦照明": "603303", -"603303": "得邦照明", -"维维股份": "600300", -"600300": "维维股份", -"同星科技": "301252", -"301252": "同星科技", -"康普顿": "603798", -"603798": "康普顿", -"国机通用": "600444", -"600444": "国机通用", -"源杰科技": "688498", -"688498": "源杰科技", -"涪陵电力": "600452", -"600452": "涪陵电力", -"红日药业": "300026", -"300026": "红日药业", -"凤凰传媒": "601928", -"601928": "凤凰传媒", -"普蕊斯": "301257", -"301257": "普蕊斯", -"精艺股份": "002295", -"002295": "精艺股份", -"仙琚制药": "002332", -"002332": "仙琚制药", -"S*ST龙昌": "600772", -"600772": "S*ST龙昌", -"科创信息": "300730", -"300730": "科创信息", -"人福医药": "600079", -"600079": "人福医药", -"中国船舶": "600150", -"600150": "中国船舶", -"ST鼎龙": "002502", -"002502": "ST鼎龙", -"天融信": "002212", -"002212": "天融信", -"纳睿雷达": "688522", -"688522": "纳睿雷达", -"格灵深瞳": "688207", -"688207": "格灵深瞳", -"银座股份": "600858", -"600858": "银座股份", -"*ST莫高": "600543", -"600543": "*ST莫高", -"厦门国贸": "600755", -"600755": "厦门国贸", -"宣泰医药": "688247", -"688247": "宣泰医药", -"*ST北科": "600878", -"600878": "*ST北科", -"锦好医疗": "872925", -"872925": "锦好医疗", -"敦煌种业": "600354", -"600354": "敦煌种业", -"四环生物": "000518", -"000518": "四环生物", -"伟隆股份": "002871", -"002871": "伟隆股份", -"尔康制药": "300267", -"300267": "尔康制药", -"山东高速": "600350", -"600350": "山东高速", -"凯莱英": "002821", -"002821": "凯莱英", -"中国海防": "600764", -"600764": "中国海防", -"天孚通信": "300394", -"300394": "天孚通信", -"XD锦波生": "832982", -"832982": "XD锦波生", -"曲美家居": "603818", -"603818": "曲美家居", -"卫星化学": "002648", -"002648": "卫星化学", -"新北洋": "002376", -"002376": "新北洋", -"天创时尚": "603608", -"603608": "天创时尚", -"丹邦退": "002618", -"002618": "丹邦退", -"新相微": "688593", -"688593": "新相微", -"兰花科创": "600123", -"600123": "兰花科创", -"天风证券": "601162", -"601162": "天风证券", -"信测标准": "300938", -"300938": "信测标准", -"PT金田A": "000003", -"000003": "PT金田A", -"西安饮食": "000721", -"000721": "西安饮食", -"上港集团": "600018", -"600018": "上港集团", -"丰元股份": "002805", -"002805": "丰元股份", -"芭田股份": "002170", -"002170": "芭田股份", -"普冉股份": "688766", -"688766": "普冉股份", -"唐山港": "601000", -"601000": "唐山港", -"退市济堂": "600090", -"600090": "退市济堂", -"连城数控": "835368", -"835368": "连城数控", -"江波龙": "301308", -"301308": "江波龙", -"中文传媒": "600373", -"600373": "中文传媒", -"西陇科学": "002584", -"002584": "西陇科学", -"齐鲁石化": "600002", -"600002": "齐鲁石化", -"九牧王": "601566", -"601566": "九牧王", -"西部黄金": "601069", -"601069": "西部黄金", -"华斯股份": "002494", -"002494": "华斯股份", -"蓝丰生化": "002513", -"002513": "蓝丰生化", -"亚泰集团": "600881", -"600881": "亚泰集团", -"德龙激光": "688170", -"688170": "德龙激光", -"顺威股份": "002676", -"002676": "顺威股份", -"东北证券": "000686", -"000686": "东北证券", -"上纬新材": "688585", -"688585": "上纬新材", -"丽江股份": "002033", -"002033": "丽江股份", -"三星新材": "603578", -"603578": "三星新材", -"萃华珠宝": "002731", -"002731": "萃华珠宝", -"南京银行": "601009", -"601009": "南京银行", -"南宁百货": "600712", -"600712": "南宁百货", -"康众医疗": "688607", -"688607": "康众医疗", -"海科新源": "301292", -"301292": "海科新源", -"山东玻纤": "605006", -"605006": "山东玻纤", -"三友化工": "600409", -"600409": "三友化工", -"华特气体": "688268", -"688268": "华特气体", -"振东制药": "300158", -"300158": "振东制药", -"龙元建设": "600491", -"600491": "龙元建设", -"海峡股份": "002320", -"002320": "海峡股份", -"金瑞矿业": "600714", -"600714": "金瑞矿业", -"证通电子": "002197", -"002197": "证通电子", -"金百泽": "301041", -"301041": "金百泽", -"欣泰退": "300372", -"300372": "欣泰退", -"宁科生物": "600165", -"600165": "宁科生物", -"九联科技": "688609", -"688609": "九联科技", -"芯碁微装": "688630", -"688630": "芯碁微装", -"龙江交通": "601188", -"601188": "龙江交通", -"联美控股": "600167", -"600167": "联美控股", -"三鑫医疗": "300453", -"300453": "三鑫医疗", -"兴化股份": "002109", -"002109": "兴化股份", -"康惠制药": "603139", -"603139": "康惠制药", -"通源石油": "300164", -"300164": "通源石油", -"明月镜片": "301101", -"301101": "明月镜片", -"龙溪股份": "600592", -"600592": "龙溪股份", -"益丰药房": "603939", -"603939": "益丰药房", -"成都先导": "688222", -"688222": "成都先导", -"中央商场": "600280", -"600280": "中央商场", -"大恒科技": "600288", -"600288": "大恒科技", -"景兴纸业": "002067", -"002067": "景兴纸业", -"飞天诚信": "300386", -"300386": "飞天诚信", -"新美星": "300509", -"300509": "新美星", -"神农科技": "300189", -"300189": "神农科技", -"中国一重": "601106", -"601106": "中国一重", -"日月股份": "603218", -"603218": "日月股份", -"汇创达": "300909", -"300909": "汇创达", -"佳力图": "603912", -"603912": "佳力图", -"驱动力": "838275", -"838275": "驱动力", -"上海家化": "600315", -"600315": "上海家化", -"维业股份": "300621", -"300621": "维业股份", -"汤姆猫": "300459", -"300459": "汤姆猫", -"粤": "002060", -"002060": "粤", -"*ST民控": "000416", -"000416": "*ST民控", -"上海港湾": "605598", -"605598": "上海港湾", -"上海能源": "600508", -"600508": "上海能源", -"中山公用": "000685", -"000685": "中山公用", -"中兵红箭": "000519", -"000519": "中兵红箭", -"久立特材": "002318", -"002318": "久立特材", -"先河环保": "300137", -"300137": "先河环保", -"浙江东方": "600120", -"600120": "浙江东方", -"蒙草生态": "300355", -"300355": "蒙草生态", -"光一退": "300356", -"300356": "光一退", -"熵基科技": "301330", -"301330": "熵基科技", -"润达医疗": "603108", -"603108": "润达医疗", -"创新新材": "600361", -"600361": "创新新材", -"渤海轮渡": "603167", -"603167": "渤海轮渡", -"锡南科技": "301170", -"301170": "锡南科技", -"昂立教育": "600661", -"600661": "昂立教育", -"神思电子": "300479", -"300479": "神思电子", -"恩捷股份": "002812", -"002812": "恩捷股份", -"菜百股份": "605599", -"605599": "菜百股份", -"中化国际": "600500", -"600500": "中化国际", -"百川股份": "002455", -"002455": "百川股份", -"华新环保": "301265", -"301265": "华新环保", -"永顺泰": "001338", -"001338": "永顺泰", -"中金黄金": "600489", -"600489": "中金黄金", -"华生科技": "605180", -"605180": "华生科技", -"高斯贝尔": "002848", -"002848": "高斯贝尔", -"亿道信息": "001314", -"001314": "亿道信息", -"万里石": "002785", -"002785": "万里石", -"宝莱特": "300246", -"300246": "宝莱特", -"金达威": "002626", -"002626": "金达威", -"廊坊发展": "600149", -"600149": "廊坊发展", -"退市中新": "603996", -"603996": "退市中新", -"海峡环保": "603817", -"603817": "海峡环保", -"新智认知": "603869", -"603869": "新智认知", -"南亚新材": "688519", -"688519": "南亚新材", -"*ST石化A": "000013", -"000013": "*ST石化A", -"清源股份": "603628", -"603628": "清源股份", -"浙江东日": "600113", -"600113": "浙江东日", -"隧道股份": "600820", -"600820": "隧道股份", -"威尔泰": "002058", -"002058": "威尔泰", -"五洲特纸": "605007", -"605007": "五洲特纸", -"奥克股份": "300082", -"300082": "奥克股份", -"华蓝集团": "301027", -"301027": "华蓝集团", -"大金重工": "002487", -"002487": "大金重工", -"力佳科技": "835237", -"835237": "力佳科技", -"迈信林": "688685", -"688685": "迈信林", -"重庆啤酒": "600132", -"600132": "重庆啤酒", -"普洛药业": "000739", -"000739": "普洛药业", -"博通股份": "600455", -"600455": "博通股份", -"普元信息": "688118", -"688118": "普元信息", -"亚太股份": "002284", -"002284": "亚太股份", -"张家界": "000430", -"000430": "张家界", -"浩丰科技": "300419", -"300419": "浩丰科技", -"润丰股份": "301035", -"301035": "润丰股份", -"康弘药业": "002773", -"002773": "康弘药业", -"塔牌集团": "002233", -"002233": "塔牌集团", -"交运股份": "600676", -"600676": "交运股份", -"金通灵": "300091", -"300091": "金通灵", -"悦心健康": "002162", -"002162": "悦心健康", -"风光股份": "301100", -"301100": "风光股份", -"品渥食品": "300892", -"300892": "品渥食品", -"ST远程": "002692", -"002692": "ST远程", -"国新文化": "600636", -"600636": "国新文化", -"蠡湖股份": "300694", -"300694": "蠡湖股份", -"陕西煤业": "601225", -"601225": "陕西煤业", -"新黄浦": "600638", -"600638": "新黄浦", -"花溪科技": "872895", -"872895": "花溪科技", -"西大门": "605155", -"605155": "西大门", -"苏州银行": "002966", -"002966": "苏州银行", -"金字火腿": "002515", -"002515": "金字火腿", -"冠农股份": "600251", -"600251": "冠农股份", -"浙江仙通": "603239", -"603239": "浙江仙通", -"中京电子": "002579", -"002579": "中京电子", -"埃科光电": "688610", -"688610": "埃科光电", -"双林股份": "300100", -"300100": "双林股份", -"东土科技": "300353", -"300353": "东土科技", -"大族激光": "002008", -"002008": "大族激光", -"亚虹医药-U": "688176", -"688176": "亚虹医药-U", -"完美世界": "002624", -"002624": "完美世界", -"安恒信息": "688023", -"688023": "安恒信息", -"润禾材料": "300727", -"300727": "润禾材料", -"江南奕帆": "301023", -"301023": "江南奕帆", -"华侨城A": "000069", -"000069": "华侨城A", -"开润股份": "300577", -"300577": "开润股份", -"退市中昌": "600242", -"600242": "退市中昌", -"新亚强": "603155", -"603155": "新亚强", -"阳光电源": "300274", -"300274": "阳光电源", -"吉林敖东": "000623", -"000623": "吉林敖东", -"普门科技": "688389", -"688389": "普门科技", -"尚太科技": "001301", -"001301": "尚太科技", -"野马电池": "605378", -"605378": "野马电池", -"卓越新能": "688196", -"688196": "卓越新能", -"渤海汽车": "600960", -"600960": "渤海汽车", -"华宏科技": "002645", -"002645": "华宏科技", -"粤桂股份": "000833", -"000833": "粤桂股份", -"牧高笛": "603908", -"603908": "牧高笛", -"谱尼测试": "300887", -"300887": "谱尼测试", -"义翘神州": "301047", -"301047": "义翘神州", -"电科数字": "600850", -"600850": "电科数字", -"文投控股": "600715", -"600715": "文投控股", -"天和防务": "300397", -"300397": "天和防务", -"德固特": "300950", -"300950": "德固特", -"艾能聚": "834770", -"834770": "艾能聚", -"舒泰神": "300204", -"300204": "舒泰神", -"ST宇顺": "002289", -"002289": "ST宇顺", -"金钼股份": "601958", -"601958": "金钼股份", -"利君股份": "002651", -"002651": "利君股份", -"斯菱股份": "301550", -"301550": "斯菱股份", -"科创新源": "300731", -"300731": "科创新源", -"雅达股份": "430556", -"430556": "雅达股份", -"超频三": "300647", -"300647": "超频三", -"博世科": "300422", -"300422": "博世科", -"汉商集团": "600774", -"600774": "汉商集团", -"威尔药业": "603351", -"603351": "威尔药业", -"退市华业": "600240", -"600240": "退市华业", -"金晶科技": "600586", -"600586": "金晶科技", -"火星人": "300894", -"300894": "火星人", -"浙江新能": "600032", -"600032": "浙江新能", -"美农生物": "301156", -"301156": "美农生物", -"梅安森": "300275", -"300275": "梅安森", -"瑞晟智能": "688215", -"688215": "瑞晟智能", -"倍轻松": "688793", -"688793": "倍轻松", -"海星股份": "603115", -"603115": "海星股份", -"亚康股份": "301085", -"301085": "亚康股份", -"冰山冷热": "000530", -"000530": "冰山冷热", -"富淼科技": "688350", -"688350": "富淼科技", -"好太太": "603848", -"603848": "好太太", -"东威科技": "688700", -"688700": "东威科技", -"新宏泰": "603016", -"603016": "新宏泰", -"东宏股份": "603856", -"603856": "东宏股份", -"新宏泽": "002836", -"002836": "新宏泽", -"标准股份": "600302", -"600302": "标准股份", -"利德曼": "300289", -"300289": "利德曼", -"华凯易佰": "300592", -"300592": "华凯易佰", -"汇绿生态": "001267", -"001267": "汇绿生态", -"精测电子": "300567", -"300567": "精测电子", -"联创股份": "300343", -"300343": "联创股份", -"华翔股份": "603112", -"603112": "华翔股份", -"ST海洋": "000658", -"000658": "ST海洋", -"国芳集团": "601086", -"601086": "国芳集团", -"海兰信": "300065", -"300065": "海兰信", -"海顺新材": "300501", -"300501": "海顺新材", -"国华网安": "000004", -"000004": "国华网安", -"益客食品": "301116", -"301116": "益客食品", -"索菲亚": "002572", -"002572": "索菲亚", -"昀冢科技": "688260", -"688260": "昀冢科技", -"花园生物": "300401", -"300401": "花园生物", -"台基股份": "300046", -"300046": "台基股份", -"骏亚科技": "603386", -"603386": "骏亚科技", -"杰华特": "688141", -"688141": "杰华特", -"铭科精技": "001319", -"001319": "铭科精技", -"荃银高科": "300087", -"300087": "荃银高科", -"ST瑞德": "600666", -"600666": "ST瑞德", -"长盛轴承": "300718", -"300718": "长盛轴承", -"博拓生物": "688767", -"688767": "博拓生物", -"智迪科技": "301503", -"301503": "智迪科技", -"中光学": "002189", -"002189": "中光学", -"华业香料": "300886", -"300886": "华业香料", -"东方明珠": "600832", -"600832": "东方明珠", -"永太科技": "002326", -"002326": "永太科技", -"时代电气": "688187", -"688187": "时代电气", -"安徽凤凰": "832000", -"832000": "安徽凤凰", -"众望布艺": "605003", -"605003": "众望布艺", -"运达科技": "300440", -"300440": "运达科技", -"深康佳A": "000016", -"000016": "深康佳A", -"魅视科技": "001229", -"001229": "魅视科技", -"领湃科技": "300530", -"300530": "领湃科技", -"奥美医疗": "002950", -"002950": "奥美医疗", -"昊帆生物": "301393", -"301393": "昊帆生物", -"科博达": "603786", -"603786": "科博达", -"珠海港": "000507", -"000507": "珠海港", -"康芝药业": "300086", -"300086": "康芝药业", -"雷赛智能": "002979", -"002979": "雷赛智能", -"沪硅产业": "688126", -"688126": "沪硅产业", -"欧克科技": "001223", -"001223": "欧克科技", -"法兰泰克": "603966", -"603966": "法兰泰克", -"瑞普生物": "300119", -"300119": "瑞普生物", -"唯科科技": "301196", -"301196": "唯科科技", -"苏常柴A": "000570", -"000570": "苏常柴A", -"康欣新材": "600076", -"600076": "康欣新材", -"新致软件": "688590", -"688590": "新致软件", -"汇金股份": "300368", -"300368": "汇金股份", -"中辰股份": "300933", -"300933": "中辰股份", -"冀东水泥": "000401", -"000401": "冀东水泥", -"神驰机电": "603109", -"603109": "神驰机电", -"宏川智慧": "002930", -"002930": "宏川智慧", -"清越科技": "688496", -"688496": "清越科技", -"辽港股份": "601880", -"601880": "辽港股份", -"东富龙": "300171", -"300171": "东富龙", -"惠泰医疗": "688617", -"688617": "惠泰医疗", -"蓝晓科技": "300487", -"300487": "蓝晓科技", -"瑞茂通": "600180", -"600180": "瑞茂通", -"国科军工": "688543", -"688543": "国科军工", -"华鹏飞": "300350", -"300350": "华鹏飞", -"亚钾国际": "000893", -"000893": "亚钾国际", -"富乐德": "301297", -"301297": "富乐德", -"高华科技": "688539", -"688539": "高华科技", -"凯龙股份": "002783", -"002783": "凯龙股份", -"豪声电子": "838701", -"838701": "豪声电子", -"比亚迪": "002594", -"002594": "比亚迪", -"极米科技": "688696", -"688696": "极米科技", -"天首退": "000611", -"000611": "天首退", -"中欣氟材": "002915", -"002915": "中欣氟材", -"贝特瑞": "835185", -"835185": "贝特瑞", -"恩威医药": "301331", -"301331": "恩威医药", -"正威新材": "002201", -"002201": "正威新材", -"现代投资": "000900", -"000900": "现代投资", -"祥明智能": "301226", -"301226": "祥明智能", -"ST天龙": "300029", -"300029": "ST天龙", -"报": "002154", -"002154": "报", -"必得科技": "605298", -"605298": "必得科技", -"嘉欣丝绸": "002404", -"002404": "嘉欣丝绸", -"东瑞股份": "001201", -"001201": "东瑞股份", -"天佑德酒": "002646", -"002646": "天佑德酒", -"明泰铝业": "601677", -"601677": "明泰铝业", -"冰川网络": "300533", -"300533": "冰川网络", -"乐心医疗": "300562", -"300562": "乐心医疗", -"安达智能": "688125", -"688125": "安达智能", -"退市博元": "600656", -"600656": "退市博元", -"日上集团": "002593", -"002593": "日上集团", -"新华制药": "000756", -"000756": "新华制药", -"中信特钢": "000708", -"000708": "中信特钢", -"和顺石油": "603353", -"603353": "和顺石油", -"*ST天沃": "002564", -"002564": "*ST天沃", -"北汽蓝谷": "600733", -"600733": "北汽蓝谷", -"ST迪威迅": "300167", -"300167": "ST迪威迅", -"S*ST佳纸": "000699", -"000699": "S*ST佳纸", -"中来股份": "300393", -"300393": "中来股份", -"上海洗霸": "603200", -"603200": "上海洗霸", -"瑞可达": "688800", -"688800": "瑞可达", -"远达环保": "600292", -"600292": "远达环保", -"北新路桥": "002307", -"002307": "北新路桥", -"盈建科": "300935", -"300935": "盈建科", -"澳弘电子": "605058", -"605058": "澳弘电子", -"ST摩登": "002656", -"002656": "ST摩登", -"豪恩汽电": "301488", -"301488": "豪恩汽电", -"浪莎股份": "600137", -"600137": "浪莎股份", -"科净源": "301372", -"301372": "科净源", -"三羊马": "001317", -"001317": "三羊马", -"同花顺": "300033", -"300033": "同花顺", -"城建发展": "600266", -"600266": "城建发展", -"隆扬电子": "301389", -"301389": "隆扬电子", -"永信至诚": "688244", -"688244": "永信至诚", -"鹏翎股份": "300375", -"300375": "鹏翎股份", -"四川黄金": "001337", -"001337": "四川黄金", -"昌红科技": "300151", -"300151": "昌红科技", -"银轮股份": "002126", -"002126": "银轮股份", -"凯旺科技": "301182", -"301182": "凯旺科技", -"安洁科技": "002635", -"002635": "安洁科技", -"新兴铸管": "000778", -"000778": "新兴铸管", -"中炬高新": "600872", -"600872": "中炬高新", -"帝欧家居": "002798", -"002798": "帝欧家居", -"仁智股份": "002629", -"002629": "仁智股份", -"鼎捷软件": "300378", -"300378": "鼎捷软件", -"华力创通": "300045", -"300045": "华力创通", -"亚光科技": "300123", -"300123": "亚光科技", -"新开源": "300109", -"300109": "新开源", -"恒帅股份": "300969", -"300969": "恒帅股份", -"浩淼科技": "831856", -"831856": "浩淼科技", -"广汽集团": "601238", -"601238": "广汽集团", -"国科恒泰": "301370", -"301370": "国科恒泰", -"东旭光电": "000413", -"000413": "东旭光电", -"保龄宝": "002286", -"002286": "保龄宝", -"南芯科技": "688484", -"688484": "南芯科技", -"华塑控股": "000509", -"000509": "华塑控股", -"长城科技": "603897", -"603897": "长城科技", -"ST九州": "000653", -"000653": "ST九州", -"川环科技": "300547", -"300547": "川环科技", -"熊猫乳品": "300898", -"300898": "熊猫乳品", -"博思软件": "300525", -"300525": "博思软件", -"三六零": "601360", -"601360": "三六零", -"新华文轩": "601811", -"601811": "新华文轩", -"北元集团": "601568", -"601568": "北元集团", -"岳阳林纸": "600963", -"600963": "岳阳林纸", -"国子软件": "872953", -"872953": "国子软件", -"中航沈飞": "600760", -"600760": "中航沈飞", -"本钢板材": "000761", -"000761": "本钢板材", -"汇鸿集团": "600981", -"600981": "汇鸿集团", -"华勤技术": "603296", -"603296": "华勤技术", -"沪宁股份": "300669", -"300669": "沪宁股份", -"京新药业": "002020", -"002020": "京新药业", -"惠同新材": "833751", -"833751": "惠同新材", -"沃格光电": "603773", -"603773": "沃格光电", -"凌云股份": "600480", -"600480": "凌云股份", -"温州宏丰": "300283", -"300283": "温州宏丰", -"天键股份": "301383", -"301383": "天键股份", -"锐奇股份": "300126", -"300126": "锐奇股份", -"星帅尔": "002860", -"002860": "星帅尔", -"昊华能源": "601101", -"601101": "昊华能源", -"望变电气": "603191", -"603191": "望变电气", -"德才股份": "605287", -"605287": "德才股份", -"恒铭达": "002947", -"002947": "恒铭达", -"开普云": "688228", -"688228": "开普云", -"南微医学": "688029", -"688029": "南微医学", -"ST阳光城": "000671", -"000671": "ST阳光城", -"美尔雅": "600107", -"600107": "美尔雅", -"阳光诺和": "688621", -"688621": "阳光诺和", -"臻镭科技": "688270", -"688270": "臻镭科技", -"建工修复": "300958", -"300958": "建工修复", -"津药药业": "600488", -"600488": "津药药业", -"武汉凡谷": "002194", -"002194": "武汉凡谷", -"方直科技": "300235", -"300235": "方直科技", -"泽璟制药-U": "688266", -"688266": "泽璟制药-U", -"国瑞科技": "300600", -"300600": "国瑞科技", -"航发控制": "000738", -"000738": "航发控制", -"宜安科技": "300328", -"300328": "宜安科技", -"春秋航空": "601021", -"601021": "春秋航空", -"ST金鸿": "000669", -"000669": "ST金鸿", -"青岛中程": "300208", -"300208": "青岛中程", -"红": "002165", -"002165": "红", -"恩华药业": "002262", -"002262": "恩华药业", -"奇信退": "002781", -"002781": "奇信退", -"欣锐科技": "300745", -"300745": "欣锐科技", -"金浦钛业": "000545", -"000545": "金浦钛业", -"四方科技": "603339", -"603339": "四方科技", -"摩恩电气": "002451", -"002451": "摩恩电气", -"三旺通信": "688618", -"688618": "三旺通信", -"郑中设计": "002811", -"002811": "郑中设计", -"宏源药业": "301246", -"301246": "宏源药业", -"四方光电": "688665", -"688665": "四方光电", -"汉宇集团": "300403", -"300403": "汉宇集团", -"东利机械": "301298", -"301298": "东利机械", -"美芯晟": "688458", -"688458": "美芯晟", -"中科海讯": "300810", -"300810": "中科海讯", -"华润材料": "301090", -"301090": "华润材料", -"宏达电子": "300726", -"300726": "宏达电子", -"协昌科技": "301418", -"301418": "协昌科技", -"航民股份": "600987", -"600987": "航民股份", -"惠达卫浴": "603385", -"603385": "惠达卫浴", -"达仁堂": "600329", -"600329": "达仁堂", -"瑞丰高材": "300243", -"300243": "瑞丰高材", -"远方信息": "300306", -"300306": "远方信息", -"益民集团": "600824", -"600824": "益民集团", -"金固股份": "002488", -"002488": "金固股份", -"如通股份": "603036", -"603036": "如通股份", -"广咨国际": "836892", -"836892": "广咨国际", -"赢时胜": "300377", -"300377": "赢时胜", -"招商蛇口": "001979", -"001979": "招商蛇口", -"湘电股份": "600416", -"600416": "湘电股份", -"*ST雪发": "002485", -"002485": "*ST雪发", -"*ST创智": "000787", -"000787": "*ST创智", -"宝明科技": "002992", -"002992": "宝明科技", -"金开新能": "600821", -"600821": "金开新能", -"灵康药业": "603669", -"603669": "灵康药业", -"中泰股份": "300435", -"300435": "中泰股份", -"松炀资源": "603863", -"603863": "松炀资源", -"豪尔赛": "002963", -"002963": "豪尔赛", -"天准科技": "688003", -"688003": "天准科技", -"蜂助手": "301382", -"301382": "蜂助手", -"霍普股份": "301024", -"301024": "霍普股份", -"宏达新材": "002211", -"002211": "宏达新材", -"麦澜德": "688273", -"688273": "麦澜德", -"中银绒业": "000982", -"000982": "中银绒业", -"派生科技": "300176", -"300176": "派生科技", -"宁波华翔": "002048", -"002048": "宁波华翔", -"利民股份": "002734", -"002734": "利民股份", -"萤石网络": "688475", -"688475": "萤石网络", -"海森药业": "001367", -"001367": "海森药业", -"三钢闽光": "002110", -"002110": "三钢闽光", -"富通信息": "000836", -"000836": "富通信息", -"康希诺": "688185", -"688185": "康希诺", -"伟星股份": "002003", -"002003": "伟星股份", -"天润工业": "002283", -"002283": "天润工业", -"蓝黛科技": "002765", -"002765": "蓝黛科技", -"建新股份": "300107", -"300107": "建新股份", -"松芝股份": "002454", -"002454": "松芝股份", -"*ST比特": "000621", -"000621": "*ST比特", -"江化微": "603078", -"603078": "江化微", -"中重科技": "603135", -"603135": "中重科技", -"中创物流": "603967", -"603967": "中创物流", -"招商证券": "600999", -"600999": "招商证券", -"鄂尔多斯": "600295", -"600295": "鄂尔多斯", -"长远锂科": "688779", -"688779": "长远锂科", -"深城交": "301091", -"301091": "深城交", -"建霖家居": "603408", -"603408": "建霖家居", -"华秦科技": "688281", -"688281": "华秦科技", -"太龙股份": "300650", -"300650": "太龙股份", -"精锻科技": "300258", -"300258": "精锻科技", -"久量股份": "300808", -"300808": "久量股份", -"胜蓝股份": "300843", -"300843": "胜蓝股份", -"光迅科技": "002281", -"002281": "光迅科技", -"苏能股份": "600925", -"600925": "苏能股份", -"新华锦": "600735", -"600735": "新华锦", -"中远海能": "600026", -"600026": "中远海能", -"南模生物": "688265", -"688265": "南模生物", -"南宁糖业": "000911", -"000911": "南宁糖业", -"三一重能": "688349", -"688349": "三一重能", -"芳源股份": "688148", -"688148": "芳源股份", -"滨海能源": "000695", -"000695": "滨海能源", -"*ST天润": "002113", -"002113": "*ST天润", -"顾家家居": "603816", -"603816": "顾家家居", -"浙文影业": "601599", -"601599": "浙文影业", -"ST万林": "603117", -"603117": "ST万林", -"德生科技": "002908", -"002908": "德生科技", -"海格通信": "002465", -"002465": "海格通信", -"通用电梯": "300931", -"300931": "通用电梯", -"福瑞股份": "300049", -"300049": "福瑞股份", -"仁信新材": "301395", -"301395": "仁信新材", -"龙净环保": "600388", -"600388": "龙净环保", -"恒力石化": "600346", -"600346": "恒力石化", -"新华医疗": "600587", -"600587": "新华医疗", -"博硕科技": "300951", -"300951": "博硕科技", -"漱玉平民": "301017", -"301017": "漱玉平民", -"天宏锂电": "873152", -"873152": "天宏锂电", -"晋拓股份": "603211", -"603211": "晋拓股份", -"富恒新材": "832469", -"832469": "富恒新材", -"宜宾纸业": "600793", -"600793": "宜宾纸业", -"蓝焰控股": "000968", -"000968": "蓝焰控股", -"漫步者": "002351", -"002351": "漫步者", -"万顺新材": "300057", -"300057": "万顺新材", -"天味食品": "603317", -"603317": "天味食品", -"华宝股份": "300741", -"300741": "华宝股份", -"鸿泉物联": "688288", -"688288": "鸿泉物联", -"亨迪药业": "301211", -"301211": "亨迪药业", -"雅葆轩": "870357", -"870357": "雅葆轩", -"君实生物-U": "688180", -"688180": "君实生物-U", -"维峰电子": "301328", -"301328": "维峰电子", -"悦安新材": "688786", -"688786": "悦安新材", -"贵阳银行": "601997", -"601997": "贵阳银行", -"世龙实业": "002748", -"002748": "世龙实业", -"皮阿诺": "002853", -"002853": "皮阿诺", -"罗": "000735", -"000735": "罗", -"汇顶科技": "603160", -"603160": "汇顶科技", -"贵航股份": "600523", -"600523": "贵航股份", -"中巨芯-U": "688549", -"688549": "中巨芯-U", -"天元智能": "603273", -"603273": "天元智能", -"久日新材": "688199", -"688199": "久日新材", -"药易购": "300937", -"300937": "药易购", -"三房巷": "600370", -"600370": "三房巷", -"巨星科技": "002444", -"002444": "巨星科技", -"大地熊": "688077", -"688077": "大地熊", -"长生退": "002680", -"002680": "长生退", -"海能实业": "300787", -"300787": "海能实业", -"远兴能源": "000683", -"000683": "远兴能源", -"*ST荣华": "600311", -"600311": "*ST荣华", -"华光新材": "688379", -"688379": "华光新材", -"斯迪克": "300806", -"300806": "斯迪克", -"森远股份": "300210", -"300210": "森远股份", -"维远股份": "600955", -"600955": "维远股份", -"艾融软件": "830799", -"830799": "艾融软件", -"九阳股份": "002242", -"002242": "九阳股份", -"北鼎股份": "300824", -"300824": "北鼎股份", -"乐视退": "300104", -"300104": "乐视退", -"退市绿庭": "600695", -"600695": "退市绿庭", -"斯太退": "000760", -"000760": "斯太退", -"奇德新材": "300995", -"300995": "奇德新材", -"雪天盐业": "600929", -"600929": "雪天盐业", -"瑞丰新材": "300910", -"300910": "瑞丰新材", -"明志科技": "688355", -"688355": "明志科技", -"山煤国际": "600546", -"600546": "山煤国际", -"绿盟科技": "300369", -"300369": "绿盟科技", -"正强股份": "301119", -"301119": "正强股份", -"大胜达": "603687", -"603687": "大胜达", -"罗普特": "688619", -"688619": "罗普特", -"新安洁": "831370", -"831370": "新安洁", -"晶科科技": "601778", -"601778": "晶科科技", -"新瀚新材": "301076", -"301076": "新瀚新材", -"中国化学": "601117", -"601117": "中国化学", -"烽火电子": "000561", -"000561": "烽火电子", -"三花智控": "002050", -"002050": "三花智控", -"华纳药厂": "688799", -"688799": "华纳药厂", -"慈文传媒": "002343", -"002343": "慈文传媒", -"中金岭南": "000060", -"000060": "中金岭南", -"达实智能": "002421", -"002421": "达实智能", -"数字政通": "300075", -"300075": "数字政通", -"博杰股份": "002975", -"002975": "博杰股份", -"丰立智能": "301368", -"301368": "丰立智能", -"ST生态": "600709", -"600709": "ST生态", -"捷成股份": "300182", -"300182": "捷成股份", -"海通发展": "603162", -"603162": "海通发展", -"横河精密": "300539", -"300539": "横河精密", -"甘化科工": "000576", -"000576": "甘化科工", -"彤程新材": "603650", -"603650": "彤程新材", -"美晨生态": "300237", -"300237": "美晨生态", -"ST富润": "600070", -"600070": "ST富润", -"天方药业": "600253", -"600253": "天方药业", -"人民同泰": "600829", -"600829": "人民同泰", -"贵研铂业": "600459", -"600459": "贵研铂业", -"山东华鹏": "603021", -"603021": "山东华鹏", -"一拖股份": "601038", -"601038": "一拖股份", -"乐惠国际": "603076", -"603076": "乐惠国际", -"路桥建设": "600263", -"600263": "路桥建设", -"XD奥浦迈": "688293", -"688293": "XD奥浦迈", -"聚力文化": "002247", -"002247": "聚力文化", -"汉嘉设计": "300746", -"300746": "汉嘉设计", -"*ST龙科": "600799", -"600799": "*ST龙科", -"退市易见": "600093", -"600093": "退市易见", -"百纳千成": "300291", -"300291": "百纳千成", -"卓易信息": "688258", -"688258": "卓易信息", -"和仁科技": "300550", -"300550": "和仁科技", -"星星科技": "300256", -"300256": "星星科技", -"美联新材": "300586", -"300586": "美联新材", -"瑞凌股份": "300154", -"300154": "瑞凌股份", -"广汇汽车": "600297", -"600297": "广汇汽车", -"*ST新纺": "002087", -"002087": "*ST新纺", -"青矩技术": "836208", -"836208": "青矩技术", -"华康医疗": "301235", -"301235": "华康医疗", -"天顺风能": "002531", -"002531": "天顺风能", -"福斯达": "603173", -"603173": "福斯达", -"英洛华": "000795", -"000795": "英洛华", -"楚天科技": "300358", -"300358": "楚天科技", -"正丹股份": "300641", -"300641": "正丹股份", -"峨眉山A": "000888", -"000888": "峨眉山A", -"元道通信": "301139", -"301139": "元道通信", -"久祺股份": "300994", -"300994": "久祺股份", -"天喻信息": "300205", -"300205": "天喻信息", -"兴业银锡": "000426", -"000426": "兴业银锡", -"辰光医疗": "430300", -"430300": "辰光医疗", -"厦门钨业": "600549", -"600549": "厦门钨业", -"新凤鸣": "603225", -"603225": "新凤鸣", -"歌尔股份": "002241", -"002241": "歌尔股份", -"德尔玛": "301332", -"301332": "德尔玛", -"科大国创": "300520", -"300520": "科大国创", -"深科技": "000021", -"000021": "深科技", -"苏州龙杰": "603332", -"603332": "苏州龙杰", -"博闻科技": "600883", -"600883": "博闻科技", -"海航科技": "600751", -"600751": "海航科技", -"润阳科技": "300920", -"300920": "润阳科技", -"华西证券": "002926", -"002926": "华西证券", -"集智股份": "300553", -"300553": "集智股份", -"神宇股份": "300563", -"300563": "神宇股份", -"朗玛信息": "300288", -"300288": "朗玛信息", -"宁波方正": "300998", -"300998": "宁波方正", -"普莱得": "301353", -"301353": "普莱得", -"大富科技": "300134", -"300134": "大富科技", -"永泰运": "001228", -"001228": "永泰运", -"镇海股份": "603637", -"603637": "镇海股份", -"科大智能": "300222", -"300222": "科大智能", -"新澳股份": "603889", -"603889": "新澳股份", -"巨一科技": "688162", -"688162": "巨一科技", -"华体科技": "603679", -"603679": "华体科技", -"八方股份": "603489", -"603489": "八方股份", -"汇中股份": "300371", -"300371": "汇中股份", -"华昌达": "300278", -"300278": "华昌达", -"财富趋势": "688318", -"688318": "财富趋势", -"热景生物": "688068", -"688068": "热景生物", -"金岭矿业": "000655", -"000655": "金岭矿业", -"国盛金控": "002670", -"002670": "国盛金控", -"万辰集团": "300972", -"300972": "万辰集团", -"恒尚节能": "603137", -"603137": "恒尚节能", -"紫燕食品": "603057", -"603057": "紫燕食品", -"安泰集团": "600408", -"600408": "安泰集团", -"南风股份": "300004", -"300004": "南风股份", -"正业科技": "300410", -"300410": "正业科技", -"联迪信息": "839790", -"839790": "联迪信息", -"*ST": "002157", -"002157": "*ST", -"泰尔股份": "002347", -"002347": "泰尔股份", -"丰林集团": "601996", -"601996": "丰林集团", -"洽洽食品": "002557", -"002557": "洽洽食品", -"华联商厦": "600632", -"600632": "华联商厦", -"郑州银行": "002936", -"002936": "郑州银行", -"神州泰岳": "300002", -"300002": "神州泰岳", -"柏诚股份": "601133", -"601133": "柏诚股份", -"株冶集团": "600961", -"600961": "株冶集团", -"海看股份": "301262", -"301262": "海看股份", -"无锡振华": "605319", -"605319": "无锡振华", -"新晨科技": "300542", -"300542": "新晨科技", -"复洁环保": "688335", -"688335": "复洁环保", -"超卓航科": "688237", -"688237": "超卓航科", -"泰晶科技": "603738", -"603738": "泰晶科技", -"嘉泽新能": "601619", -"601619": "嘉泽新能", -"海宁皮城": "002344", -"002344": "海宁皮城", -"凯添燃气": "831010", -"831010": "凯添燃气", -"横店影视": "603103", -"603103": "横店影视", -"东材科技": "601208", -"601208": "东材科技", -"武进不锈": "603878", -"603878": "武进不锈", -"康隆达": "603665", -"603665": "康隆达", -"晋亿实业": "601002", -"601002": "晋亿实业", -"新时达": "002527", -"002527": "新时达", -"吉比特": "603444", -"603444": "吉比特", -"华旺科技": "605377", -"605377": "华旺科技", -"宏英智能": "001266", -"001266": "宏英智能", -"立新能源": "001258", -"001258": "立新能源", -"包头铝业": "600472", -"600472": "包头铝业", -"冠城大通": "600067", -"600067": "冠城大通", -"中农立华": "603970", -"603970": "中农立华", -"山东墨龙": "002490", -"002490": "山东墨龙", -"球冠电缆": "834682", -"834682": "球冠电缆", -"易德龙": "603380", -"603380": "易德龙", -"通润装备": "002150", -"002150": "通润装备", -"东旭蓝天": "000040", -"000040": "东旭蓝天", -"安利股份": "300218", -"300218": "安利股份", -"南凌科技": "300921", -"300921": "南凌科技", -"联创电子": "002036", -"002036": "联创电子", -"惠博普": "002554", -"002554": "惠博普", -"千山退": "300216", -"300216": "千山退", -"瀛通通讯": "002861", -"002861": "瀛通通讯", -"海油工程": "600583", -"600583": "海油工程", -"来伊份": "603777", -"603777": "来伊份", -"慕思股份": "001323", -"001323": "慕思股份", -"安集科技": "688019", -"688019": "安集科技", -"嘉美包装": "002969", -"002969": "嘉美包装", -"ST易购": "002024", -"002024": "ST易购", -"瑞康医药": "002589", -"002589": "瑞康医药", -"上声电子": "688533", -"688533": "上声电子", -"海天股份": "603759", -"603759": "海天股份", -"商络电子": "300975", -"300975": "商络电子", -"中科通达": "688038", -"688038": "中科通达", -"岳阳兴长": "000819", -"000819": "岳阳兴长", -"中国联通": "600050", -"600050": "中国联通", -"贵州轮胎": "000589", -"000589": "贵州轮胎", -"锦江酒店": "600754", -"600754": "锦江酒店", -"华鲁恒升": "600426", -"600426": "华鲁恒升", -"ST鹏博士": "600804", -"600804": "ST鹏博士", -"西部证券": "002673", -"002673": "西部证券", -"大龙地产": "600159", -"600159": "大龙地产", -"吉大正元": "003029", -"003029": "吉大正元", -"东和新材": "839792", -"839792": "东和新材", -"新媒股份": "300770", -"300770": "新媒股份", -"炬申股份": "001202", -"001202": "炬申股份", -"明阳电气": "301291", -"301291": "明阳电气", -"迈赫股份": "301199", -"301199": "迈赫股份", -"英力股份": "300956", -"300956": "英力股份", -"赛伦生物": "688163", -"688163": "赛伦生物", -"永安期货": "600927", -"600927": "永安期货", -"东海A退": "000613", -"000613": "东海A退", -"龙腾光电": "688055", -"688055": "龙腾光电", -"金桥信息": "603918", -"603918": "金桥信息", -"华安证券": "600909", -"600909": "华安证券", -"*ST美盛": "002699", -"002699": "*ST美盛", -"云南能投": "002053", -"002053": "云南能投", -"中达安": "300635", -"300635": "中达安", -"中大力德": "002896", -"002896": "中大力德", -"深物业A": "000011", -"000011": "深物业A", -"新柴股份": "301032", -"301032": "新柴股份", -"新光光电": "688011", -"688011": "新光光电", -"康达新材": "002669", -"002669": "康达新材", -"高盟新材": "300200", -"300200": "高盟新材", -"永安药业": "002365", -"002365": "永安药业", -"杰创智能": "301248", -"301248": "杰创智能", -"同德化工": "002360", -"002360": "同德化工", -"梅雁吉祥": "600868", -"600868": "梅雁吉祥", -"新益昌": "688383", -"688383": "新益昌", -"退市运盛": "600767", -"600767": "退市运盛", -"千红制药": "002550", -"002550": "千红制药", -"东吴证券": "601555", -"601555": "东吴证券", -"移远通信": "603236", -"603236": "移远通信", -"瑞尔特": "002790", -"002790": "瑞尔特", -"长龄液压": "605389", -"605389": "长龄液压", -"中威电子": "300270", -"300270": "中威电子", -"钱江生化": "600796", -"600796": "钱江生化", -"云从科技-UW": "688327", -"688327": "云从科技-UW", -"利仁科技": "001259", -"001259": "利仁科技", -"中科飞测-U": "688361", -"688361": "中科飞测-U", -"法狮龙": "605318", -"605318": "法狮龙", -"中装建设": "002822", -"002822": "中装建设", -"莱斯信息": "688631", -"688631": "莱斯信息", -"七彩化学": "300758", -"300758": "七彩化学", -"常山北明": "000158", -"000158": "常山北明", -"盛通股份": "002599", -"002599": "盛通股份", -"ST起步": "603557", -"603557": "ST起步", -"曼恩斯特": "301325", -"301325": "曼恩斯特", -"金房能源": "001210", -"001210": "金房能源", -"英维克": "002837", -"002837": "英维克", -"退市海创": "600555", -"600555": "退市海创", -"亚翔集成": "603929", -"603929": "亚翔集成", -"爱建集团": "600643", -"600643": "爱建集团", -"*ST金洲": "000587", -"000587": "*ST金洲", -"南威软件": "603636", -"603636": "南威软件", -"长江健康": "002435", -"002435": "长江健康", -"大湖股份": "600257", -"600257": "大湖股份", -"长城证券": "002939", -"002939": "长城证券", -"白云山": "600332", -"600332": "白云山", -"远大智能": "002689", -"002689": "远大智能", -"山东黄金": "600547", -"600547": "山东黄金", -"新莱福": "301323", -"301323": "新莱福", -"城地香江": "603887", -"603887": "城地香江", -"网宿科技": "300017", -"300017": "网宿科技", -"大秦铁路": "601006", -"601006": "大秦铁路", -"福能股份": "600483", -"600483": "福能股份", -"朗进科技": "300594", -"300594": "朗进科技", -"容大感光": "300576", -"300576": "容大感光", -"大洋电机": "002249", -"002249": "大洋电机", -"坤恒顺维": "688283", -"688283": "坤恒顺维", -"荣晟环保": "603165", -"603165": "荣晟环保", -"威马农机": "301533", -"301533": "威马农机", -"宏华数科": "688789", -"688789": "宏华数科", -"东鹏饮料": "605499", -"605499": "东鹏饮料", -"华资实业": "600191", -"600191": "华资实业", -"佳讯飞鸿": "300213", -"300213": "佳讯飞鸿", -"雪浪环境": "300385", -"300385": "雪浪环境", -"声迅股份": "003004", -"003004": "声迅股份", -"瀚川智能": "688022", -"688022": "瀚川智能", -"钧达股份": "002865", -"002865": "钧达股份", -"双星新材": "002585", -"002585": "双星新材", -"云维股份": "600725", -"600725": "云维股份", -"退市海润": "600401", -"600401": "退市海润", -"开特股份": "832978", -"832978": "开特股份", -"日播时尚": "603196", -"603196": "日播时尚", -"王力安防": "605268", -"605268": "王力安防", -"双塔食品": "002481", -"002481": "双塔食品", -"新": "000876", -"000876": "新", -"昇辉科技": "300423", -"300423": "昇辉科技", -"航天智装": "300455", -"300455": "航天智装", -"西部牧业": "300106", -"300106": "西部牧业", -"岩石股份": "600696", -"600696": "岩石股份", -"斯瑞新材": "688102", -"688102": "斯瑞新材", -"长沙银行": "601577", -"601577": "长沙银行", -"新联电子": "002546", -"002546": "新联电子", -"熙菱信息": "300588", -"300588": "熙菱信息", -"明星电力": "600101", -"600101": "明星电力", -"通程控股": "000419", -"000419": "通程控股", -"光大嘉宝": "600622", -"600622": "光大嘉宝", -"赛恩斯": "688480", -"688480": "赛恩斯", -"郑州煤电": "600121", -"600121": "郑州煤电", -"同和药业": "300636", -"300636": "同和药业", -"*ST环保": "000730", -"000730": "*ST环保", -"爱司凯": "300521", -"300521": "爱司凯", -"大唐发电": "601991", -"601991": "大唐发电", -"新元科技": "300472", -"300472": "新元科技", -"尚品宅配": "300616", -"300616": "尚品宅配", -"鸿远电子": "603267", -"603267": "鸿远电子", -"中公教育": "002607", -"002607": "中公教育", -"三德科技": "300515", -"300515": "三德科技", -"丰安股份": "870508", -"870508": "丰安股份", -"新通联": "603022", -"603022": "新通联", -"致尚科技": "301486", -"301486": "致尚科技", -"三峰环境": "601827", -"601827": "三峰环境", -"佳隆股份": "002495", -"002495": "佳隆股份", -"金力泰": "300225", -"300225": "金力泰", -"芒果超媒": "300413", -"300413": "芒果超媒", -"苏大维格": "300331", -"300331": "苏大维格", -"神剑股份": "002361", -"002361": "神剑股份", -"瑞鹄模具": "002997", -"002997": "瑞鹄模具", -"国机汽车": "600335", -"600335": "国机汽车", -"大禹生物": "871970", -"871970": "大禹生物", -"豪迈科技": "002595", -"002595": "豪迈科技", -"星昊医药": "430017", -"430017": "星昊医药", -"彩虹集团": "003023", -"003023": "彩虹集团", -"龙版传媒": "605577", -"605577": "龙版传媒", -"和元生物": "688238", -"688238": "和元生物", -"恒辉安防": "300952", -"300952": "恒辉安防", -"*ST博天": "603603", -"603603": "*ST博天", -"湖南裕能": "301358", -"301358": "湖南裕能", -"金马游乐": "300756", -"300756": "金马游乐", -"龙头股份": "600630", -"600630": "龙头股份", -"金钟股份": "301133", -"301133": "金钟股份", -"派克新材": "605123", -"605123": "派克新材", -"翔丰华": "300890", -"300890": "翔丰华", -"康德莱": "603987", -"603987": "康德莱", -"莱美药业": "300006", -"300006": "莱美药业", -"合力科技": "603917", -"603917": "合力科技", -"登海种业": "002041", -"002041": "登海种业", -"中水渔业": "000798", -"000798": "中水渔业", -"多利科技": "001311", -"001311": "多利科技", -"中熔电气": "301031", -"301031": "中熔电气", -"常宝股份": "002478", -"002478": "常宝股份", -"鞍钢股份": "000898", -"000898": "鞍钢股份", -"克劳斯": "600579", -"600579": "克劳斯", -"*ST越博": "300742", -"300742": "*ST越博", -"亚普股份": "603013", -"603013": "亚普股份", -"纵横通信": "603602", -"603602": "纵横通信", -"华纬科技": "001380", -"001380": "华纬科技", -"*ST凯撒": "000796", -"000796": "*ST凯撒", -"万集科技": "300552", -"300552": "万集科技", -"富临精工": "300432", -"300432": "富临精工", -"宏盛股份": "603090", -"603090": "宏盛股份", -"太阳电缆": "002300", -"002300": "太阳电缆", -"韶能股份": "000601", -"000601": "韶能股份", -"新威凌": "871634", -"871634": "新威凌", -"张江高科": "600895", -"600895": "张江高科", -"天承科技": "688603", -"688603": "天承科技", -"东箭科技": "300978", -"300978": "东箭科技", -"国投资本": "600061", -"600061": "国投资本", -"维信诺": "002387", -"002387": "维信诺", -"联建光电": "300269", -"300269": "联建光电", -"纬达光电": "873001", -"873001": "纬达光电", -"青木股份": "301110", -"301110": "青木股份", -"恒合股份": "832145", -"832145": "恒合股份", -"祥生医疗": "688358", -"688358": "祥生医疗", -"大连热电": "600719", -"600719": "大连热电", -"三星医疗": "601567", -"601567": "三星医疗", -"舜宇精工": "831906", -"831906": "舜宇精工", -"正平股份": "603843", -"603843": "正平股份", -"派能科技": "688063", -"688063": "派能科技", -"特变电工": "600089", -"600089": "特变电工", -"黄山胶囊": "002817", -"002817": "黄山胶囊", -"迪威尔": "688377", -"688377": "迪威尔", -"金冠电气": "688517", -"688517": "金冠电气", -"光智科技": "300489", -"300489": "光智科技", -"鱼跃医疗": "002223", -"002223": "鱼跃医疗", -"天成自控": "603085", -"603085": "天成自控", -"科恒股份": "300340", -"300340": "科恒股份", -"天鹅股份": "603029", -"603029": "天鹅股份", -"三变科技": "002112", -"002112": "三变科技", -"唯特偶": "301319", -"301319": "唯特偶", -"祥源文旅": "600576", -"600576": "祥源文旅", -"旭升集团": "603305", -"603305": "旭升集团", -"津膜科技": "300334", -"300334": "津膜科技", -"广道数字": "839680", -"839680": "广道数字", -"捷佳伟创": "300724", -"300724": "捷佳伟创", -"联测科技": "688113", -"688113": "联测科技", -"浙江力诺": "300838", -"300838": "浙江力诺", -"富森美": "002818", -"002818": "富森美", -"渝三峡A": "000565", -"000565": "渝三峡A", -"舍得酒业": "600702", -"600702": "舍得酒业", -"东安动力": "600178", -"600178": "东安动力", -"东方碳素": "832175", -"832175": "东方碳素", -"天玛智控": "688570", -"688570": "天玛智控", -"华发股份": "600325", -"600325": "华发股份", -"意华股份": "002897", -"002897": "意华股份", -"上海凯宝": "300039", -"300039": "上海凯宝", -"思科瑞": "688053", -"688053": "思科瑞", -"特一药业": "002728", -"002728": "特一药业", -"莱特光电": "688150", -"688150": "莱特光电", -"长春燃气": "600333", -"600333": "长春燃气", -"大洋生物": "003017", -"003017": "大洋生物", -"科陆电子": "002121", -"002121": "科陆电子", -"天邦食品": "002124", -"002124": "天邦食品", -"泓淋电力": "301439", -"301439": "泓淋电力", -"信捷电气": "603416", -"603416": "信捷电气", -"招商轮船": "601872", -"601872": "招商轮船", -"光大证券": "601788", -"601788": "光大证券", -"新钢股份": "600782", -"600782": "新钢股份", -"迈瑞医疗": "300760", -"300760": "迈瑞医疗", -"兆新股份": "002256", -"002256": "兆新股份", -"宝泰隆": "601011", -"601011": "宝泰隆", -"永泰能源": "600157", -"600157": "永泰能源", -"粤万年青": "301111", -"301111": "粤万年青", -"*ST惠天": "000692", -"000692": "*ST惠天", -"创新医疗": "002173", -"002173": "创新医疗", -"拓普集团": "601689", -"601689": "拓普集团", -"绿色动力": "601330", -"601330": "绿色动力", -"越秀资本": "000987", -"000987": "越秀资本", -"运达股份": "300772", -"300772": "运达股份", -"神马股份": "600810", -"600810": "神马股份", -"中天服务": "002188", -"002188": "中天服务", -"中曼石油": "603619", -"603619": "中曼石油", -"华瑞股份": "300626", -"300626": "华瑞股份", -"西藏珠峰": "600338", -"600338": "西藏珠峰", -"*ST信威": "600485", -"600485": "*ST信威", -"合金投资": "000633", -"000633": "合金投资", -"三诺生物": "300298", -"300298": "三诺生物", -"退市海医": "600896", -"600896": "退市海医", -"ST中利": "002309", -"002309": "ST中利", -"国光连锁": "605188", -"605188": "国光连锁", -"日辰股份": "603755", -"603755": "日辰股份", -"金发拉比": "002762", -"002762": "金发拉比", -"山东威达": "002026", -"002026": "山东威达", -"栖霞建设": "600533", -"600533": "栖霞建设", -"星华新材": "301077", -"301077": "星华新材", -"东方盛虹": "000301", -"000301": "东方盛虹", -"中旗股份": "300575", -"300575": "中旗股份", -"精进电动-UW": "688280", -"688280": "精进电动-UW", -"派斯林": "600215", -"600215": "派斯林", -"东方国信": "300166", -"300166": "东方国信", -"哈森股份": "603958", -"603958": "哈森股份", -"创维数字": "000810", -"000810": "创维数字", -"宁新新材": "839719", -"839719": "宁新新材", -"伟明环保": "603568", -"603568": "伟明环保", -"恒天海龙": "000677", -"000677": "恒天海龙", -"维力医疗": "603309", -"603309": "维力医疗", -"智翔金泰-U": "688443", -"688443": "智翔金泰-U", -"上海物贸": "600822", -"600822": "上海物贸", -"胜通能源": "001331", -"001331": "胜通能源", -"宣亚国际": "300612", -"300612": "宣亚国际", -"泰山石油": "000554", -"000554": "泰山石油", -"宏力达": "688330", -"688330": "宏力达", -"金卡智能": "300349", -"300349": "金卡智能", -"中原高速": "600020", -"600020": "中原高速", -"微创光电": "430198", -"430198": "微创光电", -"锦盛新材": "300849", -"300849": "锦盛新材", -"博亚精工": "300971", -"300971": "博亚精工", -"柯利达": "603828", -"603828": "柯利达", -"华维设计": "833427", -"833427": "华维设计", -"盛邦安全": "688651", -"688651": "盛邦安全", -"华谊兄弟": "300027", -"300027": "华谊兄弟", -"铁龙物流": "600125", -"600125": "铁龙物流", -"欧圣电气": "301187", -"301187": "欧圣电气", -"泰慕士": "001234", -"001234": "泰慕士", -"长盈通": "688143", -"688143": "长盈通", -"普利特": "002324", -"002324": "普利特", -"江淮汽车": "600418", -"600418": "江淮汽车", -"尤安设计": "300983", -"300983": "尤安设计", -"妙可蓝多": "600882", -"600882": "妙可蓝多", -"华宝新能": "301327", -"301327": "华宝新能", -"康平科技": "300907", -"300907": "康平科技", -"士兰微": "600460", -"600460": "士兰微", -"天阳科技": "300872", -"300872": "天阳科技", -"国电南自": "600268", -"600268": "国电南自", -"佳禾食品": "605300", -"605300": "佳禾食品", -"怡和嘉业": "301367", -"301367": "怡和嘉业", -"山推股份": "000680", -"000680": "山推股份", -"翔宇医疗": "688626", -"688626": "翔宇医疗", -"三元基因": "837344", -"837344": "三元基因", -"海辰药业": "300584", -"300584": "海辰药业", -"景业智能": "688290", -"688290": "景业智能", -"凤竹纺织": "600493", -"600493": "凤竹纺织", -"神州细胞-U": "688520", -"688520": "神州细胞-U", -"恒顺醋业": "600305", -"600305": "恒顺醋业", -"三联锻造": "001282", -"001282": "三联锻造", -"万得凯": "301309", -"301309": "万得凯", -"ST德豪": "002005", -"002005": "ST德豪", -"智微智能": "001339", -"001339": "智微智能", -"胜华新材": "603026", -"603026": "胜华新材", -"健康元": "600380", -"600380": "健康元", -"立华股份": "300761", -"300761": "立华股份", -"冠昊生物": "300238", -"300238": "冠昊生物", -"山西焦化": "600740", -"600740": "山西焦化", -"菲利华": "300395", -"300395": "菲利华", -"浩物股份": "000757", -"000757": "浩物股份", -"新大正": "002968", -"002968": "新大正", -"游族网络": "002174", -"002174": "游族网络", -"七一二": "603712", -"603712": "七一二", -"三元股份": "600429", -"600429": "三元股份", -"*ST爱迪": "002740", -"002740": "*ST爱迪", -"有研粉材": "688456", -"688456": "有研粉材", -"上工申贝": "600843", -"600843": "上工申贝", -"航天长峰": "600855", -"600855": "航天长峰", -"三角轮胎": "601163", -"601163": "三角轮胎", -"海天精工": "601882", -"601882": "海天精工", -"天秦装备": "300922", -"300922": "天秦装备", -"毕得医药": "688073", -"688073": "毕得医药", -"心脉医疗": "688016", -"688016": "心脉医疗", -"亚光股份": "603282", -"603282": "亚光股份", -"亿通科技": "300211", -"300211": "亿通科技", -"家联科技": "301193", -"301193": "家联科技", -"同辉信息": "430090", -"430090": "同辉信息", -"耐科装备": "688419", -"688419": "耐科装备", -"多伦科技": "603528", -"603528": "多伦科技", -"华明装备": "002270", -"002270": "华明装备", -"国中水务": "600187", -"600187": "国中水务", -"联翔股份": "603272", -"603272": "联翔股份", -"深南电A": "000037", -"000037": "深南电A", -"龙力退": "002604", -"002604": "龙力退", -"合兴包装": "002228", -"002228": "合兴包装", -"美诺华": "603538", -"603538": "美诺华", -"吉华集团": "603980", -"603980": "吉华集团", -"长城股份": "000569", -"000569": "长城股份", -"蓝盾光电": "300862", -"300862": "蓝盾光电", -"银泰黄金": "000975", -"000975": "银泰黄金", -"山鹰国际": "600567", -"600567": "山鹰国际", -"雏鹰退": "002477", -"002477": "雏鹰退", -"远东传动": "002406", -"002406": "远东传动", -"广康生化": "300804", -"300804": "广康生化", -"倍杰特": "300774", -"300774": "倍杰特", -"尤夫股份": "002427", -"002427": "尤夫股份", -"严牌股份": "301081", -"301081": "严牌股份", -"倍益康": "870199", -"870199": "倍益康", -"苏试试验": "300416", -"300416": "苏试试验", -"珍宝岛": "603567", -"603567": "珍宝岛", -"恒星科技": "002132", -"002132": "恒星科技", -"比音勒芬": "002832", -"002832": "比音勒芬", -"富瀚微": "300613", -"300613": "富瀚微", -"瑞星股份": "836717", -"836717": "瑞星股份", -"五芳斋": "603237", -"603237": "五芳斋", -"万里扬": "002434", -"002434": "万里扬", -"科林电气": "603050", -"603050": "科林电气", -"东风科技": "600081", -"600081": "东风科技", -"北大医药": "000788", -"000788": "北大医药", -"中新集团": "601512", -"601512": "中新集团", -"赛托生物": "300583", -"300583": "赛托生物", -"九州通": "600998", -"600998": "九州通", -"新大洲A": "000571", -"000571": "新大洲A", -"同兴环保": "003027", -"003027": "同兴环保", -"尚荣医疗": "002551", -"002551": "尚荣医疗", -"紫光国微": "002049", -"002049": "紫光国微", -"冠中生态": "300948", -"300948": "冠中生态", -"方大特钢": "600507", -"600507": "方大特钢", -"*ST慧辰": "688500", -"688500": "*ST慧辰", -"晶盛机电": "300316", -"300316": "晶盛机电", -"宝地矿业": "601121", -"601121": "宝地矿业", -"龙迅股份": "688486", -"688486": "龙迅股份", -"方大集团": "000055", -"000055": "方大集团", -"奥马电器": "002668", -"002668": "奥马电器", -"顶固集创": "300749", -"300749": "顶固集创", -"恒立钻具": "836942", -"836942": "恒立钻具", -"威博液压": "871245", -"871245": "威博液压", -"四方股份": "601126", -"601126": "四方股份", -"亿能电力": "837046", -"837046": "亿能电力", -"西藏天路": "600326", -"600326": "西藏天路", -"鲁": "000726", -"000726": "鲁", -"拓日新能": "002218", -"002218": "拓日新能", -"巴安水务": "300262", -"300262": "巴安水务", -"山东海化": "000822", -"000822": "山东海化", -"宇信科技": "300674", -"300674": "宇信科技", -"汇通集团": "603176", -"603176": "汇通集团", -"特瑞斯": "834014", -"834014": "特瑞斯", -"神州信息": "000555", -"000555": "神州信息", -"贵州百灵": "002424", -"002424": "贵州百灵", -"旭光电子": "600353", -"600353": "旭光电子", -"利群股份": "601366", -"601366": "利群股份", -"世运电路": "603920", -"603920": "世运电路", -"金橙子": "688291", -"688291": "金橙子", -"悦康药业": "688658", -"688658": "悦康药业", -"威孚高科": "000581", -"000581": "威孚高科", -"金银河": "300619", -"300619": "金银河", -"三未信安": "688489", -"688489": "三未信安", -"海信视像": "600060", -"600060": "海信视像", -"芯源微": "688037", -"688037": "芯源微", -"中国电信": "601728", -"601728": "中国电信", -"天华新能": "300390", -"300390": "天华新能", -"承德露露": "000848", -"000848": "承德露露", -"涛涛车业": "301345", -"301345": "涛涛车业", -"江西长运": "600561", -"600561": "江西长运", -"永新光学": "603297", -"603297": "永新光学", -"保利发展": "600048", -"600048": "保利发展", -"中交地产": "000736", -"000736": "中交地产", -"敷尔佳": "301371", -"301371": "敷尔佳", -"艾隆科技": "688329", -"688329": "艾隆科技", -"英科医疗": "300677", -"300677": "英科医疗", -"乐创技术": "430425", -"430425": "乐创技术", -"仕佳光子": "688313", -"688313": "仕佳光子", -"康鹏科技": "688602", -"688602": "康鹏科技", -"德马科技": "688360", -"688360": "德马科技", -"科伦药业": "002422", -"002422": "科伦药业", -"盛帮股份": "301233", -"301233": "盛帮股份", -"双元科技": "688623", -"688623": "双元科技", -"*ST新联": "000620", -"000620": "*ST新联", -"昆工科技": "831152", -"831152": "昆工科技", -"淳中科技": "603516", -"603516": "淳中科技", -"嵘泰股份": "605133", -"605133": "嵘泰股份", -"*ST豆神": "300010", -"300010": "*ST豆神", -"容百科技": "688005", -"688005": "容百科技", -"闰土股份": "002440", -"002440": "闰土股份", -"山河智能": "002097", -"002097": "山河智能", -"中国北车": "601299", -"601299": "中国北车", -"福能东方": "300173", -"300173": "福能东方", -"先惠技术": "688155", -"688155": "先惠技术", -"测绘股份": "300826", -"300826": "测绘股份", -"*ST全新": "000007", -"000007": "*ST全新", -"罗平锌电": "002114", -"002114": "罗平锌电", -"康盛股份": "002418", -"002418": "康盛股份", -"松原股份": "300893", -"300893": "松原股份", -"中材国际": "600970", -"600970": "中材国际", -"键凯科技": "688356", -"688356": "键凯科技", -"吉电股份": "000875", -"000875": "吉电股份", -"安克创新": "300866", -"300866": "安克创新", -"溯联股份": "301397", -"301397": "溯联股份", -"欣灵电气": "301388", -"301388": "欣灵电气", -"思进智能": "003025", -"003025": "思进智能", -"海昌新材": "300885", -"300885": "海昌新材", -"嘉寓股份": "300117", -"300117": "嘉寓股份", -"动力源": "600405", -"600405": "动力源", -"豫能控股": "001896", -"001896": "豫能控股", -"齐鲁银行": "601665", -"601665": "齐鲁银行", -"银之杰": "300085", -"300085": "银之杰", -"瑞芯微": "603893", -"603893": "瑞芯微", -"丽珠集团": "000513", -"000513": "丽珠集团", -"大元泵业": "603757", -"603757": "大元泵业", -"气派科技": "688216", -"688216": "气派科技", -"大参林": "603233", -"603233": "大参林", -"新华网": "603888", -"603888": "新华网", -"凡拓数创": "301313", -"301313": "凡拓数创", -"电工合金": "300697", -"300697": "电工合金", -"华图山鼎": "300492", -"300492": "华图山鼎", -"安路科技": "688107", -"688107": "安路科技", -"美邦服饰": "002269", -"002269": "美邦服饰", -"药明康德": "603259", -"603259": "药明康德", -"惠伦晶体": "300460", -"300460": "惠伦晶体", -"兰石重装": "603169", -"603169": "兰石重装", -"华通线缆": "605196", -"605196": "华通线缆", -"亚辉龙": "688575", -"688575": "亚辉龙", -"四创电子": "600990", -"600990": "四创电子", -"华海诚科": "688535", -"688535": "华海诚科", -"三": "002224", -"002224": "三", -"金现代": "300830", -"300830": "金现代", -"大庆华科": "000985", -"000985": "大庆华科", -"同大股份": "300321", -"300321": "同大股份", -"中自科技": "688737", -"688737": "中自科技", -"华阳集团": "002906", -"002906": "华阳集团", -"光洋股份": "002708", -"002708": "光洋股份", -"电投产融": "000958", -"000958": "电投产融", -"广聚能源": "000096", -"000096": "广聚能源", -"雄塑科技": "300599", -"300599": "雄塑科技", -"韦尔股份": "603501", -"603501": "韦尔股份", -"智莱科技": "300771", -"300771": "智莱科技", -"泰瑞机器": "603289", -"603289": "泰瑞机器", -"龙软科技": "688078", -"688078": "龙软科技", -"华菱线缆": "001208", -"001208": "华菱线缆", -"柳": "000528", -"000528": "柳", -"*ST西源": "600139", -"600139": "*ST西源", -"XD天马科": "603668", -"603668": "XD天马科", -"中金公司": "601995", -"601995": "中金公司", -"太极集团": "600129", -"600129": "太极集团", -"三安光电": "600703", -"600703": "三安光电", -"联合化学": "301209", -"301209": "联合化学", -"郴电国际": "600969", -"600969": "郴电国际", -"德艺文创": "300640", -"300640": "德艺文创", -"依依股份": "001206", -"001206": "依依股份", -"ST实达": "600734", -"600734": "ST实达", -"ST路通": "300555", -"300555": "ST路通", -"跨境通": "002640", -"002640": "跨境通", -"长园集团": "600525", -"600525": "长园集团", -"民生健康": "301507", -"301507": "民生健康", -"汇成股份": "688403", -"688403": "汇成股份", -"中润资源": "000506", -"000506": "中润资源", -"济南高新": "600807", -"600807": "济南高新", -"方正科技": "600601", -"600601": "方正科技", -"孚能科技": "688567", -"688567": "孚能科技", -"重药控股": "000950", -"000950": "重药控股", -"京源环保": "688096", -"688096": "京源环保", -"三特索道": "002159", -"002159": "三特索道", -"行动教育": "605098", -"605098": "行动教育", -"奥锐特": "605116", -"605116": "奥锐特", -"新天绿能": "600956", -"600956": "新天绿能", -"秉扬科技": "836675", -"836675": "秉扬科技", -"爱康科技": "002610", -"002610": "爱康科技", -"德必集团": "300947", -"300947": "德必集团", -"绿的谐波": "688017", -"688017": "绿的谐波", -"三友科技": "834475", -"834475": "三友科技", -"杭叉集团": "603298", -"603298": "杭叉集团", -"深圳瑞捷": "300977", -"300977": "深圳瑞捷", -"屹通新材": "300930", -"300930": "屹通新材", -"广东宏大": "002683", -"002683": "广东宏大", -"宜通世纪": "300310", -"300310": "宜通世纪", -"深中华A": "000017", -"000017": "深中华A", -"海新能科": "300072", -"300072": "海新能科", -"九": "000989", -"000989": "九", -"上海电气": "601727", -"601727": "上海电气", -"安旭生物": "688075", -"688075": "安旭生物", -"四维图新": "002405", -"002405": "四维图新", -"延江股份": "300658", -"300658": "延江股份", -"天迈科技": "300807", -"300807": "天迈科技", -"高能环境": "603588", -"603588": "高能环境", -"爱仕达": "002403", -"002403": "爱仕达", -"晨光股份": "603899", -"603899": "晨光股份", -"紫光股份": "000938", -"000938": "紫光股份", -"澜起科技": "688008", -"688008": "澜起科技", -"金龙机电": "300032", -"300032": "金龙机电", -"汇通能源": "600605", -"600605": "汇通能源", -"孩子王": "301078", -"301078": "孩子王", -"科瑞技术": "002957", -"002957": "科瑞技术", -"天利科技": "300399", -"300399": "天利科技", -"安科生物": "300009", -"300009": "安科生物", -"美锦能源": "000723", -"000723": "美锦能源", -"明新旭腾": "605068", -"605068": "明新旭腾", -"双环传动": "002472", -"002472": "双环传动", -"益生股份": "002458", -"002458": "益生股份", -"江盐集团": "601065", -"601065": "江盐集团", -"复旦复华": "600624", -"600624": "复旦复华", -"宁夏建材": "600449", -"600449": "宁夏建材", -"有研硅": "688432", -"688432": "有研硅", -"奥维通信": "002231", -"002231": "奥维通信", -"菲菱科思": "301191", -"301191": "菲菱科思", -"航天工程": "603698", -"603698": "航天工程", -"三只松鼠": "300783", -"300783": "三只松鼠", -"返利科技": "600228", -"600228": "返利科技", -"华培动力": "603121", -"603121": "华培动力", -"*ST围海": "002586", -"002586": "*ST围海", -"江阴银行": "002807", -"002807": "江阴银行", -"当代退": "000673", -"000673": "当代退", -"华纺股份": "600448", -"600448": "华纺股份", -"比依股份": "603215", -"603215": "比依股份", -"安徽建工": "600502", -"600502": "安徽建工", -"江苏雷利": "300660", -"300660": "江苏雷利", -"北方稀土": "600111", -"600111": "北方稀土", -"誉衡药业": "002437", -"002437": "誉衡药业", -"五": "000858", -"000858": "五", -"珠江啤酒": "002461", -"002461": "珠江啤酒", -"贝达药业": "300558", -"300558": "贝达药业", -"国安达": "300902", -"300902": "国安达", -"航天科技": "000901", -"000901": "航天科技", -"万东医疗": "600055", -"600055": "万东医疗", -"铜峰电子": "600237", -"600237": "铜峰电子", -"因赛集团": "300781", -"300781": "因赛集团", -"能辉科技": "301046", -"301046": "能辉科技", -"天齐锂业": "002466", -"002466": "天齐锂业", -"中南文化": "002445", -"002445": "中南文化", -"科强股份": "873665", -"873665": "科强股份", -"中坚科技": "002779", -"002779": "中坚科技", -"华策影视": "300133", -"300133": "华策影视", -"戎美股份": "301088", -"301088": "戎美股份", -"卫信康": "603676", -"603676": "卫信康", -"中南股份": "000717", -"000717": "中南股份", -"*ST西发": "000752", -"000752": "*ST西发", -"苏垦农发": "601952", -"601952": "苏垦农发", -"嘉益股份": "301004", -"301004": "嘉益股份", -"长青科技": "001324", -"001324": "长青科技", -"上海机场": "600009", -"600009": "上海机场", -"五洲交通": "600368", -"600368": "五洲交通", -"万和电气": "002543", -"002543": "万和电气", -"皖仪科技": "688600", -"688600": "皖仪科技", -"东方电缆": "603606", -"603606": "东方电缆", -"智光电气": "002169", -"002169": "智光电气", -"长江通信": "600345", -"600345": "长江通信", -"合力泰": "002217", -"002217": "合力泰", -"扬帆新材": "300637", -"300637": "扬帆新材", -"朗姿股份": "002612", -"002612": "朗姿股份", -"聚龙退": "300202", -"300202": "聚龙退", -"劲旅环境": "001230", -"001230": "劲旅环境", -"阿石创": "300706", -"300706": "阿石创", -"保隆科技": "603197", -"603197": "保隆科技", -"德宏股份": "603701", -"603701": "德宏股份", -"华熙生物": "688363", -"688363": "华熙生物", -"欣天科技": "300615", -"300615": "欣天科技", -"欧普康视": "300595", -"300595": "欧普康视", -"大族数控": "301200", -"301200": "大族数控", -"飞荣达": "300602", -"300602": "飞荣达", -"ST深天": "000023", -"000023": "ST深天", -"派瑞股份": "300831", -"300831": "派瑞股份", -"苏农银行": "603323", -"603323": "苏农银行", -"石化油服": "600871", -"600871": "石化油服", -"雪峰科技": "603227", -"603227": "雪峰科技", -"中富电路": "300814", -"300814": "中富电路", -"鸥玛软件": "301185", -"301185": "鸥玛软件", -"传智教育": "003032", -"003032": "传智教育", -"大千生态": "603955", -"603955": "大千生态", -"爱尔眼科": "300015", -"300015": "爱尔眼科", -"诺诚健华-U": "688428", -"688428": "诺诚健华-U", -"友讯达": "300514", -"300514": "友讯达", -"哈投股份": "600864", -"600864": "哈投股份", -"*ST艾格": "002619", -"002619": "*ST艾格", -"茶花股份": "603615", -"603615": "茶花股份", -"万胜智能": "300882", -"300882": "万胜智能", -"信息发展": "300469", -"300469": "信息发展", -"美年健康": "002044", -"002044": "美年健康", -"金逸影视": "002905", -"002905": "金逸影视", -"高新发展": "000628", -"000628": "高新发展", -"大立科技": "002214", -"002214": "大立科技", -"经纬恒润-W": "688326", -"688326": "经纬恒润-W", -"海澜之家": "600398", -"600398": "海澜之家", -"华尔泰": "001217", -"001217": "华尔泰", -"纽威股份": "603699", -"603699": "纽威股份", -"旷达科技": "002516", -"002516": "旷达科技", -"浙商证券": "601878", -"601878": "浙商证券", -"建发合诚": "603909", -"603909": "建发合诚", -"迅游科技": "300467", -"300467": "迅游科技", -"明阳科技": "837663", -"837663": "明阳科技", -"联影医疗": "688271", -"688271": "联影医疗", -"大连重工": "002204", -"002204": "大连重工", -"甘李药业": "603087", -"603087": "甘李药业", -"福赛科技": "301529", -"301529": "福赛科技", -"安徽合力": "600761", -"600761": "安徽合力", -"君禾股份": "603617", -"603617": "君禾股份", -"晶赛科技": "871981", -"871981": "晶赛科技", -"超华科技": "002288", -"002288": "超华科技", -"黄山旅游": "600054", -"600054": "黄山旅游", -"德众汽车": "838030", -"838030": "德众汽车", -"博迅生物": "836504", -"836504": "博迅生物", -"华泰证券": "601688", -"601688": "华泰证券", -"快意电梯": "002774", -"002774": "快意电梯", -"两面针": "600249", -"600249": "两面针", -"文一科技": "600520", -"600520": "文一科技", -"*ST紫鑫": "002118", -"002118": "*ST紫鑫", -"山水比德": "300844", -"300844": "山水比德", -"苏": "002032", -"002032": "苏", -"东湖高新": "600133", -"600133": "东湖高新", -"首都在线": "300846", -"300846": "首都在线", -"飞利信": "300287", -"300287": "飞利信", -"建龙微纳": "688357", -"688357": "建龙微纳", -"国航远洋": "833171", -"833171": "国航远洋", -"波长光电": "301421", -"301421": "波长光电", -"ST东北高": "600003", -"600003": "ST东北高", -"海泰发展": "600082", -"600082": "海泰发展", -"中简科技": "300777", -"300777": "中简科技", -"三人行": "605168", -"605168": "三人行", -"众和退": "002070", -"002070": "众和退", -"迈得医疗": "688310", -"688310": "迈得医疗", -"沧州大化": "600230", -"600230": "沧州大化", -"江山股份": "600389", -"600389": "江山股份", -"金龙羽": "002882", -"002882": "金龙羽", -"金发科技": "600143", -"600143": "金发科技", -"雅本化学": "300261", -"300261": "雅本化学", -"英": "000635", -"000635": "英", -"光库科技": "300620", -"300620": "光库科技", -"荣科科技": "300290", -"300290": "荣科科技", -"恒丰纸业": "600356", -"600356": "恒丰纸业", -"智洋创新": "688191", -"688191": "智洋创新", -"安必平": "688393", -"688393": "安必平", -"锦江在线": "600650", -"600650": "锦江在线", -"东方中科": "002819", -"002819": "东方中科", -"好想你": "002582", -"002582": "好想你", -"开元教育": "300338", -"300338": "开元教育", -"国联水产": "300094", -"300094": "国联水产", -"合肥城建": "002208", -"002208": "合肥城建", -"东华科技": "002140", -"002140": "东华科技", -"天源迪科": "300047", -"300047": "天源迪科", -"君逸数码": "301172", -"301172": "君逸数码", -"东方锆业": "002167", -"002167": "东方锆业", -"华特达因": "000915", -"000915": "华特达因", -"紫金矿业": "601899", -"601899": "紫金矿业", -"晓程科技": "300139", -"300139": "晓程科技", -"航天机电": "600151", -"600151": "航天机电", -"湖南天雁": "600698", -"600698": "湖南天雁", -"百亚股份": "003006", -"003006": "百亚股份", -"中鼎股份": "000887", -"000887": "中鼎股份", -"雷尔伟": "301016", -"301016": "雷尔伟", -"中国国贸": "600007", -"600007": "中国国贸", -"海利尔": "603639", -"603639": "海利尔", -"鑫汇科": "831167", -"831167": "鑫汇科", -"盛美上海": "688082", -"688082": "盛美上海", -"新巨丰": "301296", -"301296": "新巨丰", -"康尼机电": "603111", -"603111": "康尼机电", -"惠泉啤酒": "600573", -"600573": "惠泉啤酒", -"红墙股份": "002809", -"002809": "红墙股份", -"文峰股份": "601010", -"601010": "文峰股份", -"腾景科技": "688195", -"688195": "腾景科技", -"新劲刚": "300629", -"300629": "新劲刚", -"东方集团": "600811", -"600811": "东方集团", -"上海艾录": "301062", -"301062": "上海艾录", -"领益智造": "002600", -"002600": "领益智造", -"易明医药": "002826", -"002826": "易明医药", -"陕建股份": "600248", -"600248": "陕建股份", -"秦川机床": "000837", -"000837": "秦川机床", -"深圳新星": "603978", -"603978": "深圳新星", -"众辰科技": "603275", -"603275": "众辰科技", -"银星能源": "000862", -"000862": "银星能源", -"大名城": "600094", -"600094": "大名城", -"金利华电": "300069", -"300069": "金利华电", -"开创电气": "301448", -"301448": "开创电气", -"外运发展": "600270", -"600270": "外运发展", -"格力电器": "000651", -"000651": "格力电器", -"万泰生物": "603392", -"603392": "万泰生物", -"西子洁能": "002534", -"002534": "西子洁能", -"五新隧装": "835174", -"835174": "五新隧装", -"奔朗新材": "836807", -"836807": "奔朗新材", -"中天精装": "002989", -"002989": "中天精装", -"徕木股份": "603633", -"603633": "徕木股份", -"赛特新材": "688398", -"688398": "赛特新材", -"满坤科技": "301132", -"301132": "满坤科技", -"邵阳液压": "301079", -"301079": "邵阳液压", -"禾信仪器": "688622", -"688622": "禾信仪器", -"冀凯股份": "002691", -"002691": "冀凯股份", -"葫芦娃": "605199", -"605199": "葫芦娃", -"侨银股份": "002973", -"002973": "侨银股份", -"中旗新材": "001212", -"001212": "中旗新材", -"纽威数控": "688697", -"688697": "纽威数控", -"良品铺子": "603719", -"603719": "良品铺子", -"首创证券": "601136", -"601136": "首创证券", -"鸿路钢构": "002541", -"002541": "鸿路钢构", -"东北制药": "000597", -"000597": "东北制药", -"航天晨光": "600501", -"600501": "航天晨光", -"道明光学": "002632", -"002632": "道明光学", -"中科云网": "002306", -"002306": "中科云网", -"*ST凯乐": "600260", -"600260": "*ST凯乐", -"济川药业": "600566", -"600566": "济川药业", -"华仁药业": "300110", -"300110": "华仁药业", -"信科移动-U": "688387", -"688387": "信科移动-U", -"佳发教育": "300559", -"300559": "佳发教育", -"准油股份": "002207", -"002207": "准油股份", -"若羽臣": "003010", -"003010": "若羽臣", -"兴业科技": "002674", -"002674": "兴业科技", -"东方环宇": "603706", -"603706": "东方环宇", -"雅博股份": "002323", -"002323": "雅博股份", -"盛和资源": "600392", -"600392": "盛和资源", -"东珠生态": "603359", -"603359": "东珠生态", -"奇安信-U": "688561", -"688561": "奇安信-U", -"农尚环境": "300536", -"300536": "农尚环境", -"易普力": "002096", -"002096": "易普力", -"宝莫股份": "002476", -"002476": "宝莫股份", -"森麒麟": "002984", -"002984": "森麒麟", -"昂利康": "002940", -"002940": "昂利康", -"中天火箭": "003009", -"003009": "中天火箭", -"海力风电": "301155", -"301155": "海力风电", -"泰格医药": "300347", -"300347": "泰格医药", -"亿利洁能": "600277", -"600277": "亿利洁能", -"迈克生物": "300463", -"300463": "迈克生物", -"渤海化学": "600800", -"600800": "渤海化学", -"顺丰控股": "002352", -"002352": "顺丰控股", -"麦捷科技": "300319", -"300319": "麦捷科技", -"设计总院": "603357", -"603357": "设计总院", -"退市银鸽": "600069", -"600069": "退市银鸽", -"保税科技": "600794", -"600794": "保税科技", -"国恩股份": "002768", -"002768": "国恩股份", -"中科金财": "002657", -"002657": "中科金财", -"棒杰股份": "002634", -"002634": "棒杰股份", -"金田股份": "601609", -"601609": "金田股份", -"富春股份": "300299", -"300299": "富春股份", -"兆龙互连": "300913", -"300913": "兆龙互连", -"迅捷兴": "688655", -"688655": "迅捷兴", -"和林微纳": "688661", -"688661": "和林微纳", -"浙江正特": "001238", -"001238": "浙江正特", -"迪哲医药-U": "688192", -"688192": "迪哲医药-U", -"中铁特货": "001213", -"001213": "中铁特货", -"华峰测控": "688200", -"688200": "华峰测控", -"三维化学": "002469", -"002469": "三维化学", -"国盾量子": "688027", -"688027": "国盾量子", -"梅轮电梯": "603321", -"603321": "梅轮电梯", -"绿田机械": "605259", -"605259": "绿田机械", -"退市金泰": "600385", -"600385": "退市金泰", -"楚江新材": "002171", -"002171": "楚江新材", -"金海通": "603061", -"603061": "金海通", -"耀皮玻璃": "600819", -"600819": "耀皮玻璃", -"精智达": "688627", -"688627": "精智达", -"瑞达期货": "002961", -"002961": "瑞达期货", -"双杰电气": "300444", -"300444": "双杰电气", -"运机集团": "001288", -"001288": "运机集团", -"好当家": "600467", -"600467": "好当家", -"北讯退": "002359", -"002359": "北讯退", -"读客文化": "301025", -"301025": "读客文化", -"协创数据": "300857", -"300857": "协创数据", -"宝利国际": "300135", -"300135": "宝利国际", -"鼎胜新材": "603876", -"603876": "鼎胜新材", -"澳华内镜": "688212", -"688212": "澳华内镜", -"中海达": "300177", -"300177": "中海达", -"湘油泵": "603319", -"603319": "湘油泵", -"老凤祥": "600612", -"600612": "老凤祥", -"中核钛白": "002145", -"002145": "中核钛白", -"新乳业": "002946", -"002946": "新乳业", -"至纯科技": "603690", -"603690": "至纯科技", -"重庆钢铁": "601005", -"601005": "重庆钢铁", -"上海电力": "600021", -"600021": "上海电力", -"珠江钢琴": "002678", -"002678": "珠江钢琴", -"华岭股份": "430139", -"430139": "华岭股份", -"中科微至": "688211", -"688211": "中科微至", -"中环海陆": "301040", -"301040": "中环海陆", -"康普化学": "834033", -"834033": "康普化学", -"退市西水": "600291", -"600291": "退市西水", -"铁大科技": "872541", -"872541": "铁大科技", -"爱博医疗": "688050", -"688050": "爱博医疗", -"朗源股份": "300175", -"300175": "朗源股份", -"大华股份": "002236", -"002236": "大华股份", -"中国稀土": "000831", -"000831": "中国稀土", -"莲花健康": "600186", -"600186": "莲花健康", -"毅昌科技": "002420", -"002420": "毅昌科技", -"嘉华股份": "603182", -"603182": "嘉华股份", -"双良节能": "600481", -"600481": "双良节能", -"宁波建工": "601789", -"601789": "宁波建工", -"东软集团": "600718", -"600718": "东软集团", -"狮头股份": "600539", -"600539": "狮头股份", -"通灵股份": "301168", -"301168": "通灵股份", -"长安汽车": "000625", -"000625": "长安汽车", -"青山纸业": "600103", -"600103": "青山纸业", -"东南网架": "002135", -"002135": "东南网架", -"万里马": "300591", -"300591": "万里马", -"富信科技": "688662", -"688662": "富信科技", -"ST交投": "002200", -"002200": "ST交投", -"浙江震元": "000705", -"000705": "浙江震元", -"百达精工": "603331", -"603331": "百达精工", -"福瑞达": "600223", -"600223": "福瑞达", -"海晨股份": "300873", -"300873": "海晨股份", -"上实发展": "600748", -"600748": "上实发展", -"捷荣技术": "002855", -"002855": "捷荣技术", -"华信退": "002018", -"002018": "华信退", -"争光股份": "301092", -"301092": "争光股份", -"太极实业": "600667", -"600667": "太极实业", -"百大集团": "600865", -"600865": "百大集团", -"哈三联": "002900", -"002900": "哈三联", -"*ST长方": "300301", -"300301": "*ST长方", -"平潭发展": "000592", -"000592": "平潭发展", -"恒林股份": "603661", -"603661": "恒林股份", -"京粮控股": "000505", -"000505": "京粮控股", -"模塑科技": "000700", -"000700": "模塑科技", -"新雷能": "300593", -"300593": "新雷能", -"中南传媒": "601098", -"601098": "中南传媒", -"迈拓股份": "301006", -"301006": "迈拓股份", -"方正证券": "601901", -"601901": "方正证券", -"云天励飞-U": "688343", -"688343": "云天励飞-U", -"圣莱退": "002473", -"002473": "圣莱退", -"华能国际": "600011", -"600011": "华能国际", -"京基智农": "000048", -"000048": "京基智农", -"保力新": "300116", -"300116": "保力新", -"共进股份": "603118", -"603118": "共进股份", -"崧盛股份": "301002", -"301002": "崧盛股份", -"汇隆新材": "301057", -"301057": "汇隆新材", -"迪普科技": "300768", -"300768": "迪普科技", -"航天电器": "002025", -"002025": "航天电器", -"新潮能源": "600777", -"600777": "新潮能源", -"柳化股份": "600423", -"600423": "柳化股份", -"西王食品": "000639", -"000639": "西王食品", -"广汇物流": "600603", -"600603": "广汇物流", -"华帝股份": "002035", -"002035": "华帝股份", -"中牧股份": "600195", -"600195": "中牧股份", -"御银股份": "002177", -"002177": "御银股份", -"富春环保": "002479", -"002479": "富春环保", -"ST中嘉": "000889", -"000889": "ST中嘉", -"中际联合": "605305", -"605305": "中际联合", -"海欣食品": "002702", -"002702": "海欣食品", -"东方通": "300379", -"300379": "东方通", -"纳芯微": "688052", -"688052": "纳芯微", -"申通地铁": "600834", -"600834": "申通地铁", -"天源环保": "301127", -"301127": "天源环保", -"南极电商": "002127", -"002127": "南极电商", -"盐津铺子": "002847", -"002847": "盐津铺子", -"中铁工业": "600528", -"600528": "中铁工业", -"拓新药业": "301089", -"301089": "拓新药业", -"光韵达": "300227", -"300227": "光韵达", -"宸展光电": "003019", -"003019": "宸展光电", -"德赛电池": "000049", -"000049": "德赛电池", -"华强科技": "688151", -"688151": "华强科技", -"重庆燃气": "600917", -"600917": "重庆燃气", -"仙鹤股份": "603733", -"603733": "仙鹤股份", -"富春染织": "605189", -"605189": "富春染织", -"鲁阳节能": "002088", -"002088": "鲁阳节能", -"洁雅股份": "301108", -"301108": "洁雅股份", -"欧浦退": "002711", -"002711": "欧浦退", -"乐普医疗": "300003", -"300003": "乐普医疗", -"江苏索普": "600746", -"600746": "江苏索普", -"海能达": "002583", -"002583": "海能达", -"辉煌科技": "002296", -"002296": "辉煌科技", -"*ST宋都": "600077", -"600077": "*ST宋都", -"*ST二重": "601268", -"601268": "*ST二重", -"华泰股份": "600308", -"600308": "华泰股份", -"ST天圣": "002872", -"002872": "ST天圣", -"*ST炼石": "000697", -"000697": "*ST炼石", -"N中集环": "301559", -"301559": "N中集环", -"天汽模": "002510", -"002510": "天汽模", -"久之洋": "300516", -"300516": "久之洋", -"海默科技": "300084", -"300084": "海默科技", -"大理药业": "603963", -"603963": "大理药业", -"恒而达": "300946", -"300946": "恒而达", -"拓荆科技": "688072", -"688072": "拓荆科技", -"维尔利": "300190", -"300190": "维尔利", -"上海九百": "600838", -"600838": "上海九百", -"ST信通": "600289", -"600289": "ST信通", -"常铝股份": "002160", -"002160": "常铝股份", -"许继电气": "000400", -"000400": "许继电气", -"上海医药": "601607", -"601607": "上海医药", -"赛维时代": "301381", -"301381": "赛维时代", -"华孚时尚": "002042", -"002042": "华孚时尚", -"华盛昌": "002980", -"002980": "华盛昌", -"安记食品": "603696", -"603696": "安记食品", -"复旦微电": "688385", -"688385": "复旦微电", -"康为世纪": "688426", -"688426": "康为世纪", -"海优新材": "688680", -"688680": "海优新材", -"正海磁材": "300224", -"300224": "正海磁材", -"ST升达": "002259", -"002259": "ST升达", -"盈方微": "000670", -"000670": "盈方微", -"永贵电器": "300351", -"300351": "永贵电器", -"双环科技": "000707", -"000707": "双环科技", -"华兴源创": "688001", -"688001": "华兴源创", -"泰豪科技": "600590", -"600590": "泰豪科技", -"风华高科": "000636", -"000636": "风华高科", -"新研股份": "300159", -"300159": "新研股份", -"双鹭药业": "002038", -"002038": "双鹭药业", -"卫光生物": "002880", -"002880": "卫光生物", -"重庆水务": "601158", -"601158": "重庆水务", -"京东方A": "000725", -"000725": "京东方A", -"圣阳股份": "002580", -"002580": "圣阳股份", -"力帆科技": "601777", -"601777": "力帆科技", -"壹石通": "688733", -"688733": "壹石通", -"罗曼股份": "605289", -"605289": "罗曼股份", -"和晶科技": "300279", -"300279": "和晶科技", -"惠丰钻石": "839725", -"839725": "惠丰钻石", -"京沪高铁": "601816", -"601816": "京沪高铁", -"三夫户外": "002780", -"002780": "三夫户外", -"创耀科技": "688259", -"688259": "创耀科技", -"四川成渝": "601107", -"601107": "四川成渝", -"华金资本": "000532", -"000532": "华金资本", -"实丰文化": "002862", -"002862": "实丰文化", -"聚灿光电": "300708", -"300708": "聚灿光电", -"罗普斯金": "002333", -"002333": "罗普斯金", -"诚益通": "300430", -"300430": "诚益通", -"中迪投资": "000609", -"000609": "中迪投资", -"润普食品": "836422", -"836422": "润普食品", -"海融科技": "300915", -"300915": "海融科技", -"宝钢股份": "600019", -"600019": "宝钢股份", -"云煤能源": "600792", -"600792": "云煤能源", -"中荣股份": "301223", -"301223": "中荣股份", -"南网储能": "600995", -"600995": "南网储能", -"联发股份": "002394", -"002394": "联发股份", -"沪江材料": "870204", -"870204": "沪江材料", -"豪美新材": "002988", -"002988": "豪美新材", -"中粮科技": "000930", -"000930": "中粮科技", -"肇民科技": "301000", -"301000": "肇民科技", -"美思德": "603041", -"603041": "美思德", -"恒立液压": "601100", -"601100": "恒立液压", -"铂力特": "688333", -"688333": "铂力特", -"健盛集团": "603558", -"603558": "健盛集团", -"粤高速A": "000429", -"000429": "粤高速A", -"中国人保": "601319", -"601319": "中国人保", -"兰生股份": "600826", -"600826": "兰生股份", -"安杰思": "688581", -"688581": "安杰思", -"诺力股份": "603611", -"603611": "诺力股份", -"九丰能源": "605090", -"605090": "九丰能源", -"中国平安": "601318", -"601318": "中国平安", -"中国移动": "600941", -"600941": "中国移动", -"美的电器": "000527", -"000527": "美的电器", -"招商公路": "001965", -"001965": "招商公路", -"透景生命": "300642", -"300642": "透景生命", -"天益医疗": "301097", -"301097": "天益医疗", -"南大光电": "300346", -"300346": "南大光电", -"美亚光电": "002690", -"002690": "美亚光电", -"丰原药业": "000153", -"000153": "丰原药业", -"博士眼镜": "300622", -"300622": "博士眼镜", -"汤臣倍健": "300146", -"300146": "汤臣倍健", -"胜利精密": "002426", -"002426": "胜利精密", -"梦网科技": "002123", -"002123": "梦网科技", -"品茗科技": "688109", -"688109": "品茗科技", -"东风股份": "601515", -"601515": "东风股份", -"晨光新材": "605399", -"605399": "晨光新材", -"特发信息": "000070", -"000070": "特发信息", -"中国高科": "600730", -"600730": "中国高科", -"上海建工": "600170", -"600170": "上海建工", -"广日股份": "600894", -"600894": "广日股份", -"泰凌微": "688591", -"688591": "泰凌微", -"中裕科技": "871694", -"871694": "中裕科技", -"江特电机": "002176", -"002176": "江特电机", -"广汇能源": "600256", -"600256": "广汇能源", -"万邦德": "002082", -"002082": "万邦德", -"九典制药": "300705", -"300705": "九典制药", -"智慧农业": "000816", -"000816": "智慧农业", -"三峡能源": "600905", -"600905": "三峡能源", -"建设工业": "002265", -"002265": "建设工业", -"新炬网络": "605398", -"605398": "新炬网络", -"卡倍亿": "300863", -"300863": "卡倍亿", -"中国卫通": "601698", -"601698": "中国卫通", -"香溢融通": "600830", -"600830": "香溢融通", -"科捷智能": "688455", -"688455": "科捷智能", -"*ST目药": "600671", -"600671": "*ST目药", -"天振股份": "301356", -"301356": "天振股份", -"君亭酒店": "301073", -"301073": "君亭酒店", -"同方股份": "600100", -"600100": "同方股份", -"涪陵榨菜": "002507", -"002507": "涪陵榨菜", -"永新股份": "002014", -"002014": "永新股份", -"中一科技": "301150", -"301150": "中一科技", -"中公高科": "603860", -"603860": "中公高科", -"派林生物": "000403", -"000403": "派林生物", -"吉宏股份": "002803", -"002803": "吉宏股份", -"百润股份": "002568", -"002568": "百润股份", -"步": "002251", -"002251": "步", -"世茂能源": "605028", -"605028": "世茂能源", -"联合水务": "603291", -"603291": "联合水务", -"明德生物": "002932", -"002932": "明德生物", -"佳都科技": "600728", -"600728": "佳都科技", -"联科科技": "001207", -"001207": "联科科技", -"设研院": "300732", -"300732": "设研院", -"富邦股份": "300387", -"300387": "富邦股份", -"德联集团": "002666", -"002666": "德联集团", -"盛达资源": "000603", -"000603": "盛达资源", -"万向钱潮": "000559", -"000559": "万向钱潮", -"煜邦电力": "688597", -"688597": "煜邦电力", -"东软载波": "300183", -"300183": "东软载波", -"科华数据": "002335", -"002335": "科华数据", -"科力远": "600478", -"600478": "科力远", -"亚通股份": "600692", -"600692": "亚通股份", -"泓禧科技": "871857", -"871857": "泓禧科技", -"南方航空": "600029", -"600029": "南方航空", -"盘古智能": "301456", -"301456": "盘古智能", -"长江材料": "001296", -"001296": "长江材料", -"千方科技": "002373", -"002373": "千方科技", -"*ST园城": "600766", -"600766": "*ST园城", -"杭州园林": "300649", -"300649": "杭州园林", -"珠城科技": "301280", -"301280": "珠城科技", -"海正药业": "600267", -"600267": "海正药业", -"普天科技": "002544", -"002544": "普天科技", -"环球印务": "002799", -"002799": "环球印务", -"天禾股份": "002999", -"002999": "天禾股份", -"恒进感应": "838670", -"838670": "恒进感应", -"可川科技": "603052", -"603052": "可川科技", -"晟楠科技": "837006", -"837006": "晟楠科技", -"天原股份": "002386", -"002386": "天原股份", -"力王股份": "831627", -"831627": "力王股份", -"上海凯鑫": "300899", -"300899": "上海凯鑫", -"泰和科技": "300801", -"300801": "泰和科技", -"东方时尚": "603377", -"603377": "东方时尚", -"长久物流": "603569", -"603569": "长久物流", -"茂业商业": "600828", -"600828": "茂业商业", -"*ST中天": "000540", -"000540": "*ST中天", -"烯碳退": "000511", -"000511": "烯碳退", -"康强电子": "002119", -"002119": "康强电子", -"致远新能": "300985", -"300985": "致远新能", -"智信精密": "301512", -"301512": "智信精密", -"长春一东": "600148", -"600148": "长春一东", -"海螺新材": "000619", -"000619": "海螺新材", -"诺思格": "301333", -"301333": "诺思格", -"华海清科": "688120", -"688120": "华海清科", -"东方雨虹": "002271", -"002271": "东方雨虹", -"英飞特": "300582", -"300582": "英飞特", -"晶合集成": "688249", -"688249": "晶合集成", -"宇邦新材": "301266", -"301266": "宇邦新材", -"柯力传感": "603662", -"603662": "柯力传感", -"碧兴物联": "688671", -"688671": "碧兴物联", -"隆达股份": "688231", -"688231": "隆达股份", -"英搏尔": "300681", -"300681": "英搏尔", -"赛福天": "603028", -"603028": "赛福天", -"申万宏源": "000166", -"000166": "申万宏源", -"卡莱特": "301391", -"301391": "卡莱特", -"赣粤高速": "600269", -"600269": "赣粤高速", -"深振业A": "000006", -"000006": "深振业A", -"华测检测": "300012", -"300012": "华测检测", -"长盈精密": "300115", -"300115": "长盈精密", -"茂莱光学": "688502", -"688502": "茂莱光学", -"中粮资本": "002423", -"002423": "中粮资本", -"退市拉夏": "603157", -"603157": "退市拉夏", -"灿勤科技": "688182", -"688182": "灿勤科技", -"国泰环保": "301203", -"301203": "国泰环保", -"中远海发": "601866", -"601866": "中远海发", -"蓝盾退": "300297", -"300297": "蓝盾退", -"大有能源": "600403", -"600403": "大有能源", -"华锡有色": "600301", -"600301": "华锡有色", -"九菱科技": "873305", -"873305": "九菱科技", -"金埔园林": "301098", -"301098": "金埔园林", -"常熟汽饰": "603035", -"603035": "常熟汽饰", -"科林退": "002499", -"002499": "科林退", -"兰州银行": "001227", -"001227": "兰州银行", -"恒邦股份": "002237", -"002237": "恒邦股份", -"徐家汇": "002561", -"002561": "徐家汇", -"蓝英装备": "300293", -"300293": "蓝英装备", -"新里程": "002219", -"002219": "新里程", -"日出东方": "603366", -"603366": "日出东方", -"钒钛股份": "000629", -"000629": "钒钛股份", -"秀强股份": "300160", -"300160": "秀强股份", -"富临运业": "002357", -"002357": "富临运业", -"雪龙集团": "603949", -"603949": "雪龙集团", -"药康生物": "688046", -"688046": "药康生物", -"信邦制药": "002390", -"002390": "信邦制药", -"大华农": "300186", -"300186": "大华农", -"上海钢联": "300226", -"300226": "上海钢联", -"长高电新": "002452", -"002452": "长高电新", -"福日电子": "600203", -"600203": "福日电子", -"威胜信息": "688100", -"688100": "威胜信息", -"海伦哲": "300201", -"300201": "海伦哲", -"宝钛股份": "600456", -"600456": "宝钛股份", -"华丰科技": "688629", -"688629": "华丰科技", -"泸州老窖": "000568", -"000568": "泸州老窖", -"中汽股份": "301215", -"301215": "中汽股份", -"华虹公司": "688347", -"688347": "华虹公司", -"安科瑞": "300286", -"300286": "安科瑞", -"邦基科技": "603151", -"603151": "邦基科技", -"新世界": "600628", -"600628": "新世界", -"伟测科技": "688372", -"688372": "伟测科技", -"西上海": "605151", -"605151": "西上海", -"哈焊华通": "301137", -"301137": "哈焊华通", -"寒锐钴业": "300618", -"300618": "寒锐钴业", -"龙磁科技": "300835", -"300835": "龙磁科技", -"北部湾港": "000582", -"000582": "北部湾港", -"宋城演艺": "300144", -"300144": "宋城演艺", -"苏州科达": "603660", -"603660": "苏州科达", -"钱江水利": "600283", -"600283": "钱江水利", -"永福股份": "300712", -"300712": "永福股份", -"赛意信息": "300687", -"300687": "赛意信息", -"中密控股": "300470", -"300470": "中密控股", -"金龙鱼": "300999", -"300999": "金龙鱼", -"新朋股份": "002328", -"002328": "新朋股份", -"英科再生": "688087", -"688087": "英科再生", -"亿利达": "002686", -"002686": "亿利达", -"坤泰股份": "001260", -"001260": "坤泰股份", -"同有科技": "300302", -"300302": "同有科技", -"正源股份": "600321", -"600321": "正源股份", -"迎驾贡酒": "603198", -"603198": "迎驾贡酒", -"慧为智能": "832876", -"832876": "慧为智能", -"同仁堂": "600085", -"600085": "同仁堂", -"湖南发展": "000722", -"000722": "湖南发展", -"百傲化学": "603360", -"603360": "百傲化学", -"仙乐健康": "300791", -"300791": "仙乐健康", -"分众传媒": "002027", -"002027": "分众传媒", -"中衡设计": "603017", -"603017": "中衡设计", -"剑桥科技": "603083", -"603083": "剑桥科技", -"顾地科技": "002694", -"002694": "顾地科技", -"迪贝电气": "603320", -"603320": "迪贝电气", -"今世缘": "603369", -"603369": "今世缘", -"中国重工": "601989", -"601989": "中国重工", -"温氏股份": "300498", -"300498": "温氏股份", -"红星发展": "600367", -"600367": "红星发展", -"深华发A": "000020", -"000020": "深华发A", -"百花医药": "600721", -"600721": "百花医药", -"丰乐种业": "000713", -"000713": "丰乐种业", -"大业股份": "603278", -"603278": "大业股份", -"盐湖集团": "000578", -"000578": "盐湖集团", -"中芯国际": "688981", -"688981": "中芯国际", -"优利德": "688628", -"688628": "优利德", -"百普赛斯": "301080", -"301080": "百普赛斯", -"广电计量": "002967", -"002967": "广电计量", -"荣旗科技": "301360", -"301360": "荣旗科技", -"平治信息": "300571", -"300571": "平治信息", -"凤形股份": "002760", -"002760": "凤形股份", -"首钢股份": "000959", -"000959": "首钢股份", -"川大智胜": "002253", -"002253": "川大智胜", -"国缆检测": "301289", -"301289": "国缆检测", -"东电退": "000585", -"000585": "东电退", -"新亚制程": "002388", -"002388": "新亚制程", -"圣达生物": "603079", -"603079": "圣达生物", -"渤海租赁": "000415", -"000415": "渤海租赁", -"瑞联新材": "688550", -"688550": "瑞联新材", -"金亚退": "300028", -"300028": "金亚退", -"中新赛克": "002912", -"002912": "中新赛克", -"长青股份": "002391", -"002391": "长青股份", -"金城医药": "300233", -"300233": "金城医药", -"长源电力": "000966", -"000966": "长源电力", -"古井贡酒": "000596", -"000596": "古井贡酒", -"青松股份": "300132", -"300132": "青松股份", -"京投发展": "600683", -"600683": "京投发展", -"交建股份": "603815", -"603815": "交建股份", -"铭普光磁": "002902", -"002902": "铭普光磁", -"长城电工": "600192", -"600192": "长城电工", -"兆讯传媒": "301102", -"301102": "兆讯传媒", -"中科信息": "300678", -"300678": "中科信息", -"中国天楹": "000035", -"000035": "中国天楹", -"山东药玻": "600529", -"600529": "山东药玻", -"依顿电子": "603328", -"603328": "依顿电子", -"中红医疗": "300981", -"300981": "中红医疗", -"天永智能": "603895", -"603895": "天永智能", -"中国医药": "600056", -"600056": "中国医药", -"招标股份": "301136", -"301136": "招标股份", -"赛诺医疗": "688108", -"688108": "赛诺医疗", -"ST景谷": "600265", -"600265": "ST景谷", -"海天味业": "603288", -"603288": "海天味业", -"河钢股份": "000709", -"000709": "河钢股份", -"雷特科技": "832110", -"832110": "雷特科技", -"伯特利": "603596", -"603596": "伯特利", -"ST金圆": "000546", -"000546": "ST金圆", -"香飘飘": "603711", -"603711": "香飘飘", -"赫美集团": "002356", -"002356": "赫美集团", -"金新农": "002548", -"002548": "金新农", -"普源精电": "688337", -"688337": "普源精电", -"马应龙": "600993", -"600993": "马应龙", -"*ST西域": "300859", -"300859": "*ST西域", -"博雅生物": "300294", -"300294": "博雅生物", -"智立方": "301312", -"301312": "智立方", -"华依科技": "688071", -"688071": "华依科技", -"陕西金叶": "000812", -"000812": "陕西金叶", -"儒竞科技": "301525", -"301525": "儒竞科技", -"齐峰新材": "002521", -"002521": "齐峰新材", -"新产业": "300832", -"300832": "新产业", -"皖天然气": "603689", -"603689": "皖天然气", -"百诚医药": "301096", -"301096": "百诚医药", -"庄园牧场": "002910", -"002910": "庄园牧场", -"路畅科技": "002813", -"002813": "路畅科技", -"浙农股份": "002758", -"002758": "浙农股份", -"思创医惠": "300078", -"300078": "思创医惠", -"中成股份": "000151", -"000151": "中成股份", -"索通发展": "603612", -"603612": "索通发展", -"兔": "002043", -"002043": "兔", -"老百姓": "603883", -"603883": "老百姓", -"金禄电子": "301282", -"301282": "金禄电子", -"日照港": "600017", -"600017": "日照港", -"德奥退": "002260", -"002260": "德奥退", -"龙高股份": "605086", -"605086": "龙高股份", -"高争民爆": "002827", -"002827": "高争民爆", -"中锐股份": "002374", -"002374": "中锐股份", -"退市工新": "600701", -"600701": "退市工新", -"亿嘉和": "603666", -"603666": "亿嘉和", -"海汽集团": "603069", -"603069": "海汽集团", -"中国通号": "688009", -"688009": "中国通号", -"康泰医学": "300869", -"300869": "康泰医学", -"朗科智能": "300543", -"300543": "朗科智能", -"全": "002186", -"002186": "全", -"沃华医药": "002107", -"002107": "沃华医药", -"*ST成城": "600247", -"600247": "*ST成城", -"上海机电": "600835", -"600835": "上海机电", -"文化退": "300089", -"300089": "文化退", -"兴民智通": "002355", -"002355": "兴民智通", -"三维通信": "002115", -"002115": "三维通信", -"润贝航科": "001316", -"001316": "润贝航科", -"学大教育": "000526", -"000526": "学大教育", -"龙韵股份": "603729", -"603729": "龙韵股份", -"永安林业": "000663", -"000663": "永安林业", -"回天新材": "300041", -"300041": "回天新材", -"丰山集团": "603810", -"603810": "丰山集团", -"药石科技": "300725", -"300725": "药石科技", -"嘉诚国际": "603535", -"603535": "嘉诚国际", -"同济科技": "600846", -"600846": "同济科技", -"日丰股份": "002953", -"002953": "日丰股份", -"佛燃能源": "002911", -"002911": "佛燃能源", -"华宇软件": "300271", -"300271": "华宇软件", -"天宝退": "002220", -"002220": "天宝退", -"科力尔": "002892", -"002892": "科力尔", -"德冠新材": "001378", -"001378": "德冠新材", -"川润股份": "002272", -"002272": "川润股份", -"科大讯飞": "002230", -"002230": "科大讯飞", -"敏芯股份": "688286", -"688286": "敏芯股份", -"昆药集团": "600422", -"600422": "昆药集团", -"腾邦退": "300178", -"300178": "腾邦退", -"山西路桥": "000755", -"000755": "山西路桥", -"暴风退": "300431", -"300431": "暴风退", -"广钢气体": "688548", -"688548": "广钢气体", -"路维光电": "688401", -"688401": "路维光电", -"君正集团": "601216", -"601216": "君正集团", -"弘讯科技": "603015", -"603015": "弘讯科技", -"春秋电子": "603890", -"603890": "春秋电子", -"上海新阳": "300236", -"300236": "上海新阳", -"退市秋林": "600891", -"600891": "退市秋林", -"中基健康": "000972", -"000972": "中基健康", -"道氏技术": "300409", -"300409": "道氏技术", -"农": "000061", -"000061": "农", -"时空科技": "605178", -"605178": "时空科技", -"江西铜业": "600362", -"600362": "江西铜业", -"大宏立": "300865", -"300865": "大宏立", -"常润股份": "603201", -"603201": "常润股份", -"好利科技": "002729", -"002729": "好利科技", -"招商地产": "000024", -"000024": "招商地产", -"市北高新": "600604", -"600604": "市北高新", -"东方生物": "688298", -"688298": "东方生物", -"*ST哈慈": "600752", -"600752": "*ST哈慈", -"苏州固锝": "002079", -"002079": "苏州固锝", -"珠海中富": "000659", -"000659": "珠海中富", -"安达科技": "830809", -"830809": "安达科技", -"湘潭电化": "002125", -"002125": "湘潭电化", -"世嘉科技": "002796", -"002796": "世嘉科技", -"联赢激光": "688518", -"688518": "联赢激光", -"晶丰明源": "688368", -"688368": "晶丰明源", -"隆基绿能": "601012", -"601012": "隆基绿能", -"英联股份": "002846", -"002846": "英联股份", -"安联锐视": "301042", -"301042": "安联锐视", -"德源药业": "832735", -"832735": "德源药业", -"鑫宏业": "301310", -"301310": "鑫宏业", -"优机股份": "833943", -"833943": "优机股份", -"金奥博": "002917", -"002917": "金奥博", -"北辰实业": "601588", -"601588": "北辰实业", -"之江生物": "688317", -"688317": "之江生物", -"南都电源": "300068", -"300068": "南都电源", -"科隆股份": "300405", -"300405": "科隆股份", -"铜冠铜箔": "301217", -"301217": "铜冠铜箔", -"中航西飞": "000768", -"000768": "中航西飞", -"海通证券": "600837", -"600837": "海通证券", -"合众思壮": "002383", -"002383": "合众思壮", -"光大银行": "601818", -"601818": "光大银行", -"科顺股份": "300737", -"300737": "科顺股份", -"华东医药": "000963", -"000963": "华东医药", -"易成新能": "300080", -"300080": "易成新能", -"楚天龙": "003040", -"003040": "楚天龙", -"天邑股份": "300504", -"300504": "天邑股份", -"泉峰汽车": "603982", -"603982": "泉峰汽车", -"明阳电路": "300739", -"300739": "明阳电路", -"奥特维": "688516", -"688516": "奥特维", -"欢瑞世纪": "000892", -"000892": "欢瑞世纪", -"玉马遮阳": "300993", -"300993": "玉马遮阳", -"GQY视讯": "300076", -"300076": "GQY视讯", -"长江电力": "600900", -"600900": "长江电力", -"全志科技": "300458", -"300458": "全志科技", -"数知退": "300038", -"300038": "数知退", -"隆盛科技": "300680", -"300680": "隆盛科技", -"上海亚虹": "603159", -"603159": "上海亚虹", -"兆日科技": "300333", -"300333": "兆日科技", -"贵广网络": "600996", -"600996": "贵广网络", -"洋河股份": "002304", -"002304": "洋河股份", -"四通股份": "603838", -"603838": "四通股份", -"巨人网络": "002558", -"002558": "巨人网络", -"风语筑": "603466", -"603466": "风语筑", -"东方日升": "300118", -"300118": "东方日升", -"宝光股份": "600379", -"600379": "宝光股份", -"光格科技": "688450", -"688450": "光格科技", -"浙江自然": "605080", -"605080": "浙江自然", -"亿帆医药": "002019", -"002019": "亿帆医药", -"建科股份": "301115", -"301115": "建科股份", -"上海建科": "603153", -"603153": "上海建科", -"华泽退": "000693", -"000693": "华泽退", -"珈伟新能": "300317", -"300317": "珈伟新能", -"中联重科": "000157", -"000157": "中联重科", -"航新科技": "300424", -"300424": "航新科技", -"国金证券": "600109", -"600109": "国金证券", -"万安科技": "002590", -"002590": "万安科技", -"川能动力": "000155", -"000155": "川能动力", -"远东股份": "600869", -"600869": "远东股份", -"誉辰智能": "688638", -"688638": "誉辰智能", -"华北制药": "600812", -"600812": "华北制药", -"春晖智控": "300943", -"300943": "春晖智控", -"科新发展": "600234", -"600234": "科新发展", -"亚通精工": "603190", -"603190": "亚通精工", -"金鸿顺": "603922", -"603922": "金鸿顺", -"骏成科技": "301106", -"301106": "骏成科技", -"华茂股份": "000850", -"000850": "华茂股份", -"中再资环": "600217", -"600217": "中再资环", -"华森制药": "002907", -"002907": "华森制药", -"海容冷链": "603187", -"603187": "海容冷链", -"海": "002206", -"002206": "海", -"华钰矿业": "601020", -"601020": "华钰矿业", -"超声电子": "000823", -"000823": "超声电子", -"康比特": "833429", -"833429": "康比特", -"华昌化工": "002274", -"002274": "华昌化工", -"步长制药": "603858", -"603858": "步长制药", -"健麾信息": "605186", -"605186": "健麾信息", -"合富中国": "603122", -"603122": "合富中国", -"快可电子": "301278", -"301278": "快可电子", -"捷安高科": "300845", -"300845": "捷安高科", -"江南化工": "002226", -"002226": "江南化工", -"飞力达": "300240", -"300240": "飞力达", -"ST宏业": "000689", -"000689": "ST宏业", -"宝丰能源": "600989", -"600989": "宝丰能源", -"中矿资源": "002738", -"002738": "中矿资源", -"六国化工": "600470", -"600470": "六国化工", -"桂冠电力": "600236", -"600236": "桂冠电力", -"安凯客车": "000868", -"000868": "安凯客车", -"睿智医药": "300149", -"300149": "睿智医药", -"联泓新科": "003022", -"003022": "联泓新科", -"楚环科技": "001336", -"001336": "楚环科技", -"广州港": "601228", -"601228": "广州港", -"广东鸿图": "002101", -"002101": "广东鸿图", -"德恩精工": "300780", -"300780": "德恩精工", -"宏源证券": "000562", -"000562": "宏源证券", -"申达股份": "600626", -"600626": "申达股份", -"杭齿前进": "601177", -"601177": "杭齿前进", -"ST交昂": "600530", -"600530": "ST交昂", -"蓝特光学": "688127", -"688127": "蓝特光学", -"丽臣实业": "001218", -"001218": "丽臣实业", -"ST大集": "000564", -"000564": "ST大集", -"锦富技术": "300128", -"300128": "锦富技术", -"招商南油": "601975", -"601975": "招商南油", -"崇达技术": "002815", -"002815": "崇达技术", -"ST平能": "000780", -"000780": "ST平能", -"生物谷": "833266", -"833266": "生物谷", -"*ST猴王": "000535", -"000535": "*ST猴王", -"路德环境": "688156", -"688156": "路德环境", -"朗新科技": "300682", -"300682": "朗新科技", -"创识科技": "300941", -"300941": "创识科技", -"利柏特": "605167", -"605167": "利柏特", -"中天科技": "600522", -"600522": "中天科技", -"东芯股份": "688110", -"688110": "东芯股份", -"豪悦护理": "605009", -"605009": "豪悦护理", -"跃岭股份": "002725", -"002725": "跃岭股份", -"昊华科技": "600378", -"600378": "昊华科技", -"隆平高科": "000998", -"000998": "隆平高科", -"嘉化能源": "600273", -"600273": "嘉化能源", -"神力股份": "603819", -"603819": "神力股份", -"金鹰重工": "301048", -"301048": "金鹰重工", -"兴业股份": "603928", -"603928": "兴业股份", -"一诺威": "834261", -"834261": "一诺威", -"藏格矿业": "000408", -"000408": "藏格矿业", -"华谊集团": "600623", -"600623": "华谊集团", -"晨化股份": "300610", -"300610": "晨化股份", -"科华控股": "603161", -"603161": "科华控股", -"风范股份": "601700", -"601700": "风范股份", -"银宝山新": "002786", -"002786": "银宝山新", -"海德股份": "000567", -"000567": "海德股份", -"健民集团": "600976", -"600976": "健民集团", -"铁岭新城": "000809", -"000809": "铁岭新城", -"宁波精达": "603088", -"603088": "宁波精达", -"中国武夷": "000797", -"000797": "中国武夷", -"蓝科高新": "601798", -"601798": "蓝科高新", -"圣农发展": "002299", -"002299": "圣农发展", -"顺博合金": "002996", -"002996": "顺博合金", -"加加食品": "002650", -"002650": "加加食品", -"朗鸿科技": "836395", -"836395": "朗鸿科技", -"海鸥股份": "603269", -"603269": "海鸥股份", -"兆驰股份": "002429", -"002429": "兆驰股份", -"北方华创": "002371", -"002371": "北方华创", -"力鼎光电": "605118", -"605118": "力鼎光电", -"美达股份": "000782", -"000782": "美达股份", -"宝通科技": "300031", -"300031": "宝通科技", -"凯利泰": "300326", -"300326": "凯利泰", -"兴图新科": "688081", -"688081": "兴图新科", -"ST澄星": "600078", -"600078": "ST澄星", -"通达海": "301378", -"301378": "通达海", -"深": "000058", -"000058": "深", -"海源复材": "002529", -"002529": "海源复材", -"先进数通": "300541", -"300541": "先进数通", -"开能健康": "300272", -"300272": "开能健康", -"立方数科": "300344", -"300344": "立方数科", -"景旺电子": "603228", -"603228": "景旺电子", -"中科江南": "301153", -"301153": "中科江南", -"同庆楼": "605108", -"605108": "同庆楼", -"*ST天山": "300313", -"300313": "*ST天山", -"沈阳化工": "000698", -"000698": "沈阳化工", -"嘉亨家化": "300955", -"300955": "嘉亨家化", -"宇晶股份": "002943", -"002943": "宇晶股份", -"山西汾酒": "600809", -"600809": "山西汾酒", -"同享科技": "839167", -"839167": "同享科技", -"指南针": "300803", -"300803": "指南针", -"微光股份": "002801", -"002801": "微光股份", -"青鸟消防": "002960", -"002960": "青鸟消防", -"基康仪器": "830879", -"830879": "基康仪器", -"亿华通-U": "688339", -"688339": "亿华通-U", -"润本股份": "603193", -"603193": "润本股份", -"恒烁股份": "688416", -"688416": "恒烁股份", -"天合光能": "688599", -"688599": "天合光能", -"北京利尔": "002392", -"002392": "北京利尔", -"友好集团": "600778", -"600778": "友好集团", -"长荣股份": "300195", -"300195": "长荣股份", -"金冠股份": "300510", -"300510": "金冠股份", -"易瑞生物": "300942", -"300942": "易瑞生物", -"奥飞数据": "300738", -"300738": "奥飞数据", -"赣锋锂业": "002460", -"002460": "赣锋锂业", -"康缘药业": "600557", -"600557": "康缘药业", -"祥龙电业": "600769", -"600769": "祥龙电业", -"退市新亿": "600145", -"600145": "退市新亿", -"闽发铝业": "002578", -"002578": "闽发铝业", -"聚光科技": "300203", -"300203": "聚光科技", -"*ST红相": "300427", -"300427": "*ST红相", -"光电股份": "600184", -"600184": "光电股份", -"雄韬股份": "002733", -"002733": "雄韬股份", -"唐德影视": "300426", -"300426": "唐德影视", -"杭可科技": "688006", -"688006": "杭可科技", -"渝": "000514", -"000514": "渝", -"洁特生物": "688026", -"688026": "洁特生物", -"德美化工": "002054", -"002054": "德美化工", -"东方通信": "600776", -"600776": "东方通信", -"北方铜业": "000737", -"000737": "北方铜业", -"泰嘉股份": "002843", -"002843": "泰嘉股份", -"立航科技": "603261", -"603261": "立航科技", -"艾德生物": "300685", -"300685": "艾德生物", -"申能股份": "600642", -"600642": "申能股份", -"*ST榕泰": "600589", -"600589": "*ST榕泰", -"新五丰": "600975", -"600975": "新五丰", -"佳缘科技": "301117", -"301117": "佳缘科技", -"海欣股份": "600851", -"600851": "海欣股份", -"云创数据": "835305", -"835305": "云创数据", -"禾丰股份": "603609", -"603609": "禾丰股份", -"九洲集团": "300040", -"300040": "九洲集团", -"青达环保": "688501", -"688501": "青达环保", -"凯盛新能": "600876", -"600876": "凯盛新能", -"铂科新材": "300811", -"300811": "铂科新材", -"同惠电子": "833509", -"833509": "同惠电子", -"值得买": "300785", -"300785": "值得买", -"力合科技": "300800", -"300800": "力合科技", -"润都股份": "002923", -"002923": "润都股份", -"智度股份": "000676", -"000676": "智度股份", -"联瑞新材": "688300", -"688300": "联瑞新材", -"国茂股份": "603915", -"603915": "国茂股份", -"光莆股份": "300632", -"300632": "光莆股份", -"神奇制药": "600613", -"600613": "神奇制药", -"美硕科技": "301295", -"301295": "美硕科技", -"通光线缆": "300265", -"300265": "通光线缆", -"显盈科技": "301067", -"301067": "显盈科技", -"泰德股份": "831278", -"831278": "泰德股份", -"成都银行": "601838", -"601838": "成都银行", -"三联虹普": "300384", -"300384": "三联虹普", -"长飞光纤": "601869", -"601869": "长飞光纤", -"金力永磁": "300748", -"300748": "金力永磁", -"融捷股份": "002192", -"002192": "融捷股份", -"长城汽车": "601633", -"601633": "长城汽车", -"荣盛石化": "002493", -"002493": "荣盛石化", -"清水源": "300437", -"300437": "清水源", -"新化股份": "603867", -"603867": "新化股份", -"益佰制药": "600594", -"600594": "益佰制药", -"华信永道": "837592", -"837592": "华信永道", -"中兴通讯": "000063", -"000063": "中兴通讯", -"凯中精密": "002823", -"002823": "凯中精密", -"黑猫股份": "002068", -"002068": "黑猫股份", -"凯盛新材": "301069", -"301069": "凯盛新材", -"晶品特装": "688084", -"688084": "晶品特装", -"内蒙新华": "603230", -"603230": "内蒙新华", -"雅化集团": "002497", -"002497": "雅化集团", -"江南水务": "601199", -"601199": "江南水务", -"北陆药业": "300016", -"300016": "北陆药业", -"ST中珠": "600568", -"600568": "ST中珠", -"勤上股份": "002638", -"002638": "勤上股份", -"人人乐": "002336", -"002336": "人人乐", -"优宁维": "301166", -"301166": "优宁维", -"北京君正": "300223", -"300223": "北京君正", -"永辉超市": "601933", -"601933": "永辉超市", -"京山轻机": "000821", -"000821": "京山轻机", -"雷曼光电": "300162", -"300162": "雷曼光电", -"帝科股份": "300842", -"300842": "帝科股份", -"普莱柯": "603566", -"603566": "普莱柯", -"常青科技": "603125", -"603125": "常青科技", -"阳普医疗": "300030", -"300030": "阳普医疗", -"鲁信创投": "600783", -"600783": "鲁信创投", -"燕东微": "688172", -"688172": "燕东微", -"*ST新海": "002089", -"002089": "*ST新海", -"酷特智能": "300840", -"300840": "酷特智能", -"宝信软件": "600845", -"600845": "宝信软件", -"金三江": "301059", -"301059": "金三江", -"兴发集团": "600141", -"600141": "兴发集团", -"禾盛新材": "002290", -"002290": "禾盛新材", -"上海石化": "600688", -"600688": "上海石化", -"易联众": "300096", -"300096": "易联众", -"祥和实业": "603500", -"603500": "祥和实业", -"保立佳": "301037", -"301037": "保立佳", -"中航电测": "300114", -"300114": "中航电测", -"厦门银行": "601187", -"601187": "厦门银行", -"海南高速": "000886", -"000886": "海南高速", -"中航高科": "600862", -"600862": "中航高科", -"金沃股份": "300984", -"300984": "金沃股份", -"诚志股份": "000990", -"000990": "诚志股份", -"广博股份": "002103", -"002103": "广博股份", -"友邦吊顶": "002718", -"002718": "友邦吊顶", -"中国石油": "601857", -"601857": "中国石油", -"国泰君安": "601211", -"601211": "国泰君安", -"汇洁股份": "002763", -"002763": "汇洁股份", -"坚朗五金": "002791", -"002791": "坚朗五金", -"东南电子": "301359", -"301359": "东南电子", -"南": "002040", -"002040": "南", -"盖世食品": "836826", -"836826": "盖世食品", -"新安股份": "600596", -"600596": "新安股份", -"青岛食品": "001219", -"001219": "青岛食品", -"生益科技": "600183", -"600183": "生益科技", -"世纪瑞尔": "300150", -"300150": "世纪瑞尔", -"盟科药业-U": "688373", -"688373": "盟科药业-U", -"骆驼股份": "601311", -"601311": "骆驼股份", -"退市泽达": "688555", -"688555": "退市泽达", -"华峰超纤": "300180", -"300180": "华峰超纤", -"力合微": "688589", -"688589": "力合微", -"旋极信息": "300324", -"300324": "旋极信息", -"秋田微": "300939", -"300939": "秋田微", -"欧林生物": "688319", -"688319": "欧林生物", -"国瓷材料": "300285", -"300285": "国瓷材料", -"铭利达": "301268", -"301268": "铭利达", -"杭钢股份": "600126", -"600126": "杭钢股份", -"云图控股": "002539", -"002539": "云图控股", -"宇通重工": "600817", -"600817": "宇通重工", -"澳柯玛": "600336", -"600336": "澳柯玛", -"ST世茂": "600823", -"600823": "ST世茂", -"美埃科技": "688376", -"688376": "美埃科技", -"星源材质": "300568", -"300568": "星源材质", -"西测测试": "301306", -"301306": "西测测试", -"思源电气": "002028", -"002028": "思源电气", -"中国能建": "601868", -"601868": "中国能建", -"省广集团": "002400", -"002400": "省广集团", -"国义招标": "831039", -"831039": "国义招标", -"浩洋股份": "300833", -"300833": "浩洋股份", -"佐力药业": "300181", -"300181": "佐力药业", -"金牛化工": "600722", -"600722": "金牛化工", -"东方锅炉": "600786", -"600786": "东方锅炉", -"劲嘉股份": "002191", -"002191": "劲嘉股份", -"盘龙药业": "002864", -"002864": "盘龙药业", -"紫建电子": "301121", -"301121": "紫建电子", -"新特电气": "301120", -"301120": "新特电气", -"四川双马": "000935", -"000935": "四川双马", -"万讯自控": "300112", -"300112": "万讯自控", -"莱尔科技": "688683", -"688683": "莱尔科技", -"健帆生物": "300529", -"300529": "健帆生物", -"恒大高新": "002591", -"002591": "恒大高新", -"盛讯达": "300518", -"300518": "盛讯达", -"一汽解放": "000800", -"000800": "一汽解放", -"电声股份": "300805", -"300805": "电声股份", -"近岸蛋白": "688137", -"688137": "近岸蛋白", -"安井食品": "603345", -"603345": "安井食品", -"稳健医疗": "300888", -"300888": "稳健医疗", -"莱茵体育": "000558", -"000558": "莱茵体育", -"深纺织A": "000045", -"000045": "深纺织A", -"华曙高科": "688433", -"688433": "华曙高科", -"海亮股份": "002203", -"002203": "海亮股份", -"回盛生物": "300871", -"300871": "回盛生物", -"新余国科": "300722", -"300722": "新余国科", -"中控技术": "688777", -"688777": "中控技术", -"百济神州-U": "688235", -"688235": "百济神州-U", -"长阳科技": "688299", -"688299": "长阳科技", -"通行宝": "301339", -"301339": "通行宝", -"通用股份": "601500", -"601500": "通用股份", -"凌霄泵业": "002884", -"002884": "凌霄泵业", -"华自科技": "300490", -"300490": "华自科技", -"中原证券": "601375", -"601375": "中原证券", -"中船科技": "600072", -"600072": "中船科技", -"思林杰": "688115", -"688115": "思林杰", -"金刚退": "300064", -"300064": "金刚退", -"久远银海": "002777", -"002777": "久远银海", -"金明精机": "300281", -"300281": "金明精机", -"新莱应材": "300260", -"300260": "新莱应材", -"惠发食品": "603536", -"603536": "惠发食品", -"上实医药": "600607", -"600607": "上实医药", -"乾景园林": "603778", -"603778": "乾景园林", -"富创精密": "688409", -"688409": "富创精密", -"华神科技": "000790", -"000790": "华神科技", -"大禹节水": "300021", -"300021": "大禹节水", -"中洲控股": "000042", -"000042": "中洲控股", -"凯尔达": "688255", -"688255": "凯尔达", -"顺鑫农业": "000860", -"000860": "顺鑫农业", -"锋尚文化": "300860", -"300860": "锋尚文化", -"信宇人": "688573", -"688573": "信宇人", -"百龙创园": "605016", -"605016": "百龙创园", -"航天电子": "600879", -"600879": "航天电子", -"凤凰航运": "000520", -"000520": "凤凰航运", -"科德教育": "300192", -"300192": "科德教育", -"多瑞医药": "301075", -"301075": "多瑞医药", -"退市保千": "600074", -"600074": "退市保千", -"万德股份": "836419", -"836419": "万德股份", -"中国宝安": "000009", -"000009": "中国宝安", -"永安行": "603776", -"603776": "永安行", -"荣昌生物": "688331", -"688331": "荣昌生物", -"博力威": "688345", -"688345": "博力威", -"三峡水利": "600116", -"600116": "三峡水利", -"平安银行": "000001", -"000001": "平安银行", -"中英科技": "300936", -"300936": "中英科技", -"鹏鹞环保": "300664", -"300664": "鹏鹞环保", -"百利天恒-U": "688506", -"688506": "百利天恒-U", -"金正大": "002470", -"002470": "金正大", -"恺英网络": "002517", -"002517": "恺英网络", -"武商集团": "000501", -"000501": "武商集团", -"万马科技": "300698", -"300698": "万马科技", -"通源环境": "688679", -"688679": "通源环境", -"汇宇制药-W": "688553", -"688553": "汇宇制药-W", -"华阳变速": "839946", -"839946": "华阳变速", -"锦州港": "600190", -"600190": "锦州港", -"东信和平": "002017", -"002017": "东信和平", -"松霖科技": "603992", -"603992": "松霖科技", -"电科芯片": "600877", -"600877": "电科芯片", -"日盈电子": "603286", -"603286": "日盈电子", -"吉林化工": "000618", -"000618": "吉林化工", -"秦安股份": "603758", -"603758": "秦安股份", -"天娱数科": "002354", -"002354": "天娱数科", -"钢研纳克": "300797", -"300797": "钢研纳克", -"福事特": "301446", -"301446": "福事特", -"拓邦股份": "002139", -"002139": "拓邦股份", -"老板电器": "002508", -"002508": "老板电器", -"亚信安全": "688225", -"688225": "亚信安全", -"达刚控股": "300103", -"300103": "达刚控股", -"郑煤机": "601717", -"601717": "郑煤机", -"木林森": "002745", -"002745": "木林森", -"贝因美": "002570", -"002570": "贝因美", -"未来电器": "301386", -"301386": "未来电器", -"超达装备": "301186", -"301186": "超达装备", -"三峡旅游": "002627", -"002627": "三峡旅游", -"卫宁健康": "300253", -"300253": "卫宁健康", -"信音电子": "301329", -"301329": "信音电子", -"星源卓镁": "301398", -"301398": "星源卓镁", -"博盈特焊": "301468", -"301468": "博盈特焊", -"炬华科技": "300360", -"300360": "炬华科技", -"凯普生物": "300639", -"300639": "凯普生物", -"聚和材料": "688503", -"688503": "聚和材料", -"卧龙地产": "600173", -"600173": "卧龙地产", -"史丹利": "002588", -"002588": "史丹利", -"驰宏锌锗": "600497", -"600497": "驰宏锌锗", -"鹿山新材": "603051", -"603051": "鹿山新材", -"晶升股份": "688478", -"688478": "晶升股份", -"格利尔": "831641", -"831641": "格利尔", -"新农股份": "002942", -"002942": "新农股份", -"华贸物流": "603128", -"603128": "华贸物流", -"上海雅仕": "603329", -"603329": "上海雅仕", -"*ST南华": "000660", -"000660": "*ST南华", -"良信股份": "002706", -"002706": "良信股份", -"好上好": "001298", -"001298": "好上好", -"华是科技": "301218", -"301218": "华是科技", -"鸿日达": "301285", -"301285": "鸿日达", -"物产环能": "603071", -"603071": "物产环能", -"顶点软件": "603383", -"603383": "顶点软件", -"元力股份": "300174", -"300174": "元力股份", -"联特科技": "301205", -"301205": "联特科技", -"博瑞传播": "600880", -"600880": "博瑞传播", -"振华重工": "600320", -"600320": "振华重工", -"百川能源": "600681", -"600681": "百川能源", -"登康口腔": "001328", -"001328": "登康口腔", -"济民医疗": "603222", -"603222": "济民医疗", -"润欣科技": "300493", -"300493": "润欣科技", -"瑞晨环保": "301273", -"301273": "瑞晨环保", -"青龙管业": "002457", -"002457": "青龙管业", -"东贝集团": "601956", -"601956": "东贝集团", -"宝丽迪": "300905", -"300905": "宝丽迪", -"亚威股份": "002559", -"002559": "亚威股份", -"宝武镁业": "002182", -"002182": "宝武镁业", -"通宇通讯": "002792", -"002792": "通宇通讯", -"景峰医药": "000908", -"000908": "景峰医药", -"马钢股份": "600808", -"600808": "马钢股份", -"电科院": "300215", -"300215": "电科院", -"ST步森": "002569", -"002569": "ST步森", -"扬子石化": "000866", -"000866": "扬子石化", -"南京新百": "600682", -"600682": "南京新百", -"长白山": "603099", -"603099": "长白山", -"华研精机": "301138", -"301138": "华研精机", -"吉冈精密": "836720", -"836720": "吉冈精密", -"天洋新材": "603330", -"603330": "天洋新材", -"联泰环保": "603797", -"603797": "联泰环保", -"浩欧博": "688656", -"688656": "浩欧博", -"龙大美食": "002726", -"002726": "龙大美食", -"科锐国际": "300662", -"300662": "科锐国际", -"会通股份": "688219", -"688219": "会通股份", -"新赣江": "873167", -"873167": "新赣江", -"百奥泰": "688177", -"688177": "百奥泰", -"仙坛股份": "002746", -"002746": "仙坛股份", -"孚日股份": "002083", -"002083": "孚日股份", -"*ST联谊": "600065", -"600065": "*ST联谊", -"皖维高新": "600063", -"600063": "皖维高新", -"航天动力": "600343", -"600343": "航天动力", -"浙商银行": "601916", -"601916": "浙商银行", -"昊志机电": "300503", -"300503": "昊志机电", -"华立科技": "301011", -"301011": "华立科技", -"昭衍新药": "603127", -"603127": "昭衍新药", -"沃顿科技": "000920", -"000920": "沃顿科技", -"果麦文化": "301052", -"301052": "果麦文化", -"罗欣药业": "002793", -"002793": "罗欣药业", -"金刚光伏": "300093", -"300093": "金刚光伏", -"格科微": "688728", -"688728": "格科微", -"水羊股份": "300740", -"300740": "水羊股份", -"中国交建": "601800", -"601800": "中国交建", -"邦德股份": "838171", -"838171": "邦德股份", -"中船汉光": "300847", -"300847": "中船汉光", -"新芝生物": "430685", -"430685": "新芝生物", -"深深房A": "000029", -"000029": "深深房A", -"诺禾致源": "688315", -"688315": "诺禾致源", -"纬德信息": "688171", -"688171": "纬德信息", -"爱普股份": "603020", -"603020": "爱普股份", -"日发精机": "002520", -"002520": "日发精机", -"ST中安": "600654", -"600654": "ST中安", -"炬芯科技": "688049", -"688049": "炬芯科技", -"国新能源": "600617", -"600617": "国新能源", -"一致魔芋": "839273", -"839273": "一致魔芋", -"苏宁环球": "000718", -"000718": "苏宁环球", -"华民股份": "300345", -"300345": "华民股份", -"播恩集团": "001366", -"001366": "播恩集团", -"科润智控": "834062", -"834062": "科润智控", -"皓元医药": "688131", -"688131": "皓元医药", -"盛科通信-U": "688702", -"688702": "盛科通信-U", -"拓山重工": "001226", -"001226": "拓山重工", -"大西洋": "600558", -"600558": "大西洋", -"欧福蛋业": "839371", -"839371": "欧福蛋业", -"华如科技": "301302", -"301302": "华如科技", -"*ST金山": "600396", -"600396": "*ST金山", -"银河退": "000806", -"000806": "银河退", -"华丰股份": "605100", -"605100": "华丰股份", -"我乐家居": "603326", -"603326": "我乐家居", -"中西药业": "600842", -"600842": "中西药业", -"齐翔腾达": "002408", -"002408": "齐翔腾达", -"双象股份": "002395", -"002395": "双象股份", -"华铁应急": "603300", -"603300": "华铁应急", -"西安银行": "600928", -"600928": "西安银行", -"丰华股份": "600615", -"600615": "丰华股份", -"安泰科技": "000969", -"000969": "安泰科技", -"派特尔": "836871", -"836871": "派特尔", -"*ST庞大": "601258", -"601258": "*ST庞大", -"格林美": "002340", -"002340": "格林美", -"硕贝德": "300322", -"300322": "硕贝德", -"长城信息": "000748", -"000748": "长城信息", -"立高食品": "300973", -"300973": "立高食品", -"杭州解百": "600814", -"600814": "杭州解百", -"西力科技": "688616", -"688616": "西力科技", -"重庆建工": "600939", -"600939": "重庆建工", -"大众交通": "600611", -"600611": "大众交通", -"北京科锐": "002350", -"002350": "北京科锐", -"华域汽车": "600741", -"600741": "华域汽车", -"延华智能": "002178", -"002178": "延华智能", -"九华旅游": "603199", -"603199": "九华旅游", -"世联行": "002285", -"002285": "世联行", -"永清环保": "300187", -"300187": "永清环保", -"雷电微力": "301050", -"301050": "雷电微力", -"奇正藏药": "002287", -"002287": "奇正藏药", -"沃特股份": "002886", -"002886": "沃特股份", -"京能电力": "600578", -"600578": "京能电力", -"ST金运": "300220", -"300220": "ST金运", -"竞业达": "003005", -"003005": "竞业达", -"新洋丰": "000902", -"000902": "新洋丰", -"北方股份": "600262", -"600262": "北方股份", -"晨鸣纸业": "000488", -"000488": "晨鸣纸业", -"恒兴新材": "603276", -"603276": "恒兴新材", -"王子新材": "002735", -"002735": "王子新材", -"利安隆": "300596", -"300596": "利安隆", -"*ST上航": "600591", -"600591": "*ST上航", -"必易微": "688045", -"688045": "必易微", -"德科立": "688205", -"688205": "德科立", -"新疆火炬": "603080", -"603080": "新疆火炬", -"欧陆通": "300870", -"300870": "欧陆通", -"哈药股份": "600664", -"600664": "哈药股份", -"东鹏控股": "003012", -"003012": "东鹏控股", -"华鼎股份": "601113", -"601113": "华鼎股份", -"吉林高速": "601518", -"601518": "吉林高速", -"金杨股份": "301210", -"301210": "金杨股份", -"退市中天": "600856", -"600856": "退市中天", -"*ST中川": "600852", -"600852": "*ST中川", -"智飞生物": "300122", -"300122": "智飞生物", -"锦浪科技": "300763", -"300763": "锦浪科技", -"华大九天": "301269", -"301269": "华大九天", -"中国石化": "600028", -"600028": "中国石化", -"激智科技": "300566", -"300566": "激智科技", -"中船特气": "688146", -"688146": "中船特气", -"芯原股份": "688521", -"688521": "芯原股份", -"格林精密": "300968", -"300968": "格林精密", -"海南海药": "000566", -"000566": "海南海药", -"华海药业": "600521", -"600521": "华海药业", -"同力日升": "605286", -"605286": "同力日升", -"贵州茅台": "600519", -"600519": "贵州茅台", -"陕西华达": "301517", -"301517": "陕西华达", -"新国都": "300130", -"300130": "新国都", -"云赛智联": "600602", -"600602": "云赛智联", -"川网传媒": "300987", -"300987": "川网传媒", -"信濠光电": "301051", -"301051": "信濠光电", -"雷神科技": "872190", -"872190": "雷神科技", -"殷图网联": "835508", -"835508": "殷图网联", -"大博医疗": "002901", -"002901": "大博医疗", -"八一钢铁": "600581", -"600581": "八一钢铁", -"南京聚隆": "300644", -"300644": "南京聚隆", -"瑞松科技": "688090", -"688090": "瑞松科技", -"永和股份": "605020", -"605020": "永和股份", -"广联航空": "300900", -"300900": "广联航空", -"星光股份": "002076", -"002076": "星光股份", -"金盘科技": "688676", -"688676": "金盘科技", -"新筑股份": "002480", -"002480": "新筑股份", -"申科股份": "002633", -"002633": "申科股份", -"爱克股份": "300889", -"300889": "爱克股份", -"津滨发展": "000897", -"000897": "津滨发展", -"中国中免": "601888", -"601888": "中国中免", -"芯海科技": "688595", -"688595": "芯海科技", -"一鸣食品": "605179", -"605179": "一鸣食品", -"中信证券": "600030", -"600030": "中信证券", -"汉马科技": "600375", -"600375": "汉马科技", -"信隆健康": "002105", -"002105": "信隆健康", -"众合科技": "000925", -"000925": "众合科技", -"中国建筑": "601668", -"601668": "中国建筑", -"邦彦技术": "688132", -"688132": "邦彦技术", -"华平股份": "300074", -"300074": "华平股份", -"朗坤环境": "301305", -"301305": "朗坤环境", -"凯格精机": "301338", -"301338": "凯格精机", -"攀渝钛业": "000515", -"000515": "攀渝钛业", -"金辰股份": "603396", -"603396": "金辰股份", -"威创股份": "002308", -"002308": "威创股份", -"光环新网": "300383", -"300383": "光环新网", -"特宝生物": "688278", -"688278": "特宝生物", -"龙建股份": "600853", -"600853": "龙建股份", -"新经典": "603096", -"603096": "新经典", -"中远海特": "600428", -"600428": "中远海特", -"三和管桩": "003037", -"003037": "三和管桩", -"ST高升": "000971", -"000971": "ST高升", -"海达股份": "300320", -"300320": "海达股份", -"恒盛能源": "605580", -"605580": "恒盛能源", -"天岳先进": "688234", -"688234": "天岳先进", -"创业环保": "600874", -"600874": "创业环保", -"河钢资源": "000923", -"000923": "河钢资源", -"鸣志电器": "603728", -"603728": "鸣志电器", -"广大特材": "688186", -"688186": "广大特材", -"美好医疗": "301363", -"301363": "美好医疗", -"集泰股份": "002909", -"002909": "集泰股份", -"奥来德": "688378", -"688378": "奥来德", -"盘江股份": "600395", -"600395": "盘江股份", -"盛屯矿业": "600711", -"600711": "盛屯矿业", -"纵横股份": "688070", -"688070": "纵横股份", -"中煤能源": "601898", -"601898": "中煤能源", -"澄天伟业": "300689", -"300689": "澄天伟业", -"海伦钢琴": "300329", -"300329": "海伦钢琴", -"再升科技": "603601", -"603601": "再升科技", -"华锦股份": "000059", -"000059": "华锦股份", -"水晶光电": "002273", -"002273": "水晶光电", -"PT南洋": "000556", -"000556": "PT南洋", -"濮阳惠成": "300481", -"300481": "濮阳惠成", -"中触媒": "688267", -"688267": "中触媒", -"吉祥航空": "603885", -"603885": "吉祥航空", -"韩建河山": "603616", -"603616": "韩建河山", -"新光退": "002147", -"002147": "新光退", -"渝农商行": "601077", -"601077": "渝农商行", -"新华保险": "601336", -"601336": "新华保险", -"中晶科技": "003026", -"003026": "中晶科技", -"天宸股份": "600620", -"600620": "天宸股份", -"恒信东方": "300081", -"300081": "恒信东方", -"印纪退": "002143", -"002143": "印纪退", -"国新健康": "000503", -"000503": "国新健康", -"上海易连": "600836", -"600836": "上海易连", -"兰州黄河": "000929", -"000929": "兰州黄河", -"江苏北人": "688218", -"688218": "江苏北人", -"海思科": "002653", -"002653": "海思科", -"广信材料": "300537", -"300537": "广信材料", -"华光源海": "872351", -"872351": "华光源海", -"华设集团": "603018", -"603018": "华设集团", -"汉缆股份": "002498", -"002498": "汉缆股份", -"天普股份": "605255", -"605255": "天普股份", -"电广传媒": "000917", -"000917": "电广传媒", -"日联科技": "688531", -"688531": "日联科技", -"中航机载": "600372", -"600372": "中航机载", -"湖南黄金": "002155", -"002155": "湖南黄金", -"上能电气": "300827", -"300827": "上能电气", -"蓝天燃气": "605368", -"605368": "蓝天燃气", -"中国中冶": "601618", -"601618": "中国中冶", -"奥士康": "002913", -"002913": "奥士康", -"中国太保": "601601", -"601601": "中国太保", -"莱克电气": "603355", -"603355": "莱克电气", -"菲达环保": "600526", -"600526": "菲达环保", -"鼎信通讯": "603421", -"603421": "鼎信通讯", -"荣安地产": "000517", -"000517": "荣安地产", -"金凯生科": "301509", -"301509": "金凯生科", -"文灿股份": "603348", -"603348": "文灿股份", -"优彩资源": "002998", -"002998": "优彩资源", -"东方电气": "600875", -"600875": "东方电气", -"玉禾田": "300815", -"300815": "玉禾田", -"ST泰禾": "000732", -"000732": "ST泰禾", -"中通客车": "000957", -"000957": "中通客车", -"浙江大农": "831855", -"831855": "浙江大农", -"恒太照明": "873339", -"873339": "恒太照明", -"共创草坪": "605099", -"605099": "共创草坪", -"中贝通信": "603220", -"603220": "中贝通信", -"鑫磊股份": "301317", -"301317": "鑫磊股份", -"中科曙光": "603019", -"603019": "中科曙光", -"东方材料": "603110", -"603110": "东方材料", -"粤海饲料": "001313", -"001313": "粤海饲料", -"通达创智": "001368", -"001368": "通达创智", -"大连电瓷": "002606", -"002606": "大连电瓷", -"麒盛科技": "603610", -"603610": "麒盛科技", -"古鳌科技": "300551", -"300551": "古鳌科技", -"华鑫股份": "600621", -"600621": "华鑫股份", -"源飞宠物": "001222", -"001222": "源飞宠物", -"丽尚国潮": "600738", -"600738": "丽尚国潮", -"永艺股份": "603600", -"603600": "永艺股份", -"白银有色": "601212", -"601212": "白银有色", -"圣泉集团": "605589", -"605589": "圣泉集团", -"国恒退": "000594", -"000594": "国恒退", -"维海德": "301318", -"301318": "维海德", -"映翰通": "688080", -"688080": "映翰通", -"国力股份": "688103", -"688103": "国力股份", -"大东方": "600327", -"600327": "大东方", -"欢乐家": "300997", -"300997": "欢乐家", -"中瓷电子": "003031", -"003031": "中瓷电子", -"正裕工业": "603089", -"603089": "正裕工业", -"高伟达": "300465", -"300465": "高伟达", -"维宏股份": "300508", -"300508": "维宏股份", -"百利电气": "600468", -"600468": "百利电气", -"朗特智能": "300916", -"300916": "朗特智能", -"水发燃气": "603318", -"603318": "水发燃气", -"*ST达曼": "600788", -"600788": "*ST达曼", -"东尼电子": "603595", -"603595": "东尼电子", -"南钢股份": "600282", -"600282": "南钢股份", -"骄成超声": "688392", -"688392": "骄成超声", -"金帝股份": "603270", -"603270": "金帝股份", -"春风动力": "603129", -"603129": "春风动力", -"华润三九": "000999", -"000999": "华润三九", -"振德医疗": "603301", -"603301": "振德医疗", -"铁建重工": "688425", -"688425": "铁建重工", -"金迪克": "688670", -"688670": "金迪克", -"海南机场": "600515", -"600515": "海南机场", -"吉贝尔": "688566", -"688566": "吉贝尔", -"华中数控": "300161", -"300161": "华中数控", -"东宝生物": "300239", -"300239": "东宝生物", -"绿景退": "000502", -"000502": "绿景退", -"世纪天鸿": "300654", -"300654": "世纪天鸿", -"利扬芯片": "688135", -"688135": "利扬芯片", -"福成股份": "600965", -"600965": "福成股份", -"安达维尔": "300719", -"300719": "安达维尔", -"中科创达": "300496", -"300496": "中科创达", -"睿昂基因": "688217", -"688217": "睿昂基因", -"*ST长兴": "000827", -"000827": "*ST长兴", -"江苏华辰": "603097", -"603097": "江苏华辰", -"多浦乐": "301528", -"301528": "多浦乐", -"卓锦股份": "688701", -"688701": "卓锦股份", -"捷昌驱动": "603583", -"603583": "捷昌驱动", -"迅安科技": "834950", -"834950": "迅安科技", -"电魂网络": "603258", -"603258": "电魂网络", -"天富能源": "600509", -"600509": "天富能源", -"亚太实业": "000691", -"000691": "亚太实业", -"重庆港": "600279", -"600279": "重庆港", -"中微半导": "688380", -"688380": "中微半导", -"达华智能": "002512", -"002512": "达华智能", -"中青宝": "300052", -"300052": "中青宝", -"汉威科技": "300007", -"300007": "汉威科技", -"杭州高新": "300478", -"300478": "杭州高新", -"万年青": "000789", -"000789": "万年青", -"安宁股份": "002978", -"002978": "安宁股份", -"贵州三力": "603439", -"603439": "贵州三力", -"振华科技": "000733", -"000733": "振华科技", -"中航光电": "002179", -"002179": "中航光电", -"开勒股份": "301070", -"301070": "开勒股份", -"蕾奥规划": "300989", -"300989": "蕾奥规划", -"志晟信息": "832171", -"832171": "志晟信息", -"ST南卫": "603880", -"603880": "ST南卫", -"辉丰股份": "002496", -"002496": "辉丰股份", -"泰达股份": "000652", -"000652": "泰达股份", -"小熊电器": "002959", -"002959": "小熊电器", -"国网信通": "600131", -"600131": "国网信通", -"国能日新": "301162", -"301162": "国能日新", -"海达尔": "836699", -"836699": "海达尔", -"百合股份": "603102", -"603102": "百合股份", -"安车检测": "300572", -"300572": "安车检测", -"凌志软件": "688588", -"688588": "凌志软件", -"华正新材": "603186", -"603186": "华正新材", -"万润科技": "002654", -"002654": "万润科技", -"亚星客车": "600213", -"600213": "亚星客车", -"金丹科技": "300829", -"300829": "金丹科技", -"中晟高科": "002778", -"002778": "中晟高科", -"山科智能": "300897", -"300897": "山科智能", -"信达证券": "601059", -"601059": "信达证券", -"英特集团": "000411", -"000411": "英特集团", -"天舟文化": "300148", -"300148": "天舟文化", -"众诚科技": "835207", -"835207": "众诚科技", -"泉阳泉": "600189", -"600189": "泉阳泉", -"开尔新材": "300234", -"300234": "开尔新材", -"圣晖集成": "603163", -"603163": "圣晖集成", -"得润电子": "002055", -"002055": "得润电子", -"惠云钛业": "300891", -"300891": "惠云钛业", -"S*ST国瓷": "600286", -"600286": "S*ST国瓷", -"财通证券": "601108", -"601108": "财通证券", -"翰博高新": "301321", -"301321": "翰博高新", -"广州酒家": "603043", -"603043": "广州酒家", -"九洲药业": "603456", -"603456": "九洲药业", -"天地数码": "300743", -"300743": "天地数码", -"可孚医疗": "301087", -"301087": "可孚医疗", -"时代出版": "600551", -"600551": "时代出版", -"常辅股份": "871396", -"871396": "常辅股份", -"固德威": "688390", -"688390": "固德威", -"*ST太安": "002433", -"002433": "*ST太安", -"建设机械": "600984", -"600984": "建设机械", -"胜宏科技": "300476", -"300476": "胜宏科技", -"爱婴室": "603214", -"603214": "爱婴室", -"光云科技": "688365", -"688365": "光云科技", -"美利云": "000815", -"000815": "美利云", -"奥迪威": "832491", -"832491": "奥迪威", -"嘉事堂": "002462", -"002462": "嘉事堂", -"本川智能": "300964", -"300964": "本川智能", -"莱绅通灵": "603900", -"603900": "莱绅通灵", -"征和工业": "003033", -"003033": "征和工业", -"科士达": "002518", -"002518": "科士达", -"友发集团": "601686", -"601686": "友发集团", -"金禾实业": "002597", -"002597": "金禾实业", -"辰欣药业": "603367", -"603367": "辰欣药业", -"扬农化工": "600486", -"600486": "扬农化工", -"弘元绿能": "603185", -"603185": "弘元绿能", -"中金环境": "300145", -"300145": "中金环境", -"交控科技": "688015", -"688015": "交控科技", -"长春高新": "000661", -"000661": "长春高新", -"瀚蓝环境": "600323", -"600323": "瀚蓝环境", -"联合光电": "300691", -"300691": "联合光电", -"中油工程": "600339", -"600339": "中油工程", -"永顺生物": "839729", -"839729": "永顺生物", -"石化机械": "000852", -"000852": "石化机械", -"鼎智科技": "873593", -"873593": "鼎智科技", -"和辉光电-U": "688538", -"688538": "和辉光电-U", -"国林科技": "300786", -"300786": "国林科技", -"川仪股份": "603100", -"603100": "川仪股份", -"天润乳业": "600419", -"600419": "天润乳业", -"盈康生命": "300143", -"300143": "盈康生命", -"山子股份": "000981", -"000981": "山子股份", -"五洋停车": "300420", -"300420": "五洋停车", -"雄帝科技": "300546", -"300546": "雄帝科技", -"振芯科技": "300101", -"300101": "振芯科技", -"嘉曼服饰": "301276", -"301276": "嘉曼服饰", -"金安国纪": "002636", -"002636": "金安国纪", -"淮北矿业": "600985", -"600985": "淮北矿业", -"合兴股份": "605005", -"605005": "合兴股份", -"信立泰": "002294", -"002294": "信立泰", -"华映科技": "000536", -"000536": "华映科技", -"佳电股份": "000922", -"000922": "佳电股份", -"长江投资": "600119", -"600119": "长江投资", -"日月明": "300906", -"300906": "日月明", -"中兰环保": "300854", -"300854": "中兰环保", -"高凌信息": "688175", -"688175": "高凌信息", -"恒源煤电": "600971", -"600971": "恒源煤电", -"工业富联": "601138", -"601138": "工业富联", -"奋达科技": "002681", -"002681": "奋达科技", -"数字认证": "300579", -"300579": "数字认证", -"凯美特气": "002549", -"002549": "凯美特气", -"中国海诚": "002116", -"002116": "中国海诚", -"精华制药": "002349", -"002349": "精华制药", -"恒工精密": "301261", -"301261": "恒工精密", -"圣诺生物": "688117", -"688117": "圣诺生物", -"安通控股": "600179", -"600179": "安通控股", -"中航机电": "002013", -"002013": "中航机电", -"名家汇": "300506", -"300506": "名家汇", -"宏景科技": "301396", -"301396": "宏景科技", -"国邦医药": "605507", -"605507": "国邦医药", -"赛腾股份": "603283", -"603283": "赛腾股份", -"广百股份": "002187", -"002187": "广百股份", -"创意信息": "300366", -"300366": "创意信息", -"环旭电子": "601231", -"601231": "环旭电子", -"飞沃科技": "301232", -"301232": "飞沃科技", -"中科美菱": "835892", -"835892": "中科美菱", -"龙利得": "300883", -"300883": "龙利得", -"翔楼新材": "301160", -"301160": "翔楼新材", -"奥瑞金": "002701", -"002701": "奥瑞金", -"本立科技": "301065", -"301065": "本立科技", -"恒勃股份": "301225", -"301225": "恒勃股份", -"山东章鼓": "002598", -"002598": "山东章鼓", -"欧派家居": "603833", -"603833": "欧派家居", -"启迪环境": "000826", -"000826": "启迪环境", -"华升股份": "600156", -"600156": "华升股份", -"铁科轨道": "688569", -"688569": "铁科轨道", -"创世纪": "300083", -"300083": "创世纪", -"联络互动": "002280", -"002280": "联络互动", -"峰岹科技": "688279", -"688279": "峰岹科技", -"湖南海利": "600731", -"600731": "湖南海利", -"千金药业": "600479", -"600479": "千金药业", -"华荣股份": "603855", -"603855": "华荣股份", -"安诺其": "300067", -"300067": "安诺其", -"安奈儿": "002875", -"002875": "安奈儿", -"诺": "002215", -"002215": "诺", -"交通银行": "601328", -"601328": "交通银行", -"英杰电气": "300820", -"300820": "英杰电气", -"东易日盛": "002713", -"002713": "东易日盛", -"宁波港": "601018", -"601018": "宁波港", -"奕瑞科技": "688301", -"688301": "奕瑞科技", -"万朗磁塑": "603150", -"603150": "万朗磁塑", -"闽东电力": "000993", -"000993": "闽东电力", -"五方光电": "002962", -"002962": "五方光电", -"金陵饭店": "601007", -"601007": "金陵饭店", -"众信旅游": "002707", -"002707": "众信旅游", -"理工能科": "002322", -"002322": "理工能科", -"申联生物": "688098", -"688098": "申联生物", -"獐子岛": "002069", -"002069": "獐子岛", -"中原传媒": "000719", -"000719": "中原传媒", -"天津港": "600717", -"600717": "天津港", -"万通液压": "830839", -"830839": "万通液压", -"合肥高科": "430718", -"430718": "合肥高科", -"鸿达兴业": "002002", -"002002": "鸿达兴业", -"德龙汇能": "000593", -"000593": "德龙汇能", -"洛阳钼业": "603993", -"603993": "洛阳钼业", -"杭电股份": "603618", -"603618": "杭电股份", -"利通科技": "832225", -"832225": "利通科技", -"航天软件": "688562", -"688562": "航天软件", -"亚香股份": "301220", -"301220": "亚香股份", -"美力科技": "300611", -"300611": "美力科技", -"常青股份": "603768", -"603768": "常青股份", -"百克生物": "688276", -"688276": "百克生物", -"赛微微电": "688325", -"688325": "赛微微电", -"微芯生物": "688321", -"688321": "微芯生物", -"千禾味业": "603027", -"603027": "千禾味业", -"北方国际": "000065", -"000065": "北方国际", -"东华测试": "300354", -"300354": "东华测试", -"盛天网络": "300494", -"300494": "盛天网络", -"退市大控": "600747", -"600747": "退市大控", -"深圳华强": "000062", -"000062": "深圳华强", -"吉鑫科技": "601218", -"601218": "吉鑫科技", -"苏美达": "600710", -"600710": "苏美达", -"国际医学": "000516", -"000516": "国际医学", -"欧普泰": "836414", -"836414": "欧普泰", -"康力源": "301287", -"301287": "康力源", -"福石控股": "300071", -"300071": "福石控股", -"博创科技": "300548", -"300548": "博创科技", -"莱茵生物": "002166", -"002166": "莱茵生物", -"天元股份": "003003", -"003003": "天元股份", -"龙宇股份": "603003", -"603003": "龙宇股份", -"科美诊断": "688468", -"688468": "科美诊断", -"ST红太阳": "000525", -"000525": "ST红太阳", -"盛剑环境": "603324", -"603324": "盛剑环境", -"海象新材": "003011", -"003011": "海象新材", -"棕榈股份": "002431", -"002431": "棕榈股份", -"弘业期货": "001236", -"001236": "弘业期货", -"昇兴股份": "002752", -"002752": "昇兴股份", -"金富科技": "003018", -"003018": "金富科技", -"亚玛顿": "002623", -"002623": "亚玛顿", -"抚顺特钢": "600399", -"600399": "抚顺特钢", -"惠威科技": "002888", -"002888": "惠威科技", -"绝味食品": "603517", -"603517": "绝味食品", -"建科院": "300675", -"300675": "建科院", -"博彦科技": "002649", -"002649": "博彦科技", -"东兴证券": "601198", -"601198": "东兴证券", -"华新水泥": "600801", -"600801": "华新水泥", -"广州发展": "600098", -"600098": "广州发展", -"ST建元": "600816", -"600816": "ST建元", -"光庭信息": "301221", -"301221": "光庭信息", -"中恒集团": "600252", -"600252": "中恒集团", -"上海临港": "600848", -"600848": "上海临港", -"锦泓集团": "603518", -"603518": "锦泓集团", -"苏文电能": "300982", -"300982": "苏文电能", -"宝馨科技": "002514", -"002514": "宝馨科技", -"高澜股份": "300499", -"300499": "高澜股份", -"拾比佰": "831768", -"831768": "拾比佰", -"阿科力": "603722", -"603722": "阿科力", -"金种子酒": "600199", -"600199": "金种子酒", -"东风汽车": "600006", -"600006": "东风汽车", -"博汇科技": "688004", -"688004": "博汇科技", -"云路股份": "688190", -"688190": "云路股份", -"泰和新材": "002254", -"002254": "泰和新材", -"欣贺股份": "003016", -"003016": "欣贺股份", -"无锡银行": "600908", -"600908": "无锡银行", -"神雾退": "300156", -"300156": "神雾退", -"王府井": "600859", -"600859": "王府井", -"军信股份": "301109", -"301109": "军信股份", -"三木集团": "000632", -"000632": "三木集团", -"浙江黎明": "603048", -"603048": "浙江黎明", -"惠而浦": "600983", -"600983": "惠而浦", -"*ST海投": "000616", -"000616": "*ST海投", -"中泰化学": "002092", -"002092": "中泰化学", -"鹏都农牧": "002505", -"002505": "鹏都农牧", -"森鹰窗业": "301227", -"301227": "森鹰窗业", -"锐捷网络": "301165", -"301165": "锐捷网络", -"鲁西化工": "000830", -"000830": "鲁西化工", -"科达利": "002850", -"002850": "科达利", -"湘邮科技": "600476", -"600476": "湘邮科技", -"金洲管道": "002443", -"002443": "金洲管道", -"国风新材": "000859", -"000859": "国风新材", -"锐新科技": "300828", -"300828": "锐新科技", -"国博电子": "688375", -"688375": "国博电子", -"顺钠股份": "000533", -"000533": "顺钠股份", -"久其软件": "002279", -"002279": "久其软件", -"诚邦股份": "603316", -"603316": "诚邦股份", -"神农集团": "605296", -"605296": "神农集团", -"华建集团": "600629", -"600629": "华建集团", -"奥特佳": "002239", -"002239": "奥特佳", -"金道科技": "301279", -"301279": "金道科技", -"嘉必优": "688089", -"688089": "嘉必优", -"天健集团": "000090", -"000090": "天健集团", -"向日葵": "300111", -"300111": "向日葵", -"广联达": "002410", -"002410": "广联达", -"恒锋信息": "300605", -"300605": "恒锋信息", -"泰林生物": "300813", -"300813": "泰林生物", -"国星光电": "002449", -"002449": "国星光电", -"海大集团": "002311", -"002311": "海大集团", -"宿迁联盛": "603065", -"603065": "宿迁联盛", -"信维通信": "300136", -"300136": "信维通信", -"麦趣尔": "002719", -"002719": "麦趣尔", -"强瑞技术": "301128", -"301128": "强瑞技术", -"天铭科技": "836270", -"836270": "天铭科技", -"金龙汽车": "600686", -"600686": "金龙汽车", -"通达股份": "002560", -"002560": "通达股份", -"冰轮环境": "000811", -"000811": "冰轮环境", -"金达莱": "688057", -"688057": "金达莱", -"石头科技": "688169", -"688169": "石头科技", -"东岳硅材": "300821", -"300821": "东岳硅材", -"德力股份": "002571", -"002571": "德力股份", -"东杰智能": "300486", -"300486": "东杰智能", -"精工科技": "002006", -"002006": "精工科技", -"松发股份": "603268", -"603268": "松发股份", -"美利信": "301307", -"301307": "美利信", -"圣元环保": "300867", -"300867": "圣元环保", -"西藏矿业": "000762", -"000762": "西藏矿业", -"S兰铝": "600296", -"600296": "S兰铝", -"长光华芯": "688048", -"688048": "长光华芯", -"盛弘股份": "300693", -"300693": "盛弘股份", -"天山铝业": "002532", -"002532": "天山铝业", -"以岭药业": "002603", -"002603": "以岭药业", -"晨丰科技": "603685", -"603685": "晨丰科技", -"赛摩智能": "300466", -"300466": "赛摩智能", -"中纺标": "873122", -"873122": "中纺标", -"伊之密": "300415", -"300415": "伊之密", -"天能重工": "300569", -"300569": "天能重工", -"元成股份": "603388", -"603388": "元成股份", -"申通快递": "002468", -"002468": "申通快递", -"百邦科技": "300736", -"300736": "百邦科技", -"中光防雷": "300414", -"300414": "中光防雷", -"*ST商城": "600306", -"600306": "*ST商城", -"鲁北化工": "600727", -"600727": "鲁北化工", -"兴业银行": "601166", -"601166": "兴业银行", -"贝瑞基因": "000710", -"000710": "贝瑞基因", -"智新电子": "837212", -"837212": "智新电子", -"邯郸钢铁": "600001", -"600001": "邯郸钢铁", -"东华软件": "002065", -"002065": "东华软件", -"数码视讯": "300079", -"300079": "数码视讯", -"恒瑞医药": "600276", -"600276": "恒瑞医药", -"中兴商业": "000715", -"000715": "中兴商业", -"美凯龙": "601828", -"601828": "美凯龙", -"红旗连锁": "002697", -"002697": "红旗连锁", -"新亚电子": "605277", -"605277": "新亚电子", -"格力地产": "600185", -"600185": "格力地产", -"上电股份": "600627", -"600627": "上电股份", -"润泽科技": "300442", -"300442": "润泽科技", -"依米康": "300249", -"300249": "依米康", -"九州一轨": "688485", -"688485": "九州一轨", -"金石亚药": "300434", -"300434": "金石亚药", -"三祥科技": "831195", -"831195": "三祥科技", -"艾力斯": "688578", -"688578": "艾力斯", -"天房发展": "600322", -"600322": "天房发展", -"开创国际": "600097", -"600097": "开创国际", -"常山药业": "300255", -"300255": "常山药业", -"恒银科技": "603106", -"603106": "恒银科技", -"统一股份": "600506", -"600506": "统一股份", -"狄耐克": "300884", -"300884": "狄耐克", -"超越科技": "301049", -"301049": "超越科技", -"人民网": "603000", -"603000": "人民网", -"南京医药": "600713", -"600713": "南京医药", -"朝阳科技": "002981", -"002981": "朝阳科技", -"扬电科技": "301012", -"301012": "扬电科技", -"泰禾智能": "603656", -"603656": "泰禾智能", -"嘉澳环保": "603822", -"603822": "嘉澳环保", -"开滦股份": "600997", -"600997": "开滦股份", -"威唐工业": "300707", -"300707": "威唐工业", -"西藏药业": "600211", -"600211": "西藏药业", -"国源科技": "835184", -"835184": "国源科技", -"高乐股份": "002348", -"002348": "高乐股份", -"海光信息": "688041", -"688041": "海光信息", -"天山电子": "301379", -"301379": "天山电子", -"中弘退": "000979", -"000979": "中弘退", -"首商股份": "600723", -"600723": "首商股份", -"蓝箭电子": "301348", -"301348": "蓝箭电子", -"华林证券": "002945", -"002945": "华林证券", -"和达科技": "688296", -"688296": "和达科技", -"越剑智能": "603095", -"603095": "越剑智能", -"万泽股份": "000534", -"000534": "万泽股份", -"成飞集成": "002190", -"002190": "成飞集成", -"第一医药": "600833", -"600833": "第一医药", -"旗滨集团": "601636", -"601636": "旗滨集团", -"金健米业": "600127", -"600127": "金健米业", -"迈威生物-U": "688062", -"688062": "迈威生物-U", -"亚联发展": "002316", -"002316": "亚联发展", -"万马股份": "002276", -"002276": "万马股份", -"长鸿高科": "605008", -"605008": "长鸿高科", -"咸亨国际": "605056", -"605056": "咸亨国际", -"思泉新材": "301489", -"301489": "思泉新材", -"航宇科技": "688239", -"688239": "航宇科技", -"爱玛科技": "603529", -"603529": "爱玛科技", -"动力新科": "600841", -"600841": "动力新科", -"海南橡胶": "601118", -"601118": "海南橡胶", -"S*ST金荔": "600762", -"600762": "S*ST金荔", -"中储股份": "600787", -"600787": "中储股份", -"盛德鑫泰": "300881", -"300881": "盛德鑫泰", -"德瑞锂电": "833523", -"833523": "德瑞锂电", -"友阿股份": "002277", -"002277": "友阿股份", -"裕太微-U": "688515", -"688515": "裕太微-U", -"中葡股份": "600084", -"600084": "中葡股份", -"新疆众和": "600888", -"600888": "新疆众和", -"科沃斯": "603486", -"603486": "科沃斯", -"杰恩设计": "300668", -"300668": "杰恩设计", -"燕京啤酒": "000729", -"000729": "燕京啤酒", -"华密新材": "836247", -"836247": "华密新材", -"中伟股份": "300919", -"300919": "中伟股份", -"华夏幸福": "600340", -"600340": "华夏幸福", -"信邦智能": "301112", -"301112": "信邦智能", -"东方园林": "002310", -"002310": "东方园林", -"中闽能源": "600163", -"600163": "中闽能源", -"华东数控": "002248", -"002248": "华东数控", -"*ST龙涤": "000832", -"000832": "*ST龙涤", -"普路通": "002769", -"002769": "普路通", -"元祖股份": "603886", -"603886": "元祖股份", -"中信建投": "601066", -"601066": "中信建投", -"家家悦": "603708", -"603708": "家家悦", -"一品红": "300723", -"300723": "一品红", -"立中集团": "300428", -"300428": "立中集团", -"润建股份": "002929", -"002929": "润建股份", -"创益通": "300991", -"300991": "创益通", -"创源股份": "300703", -"300703": "创源股份", -"琼民源A": "000508", -"000508": "琼民源A", -"观典防务": "688287", -"688287": "观典防务", -"正川股份": "603976", -"603976": "正川股份", -"软通动力": "301236", -"301236": "软通动力", -"新日股份": "603787", -"603787": "新日股份", -"道通科技": "688208", -"688208": "道通科技", -"中源协和": "600645", -"600645": "中源协和", -"新中港": "605162", -"605162": "新中港", -"保变电气": "600550", -"600550": "保变电气", -"爱施德": "002416", -"002416": "爱施德", -"东阿阿胶": "000423", -"000423": "东阿阿胶", -"高鸿股份": "000851", -"000851": "高鸿股份", -"云意电气": "300304", -"300304": "云意电气", -"华立股份": "603038", -"603038": "华立股份", -"美康生物": "300439", -"300439": "美康生物", -"特发服务": "300917", -"300917": "特发服务", -"睿创微纳": "688002", -"688002": "睿创微纳", -"城投控股": "600649", -"600649": "城投控股", -"恒锋工具": "300488", -"300488": "恒锋工具", -"烽火通信": "600498", -"600498": "烽火通信", -"开山股份": "300257", -"300257": "开山股份", -"喜临门": "603008", -"603008": "喜临门", -"超讯通信": "603322", -"603322": "超讯通信", -"润农节水": "830964", -"830964": "润农节水", -"创业黑马": "300688", -"300688": "创业黑马", -"安凯微": "688620", -"688620": "安凯微", -"磁谷科技": "688448", -"688448": "磁谷科技", -"元利科技": "603217", -"603217": "元利科技", -"天地科技": "600582", -"600582": "天地科技", -"华丽家族": "600503", -"600503": "华丽家族", -"美吉姆": "002621", -"002621": "美吉姆", -"当虹科技": "688039", -"688039": "当虹科技", -"广宇集团": "002133", -"002133": "广宇集团", -"陕天然气": "002267", -"002267": "陕天然气", -"奥翔药业": "603229", -"603229": "奥翔药业", -"龙蟠科技": "603906", -"603906": "龙蟠科技", -"苏交科": "300284", -"300284": "苏交科", -"苏州规划": "301505", -"301505": "苏州规划", -"国盛智科": "688558", -"688558": "国盛智科", -"云中马": "603130", -"603130": "云中马", -"恒拓开源": "834415", -"834415": "恒拓开源", -"力源科技": "688565", -"688565": "力源科技", -"上海谊众": "688091", -"688091": "上海谊众", -"南矿集团": "001360", -"001360": "南矿集团", -"ST华铁": "000976", -"000976": "ST华铁", -"*ST炎黄": "000805", -"000805": "*ST炎黄", -"冠龙节能": "301151", -"301151": "冠龙节能", -"辽宁成大": "600739", -"600739": "辽宁成大", -"佛塑科技": "000973", -"000973": "佛塑科技", -"山大地纬": "688579", -"688579": "山大地纬", -"南方传媒": "601900", -"601900": "南方传媒", -"安德利": "605198", -"605198": "安德利", -"腾信退": "300392", -"300392": "腾信退", -"新湖创业": "600840", -"600840": "新湖创业", -"节能铁汉": "300197", -"300197": "节能铁汉", -"乐歌股份": "300729", -"300729": "乐歌股份", -"宝色股份": "300402", -"300402": "宝色股份", -"信安世纪": "688201", -"688201": "信安世纪", -"中钨高新": "000657", -"000657": "中钨高新", -"首华燃气": "300483", -"300483": "首华燃气", -"徐工机械": "000425", -"000425": "徐工机械", -"安控科技": "300370", -"300370": "安控科技", -"必创科技": "300667", -"300667": "必创科技", -"伟思医疗": "688580", -"688580": "伟思医疗", -"拓维信息": "002261", -"002261": "拓维信息", -"广脉科技": "838924", -"838924": "广脉科技", -"中钢天源": "002057", -"002057": "中钢天源", -"宇瞳光学": "300790", -"300790": "宇瞳光学", -"百洋医药": "301015", -"301015": "百洋医药", -"东阳光": "600673", -"600673": "东阳光", -"北玻股份": "002613", -"002613": "北玻股份", -"雪榕生物": "300511", -"300511": "雪榕生物", -"天下秀": "600556", -"600556": "天下秀", -"仁度生物": "688193", -"688193": "仁度生物", -"优德精密": "300549", -"300549": "优德精密", -"雅克科技": "002409", -"002409": "雅克科技", -"中胤时尚": "300901", -"300901": "中胤时尚", -"中航产融": "600705", -"600705": "中航产融", -"香山股份": "002870", -"002870": "香山股份", -"飞乐音响": "600651", -"600651": "飞乐音响", -"江航装备": "688586", -"688586": "江航装备", -"林海股份": "600099", -"600099": "林海股份", -"北京人力": "600861", -"600861": "北京人力", -"贝斯美": "300796", -"300796": "贝斯美", -"招商港口": "001872", -"001872": "招商港口", -"科思科技": "688788", -"688788": "科思科技", -"震有科技": "688418", -"688418": "震有科技", -"贝仕达克": "300822", -"300822": "贝仕达克", -"迎丰股份": "605055", -"605055": "迎丰股份", -"艾布鲁": "301259", -"301259": "艾布鲁", -"宏昌电子": "603002", -"603002": "宏昌电子", -"中国铝业": "601600", -"601600": "中国铝业", -"锦和商管": "603682", -"603682": "锦和商管", -"星球石墨": "688633", -"688633": "星球石墨", -"艾可蓝": "300816", -"300816": "艾可蓝", -"亚士创能": "603378", -"603378": "亚士创能", -"苏利股份": "603585", -"603585": "苏利股份", -"三友医疗": "688085", -"688085": "三友医疗", -"晶瑞电材": "300655", -"300655": "晶瑞电材", -"ST同洲": "002052", -"002052": "ST同洲", -"神开股份": "002278", -"002278": "神开股份", -"阿尔特": "300825", -"300825": "阿尔特", -"白云机场": "600004", -"600004": "白云机场", -"通易航天": "871642", -"871642": "通易航天", -"方邦股份": "688020", -"688020": "方邦股份", -"宁波银行": "002142", -"002142": "宁波银行", -"天壕能源": "300332", -"300332": "天壕能源", -"颀中科技": "688352", -"688352": "颀中科技", -"吉峰科技": "300022", -"300022": "吉峰科技", -"丹化科技": "600844", -"600844": "丹化科技", -"骏创科技": "833533", -"833533": "骏创科技", -"上药转换": "600849", -"600849": "上药转换", -"生物股份": "600201", -"600201": "生物股份", -"浩通科技": "301026", -"301026": "浩通科技", -"盛路通信": "002446", -"002446": "盛路通信", -"中国科传": "601858", -"601858": "中国科传", -"泰胜风能": "300129", -"300129": "泰胜风能", -"华锋股份": "002806", -"002806": "华锋股份", -"隆基机械": "002363", -"002363": "隆基机械", -"协和电子": "605258", -"605258": "协和电子", -"英集芯": "688209", -"688209": "英集芯", -"四川长虹": "600839", -"600839": "四川长虹", -"赛为智能": "300044", -"300044": "赛为智能", -"晋控煤业": "601001", -"601001": "晋控煤业", -"尚纬股份": "603333", -"603333": "尚纬股份", -"上汽集团": "600104", -"600104": "上汽集团", -"公牛集团": "603195", -"603195": "公牛集团", -"健友股份": "603707", -"603707": "健友股份", -"喜悦智行": "301198", -"301198": "喜悦智行", -"ST沪科": "600608", -"600608": "ST沪科", -"沃尔核材": "002130", -"002130": "沃尔核材", -"西藏旅游": "600749", -"600749": "西藏旅游", -"研奥股份": "300923", -"300923": "研奥股份", -"华西能源": "002630", -"002630": "华西能源", -"景嘉微": "300474", -"300474": "景嘉微", -"蓝色光标": "300058", -"300058": "蓝色光标", -"华讯退": "000687", -"000687": "华讯退", -"雷科防务": "002413", -"002413": "雷科防务", -"东微半导": "688261", -"688261": "东微半导", -"德威退": "300325", -"300325": "德威退", -"承德钒钛": "600357", -"600357": "承德钒钛", -"扬子新材": "002652", -"002652": "扬子新材", -"*ST信联": "600899", -"600899": "*ST信联", -"优刻得-W": "688158", -"688158": "优刻得-W", -"赛轮轮胎": "601058", -"601058": "赛轮轮胎", -"太阳能": "000591", -"000591": "太阳能", -"智动力": "300686", -"300686": "智动力", -"同兴达": "002845", -"002845": "同兴达", -"辉隆股份": "002556", -"002556": "辉隆股份", -"科汇股份": "688681", -"688681": "科汇股份", -"宏润建设": "002062", -"002062": "宏润建设", -"西藏城投": "600773", -"600773": "西藏城投", -"华脉科技": "603042", -"603042": "华脉科技", -"酒鬼酒": "000799", -"000799": "酒鬼酒", -"国电南瑞": "600406", -"600406": "国电南瑞", -"金杯电工": "002533", -"002533": "金杯电工", -"福莱蒽特": "605566", -"605566": "福莱蒽特", -"科新机电": "300092", -"300092": "科新机电", -"南山智尚": "300918", -"300918": "南山智尚", -"凌钢股份": "600231", -"600231": "凌钢股份", -"嘉戎技术": "301148", -"301148": "嘉戎技术", -"康拓医疗": "688314", -"688314": "康拓医疗", -"三六五网": "300295", -"300295": "三六五网", -"永冠新材": "603681", -"603681": "永冠新材", -"退市紫晶": "688086", -"688086": "退市紫晶", -"京泉华": "002885", -"002885": "京泉华", -"盛洋科技": "603703", -"603703": "盛洋科技", -"山高环能": "000803", -"000803": "山高环能", -"普联软件": "300996", -"300996": "普联软件", -"甘咨询": "000779", -"000779": "甘咨询", -"三江购物": "601116", -"601116": "三江购物", -"奥": "002227", -"002227": "奥", -"豪森股份": "688529", -"688529": "豪森股份", -"民丰特纸": "600235", -"600235": "民丰特纸", -"际华集团": "601718", -"601718": "际华集团", -"曙光数创": "872808", -"872808": "曙光数创", -"ST曙光": "600303", -"600303": "ST曙光", -"长江传媒": "600757", -"600757": "长江传媒", -"美盈森": "002303", -"002303": "美盈森", -"天茂退": "002509", -"002509": "天茂退", -"华铭智能": "300462", -"300462": "华铭智能", -"诚达药业": "301201", -"301201": "诚达药业", -"片仔癀": "600436", -"600436": "片仔癀", -"统联精密": "688210", -"688210": "统联精密", -"光线传媒": "300251", -"300251": "光线传媒", -"黔源电力": "002039", -"002039": "黔源电力", -"久吾高科": "300631", -"300631": "久吾高科", -"新天药业": "002873", -"002873": "新天药业", -"龙竹科技": "831445", -"831445": "龙竹科技", -"四川美丰": "000731", -"000731": "四川美丰", -"太龙药业": "600222", -"600222": "太龙药业", -"瑞泰科技": "002066", -"002066": "瑞泰科技", -"江苏舜天": "600287", -"600287": "江苏舜天", -"天音控股": "000829", -"000829": "天音控股", -"英利汽车": "601279", -"601279": "英利汽车", -"固高科技": "301510", -"301510": "固高科技", -"弘亚数控": "002833", -"002833": "弘亚数控", -"宇环数控": "002903", -"002903": "宇环数控", -"森萱医药": "830946", -"830946": "森萱医药", -"晨光电缆": "834639", -"834639": "晨光电缆", -"凯立新材": "688269", -"688269": "凯立新材", -"今天国际": "300532", -"300532": "今天国际", -"百利科技": "603959", -"603959": "百利科技", -"德石股份": "301158", -"301158": "德石股份", -"西高院": "688334", -"688334": "西高院", -"中设咨询": "833873", -"833873": "中设咨询", -"澳洋健康": "002172", -"002172": "澳洋健康", -"理工光科": "300557", -"300557": "理工光科", -"华天科技": "002185", -"002185": "华天科技", -"龙津药业": "002750", -"002750": "龙津药业", -"湖南投资": "000548", -"000548": "湖南投资", -"南山铝业": "600219", -"600219": "南山铝业", -"恒誉环保": "688309", -"688309": "恒誉环保", -"通威股份": "600438", -"600438": "通威股份", -"圣龙股份": "603178", -"603178": "圣龙股份", -"北方导航": "600435", -"600435": "北方导航", -"直真科技": "003007", -"003007": "直真科技", -"力诺特玻": "301188", -"301188": "力诺特玻", -"新诺威": "300765", -"300765": "新诺威", -"神州数码": "000034", -"000034": "神州数码", -"虹软科技": "688088", -"688088": "虹软科技", -"广生堂": "300436", -"300436": "广生堂", -"浙海德曼": "688577", -"688577": "浙海德曼", -"航亚科技": "688510", -"688510": "航亚科技", -"全通教育": "300359", -"300359": "全通教育", -"朗迪集团": "603726", -"603726": "朗迪集团", -"苏博特": "603916", -"603916": "苏博特", -"飞凯材料": "300398", -"300398": "飞凯材料", -"海尔生物": "688139", -"688139": "海尔生物", -"华峰铝业": "601702", -"601702": "华峰铝业", -"洪都航空": "600316", -"600316": "洪都航空", -"四川九洲": "000801", -"000801": "四川九洲", -"利欧股份": "002131", -"002131": "利欧股份", -"五洲医疗": "301234", -"301234": "五洲医疗", -"光大同创": "301387", -"301387": "光大同创", -"华厦眼科": "301267", -"301267": "华厦眼科", -"兖矿能源": "600188", -"600188": "兖矿能源", -"必康退": "002411", -"002411": "必康退", -"德邦科技": "688035", -"688035": "德邦科技", -"启明信息": "002232", -"002232": "启明信息", -"博信股份": "600083", -"600083": "博信股份", -"邮储银行": "601658", -"601658": "邮储银行", -"鸿富瀚": "301086", -"301086": "鸿富瀚", -"云南白药": "000538", -"000538": "云南白药", -"云南旅游": "002059", -"002059": "云南旅游", -"广立微": "301095", -"301095": "广立微", -"纳思达": "002180", -"002180": "纳思达", -"华统股份": "002840", -"002840": "华统股份", -"美登科技": "838227", -"838227": "美登科技", -"广济药业": "000952", -"000952": "广济药业", -"皖通高速": "600012", -"600012": "皖通高速", -"华融化学": "301256", -"301256": "华融化学", -"岭南股份": "002717", -"002717": "岭南股份", -"机器人": "300024", -"300024": "机器人", -"矩阵股份": "301365", -"301365": "矩阵股份", -"福安药业": "300194", -"300194": "福安药业", -"中科软": "603927", -"603927": "中科软", -"首旅酒店": "600258", -"600258": "首旅酒店", -"拓斯达": "300607", -"300607": "拓斯达", -"彩虹股份": "600707", -"600707": "彩虹股份", -"生益电子": "688183", -"688183": "生益电子", -"上海银行": "601229", -"601229": "上海银行", -"老白干酒": "600559", -"600559": "老白干酒", -"塞力医疗": "603716", -"603716": "塞力医疗", -"中国动力": "600482", -"600482": "中国动力", -"华辰装备": "300809", -"300809": "华辰装备", -"云南城投": "600239", -"600239": "云南城投", -"浙矿股份": "300837", -"300837": "浙矿股份", -"莱宝高科": "002106", -"002106": "莱宝高科", -"荣丰控股": "000668", -"000668": "荣丰控股", -"广弘控股": "000529", -"000529": "广弘控股", -"兆丰股份": "300695", -"300695": "兆丰股份", -"海印股份": "000861", -"000861": "海印股份", -"建邦科技": "837242", -"837242": "建邦科技", -"纳尔股份": "002825", -"002825": "纳尔股份", -"翔腾新材": "001373", -"001373": "翔腾新材", -"福晶科技": "002222", -"002222": "福晶科技", -"天保基建": "000965", -"000965": "天保基建", -"凯文教育": "002659", -"002659": "凯文教育", -"振华股份": "603067", -"603067": "振华股份", -"新点软件": "688232", -"688232": "新点软件", -"大地电气": "870436", -"870436": "大地电气", -"*ST日海": "002313", -"002313": "*ST日海", -"森林包装": "605500", -"605500": "森林包装", -"华润双鹤": "600062", -"600062": "华润双鹤", -"南华仪器": "300417", -"300417": "南华仪器", -"国脉科技": "002093", -"002093": "国脉科技", -"大连圣亚": "600593", -"600593": "大连圣亚", -"航天信息": "600271", -"600271": "航天信息", -"万润股份": "002643", -"002643": "万润股份", -"南山控股": "002314", -"002314": "南山控股", -"达安基因": "002030", -"002030": "达安基因", -"佳云科技": "300242", -"300242": "佳云科技", -"梦天家居": "603216", -"603216": "梦天家居", -"亚世光电": "002952", -"002952": "亚世光电", -"卓郎智能": "600545", -"600545": "卓郎智能", -"奥尼电子": "301189", -"301189": "奥尼电子", -"华夏航空": "002928", -"002928": "华夏航空", -"中顺洁柔": "002511", -"002511": "中顺洁柔", -"PT水仙": "600625", -"600625": "PT水仙", -"扬州金泉": "603307", -"603307": "扬州金泉", -"一汽富维": "600742", -"600742": "一汽富维", -"长虹美菱": "000521", -"000521": "长虹美菱", -"华星创业": "300025", -"300025": "华星创业", -"奥拓电子": "002587", -"002587": "奥拓电子", -"海利生物": "603718", -"603718": "海利生物", -"华瓷股份": "001216", -"001216": "华瓷股份", -"新集能源": "601918", -"601918": "新集能源", -"新城控股": "601155", -"601155": "新城控股", -"正和生态": "605069", -"605069": "正和生态", -"帝奥微": "688381", -"688381": "帝奥微", -"德业股份": "605117", -"605117": "德业股份", -"建业股份": "603948", -"603948": "建业股份", -"容知日新": "688768", -"688768": "容知日新", -"罗博特科": "300757", -"300757": "罗博特科", -"神州高铁": "000008", -"000008": "神州高铁", -"巨化股份": "600160", -"600160": "巨化股份", -"帝尔激光": "300776", -"300776": "帝尔激光", -"维科精密": "301499", -"301499": "维科精密", -"美亚柏科": "300188", -"300188": "美亚柏科", -"德明利": "001309", -"001309": "德明利", -"退市鹏起": "600614", -"600614": "退市鹏起", -"中铁装配": "300374", -"300374": "中铁装配", -"ST银山": "000675", -"000675": "ST银山", -"退市长油": "600087", -"600087": "退市长油", -"神城A退": "000018", -"000018": "神城A退", -"元琛科技": "688659", -"688659": "元琛科技", -"天玑科技": "300245", -"300245": "天玑科技", -"东亚药业": "605177", -"605177": "东亚药业", -"*ST西钢": "600117", -"600117": "*ST西钢", -"共同药业": "300966", -"300966": "共同药业", -"森泰股份": "301429", -"301429": "森泰股份", -"冠捷科技": "000727", -"000727": "冠捷科技", -"姚记科技": "002605", -"002605": "姚记科技", -"众泰汽车": "000980", -"000980": "众泰汽车", -"致远互联": "688369", -"688369": "致远互联", -"聚石化学": "688669", -"688669": "聚石化学", -"长川科技": "300604", -"300604": "长川科技", -"天晟新材": "300169", -"300169": "天晟新材", -"章源钨业": "002378", -"002378": "章源钨业", -"江苏国信": "002608", -"002608": "江苏国信", -"菲沃泰": "688371", -"688371": "菲沃泰", -"百隆东方": "601339", -"601339": "百隆东方", -"德展健康": "000813", -"000813": "德展健康", -"精研科技": "300709", -"300709": "精研科技", -"盾安环境": "002011", -"002011": "盾安环境", -"达嘉维康": "301126", -"301126": "达嘉维康", -"太行水泥": "600553", -"600553": "太行水泥", -"中能电气": "300062", -"300062": "中能电气", -"瑞玛精密": "002976", -"002976": "瑞玛精密", -"经纬股份": "301390", -"301390": "经纬股份", -"合康新能": "300048", -"300048": "合康新能", -"普利制药": "300630", -"300630": "普利制药", -"达": "002209", -"002209": "达", -"有方科技": "688159", -"688159": "有方科技", -"港通医疗": "301515", -"301515": "港通医疗", -"合锻智能": "603011", -"603011": "合锻智能", -"柘中股份": "002346", -"002346": "柘中股份", -"富佳股份": "603219", -"603219": "富佳股份", -"康泰生物": "300601", -"300601": "康泰生物", -"交大思诺": "300851", -"300851": "交大思诺", -"概伦电子": "688206", -"688206": "概伦电子", -"*ST宏图": "600122", -"600122": "*ST宏图", -"通达动力": "002576", -"002576": "通达动力", -"松井股份": "688157", -"688157": "松井股份", -"节能国祯": "300388", -"300388": "节能国祯", -"匠心家居": "301061", -"301061": "匠心家居", -"逸飞激光": "688646", -"688646": "逸飞激光", -"华数传媒": "000156", -"000156": "华数传媒", -"国统股份": "002205", -"002205": "国统股份", -"任子行": "300311", -"300311": "任子行", -"杭州银行": "600926", -"600926": "杭州银行", -"*ST嘉凯": "000918", -"000918": "*ST嘉凯", -"辽河油田": "000817", -"000817": "辽河油田", -"新能泰山": "000720", -"000720": "新能泰山", -"远": "002161", -"002161": "远", -"汇得科技": "603192", -"603192": "汇得科技", -"瑞华泰": "688323", -"688323": "瑞华泰", -"金山办公": "688111", -"688111": "金山办公", -"卓翼科技": "002369", -"002369": "卓翼科技", -"退市昌鱼": "600275", -"600275": "退市昌鱼", -"晶方科技": "603005", -"603005": "晶方科技", -"宏创控股": "002379", -"002379": "宏创控股", -"拉芳家化": "603630", -"603630": "拉芳家化", -"海普瑞": "002399", -"002399": "海普瑞", -"三博脑科": "301293", -"301293": "三博脑科", -"佰维存储": "688525", -"688525": "佰维存储", -"健之佳": "605266", -"605266": "健之佳", -"金自天正": "600560", -"600560": "金自天正", -"联诚精密": "002921", -"002921": "联诚精密", -"豪能股份": "603809", -"603809": "豪能股份", -"味知香": "605089", -"605089": "味知香", -"燕塘乳业": "002732", -"002732": "燕塘乳业", -"卧龙电驱": "600580", -"600580": "卧龙电驱", -"星宇股份": "601799", -"601799": "星宇股份", -"天通股份": "600330", -"600330": "天通股份", -"爱科科技": "688092", -"688092": "爱科科技", -"金博股份": "688598", -"688598": "金博股份", -"汇洲智能": "002122", -"002122": "汇洲智能", -"晶科能源": "688223", -"688223": "晶科能源", -"汇纳科技": "300609", -"300609": "汇纳科技", -"丽岛新材": "603937", -"603937": "丽岛新材", -"天域生态": "603717", -"603717": "天域生态", -"申菱环境": "301018", -"301018": "申菱环境", -"龙星化工": "002442", -"002442": "龙星化工", -"斯达半导": "603290", -"603290": "斯达半导", -"退市明科": "600091", -"600091": "退市明科", -"三雄极光": "300625", -"300625": "三雄极光", -"杰美特": "300868", -"300868": "杰美特", -"华安鑫创": "300928", -"300928": "华安鑫创", -"中钢国际": "000928", -"000928": "中钢国际", -"航天南湖": "688552", -"688552": "航天南湖", -"成大生物": "688739", -"688739": "成大生物", -"永创智能": "603901", -"603901": "永创智能", -"中国铁物": "000927", -"000927": "中国铁物", -"中国卫星": "600118", -"600118": "中国卫星", -"康龙化成": "300759", -"300759": "康龙化成", -"猛狮退": "002684", -"002684": "猛狮退", -"天奈科技": "688116", -"688116": "天奈科技", -"汇嘉时代": "603101", -"603101": "汇嘉时代", -"精伦电子": "600355", -"600355": "精伦电子", -"博汇股份": "300839", -"300839": "博汇股份", -"继峰股份": "603997", -"603997": "继峰股份", -"新易盛": "300502", -"300502": "新易盛", -"华灿光电": "300323", -"300323": "华灿光电", -"翠微股份": "603123", -"603123": "翠微股份", -"北京文化": "000802", -"000802": "北京文化", -"双飞股份": "300817", -"300817": "双飞股份", -"同益中": "688722", -"688722": "同益中", -"广电电气": "601616", -"601616": "广电电气", -"海泰新能": "835985", -"835985": "海泰新能", -"博腾股份": "300363", -"300363": "博腾股份", -"博菲电气": "001255", -"001255": "博菲电气", -"华骐环保": "300929", -"300929": "华骐环保", -"ST恒久": "002808", -"002808": "ST恒久", -"智能自控": "002877", -"002877": "智能自控", -"迪安诊断": "300244", -"300244": "迪安诊断", -"震安科技": "300767", -"300767": "震安科技", -"浙江医药": "600216", -"600216": "浙江医药", -"武汉蓝电": "830779", -"830779": "武汉蓝电", -"远大控股": "000626", -"000626": "远大控股", -"英可瑞": "300713", -"300713": "英可瑞", -"桂林旅游": "000978", -"000978": "桂林旅游", -"万业企业": "600641", -"600641": "万业企业", -"宁波联合": "600051", -"600051": "宁波联合", -"XD颖泰生": "833819", -"833819": "XD颖泰生", -"广深铁路": "601333", -"601333": "广深铁路", -"蒙泰高新": "300876", -"300876": "蒙泰高新", -"生": "002095", -"002095": "生", -"四川路桥": "600039", -"600039": "四川路桥", -"S*ST精密": "600092", -"600092": "S*ST精密", -"荣联科技": "002642", -"002642": "荣联科技", -"威派格": "603956", -"603956": "威派格", -"蓝海华腾": "300484", -"300484": "蓝海华腾", -"建艺集团": "002789", -"002789": "建艺集团", -"江苏阳光": "600220", -"600220": "江苏阳光", -"用友网络": "600588", -"600588": "用友网络", -"科达制造": "600499", -"600499": "科达制造", -"富士达": "835640", -"835640": "富士达", -"诺泰生物": "688076", -"688076": "诺泰生物", -"科安达": "002972", -"002972": "科安达", -"亿田智能": "300911", -"300911": "亿田智能", -"灿能电力": "870299", -"870299": "灿能电力", -"伟时电子": "605218", -"605218": "伟时电子", -"莱钢股份": "600102", -"600102": "莱钢股份", -"森霸传感": "300701", -"300701": "森霸传感", -"福元医药": "601089", -"601089": "福元医药", -"厦工股份": "600815", -"600815": "厦工股份", -"韵达股份": "002120", -"002120": "韵达股份", -"金杯汽车": "600609", -"600609": "金杯汽车", -"万孚生物": "300482", -"300482": "万孚生物", -"建研设计": "301167", -"301167": "建研设计", -"中国东航": "600115", -"600115": "中国东航", -"日科化学": "300214", -"300214": "日科化学", -"*ST泛海": "000046", -"000046": "*ST泛海", -"金溢科技": "002869", -"002869": "金溢科技", -"中船应急": "300527", -"300527": "中船应急", -"太平鸟": "603877", -"603877": "太平鸟", -"北纬科技": "002148", -"002148": "北纬科技", -"中科三环": "000970", -"000970": "中科三环", -"南极光": "300940", -"300940": "南极光", -"川发龙蟒": "002312", -"002312": "川发龙蟒", -"确成股份": "605183", -"605183": "确成股份", -"国光电气": "688776", -"688776": "国光电气", -"青农商行": "002958", -"002958": "青农商行", -"禾迈股份": "688032", -"688032": "禾迈股份", -"上海沿浦": "605128", -"605128": "上海沿浦", -"新风光": "688663", -"688663": "新风光", -"豪江智能": "301320", -"301320": "豪江智能", -"新动力": "300152", -"300152": "新动力", -"星光农机": "603789", -"603789": "星光农机", -"深水规院": "301038", -"301038": "深水规院", -"长城退": "002071", -"002071": "长城退", -"ST通脉": "603559", -"603559": "ST通脉", -"锌业股份": "000751", -"000751": "锌业股份", -"宏达高科": "002144", -"002144": "宏达高科", -"民士达": "833394", -"833394": "民士达", -"索辰科技": "688507", -"688507": "索辰科技", -"远航精密": "833914", -"833914": "远航精密", -"厦门港务": "000905", -"000905": "厦门港务", -"易实精密": "836221", -"836221": "易实精密", -"迪马股份": "600565", -"600565": "迪马股份", -"引力传媒": "603598", -"603598": "引力传媒", -"陕鼓动力": "601369", -"601369": "陕鼓动力", -"艾华集团": "603989", -"603989": "艾华集团", -"江南高纤": "600527", -"600527": "江南高纤", -"大豪科技": "603025", -"603025": "大豪科技", -"嘉环科技": "603206", -"603206": "嘉环科技", -"三生国健": "688336", -"688336": "三生国健", -"我武生物": "300357", -"300357": "我武生物", -"灿瑞科技": "688061", -"688061": "灿瑞科技", -"华亚智能": "003043", -"003043": "华亚智能", -"中持股份": "603903", -"603903": "中持股份", -"先锋电子": "002767", -"002767": "先锋电子", -"大叶股份": "300879", -"300879": "大叶股份", -"道道全": "002852", -"002852": "道道全", -"高铁电气": "688285", -"688285": "高铁电气", -"巨能股份": "871478", -"871478": "巨能股份", -"中国银行": "601988", -"601988": "中国银行", -"燕麦科技": "688312", -"688312": "燕麦科技", -"ST天成": "600112", -"600112": "ST天成", -"南京证券": "601990", -"601990": "南京证券", -"安源煤业": "600397", -"600397": "安源煤业", -"华阳股份": "600348", -"600348": "华阳股份", -"S*ST托普": "000583", -"000583": "S*ST托普", -"新天地": "301277", -"301277": "新天地", -"成都路桥": "002628", -"002628": "成都路桥", -"志邦家居": "603801", -"603801": "志邦家居", -"天正电气": "605066", -"605066": "天正电气", -"宁波富邦": "600768", -"600768": "宁波富邦", -"凯因科技": "688687", -"688687": "凯因科技", -"东方证券": "600958", -"600958": "东方证券", -"可立克": "002782", -"002782": "可立克", -"鸿合科技": "002955", -"002955": "鸿合科技", -"金域医学": "603882", -"603882": "金域医学", -"隆鑫通用": "603766", -"603766": "隆鑫通用", -"麦格米特": "002851", -"002851": "麦格米特", -"复星医药": "600196", -"600196": "复星医药", -"中体产业": "600158", -"600158": "中体产业", -"索菱股份": "002766", -"002766": "索菱股份", -"怡合达": "301029", -"301029": "怡合达", -"戴维医疗": "300314", -"300314": "戴维医疗", -"雅戈尔": "600177", -"600177": "雅戈尔", -"北化股份": "002246", -"002246": "北化股份", -"威尔高": "301251", -"301251": "威尔高", -"安琪酵母": "600298", -"600298": "安琪酵母", -"流金科技": "834021", -"834021": "流金科技", -"*ST广田": "002482", -"002482": "*ST广田", -"安妮股份": "002235", -"002235": "安妮股份", -"科源制药": "301281", -"301281": "科源制药", -"北摩高科": "002985", -"002985": "北摩高科", -"怡球资源": "601388", -"601388": "怡球资源", -"朗科科技": "300042", -"300042": "朗科科技", -"精准信息": "300099", -"300099": "精准信息", -"襄阳轴承": "000678", -"000678": "襄阳轴承", -"赤峰黄金": "600988", -"600988": "赤峰黄金", -"三孚新科": "688359", -"688359": "三孚新科", -"博睿数据": "688229", -"688229": "博睿数据", -"天力复合": "873576", -"873576": "天力复合", -"*ST佳沃": "300268", -"300268": "*ST佳沃", -"亿联网络": "300628", -"300628": "亿联网络", -"养元饮品": "603156", -"603156": "养元饮品", -"中海油服": "601808", -"601808": "中海油服", -"东方电热": "300217", -"300217": "东方电热", -"宁沪高速": "600377", -"600377": "宁沪高速", -"江河集团": "601886", -"601886": "江河集团", -"英方软件": "688435", -"688435": "英方软件", -"英飞拓": "002528", -"002528": "英飞拓", -"每日互动": "300766", -"300766": "每日互动", -"西麦食品": "002956", -"002956": "西麦食品", -"凌玮科技": "301373", -"301373": "凌玮科技", -"通力科技": "301255", -"301255": "通力科技", -"掌趣科技": "300315", -"300315": "掌趣科技", -"广安爱众": "600979", -"600979": "广安爱众", -"三维股份": "603033", -"603033": "三维股份", -"太极股份": "002368", -"002368": "太极股份", -"洪兴股份": "001209", -"001209": "洪兴股份", -"皇庭国际": "000056", -"000056": "皇庭国际", -"春兰股份": "600854", -"600854": "春兰股份", -"洪通燃气": "605169", -"605169": "洪通燃气", -"*ST中捷": "002021", -"002021": "*ST中捷", -"电投能源": "002128", -"002128": "电投能源", -"大智慧": "601519", -"601519": "大智慧", -"金太阳": "300606", -"300606": "金太阳", -"力星股份": "300421", -"300421": "力星股份", -"新赛股份": "600540", -"600540": "新赛股份", -"立昂技术": "300603", -"300603": "立昂技术", -"中国电研": "688128", -"688128": "中国电研", -"先锋新材": "300163", -"300163": "先锋新材", -"广西广电": "600936", -"600936": "广西广电", -"汉钟精机": "002158", -"002158": "汉钟精机", -"雅创电子": "301099", -"301099": "雅创电子", -"武钢股份": "600005", -"600005": "武钢股份", -"星湖科技": "600866", -"600866": "星湖科技", -"太和水": "605081", -"605081": "太和水", -"西部建设": "002302", -"002302": "西部建设", -"中超控股": "002471", -"002471": "中超控股", -"华盛锂电": "688353", -"688353": "华盛锂电", -"久盛电气": "301082", -"301082": "久盛电气", -"佛慈制药": "002644", -"002644": "佛慈制药", -"思特威-W": "688213", -"688213": "思特威-W", -"渤海股份": "000605", -"000605": "渤海股份", -"富奥股份": "000030", -"000030": "富奥股份", -"逸豪新材": "301176", -"301176": "逸豪新材", -"坤彩科技": "603826", -"603826": "坤彩科技", -"和远气体": "002971", -"002971": "和远气体", -"银信科技": "300231", -"300231": "银信科技", -"昆船智能": "301311", -"301311": "昆船智能", -"威龙股份": "603779", -"603779": "威龙股份", -"新强联": "300850", -"300850": "新强联", -"秋乐种业": "831087", -"831087": "秋乐种业", -"厦钨新能": "688778", -"688778": "厦钨新能", -"南天信息": "000948", -"000948": "南天信息", -"农发种业": "600313", -"600313": "农发种业", -"科创新材": "833580", -"833580": "科创新材", -"昆仑万维": "300418", -"300418": "昆仑万维", -"中元股份": "300018", -"300018": "中元股份", -"华菱钢铁": "000932", -"000932": "华菱钢铁", -"金陵体育": "300651", -"300651": "金陵体育", -"南华期货": "603093", -"603093": "南华期货", -"华洋赛车": "834058", -"834058": "华洋赛车", -"天宇股份": "300702", -"300702": "天宇股份", -"三环集团": "300408", -"300408": "三环集团", -"美之高": "834765", -"834765": "美之高", -"海康威视": "002415", -"002415": "海康威视", -"新天然气": "603393", -"603393": "新天然气", -"新开普": "300248", -"300248": "新开普", -"凯撒文化": "002425", -"002425": "凯撒文化", -"裕兴股份": "300305", -"300305": "裕兴股份", -"拱东医疗": "605369", -"605369": "拱东医疗", -"华兰疫苗": "301207", -"301207": "华兰疫苗", -"贵州燃气": "600903", -"600903": "贵州燃气", -"凌云光": "688400", -"688400": "凌云光", -"宏和科技": "603256", -"603256": "宏和科技", -"城市传媒": "600229", -"600229": "城市传媒", -"宏微科技": "688711", -"688711": "宏微科技", -"ST贵人": "603555", -"603555": "ST贵人", -"潜能恒信": "300191", -"300191": "潜能恒信", -"博敏电子": "603936", -"603936": "博敏电子", -"泰坦科技": "688133", -"688133": "泰坦科技", -"中潜退": "300526", -"300526": "中潜退", -"庚星股份": "600753", -"600753": "庚星股份", -"步科股份": "688160", -"688160": "步科股份", -"凯伦股份": "300715", -"300715": "凯伦股份", -"南华生物": "000504", -"000504": "南华生物", -"*ST京蓝": "000711", -"000711": "*ST京蓝", -"青岛银行": "002948", -"002948": "青岛银行", -"ST三圣": "002742", -"002742": "ST三圣", -"锦龙股份": "000712", -"000712": "锦龙股份", -"万盛股份": "603010", -"603010": "万盛股份", -"梓橦宫": "832566", -"832566": "梓橦宫", -"网达软件": "603189", -"603189": "网达软件", -"盛泰集团": "605138", -"605138": "盛泰集团", -"中国软件": "600536", -"600536": "中国软件", -"志特新材": "300986", -"300986": "志特新材", -"方大炭素": "600516", -"600516": "方大炭素", -"中核科技": "000777", -"000777": "中核科技", -"金诚信": "603979", -"603979": "金诚信", -"中文在线": "300364", -"300364": "中文在线", -"腾亚精工": "301125", -"301125": "腾亚精工", -"民德电子": "300656", -"300656": "民德电子", -"富祥药业": "300497", -"300497": "富祥药业", -"欣龙控股": "000955", -"000955": "欣龙控股", -"爱美客": "300896", -"300896": "爱美客", -"威贸电子": "833346", -"833346": "威贸电子", -"东方嘉盛": "002889", -"002889": "东方嘉盛", -"顺控发展": "003039", -"003039": "顺控发展", -"双枪科技": "001211", -"001211": "双枪科技", -"驰诚股份": "834407", -"834407": "驰诚股份", -"*ST柏龙": "002776", -"002776": "*ST柏龙", -"华东重机": "002685", -"002685": "华东重机", -"春光药装": "838810", -"838810": "春光药装", -"高测股份": "688556", -"688556": "高测股份", -"天德钰": "688252", -"688252": "天德钰", -"福耀玻璃": "600660", -"600660": "福耀玻璃", -"利和兴": "301013", -"301013": "利和兴", -"泛微网络": "603039", -"603039": "泛微网络", -"琏升科技": "300051", -"300051": "琏升科技", -"瑞斯康达": "603803", -"603803": "瑞斯康达", -"岭南控股": "000524", -"000524": "岭南控股", -"新泉股份": "603179", -"603179": "新泉股份", -"天士力": "600535", -"600535": "天士力", -"光力科技": "300480", -"300480": "光力科技", -"浦发银行": "600000", -"600000": "浦发银行", -"三达膜": "688101", -"688101": "三达膜", -"福鞍股份": "603315", -"603315": "福鞍股份", -"通合科技": "300491", -"300491": "通合科技", -"退市昆机": "600806", -"600806": "退市昆机", -"金花股份": "600080", -"600080": "金花股份", -"强力新材": "300429", -"300429": "强力新材", -"深科达": "688328", -"688328": "深科达", -"泰福泵业": "300992", -"300992": "泰福泵业", -"三元生物": "301206", -"301206": "三元生物", -"快克智能": "603203", -"603203": "快克智能", -"善水科技": "301190", -"301190": "善水科技", -"XD方盛制": "603998", -"603998": "XD方盛制", -"铖昌科技": "001270", -"001270": "铖昌科技", -"天坛生物": "600161", -"600161": "天坛生物", -"海南椰岛": "600238", -"600238": "海南椰岛", -"达瑞电子": "300976", -"300976": "达瑞电子", -"唐人神": "002567", -"002567": "唐人神", -"立讯精密": "002475", -"002475": "立讯精密", -"蓝帆医疗": "002382", -"002382": "蓝帆医疗", -"海量数据": "603138", -"603138": "海量数据", -"清溢光电": "688138", -"688138": "清溢光电", -"创元科技": "000551", -"000551": "创元科技", -"遥望科技": "002291", -"002291": "遥望科技", -"浙江龙盛": "600352", -"600352": "浙江龙盛", -"京威股份": "002662", -"002662": "京威股份", -"中原油气": "000956", -"000956": "中原油气", -"上海莱士": "002252", -"002252": "上海莱士", -"居然之家": "000785", -"000785": "居然之家", -"禾川科技": "688320", -"688320": "禾川科技", -"普瑞眼科": "301239", -"301239": "普瑞眼科", -"璞泰来": "603659", -"603659": "璞泰来", -"全信股份": "300447", -"300447": "全信股份", -"惠城环保": "300779", -"300779": "惠城环保", -"物产中大": "600704", -"600704": "物产中大", -"浙江美大": "002677", -"002677": "浙江美大", -"中路股份": "600818", -"600818": "中路股份", -"寿仙谷": "603896", -"603896": "寿仙谷", -"特锐德": "300001", -"300001": "特锐德", -"伊戈尔": "002922", -"002922": "伊戈尔", -"炜冈科技": "001256", -"001256": "炜冈科技", -"厦门空港": "600897", -"600897": "厦门空港", -"煌上煌": "002695", -"002695": "煌上煌", -"天海防务": "300008", -"300008": "天海防务", -"星网锐捷": "002396", -"002396": "星网锐捷", -"爱丽家居": "603221", -"603221": "爱丽家居", -"科思股份": "300856", -"300856": "科思股份", -"易华录": "300212", -"300212": "易华录", -"大晟文化": "600892", -"600892": "大晟文化", -"顺灏股份": "002565", -"002565": "顺灏股份", -"古越龙山": "600059", -"600059": "古越龙山", -"中马传动": "603767", -"603767": "中马传动", -"宝兰德": "688058", -"688058": "宝兰德", -"峆一药业": "430478", -"430478": "峆一药业", -"智明达": "688636", -"688636": "智明达", -"岱勒新材": "300700", -"300700": "岱勒新材", -"易尚退": "002751", -"002751": "易尚退", -"电科网安": "002268", -"002268": "电科网安", -"银河微电": "688689", -"688689": "银河微电", -"凤凰光学": "600071", -"600071": "凤凰光学", -"长海股份": "300196", -"300196": "长海股份", -"海川智能": "300720", -"300720": "海川智能", -"深信服": "300454", -"300454": "深信服", -"万润新能": "688275", -"688275": "万润新能", -"和而泰": "002402", -"002402": "和而泰", -"皇氏集团": "002329", -"002329": "皇氏集团", -"盐": "000088", -"000088": "盐", -"ST天顺": "002800", -"002800": "ST天顺", -"奥普家居": "603551", -"603551": "奥普家居", -"上峰水泥": "000672", -"000672": "上峰水泥", -"数据港": "603881", -"603881": "数据港", -"大地海洋": "301068", -"301068": "大地海洋", -"雪迪龙": "002658", -"002658": "雪迪龙", -"*ST蓝光": "600466", -"600466": "*ST蓝光", -"国信证券": "002736", -"002736": "国信证券", -"德林海": "688069", -"688069": "德林海", -"振华新材": "688707", -"688707": "振华新材", -"国民技术": "300077", -"300077": "国民技术", -"博济医药": "300404", -"300404": "博济医药", -"科远智慧": "002380", -"002380": "科远智慧", -"森赫股份": "301056", -"301056": "森赫股份", -"光正眼科": "002524", -"002524": "光正眼科", -"博迁新材": "605376", -"605376": "博迁新材", -"慧博云通": "301316", -"301316": "慧博云通", -"广电网络": "600831", -"600831": "广电网络", -"永茂泰": "605208", -"605208": "永茂泰", -"同飞股份": "300990", -"300990": "同飞股份", -"酒钢宏兴": "600307", -"600307": "酒钢宏兴", -"浙文互联": "600986", -"600986": "浙文互联", -"榕基软件": "002474", -"002474": "榕基软件", -"海程邦达": "603836", -"603836": "海程邦达", -"国轩高科": "002074", -"002074": "国轩高科", -"葵花药业": "002737", -"002737": "葵花药业", -"中科电气": "300035", -"300035": "中科电气", -"道森股份": "603800", -"603800": "道森股份", -"浪潮软件": "600756", -"600756": "浪潮软件", -"华兰股份": "301093", -"301093": "华兰股份", -"友车科技": "688479", -"688479": "友车科技", -"广东明珠": "600382", -"600382": "广东明珠", -"睿能科技": "603933", -"603933": "睿能科技", -"中电环保": "300172", -"300172": "中电环保", -"重庆百货": "600729", -"600729": "重庆百货", -"广信股份": "603599", -"603599": "广信股份", -"天能股份": "688819", -"688819": "天能股份", -"美畅股份": "300861", -"300861": "美畅股份", -"昊海生科": "688366", -"688366": "昊海生科", -"吉林碳谷": "836077", -"836077": "吉林碳谷", -"东方创业": "600278", -"600278": "东方创业", -"隆利科技": "300752", -"300752": "隆利科技", -"东港股份": "002117", -"002117": "东港股份", -"中研股份": "688716", -"688716": "中研股份", -"江苏吴中": "600200", -"600200": "江苏吴中", -"浩云科技": "300448", -"300448": "浩云科技", -"思美传媒": "002712", -"002712": "思美传媒", -"锦鸡股份": "300798", -"300798": "锦鸡股份", -"中国电影": "600977", -"600977": "中国电影", -"展鹏科技": "603488", -"603488": "展鹏科技", -"津荣天宇": "300988", -"300988": "津荣天宇", -"海特高新": "002023", -"002023": "海特高新", -"川金诺": "300505", -"300505": "川金诺", -"理工导航": "688282", -"688282": "理工导航", -"达威股份": "300535", -"300535": "达威股份", -"雷迪克": "300652", -"300652": "雷迪克", -"诚意药业": "603811", -"603811": "诚意药业", -"中亦科技": "301208", -"301208": "中亦科技", -"地素时尚": "603587", -"603587": "地素时尚", -"中原内配": "002448", -"002448": "中原内配", -"中国人寿": "601628", -"601628": "中国人寿", -"川投能源": "600674", -"600674": "川投能源", -"百联股份": "600827", -"600827": "百联股份", -"中信海直": "000099", -"000099": "中信海直", -"哈空调": "600202", -"600202": "哈空调", -"文科园林": "002775", -"002775": "文科园林", -"大丰实业": "603081", -"603081": "大丰实业", -"铁流股份": "603926", -"603926": "铁流股份", -"云铝股份": "000807", -"000807": "云铝股份", -"新力金融": "600318", -"600318": "新力金融", -"潮宏基": "002345", -"002345": "潮宏基", -"启迪设计": "300500", -"300500": "启迪设计", -"南王科技": "301355", -"301355": "南王科技", -"广宇发展": "000537", -"000537": "广宇发展", -"科兴制药": "688136", -"688136": "科兴制药", -"华工科技": "000988", -"000988": "华工科技", -"司南导航": "688592", -"688592": "司南导航", -"尖峰集团": "600668", -"600668": "尖峰集团", -"沃森生物": "300142", -"300142": "沃森生物", -"九安医疗": "002432", -"002432": "九安医疗", -"世名科技": "300522", -"300522": "世名科技", -"金河生物": "002688", -"002688": "金河生物", -"鼎通科技": "688668", -"688668": "鼎通科技", -"光华科技": "002741", -"002741": "光华科技", -"威奥股份": "605001", -"605001": "威奥股份", -"综艺股份": "600770", -"600770": "综艺股份", -"银邦股份": "300337", -"300337": "银邦股份", -"漳州发展": "000753", -"000753": "漳州发展", -"飞鹿股份": "300665", -"300665": "飞鹿股份", -"大北农": "002385", -"002385": "大北农", -"春光科技": "603657", -"603657": "春光科技", -"夜光明": "873527", -"873527": "夜光明", -"广晟有色": "600259", -"600259": "广晟有色", -"中建环能": "300425", -"300425": "中建环能", -"海能技术": "430476", -"430476": "海能技术", -"ST粤泰": "600393", -"600393": "ST粤泰", -"春兴精工": "002547", -"002547": "春兴精工", -"凯龙高科": "300912", -"300912": "凯龙高科", -"天智航-U": "688277", -"688277": "天智航-U", -"百川畅银": "300614", -"300614": "百川畅银", -"科迪退": "002770", -"002770": "科迪退", -"建科机械": "300823", -"300823": "建科机械", -"美邦科技": "832471", -"832471": "美邦科技", -"锐明技术": "002970", -"002970": "锐明技术", -"国泰集团": "603977", -"603977": "国泰集团", -"传艺科技": "002866", -"002866": "传艺科技", -"中无人机": "688297", -"688297": "中无人机", -"奥比中光-UW": "688322", -"688322": "奥比中光-UW", -"奥海科技": "002993", -"002993": "奥海科技", -"仲景食品": "300908", -"300908": "仲景食品", -"武汉控股": "600168", -"600168": "武汉控股", -"宝胜股份": "600973", -"600973": "宝胜股份", -"和佳退": "300273", -"300273": "和佳退", -"天微电子": "688511", -"688511": "天微电子", -"宁波高发": "603788", -"603788": "宁波高发", -"万达电影": "002739", -"002739": "万达电影", -"华大基因": "300676", -"300676": "华大基因", -"中设股份": "002883", -"002883": "中设股份", -"安靠智电": "300617", -"300617": "安靠智电", -"真爱美家": "003041", -"003041": "真爱美家", -"京华激光": "603607", -"603607": "京华激光", -"甬金股份": "603995", -"603995": "甬金股份", -"天奥电子": "002935", -"002935": "天奥电子", -"中百集团": "000759", -"000759": "中百集团", -"汉森制药": "002412", -"002412": "汉森制药", -"华源控股": "002787", -"002787": "华源控股", -"退市锐电": "601558", -"601558": "退市锐电", -"国联股份": "603613", -"603613": "国联股份", -"佳禾智能": "300793", -"300793": "佳禾智能", -"城发环境": "000885", -"000885": "城发环境", -"宁波中百": "600857", -"600857": "宁波中百", -"京城股份": "600860", -"600860": "京城股份", -"ST星源": "000005", -"000005": "ST星源", -"绿城水务": "601368", -"601368": "绿城水务", -"华北高速": "000916", -"000916": "华北高速", -"兴蓉环境": "000598", -"000598": "兴蓉环境", -"江苏国泰": "002091", -"002091": "江苏国泰", -"TCL科技": "000100", -"000100": "TCL科技", -"远信工业": "301053", -"301053": "远信工业", -"思维列控": "603508", -"603508": "思维列控", -"永悦科技": "603879", -"603879": "永悦科技", -"中科星图": "688568", -"688568": "中科星图", -"读者传媒": "603999", -"603999": "读者传媒", -"中银证券": "601696", -"601696": "中银证券", -"则成电子": "837821", -"837821": "则成电子", -"格尔软件": "603232", -"603232": "格尔软件", -"绿能慧充": "600212", -"600212": "绿能慧充", -"力合科创": "002243", -"002243": "力合科创", -"浙江鼎力": "603338", -"603338": "浙江鼎力", -"广电运通": "002152", -"002152": "广电运通", -"扬杰科技": "300373", -"300373": "扬杰科技", -"软控股份": "002073", -"002073": "软控股份", -"东山精密": "002384", -"002384": "东山精密", -"应流股份": "603308", -"603308": "应流股份", -"*ST洲际": "600759", -"600759": "*ST洲际", -"欧科亿": "688308", -"688308": "欧科亿", -"辽宁能源": "600758", -"600758": "辽宁能源", -"天目湖": "603136", -"603136": "天目湖", -"科翔股份": "300903", -"300903": "科翔股份", -"恒玄科技": "688608", -"688608": "恒玄科技", -"中国巨石": "600176", -"600176": "中国巨石", -"利尔达": "832149", -"832149": "利尔达", -"华阳国际": "002949", -"002949": "华阳国际", -"星云股份": "300648", -"300648": "星云股份", -"金财互联": "002530", -"002530": "金财互联", -"广和通": "300638", -"300638": "广和通", -"共达电声": "002655", -"002655": "共达电声", -"华塑科技": "301157", -"301157": "华塑科技", -"晨光生物": "300138", -"300138": "晨光生物", -"浙江荣泰": "603119", -"603119": "浙江荣泰", -"华软科技": "002453", -"002453": "华软科技", -"鸿利智汇": "300219", -"300219": "鸿利智汇", -"中盐化工": "600328", -"600328": "中盐化工", -"中南建设": "000961", -"000961": "中南建设", -"飞马国际": "002210", -"002210": "飞马国际", -"沪光股份": "605333", -"605333": "沪光股份", -"华康股份": "605077", -"605077": "华康股份", -"歌力思": "603808", -"603808": "歌力思", -"江龙船艇": "300589", -"300589": "江龙船艇", -"中国出版": "601949", -"601949": "中国出版", -"齐心集团": "002301", -"002301": "齐心集团", -"智云股份": "300097", -"300097": "智云股份", -"欧康医药": "833230", -"833230": "欧康医药", -"退市金钰": "600086", -"600086": "退市金钰", -"李子园": "605337", -"605337": "李子园", -"海马汽车": "000572", -"000572": "海马汽车", -"华电重工": "601226", -"601226": "华电重工", -"仟源医药": "300254", -"300254": "仟源医药", -"齐鲁华信": "830832", -"830832": "齐鲁华信", -"长动退": "000835", -"000835": "长动退", -"广汽长丰": "600991", -"600991": "广汽长丰", -"翰宇药业": "300199", -"300199": "翰宇药业", -"焦作万方": "000612", -"000612": "焦作万方", -"博迈科": "603727", -"603727": "博迈科", -"路桥信息": "837748", -"837748": "路桥信息", -"百洋股份": "002696", -"002696": "百洋股份", -"冀东装备": "000856", -"000856": "冀东装备", -"佩蒂股份": "300673", -"300673": "佩蒂股份", -"吉艾退": "300309", -"300309": "吉艾退", -"白云电器": "603861", -"603861": "白云电器", -"劲仔食品": "003000", -"003000": "劲仔食品", -"芯能科技": "603105", -"603105": "芯能科技", -"世纪恒通": "301428", -"301428": "世纪恒通", -"亚华电子": "301337", -"301337": "亚华电子", -"ST国嘉": "600646", -"600646": "ST国嘉", -"中国中车": "601766", -"601766": "中国中车", -"创兴资源": "600193", -"600193": "创兴资源", -"真视通": "002771", -"002771": "真视通", -"退市吉恩": "600432", -"600432": "退市吉恩", -"香农芯创": "300475", -"300475": "香农芯创", -"鸿博股份": "002229", -"002229": "鸿博股份", -"宁波东力": "002164", -"002164": "宁波东力", -"钱江摩托": "000913", -"000913": "钱江摩托", -"联得装备": "300545", -"300545": "联得装备", -"中信出版": "300788", -"300788": "中信出版", -"黑芝麻": "000716", -"000716": "黑芝麻", -"民爆光电": "301362", -"301362": "民爆光电", -"正虹科技": "000702", -"000702": "正虹科技", -"微导纳米": "688147", -"688147": "微导纳米", -"朱老六": "831726", -"831726": "朱老六", -"金": "000402", -"000402": "金", -"中科磁业": "301141", -"301141": "中科磁业", -"思特奇": "300608", -"300608": "思特奇", -"深粮控股": "000019", -"000019": "深粮控股", -"幸福蓝海": "300528", -"300528": "幸福蓝海", -"立昂微": "605358", -"605358": "立昂微", -"冀中能源": "000937", -"000937": "冀中能源", -"爱柯迪": "600933", -"600933": "爱柯迪", -"江苏金租": "600901", -"600901": "江苏金租", -"世华科技": "688093", -"688093": "世华科技", -"森源电气": "002358", -"002358": "森源电气", -"万里股份": "600847", -"600847": "万里股份", -"建投能源": "000600", -"000600": "建投能源", -"博众精工": "688097", -"688097": "博众精工", -"青松建化": "600425", -"600425": "青松建化", -"广誉远": "600771", -"600771": "广誉远", -"天亿马": "301178", -"301178": "天亿马", -"中航泰达": "836263", -"836263": "中航泰达", -"帅丰电器": "605336", -"605336": "帅丰电器", -"保利联合": "002037", -"002037": "保利联合", -"埃斯顿": "002747", -"002747": "埃斯顿", -"双汇发展": "000895", -"000895": "双汇发展", -"何氏眼科": "301103", -"301103": "何氏眼科", -"茂硕电源": "002660", -"002660": "茂硕电源", -"方大新材": "838163", -"838163": "方大新材", -"乾照光电": "300102", -"300102": "乾照光电", -"钜泉科技": "688391", -"688391": "钜泉科技", -"ST鞍一工": "600813", -"600813": "ST鞍一工", -"汇川技术": "300124", -"300124": "汇川技术", -"锋龙股份": "002931", -"002931": "锋龙股份", -"数字人": "835670", -"835670": "数字人", -"山西证券": "002500", -"002500": "山西证券", -"新光药业": "300519", -"300519": "新光药业", -"吴通控股": "300292", -"300292": "吴通控股", -"天赐材料": "002709", -"002709": "天赐材料", -"深圳燃气": "601139", -"601139": "深圳燃气", -"葛洲坝": "600068", -"600068": "葛洲坝", -"梅花生物": "600873", -"600873": "梅花生物", -"滨化股份": "601678", -"601678": "滨化股份", -"国电电力": "600795", -"600795": "国电电力", -"税友股份": "603171", -"603171": "税友股份", -"博瑞医药": "688166", -"688166": "博瑞医药", -"苏州高新": "600736", -"600736": "苏州高新", -"壹网壹创": "300792", -"300792": "壹网壹创", -"小商品城": "600415", -"600415": "小商品城", -"威领股份": "002667", -"002667": "威领股份", -"汉维科技": "836957", -"836957": "汉维科技", -"中孚信息": "300659", -"300659": "中孚信息", -"凯众股份": "603037", -"603037": "凯众股份", -"中恒电气": "002364", -"002364": "中恒电气", -"中际旭创": "300308", -"300308": "中际旭创", -"福莱新材": "605488", -"605488": "福莱新材", -"科威尔": "688551", -"688551": "科威尔", -"博晖创新": "300318", -"300318": "博晖创新", -"退市富控": "600634", -"600634": "退市富控", -"深水海纳": "300961", -"300961": "深水海纳", -"中毅达": "600610", -"600610": "中毅达", -"利亚德": "300296", -"300296": "利亚德", -"口子窖": "603589", -"603589": "口子窖", -"上海三毛": "600689", -"600689": "上海三毛", -"协鑫集成": "002506", -"002506": "协鑫集成", -"航发动力": "600893", -"600893": "航发动力", -"腾远钴业": "301219", -"301219": "腾远钴业", -"苑东生物": "688513", -"688513": "苑东生物", -"兴瑞科技": "002937", -"002937": "兴瑞科技", -"航天环宇": "688523", -"688523": "航天环宇", -"众生药业": "002317", -"002317": "众生药业", -"北方长龙": "301357", -"301357": "北方长龙", -"泛亚微透": "688386", -"688386": "泛亚微透", -"黄河旋风": "600172", -"600172": "黄河旋风", -"浙大网新": "600797", -"600797": "浙大网新", -"石英股份": "603688", -"603688": "石英股份", -"长青集团": "002616", -"002616": "长青集团", -"通业科技": "300960", -"300960": "通业科技", -"深天马A": "000050", -"000050": "深天马A", -"大东南": "002263", -"002263": "大东南", -"福龙马": "603686", -"603686": "福龙马", -"同为股份": "002835", -"002835": "同为股份", -"拓尔思": "300229", -"300229": "拓尔思", -"芯瑞达": "002983", -"002983": "芯瑞达", -"兴森科技": "002436", -"002436": "兴森科技", -"聚胶股份": "301283", -"301283": "聚胶股份", -"长缆科技": "002879", -"002879": "长缆科技", -"沙钢股份": "002075", -"002075": "沙钢股份", -"恒生电子": "600570", -"600570": "恒生电子", -"美芝股份": "002856", -"002856": "美芝股份", -"慧智微-U": "688512", -"688512": "慧智微-U", -"邦讯退": "300312", -"300312": "邦讯退", -"三祥新材": "603663", -"603663": "三祥新材", -"物产金轮": "002722", -"002722": "物产金轮", -"美格智能": "002881", -"002881": "美格智能", -"芯导科技": "688230", -"688230": "芯导科技", -"天安新材": "603725", -"603725": "天安新材", -"福然德": "605050", -"605050": "福然德", -"创远信科": "831961", -"831961": "创远信科", -"密尔克卫": "603713", -"603713": "密尔克卫", -"东星医疗": "301290", -"301290": "东星医疗", -"三利谱": "002876", -"002876": "三利谱", -"阳谷华泰": "300121", -"300121": "阳谷华泰", -"重庆银行": "601963", -"601963": "重庆银行", -"开普检测": "003008", -"003008": "开普检测", -"华阳新材": "600281", -"600281": "华阳新材", -"热威股份": "603075", -"603075": "热威股份", -"ST通葡": "600365", -"600365": "ST通葡", -"科瑞思": "301314", -"301314": "科瑞思", -"瑞丰光电": "300241", -"300241": "瑞丰光电", -"兰卫医学": "301060", -"301060": "兰卫医学", -"舒华体育": "605299", -"605299": "舒华体育", -"鑫铂股份": "003038", -"003038": "鑫铂股份", -"神工股份": "688233", -"688233": "神工股份", -"华扬联众": "603825", -"603825": "华扬联众", -"康斯特": "300445", -"300445": "康斯特", -"泉为科技": "300716", -"300716": "泉为科技", -"赛升药业": "300485", -"300485": "赛升药业", -"新坐标": "603040", -"603040": "新坐标", -"润和软件": "300339", -"300339": "润和软件", -"白云山A": "000522", -"000522": "白云山A", -"宁波色母": "301019", -"301019": "宁波色母", -"海螺水泥": "600585", -"600585": "海螺水泥", -"天元宠物": "301335", -"301335": "天元宠物", -"迦南智能": "300880", -"300880": "迦南智能", -"南新制药": "688189", -"688189": "南新制药", -"博汇纸业": "600966", -"600966": "博汇纸业", -"瑞奇智造": "833781", -"833781": "瑞奇智造", -"华闻集团": "000793", -"000793": "华闻集团", -"电光科技": "002730", -"002730": "电光科技", -"威海广泰": "002111", -"002111": "威海广泰", -"德尔股份": "300473", -"300473": "德尔股份", -"深桑达A": "000032", -"000032": "深桑达A", -"信达地产": "600657", -"600657": "信达地产", -"天际股份": "002759", -"002759": "天际股份", -"四方精创": "300468", -"300468": "四方精创", -"万丰股份": "603172", -"603172": "万丰股份", -"天箭科技": "002977", -"002977": "天箭科技", -"浦东金桥": "600639", -"600639": "浦东金桥", -"南都物业": "603506", -"603506": "南都物业", -"威星智能": "002849", -"002849": "威星智能", -"同心传动": "833454", -"833454": "同心传动", -"博纳影业": "001330", -"001330": "博纳影业", -"去年": "2022", -"前年": "2021", -"今年": "2023", -"上季度": ["三季度", "q3"], -"q1": "一季度", -"q2": "二季度", -"q3": "三季度", -"q4": "四季度", -"上班": "办公" -} + "去年": "2024", + "前年": "2023", + "今年": "2025" +} \ No newline at end of file