Becomin' Charles

算法 | LNMP | Flutter | Mac

Becomin' Charles

我在CSDN上分享了很多东西,一直想把那个列表也在博客上罗列一个,一直就没有付诸于行动,昨天一发狠,终于弄了。

等于昨天几个小时,今天几个小时,搞出了一个小插件。就是右侧的一个小挂件。点上去就会链到CSDN的下载页面。

算是我把一年前的债还了。真开心。

插件里面没什么技术含量,就是小小调用了一下Google Feed API。

做这个插件,也引发了我一个思考。

能否在页面的head部分,就知道这个页面会装载哪些Widget呢?昨天折腾了半天,也没有解决这个问题。

解决的好处是显而易见的,现在的Widget,大多数都需要js来辅助了。但是很多高端的主题有数个sidebar,每页不同,如果Widget开发者,为了符合Web标准,把js放在head部分,就不得不无差别地在所有页面插入代码了。那样的话,添加一个Widget就会带来浪费的流量,页面速度也会被不断拖慢。

当然有个替代方案是把代码放到页面的footer部分,不过,个人以为,只要脚本出现在了Html body里面,那么直接嵌入到Widget中和hook到footer上,其实没什么本质区别,都破坏了行为和数据分离的原则。

这也是无奈之举了。谁叫WP设计成了sidebar.php执行前,无法知道页面会载入哪个sidebar这种结构呢?

当然,不排除还有更好方法的可能,如果知道的网友还望不吝告知。

初次安装vim编辑器时,我们必须要配置~/·vimrc文件才能让vim变得更加好用。最少最少,你要配置下面一些内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
" 不再与老旧的Vi兼容
set nocompatible

" 开启filetype支持
filetype on
filetype plugin on
filetype indent on

" 语法高亮
syntax on

" 这个选项为什么不是默认的?
set hidden

" 执行宏的时候不要更新显示set lazyredraw

" 至少让你知道当前是在什么状态下
set showmode

" 启用增强的命令行自动补全。必须再编译时开启 +wildmenu 选项
set wildmenu

" 更容易的编辑此文件,即vimrc文件。用ev命令表示edit vimrc。
nmap <silent> ,ev :e $MYVIMRC<cr>

" 并且令配置立刻生效,用sv命令表示source .vimrc
nmap <silent> ,sv :so $MYVIMRC<cr>

==========

上面一些选项还有很多我不懂的,以后研究明白了再添加解释。此文就作为我学习使用vim编辑器的起点吧~~

在网上搜出了很多给Hibernate配置连接池的文章,不过基本上都是同一篇文章,介绍了3种连接池的配置方法,我先试验了c3p0,感觉不出有什么快的,只是觉得在并发测试中,减少了出错的概率。那篇帖子最底下,说道社区普遍认为c3p0不够优秀,大家更倾向使用proxool,于是乎,我决定也试试,当然,我自己完全是没任何经验的,纯粹是为了试试。

去proxool下载了最新版本,0.9.1(我用的Hibernate是3.2.5版本,实际上0.9.1配置好后,跑步起来,最后还是用了0.8.3,后面会说的),按照网上普遍能搜到的帖子里的那个方法配置。

阅读全文 »

使用E63,又有一段日子了,这款手机依旧在不断地带给我惊喜,不能说这是最好的手机,但是,这绝对是性价比最高的手机之一了。 在点评狂网站上,E63的评分(9.3),稳稳地领先于其孪生兄弟E71(8.6)。

我前几天,写过一篇关于E63的文章,主要初上手E63时的一些感受,包括对手机外观和功能的简单评价。在这一篇中,我将介绍我最近几天来安装各类E63软件的一点经验。

阅读全文 »

Push Mail应用,是黑莓手机赖以成名的绝技,非常遗憾的一件事情是,在中国,这项业务是收费服务,而且价格不菲。但是,随着中国移动通信行业的发展,Push Mail的概念日渐火热,其门槛不断降低,再非昔日的高不可攀,最近一段日子,我不禁对这项应用倍感兴趣。

上一篇介绍E63的使用体验的文章中,我已经提到了这个东西。但是,事实上,我对其的了解是非常有限,我只是根据心目中的想象,将我现在享受到的服务,认为是Push Mail。而实际上,通过在互联网反复搜索,我还是没有实现对这项服务的深入了解。感觉国内做这个的有好几家公司,包括著名的尚邮,另外就是一些移动运营商和知名度较低的公司,但是我觉得这些公司里,不乏玩弄概念,欺瞒客户的现象。

阅读全文 »

前不久,我心爱的黑莓遗失了,不要询问我事情的始末,这始终让我悲痛万分。虽然,我旧有的手机Nokia 6280依然健康,但是,仿佛为了弥补那失去一员爱将而产生的空虚感,我急切地想要再购入一部手机。这种行为可能相当地不理智,但是我还是那么做了,选中的机器,就是Nokia E63。

阅读全文 »

已经有两个网友向我反应了Flash MP3 Player无法和lightbox之类插件兼容的问题,其症状为,当打开lightbox效果的图片时,flash movie会漂浮在整个页面的最顶层,破坏了lightbox的效果。

今天做了一点小小的调查,原来浏览器渲染嵌入页面的内容如flash movie或Java applet时,默认将它们放置于页面的最上层,忽略其z-index属性。所以,像lightbox这类插件,靠设置覆盖层的z-index属性来营造高亮效果的js脚本,基本无法做到覆盖掉页面上的flash movie。

阅读全文 »

什么是分词?什么是中文分词?

分词,就是将一段文字,按照语义上的最小单位切割开来。对于中文来说,虽然,很多汉字本身就具有相对独立的意思,但是更多情况下,单个的汉字是与其他一个或多个汉字组合在一起形成一个含义的。举个例子,“我是一个学生”,分词的结果是:“我/是/一个/学生”,再比如,“我/打算/去/做/分词/的/研究”。中文分词,就是将中文段落划分成词。

分词是理解语义的前提。人类依据自身的知识,在看到文字的时候,就自动完成了分词的过程。然而,计算机不具备人类的知识,更加不具备人类的智能,让机器实现自动切分文本,就成为了一个重要的研究课题,隶属于自然语言处理技术领域。在各种语言的分词中,最为困难的,可能就是中文分词了,因为中文语法复杂,规则少,特例多,歧义性强。中文领域文本处理技术,大大落后于西文,分词就是制约因素之一。

分词是搜索引擎建立索引的重要环节。我们固然可以对单个汉字建立索引,但是那样建立的索引,体积庞大,效率低下,检索缓慢,精确率低。分词完毕后,就能大大减少索引的体积,提高检索的效率。对于检索领域来说,分词可能仍非必要环节,但是对于自然语言处理领域来说(典型的如机器翻译),分词就必不可少。

分词的基本方法

分词一般有三种方法,基于字符串匹配的分词方法,将一段文本,与一个充分大辞典,逐条进行匹配,实现分词。按照长度优先级的不同,可以分为最大匹配、最小匹配;按照匹配方向的不同,可以分为正向匹配、逆向匹配。这些方法可以互相组合。

基于理解的分词方法,这种方法让计算机模拟人对句子的理解,对句子进行语法分析,语义分析,最后实现分词。该方法实现难度大,需要大量的语言知识和信息,目前还没有可生产的系统。

基于统计的分词方法,是通过对大量语料统计两个字相邻出现的频率,识别出词的方法。该方法虽然不需要辞典,而且能够实现对新词的识别。

三大类分词方法,各有利弊,参见文献【2】,现实中的分词系统,往往是综合系统,也即两种以上方法的综合,以此实现最优的分词效果。

在Lucene中分词

在Lucene中执行分词任务的是Analyzer对象,该对象中最关键的方法,是tokenStream方法,该方法可以返回一个包含着token的集合,也即TokenStream对象。TokenStream本身,是一个有着类似迭代器接口的抽象类,其具体类有两种,一种是以Reader对象作为输入的Tokenizer对象,另一种是以另一个TokenStream对象作为输入的TokenFilter。

到此,我们已经不难看出,实际执行切割任务的是Tokenizer,而TokenFilter则正如其名,对切割的结果进行过滤。要得到一个分词完毕的结果集合,必须要各类Tokenizer和TokenFilter的合作才可以完成,而Analyzer在这里,就扮演着一个组装器的角色。

从StandardAnalyzer中,我们不难发现Lucene的思路。首先创建一个StandardTokenizer实现第一次切割,然后是StandardTokenFilter,实现对token的归一化,如将复数词变成单数词,接着是一个ToLowerCaseFilter,将所有的token转换成小写字母,最后是StopFilter,将所有的stop words(无意义虚词)去掉。这样就完成了对一个英文文字段落的分词。

这样的设计,将复杂的分词实现全部对用户透明,用户具体使用的时候,就非常容易,只要创建一个Analyzer对象,然后传递给IndexWriter或者QueryParser(分解用户的查询,第一个步骤也是分词)即可。

在Lucene中实现中文分词

有了上面的理解,我们就知道,要让Lucene能够实现中文分词,我们必须创建自己的Analyzer,以及与其相关的Tokenizer和TokenFilter,有了这几个类的配合,就可以实现中文分词。

我在网上调研了数个中文分词系统,但是,里面实现了Lucene接口的并不多,好在我只是做一般性科研用途,对性能,效率不需考量,所以,我就直接选择了按照Lucene的接口设计的Paoding Analysis包。如果,我们期望能够得到更高的精确率和分词效率,我们还需要选用更加优秀的分词组件才行,那时候,就必须要自己手动来进行一次封装,以实现Lucene的接口,不过,这并不是一个复杂的事情。很多分词组件本身已经非常全面,例如ICTCLAS,已经实现了定制化分词,其给出的结果,就直接是最终结果了,所以,如果要包装ICTCLAS,我们要做的事情就很简单了,将ICTCLAS返回的结果,用TokenStream包装即可,可能单实现一个Analyzer就足够了。即便考虑得全面一些,事情也不会太复杂。

总结

市面上的中文分词组件非常多,一般应用,我们完全可以采用现成的系统。没有必要重复发明轮子。但是这些系统大多数难以适用于要求更高的商业系统,那时候就不得不选购一些相关的解决方案,或者在某开源系统的基础上进行再开发。

我个人在实际项目中,选用了Paoding Analysis,主要考虑到该实现完全使用Java,具有优秀的跨平台特性,而且用起来也最为省心,分词效果也还不错。虽然效率可能存在一定的问题,但是由于系统本身内容较少,也就不是矛盾的主要方面了。日后可以考虑更换更为高效和更为准确的系统。当然,前提是你在构建系统的时候,不要将你使用的Analyzer硬编码进系统,而是使用配置文件等方式来接入。

参考文献:

【1】百度百科:中文分词 http://baike.baidu.com/view/19109.html (中文分词的基本方法,技术难点,基本应用)

【2】三种中文分词算法优劣比较 http://www.blogjava.net/jiangyz/articles/238120.html

【3】开源中文分词软件

【4】Lucene中文分析器的中文分词准确性和性能比较

【5】几款免费中文分词模块介绍 (原文已经丢失)

【6】关于中文分词的一些琐碎资料

常见分词系统:

【1】中科院计算所ICTCLAS http://ictclas.org/index.html (很多企业和研究机构的分词系统,带有词性标注,便于搞科研)

【2】海量信息技术有限公司的中文智能分词 http://www.hylanda.com (据说是中搜使用的分词系统,传说业界公认最好的分词)

【3】猎兔 中文分词 http://www.lietu.com/demo/index.jsp

【4】极易中文分词组件 http://www.jesoft.cn/ (基于正向最大匹配算法)

【5】庖丁解牛中文分词 http://code.google.com/p/paoding/ (开源项目)

【6】简易中文分词系统 http://www.hightman.cn/index.php?scws (提供php扩展)

【7】还有许多许多