[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-baiyang2464--chatbot-base-on-Knowledge-Graph":3,"tool-baiyang2464--chatbot-base-on-Knowledge-Graph":64},[4,17,25,39,48,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,14,15],"开发框架","Agent","语言模型","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":10,"last_commit_at":23,"category_tags":24,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,15],{"id":26,"name":27,"github_repo":28,"description_zh":29,"stars":30,"difficulty_score":10,"last_commit_at":31,"category_tags":32,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[33,34,35,36,14,37,15,13,38],"图像","数据工具","视频","插件","其他","音频",{"id":40,"name":41,"github_repo":42,"description_zh":43,"stars":44,"difficulty_score":45,"last_commit_at":46,"category_tags":47,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,3,"2026-04-04T04:44:48",[14,33,13,15,37],{"id":49,"name":50,"github_repo":51,"description_zh":52,"stars":53,"difficulty_score":45,"last_commit_at":54,"category_tags":55,"status":16},519,"PaddleOCR","PaddlePaddle\u002FPaddleOCR","PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来，转换成计算机可读取的结构化数据，让机器真正“看懂”图文内容。\n\n面对海量纸质或电子文档，PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域，它扮演着连接图像与大型语言模型（LLM）的桥梁角色，能将视觉信息直接转化为文本输入，助力智能问答、文档分析等应用场景落地。\n\nPaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显：不仅支持全球 100 多种语言的识别，还能在 Windows、Linux、macOS 等多个系统上运行，并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目，PaddleOCR 既能满足快速集成的需求，也能支撑前沿的视觉语言研究，是处理文字识别任务的理想选择。",74913,"2026-04-05T10:44:17",[15,33,13,37],{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":45,"last_commit_at":62,"category_tags":63,"status":16},2181,"OpenHands","OpenHands\u002FOpenHands","OpenHands 是一个专注于 AI 驱动开发的开源平台，旨在让智能体（Agent）像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点，通过自动化流程显著提升开发速度。\n\n无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员，还是需要快速原型验证的技术团队，都能从中受益。OpenHands 提供了灵活多样的使用方式：既可以通过命令行（CLI）或本地图形界面在个人电脑上轻松上手，体验类似 Devin 的流畅交互；也能利用其强大的 Python SDK 自定义智能体逻辑，甚至在云端大规模部署上千个智能体并行工作。\n\n其核心技术亮点在于模块化的软件智能体 SDK，这不仅构成了平台的引擎，还支持高度可组合的开发模式。此外，OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩，证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能，支持与 Slack、Jira 等工具集成，并提供细粒度的权限管理，适合从个人开发者到大型企业的各类用户场景。",70612,"2026-04-05T11:12:22",[15,14,13,36],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":78,"owner_email":78,"owner_twitter":78,"owner_website":78,"owner_url":80,"languages":81,"stars":86,"forks":87,"last_commit_at":88,"license":78,"difficulty_score":45,"env_os":89,"env_gpu":90,"env_ram":91,"env_deps":92,"category_tags":103,"github_topics":78,"view_count":45,"oss_zip_url":78,"oss_zip_packed_at":78,"status":16,"created_at":104,"updated_at":105,"faqs":106,"releases":117},800,"baiyang2464\u002Fchatbot-base-on-Knowledge-Graph","chatbot-base-on-Knowledge-Graph","使用深度学习方法解析问题 知识图谱存储 查询知识点 基于医疗垂直领域的对话系统","chatbot-base-on-Knowledge-Graph 是一款专为医疗垂直领域打造的智能对话系统后台程序。它致力于解决医疗咨询场景中非结构化数据难以利用、问答响应不够精准的痛点。通过整合深度学习与自然语言处理技术，该系统能够自动解析用户提问，并在构建好的知识图谱中检索相关知识。\n\n在技术实现上，项目展现了独特的亮点：首先利用爬虫获取并清洗医疗数据，随后采用 BiLSTM-CRF 模型精准识别疾病、科室等医疗实体，配合 TextCNN 网络准确判断用户意图。最终将结构化知识存入 Neo4j 图数据库，实现了高效的知识点存储与查询。整个流程涵盖了从数据准备、图谱构建到自动问答的完整闭环。\n\n这套开源方案非常适合希望探索 NLP 应用、学习知识图谱构建或从事医疗 AI 研发的开发者与研究人员参考。它不仅提供了一个可运行的对话系统示例，还展示了如何将复杂的医疗数据转化为机器可理解的逻辑结构，为相关领域的二次开发奠定了坚实基础。","It is indeed a luxury to keep human reason forever. by  Moss, a robot of the film The Wandering Earth\n\n“让人类永远保持理智，确实是一种奢求” ，机器人莫斯，《流浪地球》\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002Fshow_talk.gif alt=\"Sample\"  width=\"700\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n\n\n+ [0.项目概况](#项目概况)\n\n+ [1.基础数据爬取](#基础数据爬取)\n\n+ [2.知识图谱搭建](#知识图谱搭建)\n\n+ [3.自动问答实现](#自动问答实现)\n  + [数据准备](#数据准备)\n  + [词向量训练](#词向量训练)\n  + [医疗命名实体识别](#医疗命名实体识别)\n    + [嵌入层](#嵌入层)\n    + [BiLSTM层](#句子输入到BiLSTM层)\n    + [CRF层](#CRF层)\n    + [损失函数及反向传播](#损失函数及反向传播)\n    + [网络结构与超参数](#循环网络结构与超参数)\n  + [用户意图识别](#用户意图识别)\n    + [数据嵌入人工特征](#数据嵌入人工特征)\n    + [模型选择](#模型选择)\n    + [嵌入层](#嵌入层)\n    + [卷积层](#卷积层)\n    + [池化层](#池化层)\n    + [全连接及SoftMax层](#全连接及SoftMax分类层)\n    + [网络结构与超参数](#卷积网络结构与超参数)\n\n+ [参考资料](#参考资料)\n\n\n\n### 项目概况\n\n本项目为一个使用深度学习方法解析问题，知识图谱存储、查询知识点，基于医疗垂直领域的对话系统的后台程序\n\n+ 运行效果：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082601.png alt=\"Sample\"  width=\"700\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n+ 项目的搭建大致分为三个模块：\n  + 基础数据爬取\n  + 知识图谱构建\n  + 自动问答实现\n  \n+ 项目运行环境：\n\npython   : \n\n```\n python 3.6.8\n```\n\n运行系统：\n\n```\nubuntu 16.04 \n```\n\n知识图谱：\n\n```\nneo4j           3.2.2 图形数据库\npy2neo          3.1.1  \t\t\tneo4j对应的python驱动\n```\n\n深度学习：\n\n```\njieba           0.39   \nnumpy           1.17.0 \npandas          0.25.0 \ntensorflow      1.10.0 \n```\n\n文本匹配：\n\n```\nahocorasick    （安装方法 pip install pyahocorasick）\n```\n\n必要说明：\n\n```\n1.深度学习模块深度网络的训练使用tensorflow的gpu版本，\n  在应用阶段由于要部署要服务器上使用的对应的tensorflow的cpu版本\n2.若要clone项目，尽量保持扩展包的版本一致\n```\n\n+ 项目运行方式\n\n1. 搭建知识图谱：python build_grapy.py。大概几个小时，耐心等待。 \n2. 启动问答系统：python chatbot_graph.py  \n\n+ 项目主要文件目录结构\n\n```shell\nchatbot\n├── answer_search.py                        # 问题查询及返回\n├── BiLSTM_CRF.py                           # 实体识别的双向LSTM-CRF网络\n├── build_medicalgraph.py                   # 将结构化json数据导入neo4j\n├── chatbot_graph.py                        # 问答程序脚本\n├── classifyApp.py                          # 问句分类应用脚本\n├── classifyUtils.py                        # 工具函数集合\n├── data\n│   └── medical.json                        # 全科知识数据\n├── data_ai\n│   ├── cbowData                            # 词向量文件\n│   │   ├── classifyDocument.txt.ebd.npy    # 词向量查找表\n│   │   ├── classifyDocument.txt.vab        # 词向量中词与索引对照表\n│   │   ├── document.txt.ebd.npy            \n│   │   └── document.txt.vab\n│   ├── classifyData                        # 问句分类训练数据\n│   │   ├── test_data.txt\n│   │   └── train_data.txt\n│   ├── classifyModel                       # 问句分类模型\n│   │   ├── checkpoint\n│   │   ├── model-3500.data-00000-of-00001\n│   │   ├── model-3500.index\n│   │   └── model-3500.meta\n│   ├── nerData                          \n│   └── nerModel                            # 命名实体识别模型\n├── dict                                    # 实体数据文件\n├── nerApp.py                               # 命名实体识别应用脚本\n├── nerUtils.py                             # 工具函数集合\n├── prepare_data                           \n│   ├── build_data.py                       # 数据库操作脚本\n│   ├── data_spider.py                      # 数据采集脚本\n│   └── max_cut.py                          # 基于词典的最大前向\u002F后向匹配\n├── question_analysis.py                    # 问句类型分类脚本\n├── question_parser.py                      # 回答生成脚本\n└── text_cnn.py                             # 文本分类的cnn网络\n```\n\n\n\n### 基础数据爬取\n\n基础数据爬取于[寻医问药](\u003Chttp:\u002F\u002Fwww.xywy.com\u002F>)网站，一家医疗信息提供平台，上面的数据做了较好的分类处理，爬下来后可以较为方便的保存为json格式的结构化文件，格式展示如下：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002Fjson_show.gif alt=\"Sample\"  width=\"700\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> 爬取的数据保存为json格式文件 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n\n### 知识图谱搭建\n\n\n知识图谱可以用若干三元组来表示，三元组的基本形式：\n\n+ 实体1-关系-实体2\n+ 实体-属性-属性值\n\n将爬取的数据调用`build_medicalgraph.py    `脚本将结构化json数据导入neo4j图数据库，部分数据库展示如下：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002Fgraph.svg alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> 图形数据库部分展示 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n知识图谱实体类型\n\n| 实体类型   |   中文含义   | 实体数量 | 举例                                   |\n| :--------- | :----------: | :------: | :------------------------------------- |\n| Check      | 诊断检查项目 |  3,353   | 支气管造影;关节镜检查                  |\n| Department |   医疗科目   |    54    | 整形美容科;烧伤科                      |\n| Disease    |     疾病     |  8,807   | 血栓闭塞性脉管炎;胸降主动脉动脉瘤      |\n| Drug       |     药品     |  3,828   | 京万红痔疮膏;布林佐胺滴眼液            |\n| Food       |     食物     |  4,870   | 番茄冲菜牛肉丸汤;竹笋炖羊肉            |\n| Producer   |   在售药品   |  17,201  | 通药制药青霉素V钾片;青阳醋酸地塞米松片 |\n| Symptom    |   疾病症状   |  5,998   | 乳腺组织肥厚;脑实质深部出血            |\n| Total      |     总计     |  44,111  | 约4.4万实体量级                        |\n\n知识图谱实体关系类型\n\n| 实体关系类型   |   中文含义   | 关系数量 | 举例                                                 |\n| :------------- | :----------: | :------: | :--------------------------------------------------- |\n| belongs_to     |     属于     |  8,844   | \u003C妇科,属于,妇产科>                                   |\n| common_drug    | 疾病常用药品 |  14,649  | \u003C阳强,常用,甲磺酸酚妥拉明分散片>                     |\n| do_eat         | 疾病宜吃食物 |  22,238  | \u003C胸椎骨折,宜吃,黑鱼>                                 |\n| drugs_of       | 药品在售药品 |  17,315  | \u003C青霉素V钾片,在售,通药制药青霉素V钾片>               |\n| need_check     | 疾病所需检查 |  39,422  | \u003C单侧肺气肿,所需检查,支气管造影>                     |\n| no_eat         | 疾病忌吃食物 |  22,247  | \u003C唇病,忌吃,杏仁>                                     |\n| recommand_drug | 疾病推荐药品 |  59,467  | \u003C混合痔,推荐用药,京万红痔疮膏>                       |\n| recommand_eat  | 疾病推荐食谱 |  40,221  | \u003C鞘膜积液,推荐食谱,番茄冲菜牛肉丸汤>                 |\n| has_symptom    |   疾病症状   |  5,998   | \u003C早期乳腺癌,疾病症状,乳腺组织肥厚>                   |\n| acompany_with  | 疾病并发疾病 |  12,029  | \u003C下肢交通静脉瓣膜关闭不全,并发疾病,血栓闭塞性脉管炎> |\n| Total          |     总计     | 294,149  | 约30万关系量级                                       |\n\n知识图谱属性类型\n\n| 属性类型      |   中文含义   |            举例             |\n| :------------ | :----------: | :-------------------------: |\n| name          |   疾病名称   |       喘息样支气管炎        |\n| desc          |   疾病简介   |    又称哮喘性支气管炎...    |\n| cause         |   疾病病因   |    常见的有合胞病毒等...    |\n| prevent       |   预防措施   | 注意家族与患儿自身过敏史... |\n| cure_lasttime |   治疗周期   |          6-12个月           |\n| cure_way      |   治疗方式   |   \"药物治疗\",\"支持性治疗\"   |\n| cured_prob    |   治愈概率   |             95%             |\n| easy_get      | 疾病易感人群 |        无特定的人群         |\n\n\n\n### 自动问答实现\n\n自动问答采用深度学习的方法，由于缺少问句训练语料，训练数据来源于自制的问句生成器，然后对问句分词，问句中的每个词进行嵌入，即由词向量组成的问句代替自然语言的问句输入，再进行命名实体识别及实体\u002F问句关系抽取（问句分类），实现对问句的语义解析。\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082501.png alt=\"Sample\"  width=\"600\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> 自动问答实现流程图 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n本仓库为了代码结构清晰，只放了深度学习的模型应用的脚本，词向量及模型训练的脚本会放在另一个代码仓库中。\n\n#### 数据准备\n\n+ 数据冷启动\n\n问句解析部分是用深度学习的方法实现的，那自然需要数据来训练模型。在通常的垂直领域内，由于缺乏系统性地数据积累或合作项目，本项目所用地问句语义解析必须依赖大规模地问句语料，因此设计了一个问句生成器（专业点地叫法为数据冷启动？），就是根据设定好的问句模板将上文爬取到的实体填充到模板的槽当中，同时对问句进行逐词的命名实体标注（BIOES标注法）及问句类别标注，用于后面的实体抽取及实体\u002F问句关系抽取（问句分类）\n\n命名实体标注标签：\n\n| 实体  | 序号 | 含义          |\n| ----- | ---- | ------------- |\n| O     | 0    | 其它          |\n| B-dis | 1    | 疾病实体开头  |\n| I-dis | 2    | 疾病实体中间  |\n| E-dis | 3    | 疾病实体末尾  |\n| B-sym | 4    | 症状          |\n| I-sym | 5    |               |\n| E-sym | 6    |               |\n| B-dru | 7    | 药品          |\n| I-dru | 8    |               |\n| E-dru | 9    |               |\n| S-dis | 10   | 单个-疾病实体 |\n| S-sym | 11   |               |\n| S-dru | 12   |               |\n\n问句类别标注标签\n\n| 类别            | 序号 | 含义               |\n| --------------- | ---- | ------------------ |\n| disease_symptom | 0    | 疾病有啥症状       |\n| symptom_curway  | 1    | 症状有啥治疗方法   |\n| symptom_disease | 2    | 症状对应啥疾病     |\n| disease_drug    | 3    | 疾病要吃啥药品     |\n| drug_disease    | 4    | 药品治疗啥疾病     |\n| disease_check   | 5    | 疾病要做啥检查检查 |\n| disease_prevent | 6    | 疾病有啥预防方式   |\n\n+ 数据增强\n\n经过人工造问句后，再针对问句结构类型单一不够多样进行了数据增强，比如采取了如下措施：句子结构倒装，同义词替换，随机插入标点加入噪音\n\n+ 数据类别平衡及shuffle\n\n在未做类别平衡及数据shuffle时，模型会严重过拟合，有时只能预测出一种结果，在测试集上正确率很低，做了类别平衡及输入数据打乱之后预测结果大幅改观\n\n#### 词向量训练\n\n采用词向量模型中的连续词袋模型cbow进行词向量的训练\n\n一些参数：\n\n| 参数名                        | 参数值 |\n| ----------------------------- | ------ |\n| 学习率                        | 0.0001 |\n| 词向量长度（中间\u002F隐藏层维度） | 200    |\n| 上下文window_size             | 10     |\n| batch_size                    | 300    |\n| 最小词频min_frq               | 2      |\n\n值得注意的是：\n\n1. 词向量的训练也会有loss，但是在训练词向量的过程中没有太必要关注其loss，因为训练词向量一般只是我们想要的中间结果，与我们的目的相去甚远，经验是等loss稳定之后将词向量先用于后面的任务，看后面任务的实际效果怎么样，若效果不佳再调整参数甚至更换其它词向量模型。\n\n2. 最开始是用的字向量，但是用于之后的任务效果不佳，会出现ner标注偏执及正确率低的现象。然后使用了词向量，效果提升较大。究其原因可能是词包含的信息更多，对模型的辅助效果更明显\n3. 网上说词向量一般在`200~300`维度表示效果较好，字向量在`100~200`维度就够了，当语料很小时候，词向量维度应调小。实际测试在10多M的语料大小情况下，词向量维度50都能达到可用效果。\n\n#### 医疗命名实体识别\n\n+ 模型训练描述\n\n在知识库问答系统处理过程中，解析问句意图首先需要进行命名实体识别（NER），正确提取出问句中询问的医疗实体。当前NER模型大多采用LSTM-CRF模型。基于词的中文NER，则需要预先对句子进行分词。\n\n##### 嵌入层\n\n最开始我是用的字向量，但是效果不好，换成了词向量。句子分词后，将每个词查找词向量的lookup tabel获得对应词向量，用词向量替换原句子中的词，形成新的句子作为输入，为保证训练效果，当句子太长时候要截断，句子太短时要填充，本项目使用的0填充。\n\n##### BiLSTM层\n\n然后将规整后的句子输入到BiLSTM网络中，就是句子正向导入LSTM网络一次，再把句子反向导入LSTM网络一次，经过多次迭代输出LSTM网络的两个预测结果（正向，反向），然后将两个预测结果拼接成一个长向量作为下一层的CRF层的输入\n\n具体是怎么拼接的：做ner时，前向时候得到的LSTM的的中间状态输出向量和后向时中间状态输出向量中对应的单词的中间状态拼接，如下图：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082502.png alt=\"Sample\"  width=\"550\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> lstm中间状态向量拼接作为输出用于ner \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n\n若用于句子的情感分类则作以下拼接：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082503.png alt=\"Sample\"  width=\"550\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> lstm中间状态向量拼接作为输出用于情感分类 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n图片来至[详解BiLSTM及代码实现](\u003Chttps:\u002F\u002Fsegmentfault.com\u002Fp\u002F1210000016830547\u002Fread#top>)\n\ntensorflow中tf.nn.dynamic_rnn函数\n\n```python\noutputs, state = tf.nn.dynamic_rnn(\n    cell,\n    inputs,\n    sequence_length=None,\n    initial_state=None,\n    dtype=None,\n    parallel_iterations=None,\n    swap_memory=False,\n    time_major=False,\n    scope=None\n)\n其中两个返回值：\noutputs: The RNN output Tensor. this will be a Tensor shaped: [batch_size, max_time, cell.output_size].\n\nstate: The final state. If cell.state_size is an int, this will be shaped [batch_size, cell.state_size]. \n```\n\n第一个输出`outputs`就是一批数据的中间状态输出的集合（张量）。第二个输出`state`就是LSTM最后一个状态，\n\n它含了一个方向的所有信息\n\n##### CRF层\n\nCRF的`转移矩阵A`由神经网络的CRF学习得到，而`发射概率矩阵P` 就是由Bi-LSTM的输出来作近似模拟。\n\n这样有了（A,P,$\\pi$）就可以调用viterbi算法进行解码做预测了\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082504.png alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> Bi-LSMT+CRF \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n##### 损失函数及反向传播\n\n损失函数用的tensorflow的`crf.crf_log_likelihood`，对数似然函数\n\n目标函数是的`-tf.reduce_mean(crf.crf_log_likelihood)`，即对数自然函数的均值的负数，这和LR回归的目标函数一样\n\n反向传播更新参数，进行下一批数据前向传播训练\n\n\n\n##### 循环网络结构与超参数\n\na）使用句子分词后词的词向量作为输入，\n\nb）dropout的值调到0.5，\n\nc）句子的最大长度sentence_length调到30以下（我使用的20），\n\nd）句子填充那里使用的0填充，\n\ne）语料中实体种类数目做平衡（不出现某个种类严重偏执，否者就回导致预测偏执严重和过拟合），\n\nf）语料标注使用的BIOES标注（之前用的BIO标注）\n\n训练出来模型的F1值可以达到0.98，\n\n\n\n| 参数名          | 参数值  |\n| --------------- | ------- |\n| lstm 隐藏层维度 | 600     |\n| 学习速率        | 0.00075 |\n| batch_size      | 100     |\n| 句子截断长度    | 25      |\n| 梯度截断        | [-5,5]  |\n| 标签数目        | 13      |\n| 训练时dropout   | 0.5     |\n| 句子填充        | 0值填充 |\n| 句子标注方式    | BIOES法 |\n\n#### 用户意图识别\n\n通过命名实体识别模型正确提取出问句中询问的医疗实体之后，还需要理解用户问句的意图，其意图的具体表现就是医疗实体的关系或属性，即需要进行问句意图和知识库关系的映射。考虑医疗问诊场景的用户问题通常是短文本，因此本项目将用户意图识别设定为短文本分类任务\n\n##### 数据嵌入人工特征\n\n数据同样用冷启动的方式获得大量数据，然后将在上一轮识别出来的命名实体类别嵌入到句子中，增加句子的区分度\n\n```\n得了感冒要吃啥药\n嵌入人工特征：\n得了感冒disease要吃啥药\n```\n\n##### 模型选择\n\n由n-gram语言模型可知，自然语言存在局部特征，卷积神经网络（CNN）可用来提取局部特征，如今常被用于表示句子级别的信息和短文本分类任务，结合识别出的医疗实体实现用户问句的意图理解。\n\n短文本有其特点，局部信息可决定句子意图，比如像`我头疼发烧流鼻涕，这是啥病`与问句`这是啥病，我最近发烧流鼻涕头疼`里面的整体与局部语序换了，但是句子意图没有变，所以短文本适用于CNN。长文本可用LSTM，attention，有大量训练语料则bert有优势，需要快速但精确度要求不高可用fasttext模型。\n\n##### 嵌入层\n\n将词表示成具有相同长度的词向量，句子就可表示成词向量的矩阵，一个二维的矩阵，这个矩阵可以类比为一张单通道的图片，若图片时RGB三通道图片，则在这里，我们的词可以采用不同的嵌入方式，比如字嵌入，或者golve形式的词向量，这样就可得到多层的句子词向量矩阵。\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082505.png alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> textCNN词的嵌入 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n##### 卷积层\n\n\n\n1. 一个长度为n的句子被视为N个word的拼接(concatenation)，每个word 的embedding有k维，则concat后的句子表示为一个N x k的矩阵，即神经网络的输入\n2. 由于图像是二维（长和宽）三通道(RGB)，而句子是一维的（word按顺序拼接）（可以L通道，即使用L种不同的embedding方法，就可以形成L层输入为N x k的矩阵），因此这里的CNN的filter（卷积核）的大小都为h x k（h为卷积核所围窗口中单词的个数） ，即每个filter扫过的区域是从上往下覆盖到h个word的所有embedding长度\n3. 根据n-gram模型，可选取几个不同大小(h不同的)filter去学习句子的不同的局部特征，得到不同的feature map。\n\n\n\n##### 池化层\n\n在得到每个卷积核的feature map之后，要做一个max-pooling，即max(c)\n\nmax-pooling的用处是：\n 1.使得可以输入不同长度的句子。长度不同的sentence经过这个卷积核后得到的特征都为1维\n 2.能够有效抓取句子的最突出特征。比如一个卷积核是用来检测是否存在not like这样的负面评论，则不论出现该模式出现在句子的哪里，前面还是后面，这个卷积核都能取得很高的卷积值。\n\n当然Pooling会损失句子的order信息，比如最显著的模式出现的位置（句子的前面还是后面），因此又多种基于Pooling的优化：如k-max pooling（保留feature map中K个最大的值）或者dynamic k-max pooling （sentence分为几段，每一段取一个最大值）\n\n##### 全连接及SoftMax分类层\n\n一个句子从输入卷积层，再到最大池化后的数据，拼接成一个向量（一共有多少个feature map，这个向量就有多少维），然后喂入全连接层。比如作13分类，则全链接的输出就是13维的向量\n\n最后接一层全连接的 softmax 层，输出每个类别的概率。\n\n注意：一般之后还会过一个tf.argmax函数过程，就是将向量中最大的概率变那一位为1，其余变成0\n\n##### 卷积网络结构与超参数\n\n| 参数                 | 值                             |\n| -------------------- | ------------------------------ |\n| 嵌入层（词向量）维度 | 200                            |\n| 卷积核尺寸           | h=2,3,4   此外不做填充，步长=1 |\n| 卷积核个数           | 各种尺寸各128个                |\n| dropout_keep_prob    | 0.5                            |\n| batch_size           | 300                            |\n| 预测类别             | 9                              |\n| 学习率               | 0.0001                         |\n| l2正则化系数         | 3                              |\n\n另外还指定了句子截断长度为20，textcnn可以不用要求指定输入句子的长度，但是发现tensorflow运行时会说不指明input的所有维度会分配很多内存，以免溢出，就会占用大量内存，所以指明了。\n\n一个textcnn的参考图\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082506.png alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> textCNN \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp\n\n\n#### 回答生成\n\n知识图谱三元组\u003C实体，关系，实体>或者是\u003C实体，属性，属性值>\n\n前面抽取的“医疗命名实体”就三元组的第一个元素——实体\n\n前面进行的“用户意图识别”则是三元组中的第二个元素——关系\u002F属性\n\n得到三元组的这两个元素就可以用cypher语言在neo4j图数据库中进行查找对应的实体或属性值，然后构建回答返回给用户\n\n```\n    def sql_transfer(self, question_type, entities):\n        if not entities:\n            return []\n\n        # 查询语句\n        sql = []\n        # 查询疾病的原因\n        if question_type == 'disease_cause':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.cause\".format(i) for i in entities]\n\n        # 查询疾病的防御措施\n        elif question_type == 'disease_prevent':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.prevent\".format(i) for i in entities]\n\n        # 查询疾病的持续时间\n        elif question_type == 'disease_lasttime':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.cure_lasttime\".format(i) for i in entities]\n\n        # 查询疾病的治愈概率\n        elif question_type == 'disease_cureprob':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.cured_prob\".format(i) for i in entities]\n\t\t'''\n\t\t...\n\t\t'''\n        return sql\n```\n\n\n\n### 参考资料\n\n[Bidirectional LSTM-CRF Models for Sequence Tagging](\u003Chttps:\u002F\u002Farxiv.org\u002Fpdf\u002F1508.01991v1.pdf>)\n\n[Convolutional Neural Networks for Sentence Classification](\u003Chttps:\u002F\u002Farxiv.org\u002Fpdf\u002F1408.5882.pdf>)\n\n[Understanding Convolutional Neural Networks for NLP](\u003Chttp:\u002F\u002Fwww.wildml.com\u002F2015\u002F11\u002Funderstanding-convolutional-neural-networks-for-nlp\u002F>)\n\n","它确实是保持人类理智的一种奢侈。 ——《流浪地球》中的机器人莫斯\n\n“让人类永远保持理智，确实是一种奢求”，机器人莫斯，《流浪地球》\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002Fshow_talk.gif alt=\"Sample\"  width=\"700\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n\n\n+ [0.项目概况](#项目概况)\n\n+ [1.基础数据爬取](#基础数据爬取)\n\n+ [2.知识图谱搭建](#知识图谱搭建)\n\n+ [3.自动问答实现](#自动问答实现)\n  + [数据准备](#数据准备)\n  + [词向量训练](#词向量训练)\n  + [医疗命名实体识别](#医疗命名实体识别)\n    + [嵌入层](#嵌入层)\n    + [BiLSTM 层](#句子输入到 BiLSTM 层)\n    + [CRF 层](#CRF 层)\n    + [损失函数及反向传播](#损失函数及反向传播)\n    + [网络结构与超参数](#循环网络结构与超参数)\n  + [用户意图识别](#用户意图识别)\n    + [数据嵌入人工特征](#数据嵌入人工特征)\n    + [模型选择](#模型选择)\n    + [嵌入层](#嵌入层)\n    + [卷积层](#卷积层)\n    + [池化层](#池化层)\n    + [全连接及 SoftMax 层](#全连接及 SoftMax 分类层)\n    + [网络结构与超参数](#卷积网络结构与超参数)\n\n+ [参考资料](#参考资料)\n\n\n\n### 项目概况\n\n本项目为一个使用深度学习方法解析问题，知识图谱存储、查询知识点，基于医疗垂直领域的对话系统的后台程序\n\n+ 运行效果：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082601.png alt=\"Sample\"  width=\"700\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n+ 项目的搭建大致分为三个模块：\n  + 基础数据爬取\n  + 知识图谱构建\n  + 自动问答实现\n  \n+ 项目运行环境：\n\npython   : \n\n```\n python 3.6.8\n```\n\n运行系统：\n\n```\nubuntu 16.04 \n```\n\n知识图谱：\n\n```\nneo4j           3.2.2 图形数据库\npy2neo          3.1.1  \t\t\tneo4j 对应的 python 驱动\n```\n\n深度学习：\n\n```\njieba           0.39   \nnumpy           1.17.0 \npandas          0.25.0 \ntensorflow      1.10.0 \n```\n\n文本匹配：\n\n```\nahocorasick    （安装方法 pip install pyahocorasick）\n```\n\n必要说明：\n\n```\n1.深度学习模块深度网络的训练使用 tensorflow 的 gpu 版本，\n  在应用阶段由于要部署要服务器上使用的对应的 tensorflow 的 cpu 版本\n2.若要 clone 项目，尽量保持扩展包的版本一致\n```\n\n+ 项目运行方式\n\n1. 搭建知识图谱：python build_grapy.py。大概几个小时，耐心等待。 \n2. 启动问答系统：python chatbot_graph.py  \n\n+ 项目主要文件目录结构\n\n```shell\nchatbot\n├── answer_search.py                        # 问题查询及返回\n├── BiLSTM_CRF.py                           # 实体识别的双向 LSTM-CRF 网络\n├── build_medicalgraph.py                   # 将结构化 json 数据导入 neo4j\n├── chatbot_graph.py                        # 问答程序脚本\n├── classifyApp.py                          # 问句分类应用脚本\n├── classifyUtils.py                        # 工具函数集合\n├── data\n│   └── medical.json                        # 全科知识数据\n├── data_ai\n│   ├── cbowData                            # 词向量文件\n│   │   ├── classifyDocument.txt.ebd.npy    # 词向量查找表\n│   │   ├── classifyDocument.txt.vab        # 词向量中词与索引对照表\n│   │   ├── document.txt.ebd.npy            \n│   │   └── document.txt.vab\n│   ├── classifyData                        # 问句分类训练数据\n│   │   ├── test_data.txt\n│   │   └── train_data.txt\n│   ├── classifyModel                       # 问句分类模型\n│   │   ├── checkpoint\n│   │   ├── model-3500.data-00000-of-00001\n│   │   ├── model-3500.index\n│   │   └── model-3500.meta\n│   ├── nerData                          \n│   └── nerModel                            # 命名实体识别模型\n├── dict                                    # 实体数据文件\n├── nerApp.py                               # 命名实体识别应用脚本\n├── nerUtils.py                             # 工具函数集合\n├── prepare_data                           \n│   ├── build_data.py                       # 数据库操作脚本\n│   ├── data_spider.py                      # 数据采集脚本\n│   └── max_cut.py                          # 基于词典的最大前向\u002F后向匹配\n├── question_analysis.py                    # 问句类型分类脚本\n├── question_parser.py                      # 回答生成脚本\n└── text_cnn.py                             # 文本分类的 cnn 网络\n```\n\n\n\n### 基础数据爬取\n\n基础数据爬取于 [寻医问药](\u003Chttp:\u002F\u002Fwww.xywy.com\u002F>) 网站，一家医疗信息提供平台，上面的数据做了较好的分类处理，爬下来后可以较为方便的保存为 json 格式的结构化文件，格式展示如下：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002Fjson_show.gif alt=\"Sample\"  width=\"700\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> 爬取的数据保存为 json 格式文件 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n\n### 知识图谱搭建\n\n\n知识图谱可以用若干三元组来表示，三元组的基本形式：\n\n+ 实体 1-关系 - 实体 2\n+ 实体 - 属性 - 属性值\n\n将爬取的数据调用 `build_medicalgraph.py    ` 脚本将结构化 json 数据导入 neo4j 图数据库，部分数据库展示如下：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002Fgraph.svg alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> 图形数据库部分展示 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n知识图谱实体类型\n\n| 实体类型   |   中文含义   | 实体数量 | 举例                                   |\n| :--------- | :----------: | :------: | :------------------------------------- |\n| Check      | 诊断检查项目 |  3,353   | 支气管造影;关节镜检查                  |\n| Department |   医疗科目   |    54    | 整形美容科;烧伤科                      |\n| Disease    |     疾病     |  8,807   | 血栓闭塞性脉管炎;胸降主动脉动脉瘤      |\n| Drug       |     药品     |  3,828   | 京万红痔疮膏;布林佐胺滴眼液            |\n| Food       |     食物     |  4,870   | 番茄冲菜牛肉丸汤;竹笋炖羊肉            |\n| Producer   |   在售药品   |  17,201  | 通药制药青霉素 V 钾片;青阳醋酸地塞米松片 |\n| Symptom    |   疾病症状   |  5,998   | 乳腺组织肥厚;脑实质深部出血            |\n| Total      |     总计     |  44,111  | 约 4.4 万实体量级                        |\n\n知识图谱实体关系类型\n\n| 实体关系类型   |   中文含义   | 关系数量 | 举例                                                 |\n| :------------- | :----------: | :------: | :--------------------------------------------------- |\n| belongs_to     |     属于     |  8,844   | \u003C妇科，属于，妇产科>                                   |\n| common_drug    | 疾病常用药品 |  14,649  | \u003C阳强，常用，甲磺酸酚妥拉明分散片>                     |\n| do_eat         | 疾病宜吃食物 |  22,238  | \u003C胸椎骨折，宜吃，黑鱼>                                 |\n| drugs_of       | 药品在售药品 |  17,315  | \u003C青霉素 V 钾片，在售，通药制药青霉素 V 钾片>               |\n| need_check     | 疾病所需检查 |  39,422  | \u003C单侧肺气肿，所需检查，支气管造影>                     |\n| no_eat         | 疾病忌吃食物 |  22,247  | \u003C唇病，忌吃，杏仁>                                     |\n| recommand_drug | 疾病推荐药品 |  59,467  | \u003C混合痔，推荐用药，京万红痔疮膏>                       |\n| recommand_eat  | 疾病推荐食谱 |  40,221  | \u003C鞘膜积液，推荐食谱，番茄冲菜牛肉丸汤>                 |\n| has_symptom    |   疾病症状   |  5,998   | \u003C早期乳腺癌，疾病症状，乳腺组织肥厚>                   |\n| acompany_with  | 疾病并发疾病 |  12,029  | \u003C下肢交通静脉瓣膜关闭不全，并发疾病，血栓闭塞性脉管炎> |\n| Total          |     总计     | 294,149  | 约 30 万关系量级                                       |\n\n知识图谱属性类型\n\n| 属性类型      |   中文含义   |            举例             |\n| :------------ | :----------: | :-------------------------: |\n| name          |   疾病名称   |       喘息样支气管炎        |\n| desc          |   疾病简介   |    又称哮喘性支气管炎...    |\n| cause         |   疾病病因   |    常见的有合胞病毒等...    |\n| prevent       |   预防措施   | 注意家族与患儿自身过敏史... |\n| cure_lasttime |   治疗周期   |          6-12 个月           |\n| cure_way      |   治疗方式   |   \"药物治疗\",\"支持性治疗\"   |\n| cured_prob    |   治愈概率   |             95%             |\n| easy_get      | 疾病易感人群 |        无特定的人群         |\n\n\n\n### 自动问答实现\n\n自动问答采用深度学习的方法，由于缺少问句训练语料，训练数据来源于自制的问句生成器，然后对问句分词，问句中的每个词进行嵌入，即由词向量组成的问句代替自然语言的问句输入，再进行命名实体识别及实体\u002F问句关系抽取（问句分类），实现对问句的语义解析。\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082501.png alt=\"Sample\"  width=\"600\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> 自动问答实现流程图 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n本仓库为了代码结构清晰，只放了深度学习的模型应用的脚本，词向量及模型训练的脚本会放在另一个代码仓库中。\n\n#### 数据准备\n\n+ 数据冷启动\n\n问句解析部分是用深度学习的方法实现的，那自然需要数据来训练模型。在通常的垂直领域内，由于缺乏系统性地数据积累或合作项目，本项目所用地问句语义解析必须依赖大规模地问句语料，因此设计了一个问句生成器（专业点地叫法为数据冷启动？），就是根据设定好的问句模板将上文爬取到的实体填充到模板的槽当中，同时对问句进行逐词的命名实体标注（BIOES 标注法）及问句类别标注，用于后面的实体抽取及实体\u002F问句关系抽取（问句分类）\n\n命名实体标注标签：\n\n| 实体  | 序号 | 含义          |\n| ----- | ---- | ------------- |\n| O     | 0    | 其它          |\n| B-dis | 1    | 疾病实体开头  |\n| I-dis | 2    | 疾病实体中间  |\n| E-dis | 3    | 疾病实体末尾  |\n| B-sym | 4    | 症状          |\n| I-sym | 5    |               |\n| E-sym | 6    |               |\n| B-dru | 7    | 药品          |\n| I-dru | 8    |               |\n| E-dru | 9    |               |\n| S-dis | 10   | 单个 - 疾病实体 |\n| S-sym | 11   |               |\n| S-dru | 12   |               |\n\n问句类别标注标签\n\n| 类别            | 序号 | 含义               |\n| --------------- | ---- | ------------------ |\n| disease_symptom | 0    | 疾病有哪些症状     |\n| symptom_curway  | 1    | 症状有哪些治疗方法 |\n| symptom_disease | 2    | 症状对应哪些疾病   |\n| disease_drug    | 3    | 疾病需要服用哪些药品 |\n| drug_disease    | 4    | 药品能治疗哪些疾病 |\n| disease_check   | 5    | 疾病需要做哪些检查 |\n| disease_prevent | 6    | 疾病有哪些预防方式 |\n\n+ 数据增强\n\n经过人工构造问句后，针对问句结构类型单一、不够多样的问题进行了数据增强，例如采取了如下措施：句子结构倒装，同义词替换，随机插入标点以引入噪声。\n\n+ 数据类别平衡及 Shuffle\n\n在未进行类别平衡及数据 Shuffle（打乱）时，模型会出现严重过拟合，有时只能预测出一种结果，在测试集上的正确率很低。进行了类别平衡及输入数据打乱之后，预测结果显著改善。\n\n#### 词向量训练\n\n采用词向量模型中的连续词袋模型（Continuous Bag of Words, CBOW）进行词向量的训练。\n\n一些参数：\n\n| 参数名                        | 参数值 |\n| ----------------------------- | ------ |\n| 学习率                        | 0.0001 |\n| 词向量长度（中间\u002F隐藏层维度） | 200    |\n| 上下文 window_size            | 10     |\n| batch_size                    | 300    |\n| 最小词频 min_frq              | 2      |\n\n值得注意的是：\n\n1. 词向量的训练也会有 loss（损失），但是在训练词向量的过程中没有太必要关注其 loss，因为训练词向量一般只是我们想要的中间结果，与我们的最终目的相去甚远。经验是等 loss 稳定之后将词向量先用于后面的任务，看后面任务的实际效果怎么样，若效果不佳再调整参数甚至更换其它词向量模型。\n\n2. 最开始使用的是字向量，但是用于之后的任务效果不佳，会出现 NER（命名实体识别）标注偏差及正确率低的现象。然后使用了词向量，效果提升较大。究其原因可能是词包含的信息更多，对模型的辅助效果更明显。\n\n3. 网上说词向量一般在 `200~300` 维度表示效果较好，字向量在 `100~200` 维度就够了。当语料很小时，词向量维度应调小。实际测试在 10 多 M 的语料大小情况下，词向量维度 50 都能达到可用效果。\n\n#### 医疗命名实体识别\n\n+ 模型训练描述\n\n在知识库问答系统处理过程中，解析问句意图首先需要进行命名实体识别（Named Entity Recognition, NER），正确提取出问句中询问的医疗实体。当前 NER 模型大多采用 LSTM-CRF 模型。基于词的中文 NER，则需要预先对句子进行分词。\n\n##### 嵌入层\n\n最开始我使用的是字向量，但是效果不好，换成了词向量。句子分词后，将每个词查找词向量的 lookup table 获得对应词向量，用词向量替换原句子中的词，形成新的句子作为输入。为保证训练效果，当句子太长时候要截断，句子太短时要填充，本项目使用的 0 填充。\n\n##### BiLSTM 层\n\n然后将规整后的句子输入到双向长短期记忆网络（Bidirectional Long Short-Term Memory, BiLSTM）中，就是句子正向导入 LSTM 网络一次，再把句子反向导入 LSTM 网络一次，经过多次迭代输出 LSTM 网络的两个预测结果（正向，反向），然后将两个预测结果拼接成一个长向量作为下一层的 CRF（条件随机场）层的输入。\n\n具体是怎么拼接的：做 NER 时，前向时候得到的 LSTM 的中间状态输出向量和后向时中间状态输出向量中对应的单词的中间状态拼接，如下图：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082502.png alt=\"Sample\"  width=\"550\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> lstm 中间状态向量拼接作为输出用于 ner \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n\n若用于句子的情感分类则作以下拼接：\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082503.png alt=\"Sample\"  width=\"550\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> lstm 中间状态向量拼接作为输出用于情感分类 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n图片来至 [详解 BiLSTM 及代码实现](\u003Chttps:\u002F\u002Fsegmentfault.com\u002Fp\u002F1210000016830547\u002Fread#top>)\n\ntensorflow 中 tf.nn.dynamic_rnn 函数\n\n```python\noutputs, state = tf.nn.dynamic_rnn(\n    cell,\n    inputs,\n    sequence_length=None,\n    initial_state=None,\n    dtype=None,\n    parallel_iterations=None,\n    swap_memory=False,\n    time_major=False,\n    scope=None\n)\n其中两个返回值：\noutputs: The RNN output Tensor. this will be a Tensor shaped: [batch_size, max_time, cell.output_size].\n\nstate: The final state. If cell.state_size is an int, this will be shaped [batch_size, cell.state_size]. \n```\n\n第一个输出 `outputs` 就是一批数据的中间状态输出的集合（张量）。第二个输出 `state` 就是 LSTM 最后一个状态，它含了一个方向的所有信息。\n\n##### CRF 层\n\nCRF 的 `转移矩阵 A` 由神经网络的 CRF 学习得到，而 `发射概率矩阵 P` 就是由 Bi-LSTM 的输出来作近似模拟。\n\n这样有了（A,P,$\\pi$）就可以调用维特比算法（Viterbi Algorithm）进行解码做预测了。\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082504.png alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> Bi-LSMT+CRF \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n##### 损失函数及反向传播\n\n损失函数用的 tensorflow 的 `crf.crf_log_likelihood`，对数似然函数。\n\n目标函数是的 `-tf.reduce_mean(crf.crf_log_likelihood)`，即对数自然函数的均值的负数，这和逻辑回归（LR）的目标函数一样。\n\n反向传播更新参数，进行下一批数据前向传播训练。\n\n\n\n##### 循环网络结构与超参数\n\na）使用句子分词后词的词向量作为输入，\n\nb）dropout（随机失活）的值调到 0.5，\n\nc）句子的最大长度 sentence_length 调到 30 以下（我使用的 20），\n\nd）句子填充那里使用的 0 填充，\n\ne）语料中实体种类数目做平衡（不出现某个种类严重偏差，否则就回导致预测偏差严重和过拟合），\n\nf）语料标注使用的 BIOES 标注（之前用的 BIO 标注）\n\n训练出来模型的 F1 值可以达到 0.98，\n\n\n\n| 参数名          | 参数值  |\n| --------------- | ------- |\n| lstm 隐藏层维度 | 600     |\n| 学习速率        | 0.00075 |\n| batch_size      | 100     |\n| 句子截断长度    | 25      |\n| 梯度截断        | [-5,5]  |\n| 标签数目        | 13      |\n| 训练时 dropout  | 0.5     |\n| 句子填充        | 0 值填充 |\n| 句子标注方式    | BIOES 法 |\n\n#### 用户意图识别\n\n通过命名实体识别模型正确提取出问句中询问的医疗实体之后，还需要理解用户问句的意图，其意图的具体表现就是医疗实体的关系或属性，即需要进行问句意图和知识库关系的映射。考虑医疗问诊场景的用户问题通常是短文本，因此本项目将用户意图识别设定为短文本分类任务。\n\n##### 数据嵌入人工特征\n\n数据同样用冷启动的方式获得大量数据，然后将在上一轮识别出来的命名实体类别嵌入到句子中，增加句子的区分度。\n\n```\n得了感冒要吃啥药\n嵌入人工特征：\n得了感冒 disease 要吃啥药\n```\n\n##### 模型选择\n\n由 n-gram 语言模型可知，自然语言存在局部特征，卷积神经网络（Convolutional Neural Network, CNN）可用来提取局部特征，如今常被用于表示句子级别的信息和短文本分类任务，结合识别出的医疗实体实现用户问句的意图理解。\n\n短文本有其特点，局部信息可决定句子意图，比如像 `我头疼发烧流鼻涕，这是啥病` 与问句 `这是啥病，我最近发烧流鼻涕头疼` 里面的整体与局部语序换了，但是句子意图没有变，所以短文本适用于 CNN。长文本可用 LSTM，attention（注意力机制），有大量训练语料则 bert（Bidirectional Encoder Representations from Transformers）有优势，需要快速但精确度要求不高可用 fasttext 模型。\n\n##### 嵌入层\n\n将词表示成具有相同长度的词向量，句子就可表示成词向量的矩阵，一个二维的矩阵，这个矩阵可以类比为一张单通道的图片。若图片是 RGB 三通道图片，则在这里，我们的词可以采用不同的嵌入方式，比如字嵌入，或者 glove 形式的词向量，这样就可得到多层的句子词向量矩阵。\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082505.png alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> textCNN 词的嵌入 \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n##### 卷积层\n\n\n\n1. 一个长度为 n 的句子被视为 N 个 word 的拼接（concatenation），每个 word 的 embedding 有 k 维，则 concat 后的句子表示为一个 N x k 的矩阵，即神经网络的输入。\n2. 由于图像是二维（长和宽）三通道 (RGB)，而句子是一维的（word 按顺序拼接）（可以 L 通道，即使用 L 种不同的 embedding 方法，就可以形成 L 层输入为 N x k 的矩阵），因此这里的 CNN 的 filter（卷积核）的大小都为 h x k（h 为卷积核所围窗口中单词的个数），即每个 filter 扫过的区域是从上往下覆盖到 h 个 word 的所有 embedding 长度。\n3. 根据 n-gram 模型，可选取几个不同大小 (h 不同的) filter 去学习句子的不同的局部特征，得到不同的 feature map（特征图）。\n\n\n\n##### 池化层\n\n在得到每个卷积核的 feature map 之后，要做一个 max-pooling（最大池化），即 max(c)。\n\nmax-pooling 的用处是：\n 1.使得可以输入不同长度的句子。长度不同的 sentence 经过这个卷积核后得到的特征都为 1 维。\n 2.能够有效抓取句子的最突出特征。比如一个卷积核是用来检测是否存在 not like 这样的负面评论，则不论出现该模式出现在句子的哪里，前面还是后面，这个卷积核都能取得很高的卷积值。\n\n当然 Pooling 会损失句子的 order 信息，比如最显著的模式出现的位置（句子的前面还是后面），因此有多种基于 Pooling 的优化：如 k-max pooling（保留 feature map 中 K 个最大的值）或者 dynamic k-max pooling（sentence 分为几段，每一段取一个最大值）。\n\n##### 全连接及 SoftMax 分类层\n\n一个句子从输入卷积层，再到最大池化后的数据，拼接成一个向量（一共有多少个 feature map，这个向量就有多少维），然后喂入全连接层。比如作 13 分类，则全链接的输出就是 13 维的向量。\n\n最后接一层全连接的 softmax 层，输出每个类别的概率。\n\n注意：一般之后还会过一个 tf.argmax 函数过程，就是将向量中最大的概率变那一位为 1，其余变成 0。\n\n##### 卷积网络结构与超参数\n\n| 参数                 | 值                             |\n| -------------------- | ------------------------------ |\n| 嵌入层（词向量）维度 | 200                            |\n| 卷积核尺寸           | h=2,3,4   此外不做填充，步长=1 |\n| 卷积核个数           | 各种尺寸各 128 个                |\n| dropout_keep_prob    | 0.5                            |\n| batch_size           | 300                            |\n| 预测类别             | 9                              |\n| 学习率               | 0.0001                         |\n| l2 正则化系数         | 3                              |\n\n另外还指定了句子截断长度为 20，textcnn 可以不用要求指定输入句子的长度，但是发现 tensorflow 运行时会说不指明 input 的所有维度会分配很多内存，以免溢出，就会占用大量内存，所以指明了。\n\n一个 textcnn 的参考图\n\n\u003Cp align=\"center\">\n\t\u003Cimg src=.\u002Fpictures\u002F082506.png alt=\"Sample\"  width=\"800\">\n\t\u003Cp align=\"center\">\n\t\t\u003Cem> textCNN \u003C\u002Fem>\n\t\u003C\u002Fp>\n\u003C\u002Fp>\n\n\n#### 回答生成\n\n知识图谱三元组 `\u003C实体，关系，实体>` 或者是 `\u003C实体，属性，属性值>`。\n\n前面抽取的“医疗命名实体”就三元组的第一个元素——实体。\n\n前面进行的“用户意图识别”则是三元组中的第二个元素——关系\u002F属性。\n\n得到三元组的这两个元素就可以用 cypher 语言在 neo4j 图数据库中进行查找对应的实体或属性值，然后构建回答返回给用户。\n\n```\n    def sql_transfer(self, question_type, entities):\n        if not entities:\n            return []\n\n        # 查询语句\n        sql = []\n        # 查询疾病的原因\n        if question_type == 'disease_cause':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.cause\".format(i) for i in entities]\n```\n\n# 查询疾病的防御措施\n        elif question_type == 'disease_prevent':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.prevent\".format(i) for i in entities]\n\n        # 查询疾病的持续时间\n        elif question_type == 'disease_lasttime':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.cure_lasttime\".format(i) for i in entities]\n\n        # 查询疾病的治愈概率\n        elif question_type == 'disease_cureprob':\n            sql = [\"MATCH (m:Disease) where m.name = '{0}' return m.name, m.cured_prob\".format(i) for i in entities]\n\t\t'''\n\t\t...\n\t\t'''\n        return sql\n```\n\n\n\n\n\n### 参考资料\n\n[用于序列标注的双向 LSTM-CRF 模型](\u003Chttps:\u002F\u002Farxiv.org\u002Fpdf\u002F1508.01991v1.pdf>)\n\n[用于句子分类的卷积神经网络](\u003Chttps:\u002F\u002Farxiv.org\u002Fpdf\u002F1408.5882.pdf>)\n\n[理解用于自然语言处理的卷积神经网络](\u003Chttp:\u002F\u002Fwww.wildml.com\u002F2015\u002F11\u002Funderstanding-convolutional-neural-networks-for-nlp\u002F>)","# chatbot-base-on-Knowledge-Graph 快速上手指南\n\n本项目是一个基于深度学习方法解析问题，利用知识图谱存储和查询知识点，面向医疗垂直领域的对话系统后台程序。\n\n## 环境准备\n\n请确保您的开发环境满足以下要求，以保证兼容性和稳定性：\n\n*   **操作系统**: Ubuntu 16.04 (推荐)\n*   **Python 版本**: 3.6.8\n*   **图数据库**: Neo4j 3.2.2\n*   **深度学习框架**: TensorFlow 1.10.0 (训练建议使用 GPU 版，部署建议使用 CPU 版)\n*   **其他依赖**:\n    *   `jieba` 0.39\n    *   `numpy` 1.17.0\n    *   `pandas` 0.25.0\n    *   `py2neo` 3.1.1\n    *   `pyahocorasick`\n\n> **注意**：克隆项目后，建议尽量保持扩展包版本与上述一致。\n\n## 安装步骤\n\n### 1. 安装 Python 依赖库\n\n在项目根目录下，根据需求安装必要的 Python 包：\n\n```bash\npip install jieba==0.39 numpy==1.17.0 pandas==0.25.0 tensorflow==1.10.0 py2neo==3.1.1\npip install pyahocorasick\n```\n\n### 2. 配置 Neo4j 数据库\n\n确保 Neo4j 服务已安装并启动。默认端口通常为 7474。\n\n```bash\n# 示例：启动 Neo4j 服务\nsudo systemctl start neo4j\n```\n\n### 3. 准备数据文件\n\n项目需要医疗结构化数据。如果未进行数据爬取，请确保 `data\u002Fmedical.json` 文件存在。\n若需自行爬取数据，可参考项目中的 `prepare_data\u002Fdata_spider.py` 脚本。\n\n## 基本使用\n\n项目主要包含两个核心运行步骤：构建知识图谱和启动问答系统。\n\n### 1. 搭建知识图谱\n\n将结构化的 JSON 数据导入 Neo4j 图数据库。此过程可能需要数小时，请耐心等待。\n\n```bash\npython build_medicalgraph.py\n```\n\n> **提示**：如果目录中存在 `build_grapy.py`，请使用该脚本；否则使用 `build_medicalgraph.py`。\n\n### 2. 启动问答系统\n\n图谱构建完成后，即可启动聊天机器人服务。\n\n```bash\npython chatbot_graph.py\n```\n\n启动后，系统将进入自动问答模式，支持通过自然语言查询疾病、药品、症状等医疗信息。\n\n### 3. 目录结构说明\n\n*   `data\u002Fmedical.json`: 全科知识数据源\n*   `data_ai\u002F`: 存放词向量、训练数据及预训练模型\n*   `answer_search.py`: 问题查询及返回逻辑\n*   `chatbot_graph.py`: 问答程序主入口\n*   `BiLSTM_CRF.py`: 实体识别网络模型","某三甲医院信息科计划开发智能导诊机器人，旨在解决患者在线咨询量大且专业性问题突出的难题。\n\n### 没有 chatbot-base-on-Knowledge-Graph 时\n- 依赖人工整理 FAQ 文档，面对海量疾病咨询难以覆盖所有变种问法，响应效率低下。\n- 传统搜索引擎无法识别“左下腹疼痛可能是什么病”中的医学实体含义，匹配结果杂乱。\n- 科室与疾病关系分散在多个系统中，缺乏统一的知识关联，导致推荐科室不准确。\n- 系统无法理解用户意图，常将挂号咨询误判为普通信息查询，增加人工客服负担。\n\n### 使用 chatbot-base-on-Knowledge-Graph 后\n- 利用 BiLSTM-CRF 模型精准提取疾病名称与检查项目，实现语义级问题解析，回答更精准。\n- 基于 Neo4j 构建医疗知识图谱，自动关联症状、科室与治疗方案，回答逻辑严密且可追溯。\n- 文本 CNN 分类器准确识别挂号、问诊等意图，引导用户进入正确服务流程，提升体验。\n- 爬取的寻医问药结构化数据直接入库，大幅降低知识库维护成本与更新时间，支持持续迭代。\n\nchatbot-base-on-Knowledge-Graph 通过深度学习与知识图谱结合，实现了医疗垂直领域问答的自动化与专业化。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbaiyang2464_chatbot-base-on-Knowledge-Graph_770ec31f.png","baiyang2464","Mr.Young","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fbaiyang2464_d5a91e88.png",null,"pku","https:\u002F\u002Fgithub.com\u002Fbaiyang2464",[82],{"name":83,"color":84,"percentage":85},"Python","#3572A5",100,790,210,"2026-03-20T03:22:23","Linux","训练需 GPU，部署可用 CPU，具体型号\u002F显存\u002FCUDA 版本未说明","未说明",{"notes":93,"python":94,"dependencies":95},"1. 深度学习模块训练使用 TensorFlow GPU 版本，应用部署阶段使用 CPU 版本。\n2. 克隆项目时尽量保持扩展包的版本一致。\n3. 知识图谱基于 Neo4j 图数据库。\n4. 基础数据爬取自寻医问药网站。","3.6.8",[96,97,98,99,100,101,102],"neo4j==3.2.2","py2neo==3.1.1","jieba==0.39","numpy==1.17.0","pandas==0.25.0","tensorflow==1.10.0","pyahocorasick",[15],"2026-03-27T02:49:30.150509","2026-04-06T05:32:19.842447",[107,112],{"id":108,"question_zh":109,"answer_zh":110,"source_url":111},3441,"如何获取项目的词向量及模型训练脚本？","根据 Issue 内容，作者表示项目具有商业价值，愿意有偿出售剩余代码。目前仓库未公开提供直接下载链接，建议通过 Issue 中提供的邮箱（1320286922@qq.com）联系作者咨询购买事宜。","https:\u002F\u002Fgithub.com\u002Fbaiyang2464\u002Fchatbot-base-on-Knowledge-Graph\u002Fissues\u002F24",{"id":113,"question_zh":114,"answer_zh":115,"source_url":116},3442,"哪里可以找到模型训练代码和问句扩增方法的源码？","该问题涉及模型深入研究的源码需求。由于 Issue 中暂无维护者的公开回复，且核心训练逻辑可能未完全开源，建议通过 Issue 中提供的邮箱（38758333@qq.com）与作者沟通，或关注项目后续是否发布相关资源。","https:\u002F\u002Fgithub.com\u002Fbaiyang2464\u002Fchatbot-base-on-Knowledge-Graph\u002Fissues\u002F17",[]]