- 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