- PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索
- 中文分词:
a) robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robbe.html
i. Robbe完整版本下载:Robbe完整版本(PHP测试程序, 开发帮助文档, WinNT下php各版本的dll文件)下载: http://code.google.com/p/robbe(“谷歌”无法使用)
b) SCWS(简易中文分词) 基于HTTP/POST的分词 : http://www.xunsearch.com/scws/api.php
c) MFSOU中文分词PHP扩展: http://php.mfsou.com/(网站打不开,无法访问)
综上:只能使用SCMS中文分词了。
3. 全文检索
a) MySQL全文检索(支持英文分词)
i. http://www.jcodecraeer.com/a/shujuku/2012/0728/324.html
ii. 需要进一步学习MySQL全文检索
b) Sphinx:基于SQL的全文检索引擎
i. http://sphinxsearch.com/downloads/
ii. Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。
c) 迅搜:sunsearch: http://www.xunsearch.com/doc/index
i. 目前后端服务器只支持 UNIX (含Linux/BSD/MacOS等) 操作系统,前端开发包只支持 PHP 语言。
ii. Xunsearch 可以帮助您建立门户/垂直搜索/论坛搜索/WEB站内搜索/文档文献资料搜索等。
php_scws.dll/Win32 安装说明
安装:http://www.xunsearch.com/scws/docs.php#instdll
1. 根据您当前用的 PHP 版本,下载相应已编译好的 php_scws.dll 扩展库。
目前支持 PHP-4.4.x 和 PHP-5.2.x 系列,下载地址分别为: php-4.4.x: http://www.xunsearch.com/scws/down/php-4.4.x/php_scws.dll
php-5.2.x: http://www.xunsearch.com/scws/down/php-5.2.x/php_scws.dll
php-5.3.x: http://www.xunsearch.com/scws/down/php-5.3.x/php_scws.dll 2. 将下载后的 php_scws.dll 放到 php 安装目录的
extensions/ 目录中去(通常为:X:/php/extensions/或 X:/php/ext/)。 3. 建立一个本地目录放规则集文件和词典文件,建议使用:C:/program files/scws/etc 4. 从 scws 主页上下载词典文件,解压后将 *.xdb 放到上述目录中
词典系列:http://www.xunsearch.com/scws/down/scws-dict-chs-gbk.tar.bz2
http://www.xunsearch.com/scws/down/scws-dict-chs-utf8.tar.bz2
http://www.xunsearch.com/scws/down/scws-dict-cht-utf8.tar.bz2 5. 从 scws 主页上下载规则集文件,解压后将 *.ini 放到第 3 步建立的目录
规则集文件压缩包:http://www.xunsearch.com/scws/down/rules.tgz
解压后有三个文件分别为 rules.ini rules.utf8.ini rules_cht.utf8.ini
将三件文件拷到第 3 步所述的目录中 6. 修改 php.ini 通常位于 C:/windows/php.ini 或 C:/winnt/php.ini 之类的目录,
在 php.ini 的末尾加入以下几行: [scws]
;
; 注意请检查 php.ini 中的 extension_dir 的设定值是否正确, 否则请将 extension_dir 设为空,
; 再把 php_scws.dll 指定为绝对路径。
;
extension = php_scws.dll
scws.default.charset = gbk
scws.default.fpath = "c:/program files/scws/etc" 5. 重开 web 服务器即可完成。 scws添加新词语(添加自定义的词语)
思路:利用scws的工具,把现有词库导出为txt,然后修改txt,再把txt转换成xdb文件(这个导入几天下来也没有成功)
SCWS提供了词库XDB导出导入词库的工具,下载后解压至任意文件夹,我解压至php安装目录下。在命令行下进入您PHP的安装目录,我的目录是”D:/wampServer/wamp/bin/php/php-5.3.29-Win32-VC9-x86“。
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的说明:词典词性标注详解
步骤1:执行命令行,将词库先导出来,生成一个文本文件(dict.txt)
命令格式为:php dump_xdb_file.php <要导出的.xdb文件> [要存入的文本文件]
我的命令语句是(路径跳转到php安装路径下d:,cd D:/wampServer/wamp/bin/php/php-5.3.29-Win32-VC9-x86):
php dump_xdb_file.php C:/"Program Files"/scws/etc/dict.xdb d:/123.txt
几秒后在d:目录下我就获得了导出的纯文本文件123.txt。
导入词库命令: 命令格式为:php make_xdb_file.php <要生成的.xdb> [导入的文本文件]
php make_xdb_file.php C:/"Program Files"/scws/etc/dict2.xdb d:/123.txt
生成xdb文件的过程需要比较长的时间,请耐心等待,如下图
我遇到问题(目前还没有解决):
我用scws中文分词自定义词库导入出错如下:
Notice: Undefined index :part in make_xdb_file.php on line 92
Notice: Undefined index :tf in make_xdb_file.php on line 93[/color]
修改了make_xdb_file.php 文件90行foreach(){},“{}”中内容为:[php]
foreach ($rec[$k] as $w => $v)
{
$flag = (isset($v['tf']) ? 0x01 : 0);
if (isset($v['part'])) {
if($v['part']){
$flag |= 0x02;
}
}
$tf=(isset($v['tf'])) ? $v['tf']:'' ;
$idf=(isset($v['idf'])) ? $v['idf']:'';
$attr=(isset($v['attr'])) ? $v['attr']:'';
$data = pack('ffCa3', $tf, $idf, $flag, $attr);
//$data = pack('ffCa3', $v['tf'], $v['idf'], $flag, $v['attr']);
$xdb->Put($w, $data);
$cnt++;
}[/php]
上面问题解决,但cmd中运行到Inserting [63/64] ... 33434 Records saved.又开始出现问题:(xdb.class.php文件):[color=#FF4500]Notice:User of undefined constant key-assumed 'key' in xdb.class.php(447):runtime-created function on line 1[/color]
不知道如何解决。
问题截图:
打开php.ini 文件,找到date.timezone =PRC。去掉date.timezone前面的分号“;”。
修改了make_xdb_file.php 文件90行foreach(){},“{}”中内容为:
foreach ($rec[$k] as $w => $v) { $flag = (isset($v['tf']) ? 0x01 : 0); if (isset($v['part'])) { if($v['part']){ $flag |= 0x02; } } $tf=(isset($v['tf'])) ? $v['tf']:'' ; $idf=(isset($v['idf'])) ? $v['idf']:''; $attr=(isset($v['attr'])) ? $v['attr']:''; $data = pack('ffCa3', $tf, $idf, $flag, $attr); //$data = pack('ffCa3', $v['tf'], $v['idf'], $flag, $v['attr']); $xdb->Put($w, $data); $cnt++; }
又出现新问题:
这个问题还没有解决。导入词库失败。
参考:http://blog.sina.com.cn/s/blog_54fd6b710101as5c.html
http://blog.sina.com.cn/s/blog_7d2117080102uyeu.html