{"id":13713471,"url":"https://github.com/TsingJyujing/BlackHeartHospitalClassifier","last_synced_at":"2025-05-06T23:32:13.514Z","repository":{"id":94637699,"uuid":"158243106","full_name":"TsingJyujing/BlackHeartHospitalClassifier","owner":"TsingJyujing","description":"莆田系医院名称分类器","archived":false,"fork":false,"pushed_at":"2018-11-19T16:34:10.000Z","size":3382,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-14T00:33:55.259Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TsingJyujing.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-19T15:04:56.000Z","updated_at":"2024-08-13T13:11:34.000Z","dependencies_parsed_at":"2023-03-12T03:45:15.816Z","dependency_job_id":null,"html_url":"https://github.com/TsingJyujing/BlackHeartHospitalClassifier","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TsingJyujing%2FBlackHeartHospitalClassifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TsingJyujing%2FBlackHeartHospitalClassifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TsingJyujing%2FBlackHeartHospitalClassifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TsingJyujing%2FBlackHeartHospitalClassifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TsingJyujing","download_url":"https://codeload.github.com/TsingJyujing/BlackHeartHospitalClassifier/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252787531,"owners_count":21804277,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T23:01:37.196Z","updated_at":"2025-05-06T23:32:11.724Z","avatar_url":"https://github.com/TsingJyujing.png","language":"Jupyter Notebook","funding_links":[],"categories":["Jupyter Notebook"],"sub_categories":[],"readme":"# 东云研究所——如何利用机器学习鉴别莆田系医院名称\n\n## 简介\n\n自从百度魏则西事件以后，我持续在关注我身边的医院，我发现莆田系的医院大多是有命名的特征的（承包科室的那种真的不能识别了）。\n\n我随便给出几个“很莆田”的名字：\n\n“XX玛利亚女子医院”\n“XX女子医院”\n“XX男科医院”\n“XX肛肠医院”\n“XX阳光医院”\n\n前几天我和同事在车上说起这个事情，同事纷纷给出了自己鉴别一些莆田系医院的经验，例如莆田系特别喜欢找“武警医院”下手。\n我们可以看出，莆田系医院是有一定特征的，光靠医院列表我们无法鉴别如雨后春笋新开的莆田系医院，一个人的经验是有限的，我们如何鉴别这些黑心医院呢？\n\n没错！这次的主题还是 Machine Learning 大法好。\n\n但是我并不是一开始就决定要用 Machine Learning 的，最早打算使用词表来做，但是考虑到中国地方太大，医院有一万多个，整理出来的莆田系医院也有一千多个，辛辛苦苦整理关键字绝对不是我的Style。\n\n## RNN\n\n对于短句分类，直觉里首选的肯定是RNN（LSTM也算）啦～毕竟算是一个序列的问题。我们通过构建OneHot编码构建向量，随后送入RNN进行训练，每一个字即运行一个Step，直到最后输出结果再进行反馈。属于多输入单输出的问题。\n\n## RNN的问题\n\n刚开始的时候，打算使用 Pytorch（其实我还写过一个[Java版的LSTM](https://github.com/TsingJyujing/java_rnn)）。\n结果偷懒了就直接去抄官方的代码，正好Pytorch的代码里有这个么一个教程：\n[CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN](https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html)\n\n但是这个教程和真实情况略有写不同，需要针对本问题做一些优化：\n\n1. 中文的Charset和英文不一样，中文常用字有6k个，如果组词的话就更多了。之前考虑用字嵌入（其实就是用词嵌的方法处理单字中文语料）。\n    - 但是本案例样本量太小，使用其他语料训练不一定能学出这些字在这个语境下的关系\n2. 例子里没有划分训练测试集合，没有做Early Stopping，容易过拟合\n    - 但是由于英文字母数量少，所以原来的教程不容易过拟合\n\n上了个厕所洗了个澡（这就思考整整两遍人生了），认为RNN有一个更严重的问题：可解释性不好，难以将学习到的东西重新整理为人类能用的经验，所以大家每次要鉴别医院都要打开我的页面。\n\n## Sparse Logistic Regression\n\n我们考虑将分词后所有的词语收集起来，然后使用OneHot编码，这个时候我们得到了一个稀疏向量，多个样本构成稀疏矩阵，使用林老师的liblinear就可以学习啦～（当然最后图省事用的sklearn调liblinear）。\n\n其实中途还尝试过使用SVD先对数据进行一个降维操作，但是实际效果很不好。和之前不用词嵌的理由一样：**在有监督的数据前面，做一层无监督的降维，绝壁是会降低精度的行为，Absofuckinglutely。**\n\n### 预处理\n不需要预处理，因为数据本身已经被Normalize了。这里也不需要过采样，因为我们在训练的时候设置了权重。\n\n### 结果评价\n\n结果评价的一般方法我写在了这里：[机器学习中结果评估与模型解释](https://zhuanlan.zhihu.com/p/40718648)（其实这篇才是我在工作中呕心沥血总结出来的干货，不过居然没人看，难道大家都去看xhamster了吗？伤心……）\n\n### 可解释性\n想要可解释，我们就必需在人脑内能建立一个简单的模型，幸运的是，(Sparse) Logisic Regression 很好理解，如果不能理解的，可以去看我以前的一些文章：\n\n- [Logistic回归的CPU并行化及其 Batch Gradient Ascent 的实现 (这篇有原理)](https://zhuanlan.zhihu.com/p/20511129)\n- [如何使用Logistic回归做非线性分类](https://zhuanlan.zhihu.com/p/20545718)\n- [瞎玩儿系列 使用SQL实现Logistic回归](https://zhuanlan.zhihu.com/p/26739934)\n- [补上之前被和谐的坑](https://zhuanlan.zhihu.com/p/25764539)\n    - 这篇是实战篇\n    - 实际上是：[很污的机器学习：从xhamster网站找到喜欢的片子](http://www.cnblogs.com/TsingJyujing/p/6549780.html)\n\n我们只需要找出参数最大或者最小的几项就可以了鸭～\n让我们看看你们都应该注意哪些关键词呢？\n\n存在这些关键词的，你们避而远之：\n```python\n['慧慈', '凉山', '玛莉亚', '爱德华', '济南', '阳光', '国丹', '九州', '天骄', '莆田', '江南', '青羊区', '南亚', '妇科', '中骏']\n```\n当然，地名是不需要你们关心的，那么还剩下：\n```python\n['慧慈', '玛莉亚', '爱德华', '阳光', '国丹', '九州', '天骄', '莆田', '江南', '南亚', '妇科', '中骏']\n```\n是不是满满的莆田感？\n\n同样的操作之后我们也可以得到让人放心的关键字：\n\n```python\n['264', '中国人民武装警察部队', '钢铁', '中国人民解放军', '分院', '协合', '护理', '铁路分局', '医学院', '职工', '乳房', '地段', '妇幼保健']\n```\n\n### 改进\n对句子的分析应该做更深入的定制化，医院的名称都有一定的格式，例如`XX省XX市（当然地名一般是不关注的）XX大学附属医院XX分院`之类的，通过对句子更加细致的分析，我们可以得到一个K维矢量（这个K很小），决定K大小是对句子的细分程度，例如是否是大学附属？哪个大学？是否是分院？名称是否有某个科室的名字（如肿瘤，骨科）？科室名字是什么？\n\n因为效果还行，而且仅仅是通过名字判别也不需要特别准确，这个觉得有疑惑的时候，上一下百度，有推广的医院基本都有点问题。再用查询工商信息的软件查一下就可以判断的七七八八了。\n\n因为有的莆田系医院就是正常医院的科室被承包以后形成的，莆田系医院是一个社会问题，仅仅凭借名字是无法百分百判断的。\n如果名称的秘密被大家接受，莆田系医院只会开的更加隐蔽，更加险恶。\n\n## 页面化\n\n最后我做了个小工具，挂在了东云研究所的子域名下，页面做的很丑，但是可以玩一下，前后端分离，大家也可以调用我的接口，在服务器给你们玩挂之前我不会限流。\n\n访问：[http://hospital-classifier.shinonomelab.com](http://hospital-classifier.shinonomelab.com) 来利用小工具，或者调用API接口。\n\n接口地址：`http://hospital-classifier.shinonomelab.com/api/classifier/?name=医院名称`\n\n返回结果说明：\n\n```js\n{\n  \"status\": \"success\",// success: 正常识别了 fail：识别过程出现错误\n  \"result\": true,// true：正常医院 false：不正常医院\n  \"input\": \"江阴市人民医院\" //输入内容的回显\n}\n```\n\n## 讨论与改进\n\n其实我读了好多论文，但是很多方法并不适用于本问题，有的是因为数据量不够大，有的是因为问题种类不对。\n\n总结下来，有可能的改进我写在下面：\n\n- 尚未对“这个名称不是医院”这一情况进行学习\n- 使用医疗新闻进行词嵌以后取词向量进行学习\n- 针对医院名称做专门的句法分析\n- 使用接口获取百度推广相关信息\n- 使用接口获取股东信息和诉讼信息\n\n如果你有什么想法，请在评论区提出，也欢迎私下联系我讨论：[TsingJyujing/Resume#basic-info](https://github.com/TsingJyujing/Resume#basic-info)。\n\n## 附录\n\n### 数据来源\n- [莆田系医院名单](https://github.com/shenwei356/BlackheartedHospital)\n- [全国医院列表](http://www.a-hospital.com/w/%E5%85%A8%E5%9B%BD%E5%8C%BB%E9%99%A2%E5%88%97%E8%A1%A8)\n\n### 部分参考文献、资料\n\n（有些看了，但是没留链接……就不一一列出了）\n\n- [CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN](https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html)\n- [Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks](https://arxiv.org/abs/1503.00075)\n- [word2vec Explained: deriving Mikolov et al.'s negative-sampling word-embedding method](https://arxiv.org/abs/1402.3722)\n- [The Unreasonable Effectiveness of Recurrent Neural Networks](http://karpathy.github.io/2015/05/21/rnn-effectiveness/)\n- [Understanding LSTM Networks](http://colah.github.io/posts/2015-08-Understanding-LSTMs/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTsingJyujing%2FBlackHeartHospitalClassifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FTsingJyujing%2FBlackHeartHospitalClassifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTsingJyujing%2FBlackHeartHospitalClassifier/lists"}