为SCWS中文分词系统xdb词库添加新词

SCWS是国内PHP大牛hightman开发的基于PHP的简易中文分词系统,因为PHP的搭档Mysql不支持中文分词全文索引,这个SCWS方案可算当前PHP圈中初级分词需求的最佳解决方案。用它来实现简单的中文全文搜索,或者自动生成文章关键词,足可胜任。

其实中文分词效果如何,关键还是在于词库是否足够完善,SCWS毕竟只是个初级的解决方案,词库也是hightman个人制作,总不免有些不尽如人意的地方。比方说,我就发现常用的一个食品名“芽菜”就没有被收入词库中,SCWS会将“芽菜”分割成“芽”和“菜”,这让我有些郁闷。我尝试在SCWS的规则配置文件rules.ini中加入“芽菜”这个新词,但不知为何并没有作用。我只有考虑直接在词库数据中加入新词来解决这个问题。

幸好SCWS提供了词库XDB导出导入词库的工具,下载后解压至任意文件夹,我解压至“E:/www/tools/scws_xdb/”目录下。在命令行下进入您PHP的安装目录,我的目录是”E:/xampp/php“,执行命令行:

命令格式为:php dump_xdb_file.php <要导出的.xdb文件> [要存入的文本文件]

几秒后在E:/scws目录下我就获得了导出的纯文本文件dict.txt。

用文本编辑器打开dict.txt文件,我建议用EditPlus,用windows的记事薄的话不能正常显示换行符。dict.txt中文本格式为:

# WORD    TF    IDF    ATTR
当机立断    14.01    8.10    i

#开头的行是注释。每行是一个词。每个词分为四部分,WORD列是词本身,TF和IDF列是词权重,ATTR列是词性。

在这里要解释下TF和IDF的意思,它们合起来称作TF-IDF(term frequency–inverse document frequency),是一种用于资讯检索与资讯探勘的常用加权技术,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用分类。说起来很不好理解,其实也不需要理解,SCWS也提供了新词生词的TF/IDF计算器,可以自动获得词语的权重值。

ATTR是词性,也就是标示词语是名字、动词、形容词等等词性的。详细的词性标示方法请看SCWS的说明:词典词性标注详解

我要添加的词语是”芽菜“,是名词,用n标示。得到的IF、IDF值分别是13.82和7.48,那么在dict.txt结尾我追加了如下一行:
芽菜    13.82    7.48    n

再执行如下命令,将修改好的dict.txt重新生成xdb文件。

命令格式为:php make_xdb_file.php <要生成的.xdb> [导入的文本文件]

生成xdb文件的过程需要比较长的时间,请耐心等待,如下图:

就这么简单,补充了新词的词库制作完成啦!

在调用新词库后重新对含有”芽菜“的字符串进行分词,嘿嘿,”芽菜“已经可以作为一个词被正确识别了。

设置CentOS防火墙开放端口

在我们使用CentOS系统的时候,CentOS防火墙有时是需要改变设置的。CentOS防火墙默认是打开的,设置CentOS防火墙开放端口方法如下:

打开iptables的配置文件:
vi /etc/sysconfig/iptables
修改CentOS防火墙时注意:一定要给自己留好后路,留VNC一个管理端口和SSh的管理端口

下面是一个iptables的示例:

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp –icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
COMMIT

修改CentOS防火墙需要注意的是,你必须根据自己服务器的情况来修改这个文件。

举例来说,如果你不希望开放80端口提供web服务,那么应该相应的删除这一行:
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

全部修改完之后重启iptables:
service iptables restart

你可以验证一下是否规则都已经生效:iptables -L

这样,我们就完成了CentOS防火墙的设置修改。