我回来了

Published on Nov 12, 2015

看病与思考

昨日,很遗憾听说一个朋友的兄弟在出车祸之后一个月后,终于还是走了。生死去来,棚头傀儡,一线断时,落落磊磊。

前几个月,我也很难过,一度不知道面对的是什么。我想说说看病的经历。

症状是头疼,疼得特别厉害,晚上睡不着、或者睡着了半夜疼醒。眼眶下边,有时候太阳穴上头,耳朵旁边都会疼。

总共去北邮社区医院耳鼻喉、口腔,北医三院耳鼻喉、神经内科(头疼专科),某市中心医院耳鼻喉科、神经内科、眼科,北京协和医院神经内科、耳鼻喉科、口腔科,一直到最后把牙拔掉,终于头疼停歇了。

我想重点说说感受

  1. 医生的经验往往是领域内,有更好的判断力。比如神经内科的专家告诉我,你这个比较奇怪,一般我们只考虑头部而不是面部的疼痛。而且头疼的原因很复杂,百分之八十根本找不出原因。再比如耳鼻喉的专家告诉我,你这个鼻窦囊肿根本没什么事,建议去神经科检查。再比如头疼专科专家做了一系列排除后让我复查鼻窦CT,如果发现问题还是去耳鼻喉。比如我怀疑牙齿或周边问题,可是非口腔科医生一个没看出问题,还有似乎没看清还带手套摸了下说没问题的社区医院口腔科医生。
  2. 症状关联还是要靠自己。要清晰记录、准确描述自身症状。我一路看下去,各科医生也不能确保问题在哪里,倒是自己去问,会不会因为牙齿的问题造成的囊肿,要不要还看下口腔科。后来发现疼痛发作时间和牙疼的规律有些相像,另外就是有时候刷牙或者漱口会造成头猛地一疼。后来一天刷四次牙竟然不怎么疼了更让我怀疑。。。
  3. 看病不容易,挂号难,等了一周可能就看那么一会儿。检查有可能也要预约,做完检查还要等取结果。等啊等。。。

反馈

在北京看病是一个很长的周期,特别是疾病很难在某个领域内精确诊断时,往往都是在各大医院辗转求医。去协和头疼专科的时候,一个阿姨给我展示她的病历,厚厚的一本上写满了在各大医院的辗转的诊断、治疗信息。时间跨度长达数年,病情反反复复,原因则不明。一方面,零散在各地的医院积累了大量的诊断信息、治疗信息。另一方面,医生一般很难收到门诊病人的反馈。

好在有很多医生在病房。然而,反馈真是个很重要的东西。可惜我最后去拔了牙,之前的所有的医生都不会得到反馈这个症状可能和牙有关系,估计他们忙碌接待了成百上千各式各样的人,也不会记得某些-–—特例吧。

反馈很重要。北医三院神经科专家李坚当时对我的症状把边边角角都想了想,最后推荐去宣武医院一位医生那里看看去排除下极度罕见的特例。因为他的一位患者曾经给过他反馈,他印象比较深刻。

我校医院口腔科医生现在都不知道我智齿蛀牙这么厉害,但我也不可能跑回去跟她说当时你没看清、也没摸出来,智齿其实缺了一块。。。

我想,也许只是个美好的远景,商业大数据不应该仅仅应用到娱乐和消费之上,更多的应该能服务于我们生活的基础、生活的方方面面。希望互联网能促进传统医疗行业的数字化和高度整合,基于数据驱动开创新的医疗模式。这对参与者是商机,也是降低整个医疗成本的关键。

目前就自己搜集资料和使用的体验上来看,好大夫是首屈一指的高质量医患交流平台、春雨医生也还不错,可能主要移动端的不怎么能靠搜索引擎检索到,但响应速度挺快。 丁香园平台内容据说很优质,可惜搜索引擎也检索不到相关信息,需要注册登录。

愿景

个人希望将来的医疗信息平台是:

  1. 基本开放的。可以通过搜索引擎高效检索,而不是在信息上设置层层权限和障碍。这一点,非常喜欢好大夫,有些权限控制来保护患者隐私,但其他信息一般不会不可见。医生有时候也会发些不错的科普文哈哈。
  2. 高质量的。有专业的医生和认真对待自己病情的患者。有热衷分享和共同创造价值的开放社区。社区对品质和贡献有追求。有些网站的质量简直不忍直视,一看都是复制粘贴。
  3. 数据驱动的。不知道该不该寄希望于那些赚得钵满盆满,牛逼吹得天花乱坠,在推动娱乐文化和消费狂潮上无所不用其及的互联网企业们。商机和风险必然是相伴而生,目前看,医疗相关的互联网企业似乎还是需要偏运营更多才能勉强生存。O2O才是各个企业的重点。行业达到了一定的原始数据和资金积累之后,应该会有更多技术上追寻进步的力量去改善整个医疗行业的未来吧。

关联分析

当时,头疼找不出原因的时候。开始记录疼痛和生活点滴做关联。事实上,源于早前在Eloquent Javascript中的有趣例子。

之后,一直想做这些吧,一是一直对关联挖掘算法、NLP、机器学习的东西念念不忘。总觉得可以做点什么,能让疾病诊断这方面有点突破和改变。

可是,我个人的数据量小。这时候就发现好大夫这个网站用来做数据源是可能的。有次和周老板(话说,周老板他们和丁香园那边的冯某某都认识。。。)讨论百度口碑和淘宝大家印象的实现时,开始考虑来对医生、患者提问信息条目等等里头做主题分类一类的事情。大概想了下相关技术。

数据获取

  1. 数据的获取。爬虫自不用说,一般没有写不出的爬虫。基本上、Python和Nodejs都写过,觉得Python工具栈更全面成熟。效率我会考虑twisted而不是gevent,那个内存占用太吓人。
  2. 数据的清理。这是体力活。

NLP

自然语言处理、主题模型等等。常用算法、模块基本都没问题。最最关键的是、做中文的时候, 特别是特定领域中文自然语言处理的时候,如果想在效率上提升、词典很重要。我大概看了下Matrix67当年关于分词发现的那篇博客,又对照了下某人的新词发现硕士论文。看了看HanLP和jieba分词的原理,瞄了瞄HMM和CRF分词的思想。最后自己实现了下Matrix67的算法玩(你敢信是用nodejs,结果后来RedHat的Bruno问,What do you do with Nodjs? 我说。。。String Manipulation…)。

另一方面,写的时候发现自己应该在NLP理论上学习更多,于是看了看NLTK book,没想到,因为前一阵刚看完Mozilla Hacks的ES6: In Depth系列每次看到它介绍什么,我都想了想NLTK怎么实现的,在javascript中依托ES6该怎么实现。于是把他的FreqDist类在ES6中实现了,终于最后掉到Wordnet这个大坑里。。。开始在js上试图实现NLTK Wordnet Corpus Reader这种东西。顺便说下,写个稍微大点的东西才发现Python真是好啊真是好。所以RedHat的Bruno问,What do you do with Nodjs? 我说。。。String Manipulation我觉得再合适不过了)。

自己实现终究是玩,关键是知道有一票可用的比较高质量的NLP实现。python的有NLTK和果壳某位的snowNLP还有jieba,nodejs有NaturalNode,java啊go啊C++啊啥都有一大堆分词或者新词发现的东西。

一些不错的参考资料如下:

  • 互联网时代的社会语言学:基于SNS的文本数据挖掘(虽然我觉得某个论文讲的更丰富,但论文这种东西,不接地气)
  • 浅谈中文分词
  • Hankcs的各种文章(他的机器学习数据挖掘笔记也值得一看)

后来看NLTK了解了下Wordnet这种东西,额,有空再说吧,简单来说就是词、语义、近义词之间的复杂关系网络。

可是wordnet是英文词汇的,中文的质量、近义词语关联都是问题。

结合之前对淘宝大家印象的考虑。看到淘宝对每种标签印象还在评论中标明了相关语句。就简单思考了下怎么通过爬虫获取某宝的近义词/和对应句子数据,打开网络控制台看了看。然而并不知道我能拿来有什么用,做分词之后的tokenize?

反正,好奇心驱使着瞎看了很多也想了很多。真正做的精力却有限的只有未完成的英文Wordnet Corpus Reader、和Matrix67的算法对西游记和鲁迅全集并不觉得效果很好的分词算法实现。

对了,差点忘了NLTK这本书还在继续看,可是Wordnet Corpus Reader不做完我估计是看不下去了。。。感谢丁总还给我发了个电子版能在kindle上看= =

由于贵邮日了狗的毕业设计,对bag of n-gram算法,TFIDF以及如何利用Scikit Learn训练和交叉验证算是熟悉了。

最后,词语的获取,输入法的各种细胞词库、搜索引擎的热搜往往带来的新词啥的

可视化

数据来了之后,就是可视化的问题。WordNet之后就想可视化出来,准备用D3,在看NaturalNode的讨论时看到D3已经拆分,准备之后就看看这个数据驱动的。。。嗯。

算了,都只是设想。我就随便说说,你就随便听听。如能有半点波澜,也没有白花这么久写这么多。

I'm back|致谢

一方面,蛀牙拔掉之后头再没疼过,另一方面,校招早早地就如火如荼。校招走的三心二意。

结果是很多没打算过的阴差阳错有缘无分哈哈。截至现在,没有offer,却觉得这状态不好也好。

感谢这期间,关注过我,为我操心过的:

  • TomSawyer和内推阿里前端的Li Dongmeng师兄
  • Armsword和领英中国内推我的Zhou Tong师兄
  • 我的腾讯一面面试官Wu Lijian
  • 给了波Microsoft的内推的Chon,好吧,我做了二十分钟笔试就去游泳了。
  • 愿意为我推某安全创业公司的天枢Teacher G
  • 直接向某互联网金融公司HRD推荐我的周老板,虽然因为实习问题就没有然后了。。。
  • 还有sbilly大大
  • 来自美团的碧水中的扯旗鱼
  • 帮朋友内推头条的qiukun大神
  • 帮朋友内推搜狗的lkasdolka
  • 复试没去还打电话联系我又给硬安插了一次面试的的Tencent HR zyy

我故不才,辜负了大家的期望= =,一直犹犹豫豫。

最近投了个Redhat的前端简历,虽然。。。Redhat根本不招前端基本都是java和kernel为主。。。但怎么说,真是一家和开源紧密联系的企业,我就参加了这一场宣讲,全都是讲开源去了。而且自从从greathaul那里听说了远程工作这个东西,其实,还是很有倾向。听到Fang Yue说到他一般在家工作眼睛感觉一亮

再看吧,感谢Bruno的关注和Jim Ma和Zhang Cheng的指教。还有组织Redhat活动的Charlie?和联系的HR们。在Redhat的工作,看上去真是很有挑战。嗯,不管怎样,我前所未有的觉得java大法好。

我一度觉得,自己干了太多没有意义的事情,时光如梭、岁月流逝,身边的人都承担起了自己的生活和他人的未来,我还是无所作为也没做啥有价值的事。

后来,看到douban.fm中的某个文件

看到国内 Python 职位分析

看到scipy lecture notes的贡献者名单中竟然有我。。。

偶然看到一个光学python库,简直是我还在学光学时梦寐以求的东西。没想到作者竟然是贵邮的,更没想到作者竟然说看过我的网站上的相位去包裹的两篇文章。虽然已然不知道是什么了。

等等。

我想吧,也好吧。就像当年受到那些对开源非常友好又充满热情的Linux用户,可能我都不记得他们是谁了,他们甚至只是记录了简单的甚至错误的东西。但他们的文章、笔记、天真烂漫的态度和热情则深深感染我并驱使和决定了我今后的人生轨迹。希望自己头晕脑胀记下的絮絮叨叨的只言片语,某些热情、坚韧和情怀,能播下哪怕一点点思维模因的种子。也许哪一天,我们所梦中的世界就真的在人间降临吧。

天空不曾留下痕迹,但我已飞过。就算再也不能飞。

我想说,别忘记在评论或者邮件给你赞许的人以反馈,人生短暂,珍惜每个有缘的人。

好多曾经关注的博客、人,渐渐消失在视野之中,愿他们从未走远,过去,现在,未来。

从Jekyll迁移到Hexo

从jekyll迁移到了hexo。

其实不想迁移,我不想打破很多现有的东西。

jekyll要求ruby版本高于2.1. Ubuntu源里只到2.0。但我的笔记本散热不好,两次用rvm编译Ruby cpu过热直接灭了之后,还是用熟悉的node吧。话说,为了解决过热这种问题我把cpufrequtils和cpulimit都用上了。

迁移碰到了几个问题:

  1. permalink不一致,以及空字符串slug
  2. 语法高亮修改
  3. 特殊字符escape
  4. textile文件

一致的url结构和文件命名方式

以前,我用jeykll时,每个文件名字如下:

2012-11-19-this-is-a-post.md

对应的url为

http://reverland.org/2012/11/19/this-is-a-post/

或者可以是

http://reverland.org/2012/11/19/this-is-a-post
http://reverland.org/2012/11/19/this-is-a-post/index.html

首先,要把hexo也改成这样的,在=config.yml=中:

new_post_name: :year-:month-:day-:title.md # File name of new posts
permalink: :category/:year/:month/:day/:title/

但,还是有问题,具体可以参照我提的issue,hexo如果看你的文件名是这样:

2014-06-12-.md

会生成这样的url

2015/11/13/2014-06-12

显然这不是我们想要的。

我们通过将=nodemodules/hexo-util/lib/permalink.js=第28行由

return '(.+?)';

更改为

return '(.*?)';

可以实现以前的jekyll风格。

语法高亮修改

jekyll中,除了我用四个空格作为编码块区域缩进设定,还广泛使用了下面的代码来高亮。

{% highlight python %}
def sum(a, b):
    return a + b;
{% endhighlight %}

{% highlight cl%}
(cdr,
  (add,
    1, 1))
{% endhighlight %}

另外,我的每个文件里还有些jekyll特定命令来加入统计和评论什么的。(按理说不应该,当初从skydark那里就全盘接下来了。。。)

{% include JB/setup %}

这样转换掉

sed -i 's/{%[[:space:]]highlight[[:space:]]\(.*\)[[:space:]]*%\}/```\1/g' source/_posts/*.md  # 注意有空格和没空格
sed -i 's/{%[[:space:]]endhighlight[[:space:]]%\}/```/g' source/_posts/*.md
sed -i 's/{%[[:space:]]include JB\/setup[[:space:]]%\}//g source/_posts/*.md'

特殊字符escape

flask那篇文章hexo解析报错,因为啊,它用nunjunks来渲染,如果文本中有{{ }}或者{% %}会出错。我发现如果是缩进四格的代码标记或者`会出错,但如果用另一种标记法 ```则没关系。

是在不行,我们可以用html实体编码。

<code>&#97;&#98;&#99;</code>

textile文件

我试着用pandoc转换了下,发现几个问题:

  1. 会将metadata错误地转换
  2. 莫名的在行或特殊符号后面加反斜杠
  3. 不能很好处理jekyll的代码高亮标记法

于是就手工全改成markdown,话说这些sed代码都是之前尝试往pelican上迁移时写的辅助脚本。

# 删除和转换jeykll特定标记
sed -i 's/{%[[:space:]]include JB\/setup[[:space:]]%\}//g' source/_posts/*.textile
sed -i 's/{%[[:space:]]highlight[[:space:]]\(.*\)[[:space:]]*%\}/```\1/g' source/_posts/*.textile
sed -i 's/{%[[:space:]]endhighlight[[:space:]]%\}/```/g' source/_posts/*.textile

# textile标记到markdown的转换
# 列表
sed -i 's/^* /- /g' source/_posts/*.textile
sed -i 's/^# /- /g' source/_posts/*.textile
# 标题
sed -i 's/^h1./#/g' source/_posts/*.textile
sed -i 's/^h2./##/g' source/_posts/*.textile
sed -i 's/^h3./###/g' source/_posts/*.textile
sed -i 's/^h4./####/g' source/_posts/*.textile
sed -i 's/^h5./#####/g' source/_posts/*.textile
# 脚注
sed -i 's/^fn\([[:digit:]]\)\./[\^\1]:/g' source/*.textile
sed -i 's/\[\([[:digit:]]*\)\]/[\^\1]/g' source/*.textile

# 链接
sed -i 's/"\([^"]*\)"\([h|\/].*\)/[\1](\2)/g' source/*.textile
sed -i 's/"\([^"]*\)"\([^h\/].*\)/[\1][\2]/g' source/*.textile


# 最后把后缀改了,hexo不会处理后缀是textile的文件
for file in source/_posts/*.textile; do
cp $file source/_posts/`basename $file .textile`.md
done

当然,可能还是有手工劳动。

另外,有这么个东西hexo render pandoc来替换hexo的渲染引擎,就能顺便支持textile。值得一试和研究,也许里头就用到对文档元数据或者跳过指定行数的转换吧。

TODO

  • RSS
  • 友链
  • 评论
  • 统计
  • 分类、标签关于页面
  • 我想改个主题
  • 数学公式
  • 简历等迁移

暂时先这样,等整个站点完全改完了,就会把当前页面替换吧。现在关注的各位,对不住了,使用谷歌搜索检索本站吧。

感谢您一直看到这里。写了一天,论文一个字没写,好累。

Have fun!