- 論壇徽章:
- 0
|
MySQL-5.1.30的scws-1.x分詞插件
作者:
hightman
@Author: hightman
@Website:
http://www.hightman.cn/bbs
@download:
http://www.hightman.cn/down/myft-5.1.30-081231.tgz
[ 基本說(shuō)明 ]
這是以 mysql-5.1.30 為環(huán)境開(kāi)發(fā)制作的 mysql 全文檢索分詞插件。原則上應(yīng)該適用整個(gè) 5.1.x 系列。
mysql 內(nèi)置的全文檢索僅支持 myisam 類(lèi)型的表,默認(rèn)的不支持中文分詞。本插件依托 scws-1.0.1 分詞系統(tǒng),
scws 是由我開(kāi)發(fā)的免費(fèi)開(kāi)源的中文分詞系統(tǒng),純 C 開(kāi)發(fā)的函數(shù)庫(kù)。安裝本插件必須先安裝 scws-1.x。
安裝本插件后,系統(tǒng)會(huì)注冊(cè)一個(gè)名為 scws_parser 的分詞器,可以在 mysql 中直接使用它,對(duì)于小型全文檢索
需求,十分方便。
MyFT 系列之前曾發(fā)過(guò)布 5.1.11 和 4.0.27 的版本,舊版是簡(jiǎn)單的分詞算法并不理想,建議改為本版。
[ 安裝 & 測(cè)試]
1. 首先確定您在您的服務(wù)器上以源碼方式安裝了 mysql 5.1.x/ ,
假設(shè)您的 mysql-5.1.x 安裝在 $prefix 目錄 (通常為 /usr/local/mysql5)
務(wù)必是源碼方式,里頭一些自定義函數(shù)功能還需要對(duì)代碼打補(bǔ)丁。
2. 接下來(lái)您必須先安裝 scws-1.0.x 系統(tǒng),相關(guān)的安裝說(shuō)明及下載文件請(qǐng)?jiān)L問(wèn):
http://www.ftphp.com/scws
假設(shè)安裝在 $scws_dir 目錄(建議為 /usr/local/scws)
注意要同步下載相應(yīng)的詞典檔和規(guī)則集并放到 $scws_dir/etc 目錄中去。
否則相應(yīng)的字符集詞典/規(guī)則集文件不存在的話(huà)則會(huì)自動(dòng)采用默認(rèn)的簡(jiǎn)易分詞法。
3. 下載本插件代碼:http://www.hightman.cn/down/myft-5.1.30-081231.tgz
4. 下載后將 tgz 文件復(fù)制到您安裝的 mysql-5.1 的源代碼所在目錄里,然后解開(kāi):
tar xvzf myft-5.1.30-081231.tgz
解開(kāi)后有一個(gè) scws 目錄被放到 plugin/ 目錄里
還有一個(gè) myft_scws_udf_5.1.30.patch 補(bǔ)丁文件及本文件 README.myft-hightman
5. 對(duì) mysql 源碼打補(bǔ)丁,以支持自定義函數(shù)中獲取正確的字符集
在 mysql 源碼目錄執(zhí)行 patch -p0
3) 在返回結(jié)果太長(zhǎng)(特別是開(kāi)啟 multi的情況下)會(huì)被裁斷,以 ... 結(jié)尾(不必?fù)?dān)心!)
4) 測(cè)試:
mysql> SELECT SCWS_SEGMENT('我是中國(guó)人');
+---------------------------------+
| SCWS_SEGMENT('我是中國(guó)人') |
+---------------------------------+
| 我 是 中國(guó)人 |
+---------------------------------+
1 row in set (0.00 sec)
mysql> SELECT SCWS_SEGMENT(title) FROM test_utf8;
+-------------------------------+
| SCWS_SEGMENT(title) |
+-------------------------------+
| MySQL Tutorial |
| How To Use MySQL Efficiently |
| Optimising MySQL |
| 1001 MySQL Tricks |
| MySQL vs . YourSQL |
| MySQL Security |
| 中國(guó) 測(cè)試 |
| 瘋狂 測(cè) 中國(guó) 測(cè)試 |
| 中國(guó) 語(yǔ)言 測(cè)試 |
| 我愛(ài) china |
+-------------------------------+
10 rows in set (0.00 sec)
11. 自定義函數(shù) SCWS_TOPWORDS(),該函數(shù)返回字符串中的核心關(guān)鍵詞列表;
1) 創(chuàng)建函數(shù)(只需一次):CREATE FUNCTION scws_topwords RETURNS STRING SONAME 'libftscws.so';
2) 接受 1~3 個(gè)參數(shù),分別為:
詞性多個(gè)之間用,分隔,以~開(kāi)頭則表示除這些詞性以外。。。和 scws 用法一樣。
3) 返回結(jié)果是由符合條件的關(guān)鍵詞及其詞性和次數(shù)組成,各詞之間用空格連接
//
4) 測(cè)試:
mysql> SELECT SCWS_TOPWORDS('我是中國(guó)人,中國(guó)人很有志氣');
+----------------------------------------------------------+
| SCWS_TOPWORDS('我是中國(guó)人,中國(guó)人很有志氣') |
+----------------------------------------------------------+
| 中國(guó)人/n/2 志氣/n/1 |
+----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT SCWS_TOPWORDS(CONCAT(title, ' ', body)) FROM test_utf8;
+--------------------------------------------------------------------------------------------------+
| SCWS_TOPWORDS(CONCAT(title, ' ', body)) |
+--------------------------------------------------------------------------------------------------+
| DataBase/en/1 Tutorial/en/1 stands/en/1 MySQL/en/1 DBMS/en/1 for/en/1 |
| Efficiently/en/1 through/en/1 After/en/1 MySQL/en/1 went/en/1 How/en/1 Use/en/1 you/en/1 To/en/1 |
| Optimising/en/1 tutorial/en/1 MySQL/en/1 this/en/1 show/en/1 will/en/1 In/en/1 we/en/1 |
| Tricks/en/1 mysqld/en/1 MySQL/en/1 Never/en/1 1001/en/1 root/en/1 run/en/1 as/en/1 |
| comparison/en/1 following/en/1 database/en/1 YourSQL/en/1 MySQL/en/1 the/en/1 In/en/1 vs/en/1 |
| MySQL/en/2 configured/en/1 Security/en/1 properly/en/1 When/en/1 |
| 中國(guó)/ns/1 這樣/r/1 測(cè)試/vn/1 可以/v/1 |
| 中國(guó)/ns/1 應(yīng)該/v/1 瘋狂/an/1 這樣/r/1 測(cè)試/vn/1 可以/v/1 |
| 中國(guó)/ns/1 不行/a/1 語(yǔ)言/n/1 這樣/r/1 測(cè)試/vn/1 又是/n/1 |
| china/en/2 祖國(guó)/n/1 我愛(ài)/n/1 |
+--------------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)
12. 全文檢索中的停用詞表,類(lèi)似詞典和規(guī)則集一樣放在 $scws_dir/etc 中
分別為:stops.[$charset.]txt
rules.[$charset.]ini
dict.[$charset.]xdb
如果 $charset 沒(méi)有指定,則默認(rèn)即為 gbk
rules dict 采用 scws-1.x 的格式, stops.txt 用的是每行一個(gè)詞即可,自行建立。
名稱(chēng):PHPCWS(PHP中文分詞擴(kuò)展)
協(xié)議:New BSD License
作者:張宴
網(wǎng)址:
http://code.google.com/p/phpcws/
SVN:
http://code.google.com/p/phpcws/source/browse/#svn/trunk/phpcws
一、PHPCWS 簡(jiǎn)介
1、什么是 PHPCWS ?
PHPCWS 是一款開(kāi)源的PHP中文分詞擴(kuò)展,目前僅支持Linux/Unix系統(tǒng)。
PHPCWS 先使用“ICTCLAS 3.0 共享版中文分詞算法”的API進(jìn)行初次分詞處理,再使用自行編寫(xiě)的“逆向最大匹配算法”對(duì)分詞和進(jìn)行詞語(yǔ)合并處理,并增加標(biāo)點(diǎn)符號(hào)過(guò)濾功能,得出分詞結(jié)果。
ICTCLAS
(Institute
of Computing Technology, Chinese Lexical Analysis
System)是中國(guó)科學(xué)院計(jì)算技術(shù)研究所在多年研究工作積累的基礎(chǔ)上,基于多層隱馬模型研制出的漢語(yǔ)詞法分析系統(tǒng),主要功能包括中文分詞;詞性標(biāo)注;命
名實(shí)體識(shí)別;新詞識(shí)別;同時(shí)支持用戶(hù)詞典。ICTCLAS經(jīng)過(guò)五年精心打造,內(nèi)核升級(jí)6次,目前已經(jīng)升級(jí)到了ICTCLAS3.0,分詞精度
98.45%,各種詞典數(shù)據(jù)壓縮后不到3M。ICTCLAS在國(guó)內(nèi)973專(zhuān)家組組織的評(píng)測(cè)中活動(dòng)獲得了第一名,在第一屆國(guó)際中文處理研究機(jī)構(gòu)SigHan
組織的評(píng)測(cè)中都獲得了多項(xiàng)第一名,是當(dāng)前世界上最好的漢語(yǔ)詞法分析器。
ICTCLAS 3.0 商業(yè)版是收費(fèi)的,而免費(fèi)提供的
ICTCLAS 3.0
共享版不開(kāi)源,詞庫(kù)是根據(jù)人民日?qǐng)?bào)一個(gè)月的語(yǔ)料得出的,很多詞語(yǔ)不存在。所以本人對(duì)ICTCLAS分詞后的結(jié)果,再采用逆向最大匹配算法,根據(jù)自己補(bǔ)充的
一個(gè)9萬(wàn)條詞語(yǔ)的自定義詞庫(kù)(與ICTCLAS詞庫(kù)中的詞語(yǔ)不重復(fù)),對(duì)ICTCLAS分詞結(jié)果進(jìn)行合并處理,輸出最終分詞結(jié)果。
由于 ICTCLAS 3.0 共享版只支持GBK編碼,因此,如果是UTF-8編碼的字符串,可以先用PHP的iconv函數(shù)轉(zhuǎn)換成GBK編碼,再用phpcws_split函數(shù)進(jìn)行分詞處理,最后轉(zhuǎn)換回UTF-8編碼。
2、PHPCWS 中文分詞在線(xiàn)演示
演示網(wǎng)址:
http://blog.s135.com/demo/phpcws/
3、PHPCWS 分詞速度及用途
初次使用時(shí),Apache 或 php-cgi(FastCGI) 進(jìn)程,需要加載一次詞庫(kù)到內(nèi)存中,需要0.0X秒。58字節(jié)的一句話(huà)——“2009年2月13日,我編寫(xiě)了一款PHP中文分詞擴(kuò)展:PHPCWS 1.0.0!,分詞速度只需0.0003秒。
PHPCWS 屬于《
億級(jí)數(shù)據(jù)的高并發(fā)通用搜索引擎架構(gòu)設(shè)計(jì)
》
的一部分,用作“搜索查詢(xún)接口”的關(guān)鍵字分詞處理。在此架構(gòu)中,Sphinx索引引擎對(duì)于CJK(中日韓)語(yǔ)言支持一元切分,假設(shè)【反恐行動(dòng)是國(guó)產(chǎn)主視角
射擊網(wǎng)絡(luò)游戲】這段文字,Sphinx會(huì)將其切成【反 恐 行 動(dòng) 是 國(guó) 產(chǎn) 主 視 角 射 擊 網(wǎng) 絡(luò) 游
戲】,然后對(duì)每個(gè)字建立反向索引。如果用這句話(huà)中包含的字組成一個(gè)不存在的詞語(yǔ),例如【恐動(dòng)】,也會(huì)被搜索到,所以搜索時(shí),需要加引號(hào),例如搜索【"反恐
行動(dòng)"】,就能完全匹配連在一起的四個(gè)字,不連續(xù)的【"恐動(dòng)"】就不會(huì)被搜索到。但是,這樣還有一個(gè)問(wèn)題,搜索【"反恐行動(dòng)游戲"】或【"國(guó)產(chǎn)網(wǎng)絡(luò)游
戲"】就會(huì)搜索不到。所以,我在搜索層寫(xiě)了個(gè)PHP中文分詞擴(kuò)展,搜索“反恐行動(dòng)游戲”、“國(guó)產(chǎn)網(wǎng)絡(luò)游戲”,會(huì)被PHPCWS中文分詞函數(shù)分別切分為“反
恐行動(dòng) 游戲”、“國(guó)產(chǎn) 網(wǎng)絡(luò)游戲”,這時(shí)候,用PHP函數(shù)給以空格分隔的詞語(yǔ)加上引號(hào),去搜索【"反恐行動(dòng)" "游戲"】或【"國(guó)產(chǎn)"
"網(wǎng)絡(luò)游戲"】,就能搜索到這條記錄了。由于PHPCWS位于搜索層,中文分詞詞庫(kù)發(fā)生增、刪、改,只需平滑重啟一次Web服務(wù)器或php-cgi進(jìn)程即
可,無(wú)需重建搜索索引。
根據(jù)上述情況,對(duì)于那些采用二元交叉切分的搜索引擎,PHPCWS用在前端搜索層對(duì)用戶(hù)輸入的搜索關(guān)鍵字、短語(yǔ)進(jìn)行分詞處理,同樣適合。PHPCWS開(kāi)發(fā)的目的正在于此,對(duì)于短句、小文本中文分詞切分,速度非常之快。
4、自定義詞庫(kù)
自定義詞庫(kù)名稱(chēng)為
userdict.tch
,格式為 Tokyo Cabinet DBM 的 Abstract key-value 內(nèi)存哈希數(shù)據(jù)庫(kù)(key為GBK編碼的詞語(yǔ)名詞,value為詞頻。目前詞頻均填1,暫時(shí)用不上)。自定義詞庫(kù)的修改在安裝步驟中會(huì)詳細(xì)介紹。
二、PHPCWS 1.0.0 安裝步驟
1、安裝 Tokyo Cabinet 數(shù)據(jù)庫(kù):
wget
http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.5.tar.gz
tar zxvf tokyocabinet-1.4.5.tar.gz
cd tokyocabinet-1.4.5/
./configure --prefix=/usr/local/tokyocabinet-1.4.5
make && make install
mkdir -p /usr/local/tokyocabinet-1.4.5/lib/static/
cp -f /usr/local/tokyocabinet-1.4.5/lib/*.a /usr/local/tokyocabinet-1.4.5/lib/static/
echo "/usr/local/tokyocabinet-1.4.5/lib" >> /etc/ld.so.conf
/sbin/ldconfig
cd ../
2、安裝 PHPCWS 擴(kuò)展:
wget
http://phpcws.googlecode.com/files/phpcws-1.0.0.tar.gz
tar zxvf phpcws-1.0.0.tar.gz
cd phpcws-1.0.0/
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-tc=/usr/local/tokyocabinet-1.4.5
make && make install
cd ../
注:其中/usr/local/webserver/php/為您的PHP安裝目錄。
3、安裝 ICTCLAS 3.0 詞庫(kù)和 PHPCWS 自定義詞庫(kù)(詞庫(kù)漢字編碼均為GBK):
cd /usr/local/
wget
http://phpcws.googlecode.com/files/phpcws-dict-1.0.0.tar.gz
tar zxvf phpcws-dict-1.0.0.tar.gz
mv phpcws-dict-1.0.0 phpcws
您可以往自定義詞庫(kù)內(nèi)增加自己的詞語(yǔ),方法如下:
cd /usr/local/phpcws/
#如果userdict.tch已經(jīng)被PHP加載,請(qǐng)拷貝一個(gè)備份
cp userdict.tch userdict_new.tch
#添加新詞語(yǔ)
/usr/local/tokyocabinet-1.4.5/bin/tcamgr put userdict_new.tch 詞語(yǔ)一 1
/usr/local/tokyocabinet-1.4.5/bin/tcamgr put userdict_new.tch 詞語(yǔ)二 1
查詢(xún)某個(gè)詞語(yǔ)是否已經(jīng)在詞庫(kù)內(nèi)
/usr/local/tokyocabinet-1.4.5/bin/tcamgr get userdict_new.tch 詞語(yǔ)名詞
#刪除一個(gè)詞語(yǔ)
/usr/local/tokyocabinet-1.4.5/bin/tcamgr out userdict_new.tch 詞語(yǔ)名稱(chēng)
#將修改后的新詞庫(kù)覆蓋回原詞庫(kù)
mv userdict_new.tch userdict.tch
#重啟您的Apache服務(wù)器,或php-cgi(FastCGI)進(jìn)程。
#例如重啟php-cgi(FastCGI)進(jìn)程:
/usr/local/webserver/php/sbin/php reload
您可以從
搜狗細(xì)胞詞庫(kù)網(wǎng)站
下載自己需要的行業(yè)分類(lèi)文本詞庫(kù),整合到PHPCWS自定義詞庫(kù)中。
4、修改您的php.ini文件,增加以下幾行內(nèi)容:
[phpcws]
extension = "phpcws.so"
phpcws.dict_path = "/usr/local/phpcws"
5、重啟您的Apache服務(wù)器,或php-cgi(FastCGI)進(jìn)程
6、查看您的phpinfo信息,如果搜索到以下內(nèi)容,則表明安裝成功:
![]()
三、PHPCWS 1.0.0 調(diào)用方式
1、PHPCWS擴(kuò)展擁有一個(gè)PHP函數(shù):
string phpcws_split ( string $text [, string $interpunction ] )
參數(shù)說(shuō)明:
$text 為GBK編碼的文本內(nèi)容;
$interpunction 為可選參數(shù),用來(lái)控制是否過(guò)濾標(biāo)點(diǎn)符號(hào)。
、、值為空時(shí),表示不過(guò)濾;
②、值為"default"時(shí),過(guò)濾掉默認(rèn)的標(biāo)點(diǎn)符號(hào),即以下標(biāo)點(diǎn)符號(hào):
,.!。ⅲ#ぃィΓ啵Вǎ病场础怠丁贰浮埂骸弧肌健尽浚。、?…—·ˉˇ¨‘’“”々~‖∶"/:;|〃<=>?@[\]^_`{|} ̄
③、值為其他字符串時(shí),表示過(guò)濾掉自定義的標(biāo)點(diǎn)符號(hào),例如值為",.!,。!"即過(guò)濾掉半角、全角的逗號(hào)、句號(hào)、感嘆號(hào)。
2、PHP中文分詞實(shí)例:
①、對(duì)GBK編碼的字符串進(jìn)行中文分詞處理(example_gbk.php):
@header('Content-Type: text/html; charset=gb2312'); $text = "2009年2月13日,我編寫(xiě)了一款PHP中文分詞擴(kuò)展:PHPCWS 1.0.0。"; echo "分詞結(jié)果為:
"; $result = phpcws_split($text); echo $result . "
"; echo "過(guò)濾掉默認(rèn)標(biāo)點(diǎn)符號(hào)的分詞結(jié)果為:
"; $result = phpcws_split($text, "default"); echo $result . "
"; echo "過(guò)濾掉全角逗號(hào)與冒號(hào)的分詞結(jié)果為:
"; $result = phpcws_split($text, ",:"); echo $result . "
"; ?>
、、對(duì)UTF-8編碼的字符串進(jìn)行中文分詞處理(example_utf8.php):
@header('Content-Type: text/html; charset=utf-8'); $text = "2009年2月13日,我編寫(xiě)了一款PHP中文分詞擴(kuò)展:PHPCWS 1.0.0。"; $text = iconv("UTF-8", "GBK//IGNORE", $text); echo "分詞結(jié)果為:
"; $result = phpcws_split($text); $result = iconv("GBK", "UTF-8//IGNORE", $result); echo $result . "
"; echo "過(guò)濾掉默認(rèn)標(biāo)點(diǎn)符號(hào)的分詞結(jié)果為:
"; $result = phpcws_split($text, "default"); $result = iconv("GBK", "UTF-8//IGNORE", $result); echo $result . "
"; echo "過(guò)濾掉全角逗號(hào)與冒號(hào)的分詞結(jié)果為:
"; $result = phpcws_split($text, ",:"); $result = iconv("GBK", "UTF-8//IGNORE", $result); echo $result . "
"; ?>
輸出結(jié)果為:
分詞結(jié)果為:
2009年 2月 13日 , 我 編寫(xiě) 了 一款 PHP 中文 分詞 擴(kuò)展 : PHPCWS 1.0.0 。
過(guò)濾掉默認(rèn)標(biāo)點(diǎn)符號(hào)的分詞結(jié)果為:
2009年 2月 13日 我 編寫(xiě) 了 一款 PHP 中文 分詞 擴(kuò)展 PHPCWS 1.0.0
過(guò)濾掉全角逗號(hào)與冒號(hào)的分詞結(jié)果為:
2009年 2月 13日 我 編寫(xiě) 了 一款 PHP 中文 分詞 擴(kuò)展 PHPCWS 1.0.0 。
以上兩個(gè)實(shí)例PHP程序文件可以從SVN中獲。
svn checkout
http://phpcws.googlecode.com/svn/trunk/php-example/
php-example
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/13284/showart_1854560.html |
|