JSPHP NLP工作流

这个JSPHP NLP工作流的标题有点拗口,但目前仍难以作为独立服务发布,后面再取一个好听的名字吧。

高大上一点就是,我考虑的是如何利用有限的web空间/运算资源,实现规模略大的运算

我去年买了这个无限量存储的PHP web hosting,放弃了用了好几年的VPS。原因是VPS被攻击风险越来越大,用于VPN效果又不好,而多放几个网站存储上就有点累了。

但是纯粹的host缺点也是很明显的,我不能再在PHP下面自由添加一些扩展库了,更多的时候,只能使用纯粹的PHP进行运算。另外,单个PHP页面运算资源也是有限的,超时、内存限制等都不能自由修改。

不过是缺点也是挑战,于是当我考虑用这个host来进行一些NLP运算和统计工作的时候,我不得不考虑将运算过程进一步分解成若干个独立的小任务,这些小任务运算时间和资源都有一定限制。将这些小任务串联起来的工作,就落在前端的javascript上。

问题来了,为什么不在javascript上完成一切?

我是这么想的,虽然PHP在学术上并不是最佳的编程语言,但其语言编程能力足够,因此也有不少的算法类的开源项目基于PHP进行开发。而前端的javascript则不具备这样的能力,甚至如果我在手机端运行一段复杂的javascript,有可能直接导致浏览器的崩溃。

那么node.js呢?

不大了解node.js,也没试过,而且我的host似乎不支持node.js。

这样的模型还有什么好处?

我需要把一个大框架的任务拆解,利用host作为长期的web api方式的使用,后续如果有更佳的语言/算法,则可以保留接口,更换后台。另外,这种方式允许并行计算,可以运算分布在不同的host(目前看来,很多免费的host资源)同时运行,希望能成为一种web薅羊毛的新模式。

而按照growth hacking的思想,这样的系统搭出来就是可以自由演示的,而且成本非常低,其可扩展性也非常强,可以按需增加功能,把框架对性能的影响尽量降低。

 

我一直以来想做的是一个长篇小说的人物分布统计,并根据人名的分词距离从中获取不同角色的关系亲密度。

首先的工作是建立NLP的分词词典,我选的是phpanalysis(安装在host上),默认就有词典了,再把人物名称都加进去,重建词典。

设计前端,对小说全文按章节分段(因为担心全文提交会导致500),分段需要提前做好节点魔术字;然后每段通过ajax提交phpanalysis的处理程序;处理程序返回分词结果给前端;前端根据人物名称词组,统计人物名称频次和位置。

统计结束后,

  1. 上传服务器保存,
  2. 或者生成可视化图表

工作流程大概如下:

JS-PHP NLP工作流

JSPHP NLP工作流》有1个想法

  1. polo 文章作者

    前后端的一些技术总结:

    由于我太长时间没有进行开发了,对于流行的架构也不清楚,因此这次纯粹是为了开发而使用最基本的HTML及JAVASCRIPT及PHP来做的。
    当然了,KMEANS以及NLP分词是已经有了的PHP代码,用通了就OK,所幸它们也没有使用什么依赖性强的框架。

    列举一下查过的API及用法:
    JAVASCRIPT:
    * Math.floor(), 用来在有限屏幕内归一化数据为整数。
    * AJAX,现成的代码改改,需要注意的是,由于AJAX的任务多而且不一致,因此制作AJAX任务时要同时将callback传入,我相信前端的框架一定都实现了这样的动作。这次纯粹就是重做小轮子了。
    * 调试专用函数,实现了一个log函数,在页面下方设一个p, id就是log,log函数负责往里面追加内容,当然了,也提供清除log的函数,在页面上用href提供清除功能的按钮/链接。
    * 有多个同类任务排队的时候,我没有使用任务管理器,直接在callback里面把未完成的任务数组下一个启动了。坏处就是如果callback因为失效没有进入,这时候就需要手动再断点启动。
    * 第一次用Canvas绘图,document.getElementById(“foo”).getContext(“2d”),然后是系列的函数,查手册即可。这部分我相信其他框架本身再封装意义不大,但它们倒是会做一些charts的包。
    * 符合JSON格式的字符串直接使用JSON.parse(),如果失败,基本上是因为后台输出有不可见的标签,比如这次PHP多打了一个”< pre >“。
    * 数组排序需要提供比较两数组元素的函数。然后就是array.sort(comparefunc)。
    * 用了一下iChart,一般,够用,不需要重做轮子。
    * innerHTML里面不可以写table,要取得table的dom,再table的innerHTML里面写tr,td等等。
    * 用字符分割字符串为数组用split,如果内容为整数字,则还要每个用parseInt。

    PHP:
    * 用字符分割字符串为数组用explode,如果内容为整数字,则还要每个用intval。
    * 数组转JSON用json_encode。
    * 纯JSON字符串返回时注意其他的不可见标签。
    * 删除数组元素用unset,比如”unset($data[$key]);”。
    * 纯数字排序,直接用sort。
    * 函数返回多个数据,可以组合成数组返回。

评论已关闭。