◆◆ 请高手谈谈分词技术用PHP+MySQL是如何实现的! ◆◆ 这个东东用php做肯定很慢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <?php$text = <<< TEXTgoogle上搜到的全是理论 算法都没有~~ :(请研究过分词的同志谈谈分词用PHP+MySQL是如何实现的TEXT;/*** 基本的分词函数 ***/function word_split($text) { preg_match_all("/[\x81-\xff].||\w+/",$text,$regs); $tmp = split(',',preg_replace(array("/^,+|,+$/","/,+/"),array("",","),join(',',$regs[0]))); $word = array(); for($i=0;$i<count($tmp)-1;$i++) { if(ord($tmp[$i][0])<128) $word[] = $tmp[$i]; elseif(ord($tmp[$i+1][0])>=128) $word[] = join('',array_slice($tmp,$i,2)); } return $word;}print_r(word_split($text));?>得到Array( [0] => google [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] => PHP [28] => MySQL [29] => 是如 [30] => 如何 [31] => 何实 [32] => 实现 [33] => 现的)供检索用的表CREATE TABLE `dict` ( `id` int(11) NOT NULL default '0', `word` varchar(50) NOT NULL default '', KEY `word` (`word`)) TYPE=MyISAM;将文章分词后连同唯一键(id)一同保存到dict中,此动作在文章入库时完成检索时select * from dict where word='$key'多键查询时select * from dict where word='$key1' or word='$key2' ...在汉语中两个字的词组居多,所以拆分成两个字就可以了当查询字串长度超过两个汉字时,先用word_split分词后组装成查询串 你还可以剔除dict中不可能成为词组的成分,以减小dict的规模 如果剔除了dict中不可能成为词组的成分时,那么搜索人名“徐祖宁”或者其它新名词“法 轮 功”用这种方法不是搜索不到了吗? 强烈关注!正在研究这方面的搜索。基本的方法是用字典,不过需要优化算法的地方太多了不过如果数据库的表太大一般的分词程序还是使搜索很艰难。比如我们现在的mysql数据库已经有接近1G的表了我见过的做得分词最好的就是那个海量搞的那个(绝对不是广告),可惜不提供源码,而且免费版的只提供在windows平台下面的接口 另外国外有几种开源的搜索技术,可以参考一下。当然opensourse的终究不可能那么完美 to lawyu(雨淋漓): 你什么数据这么多都上G了? to:Meteorlet公司的数据库,mysql数据库现在不到1G,真正数据的服务器都1T多了。只是一个小公司,比我们多的有的事,具体就不讲了 PHPBB 怎么分词的,有人研究过吗? TO: xuzuning(唠叨)现在最大的记录数应该超过了300w,会有一些问题,但搜索引擎,数据库经过一定的优化后还可以正常的使用,数据库也分别在北方和南方两个城市各4台同步(包括做数据库映射和数据备份)。以后肯定整个系统都会有大的修改,但不会脱离linux平台,短时间内还不有大的改变,毕竟涉及的人力财力成本比较大。 to lawyu(雨淋漓)我对数据库到底是1G还是1T没有兴趣,我是对数据的类别感兴趣,需要这么大数据量的我知道的有搜索,检索,生物,医学,天文地理等方面,一般公司怎么都不可能用到G,T吧? 不就是我说的“剔除dict中不可能成为词组的成分”吗? TO xuzuning(唠叨):如果剔除了dict中不可能成为词组的成分时,那么搜索人名“徐祖宁”或者其它新名词“法 轮 功”用这种方法不是搜索不到了吗? 比如:我的家在中国经过剔除,将会这样插入表:ID word--------------1 我的1 中国这时搜索"我的","中国"将不会出现问题,但是如果我搜索"在"呢? 那岂不是搜索不到了? 比如:我的家在中国经过剔除,将会这样插入表:ID word--------------1 我的1 中国这时搜索"我的","中国"将不会出现问题,但是如果我搜索"在"呢? 那岂不是搜索不到了?-----------------------------------其实不应该像你这么考虑的,那我如果搜索"我家"呢?这个比"我在"应该更实际一些吧.如果所有情况都考虑到,这就是另一个google了.唠叨说的算法应该是最实际和普遍的了,java中流行的lucene就是用的这种得算法. 看看是不是要 www.lw86.com 这种风格,新版的织梦网站管理系统(DedeCms)有这个功能... 分词算法其实实现并不难,按不同类型的网站,没必要都要一个有几万个词汇的词典。lw86.com (论文搜索引擎) 它的实现方法是:1、搜索时会保存用户的关键字,可以在后台根据用户的关键字生成或更新字典;2、在字典中,如果出现 “企业管理”和“企业”这样的词时,会优先使用“企业管理”;3、对常用的词,如特殊符号,“了”,“啊”,“哦”这些词换成空格,然后用分词。 不知google ,baidu 这些搜索引擎的分词算法怎样! TO ddboy(留言版版主) : 可以谈谈你是怎么乱搞的吗? 从搜索的角度来说,如果搜索库不是很大,不像baidu,google这样的,完全可以这样:搜索“在线词典”:可以分成这样:"%在%线%词%典%",基本能把所有可能的词组都搜索出来的,对于海量数据搜索,可以用优化,只要有个常用单词词典就可以,比如词典里保存了"在线","词典",那么“在线词典”可以很容易分成 "%在线%词典%",所以用xuzuning,ddboy说的方法就差不多了,while (取两个字 = msubstr($str,$i++,2)){ 这两个字是单词吗?是就在词后面加%,否则跳过。}也可以搜索词典库:while (取出词典库一个单词){ $str = str_replace(取出的单词,取出的单词 .'%', $str);}当然这样也会有些问题,关于新词,还有最大匹配的问题和歧义问题分词应用在自然语言分析就会比搜索复杂多了。 大家用一下搜索引擎就会发现,分词的情况只是出现在当整词命中为0的情况下。而具体怎样分词,大家可以参考一下baidu搜索试验结果:·如果搜“徐祖宁宁”,结果为“徐祖”+“宁宁”。(搜人名的情况下,它可能有一个百家姓词典,自动将姓后第一个字归前)·搜“徐宁愿”,结果为“徐宁愿”。(说明“宁愿”归“徐”所有。同上。因为徐是姓。)·搜“徐祖宁愿”,结果为“徐祖”+“宁愿”。(因为“宁愿”是词,故“徐”只带“祖”。)·搜“徐祖宁高”,结果为“徐祖宁”。(因为“宁高”不是关键字,所以“宁”归前词所有。而“高”可能因为是单字,为提高前词搜索效率故被省略。) [求助]关于discuz里面的php,应该怎么写才能把改动提交到数据库? php终止函数运行都用return;吗? 北京PHPer求职~2年半开发经验 最近没感觉了 php与mysql数据库连接的小问题 网页关掉后程序还会继续运行吗? 求用开源软件开发的电子资源使用统计系统 求助phpmailer类应用 数据库记数器和文本记数器 define('PTR_SIZE',8)是什么意思呢? 500分跪求PHP书评论坛 一个关于onclick的问题
$text = <<< TEXT
google上搜到的全是理论 算法都没有~~ :(请研究过分词的同志谈谈分词用PHP+MySQL是如何实现的
TEXT;/*** 基本的分词函数 ***/
function word_split($text) {
preg_match_all("/[\x81-\xff].||\w+/",$text,$regs);
$tmp = split(',',preg_replace(array("/^,+|,+$/","/,+/"),array("",","),join(',',$regs[0])));
$word = array();
for($i=0;$i<count($tmp)-1;$i++) {
if(ord($tmp[$i][0])<128)
$word[] = $tmp[$i];
elseif(ord($tmp[$i+1][0])>=128)
$word[] = join('',array_slice($tmp,$i,2));
}
return $word;
}
print_r(word_split($text));
?>
得到
Array
(
[0] => google
[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] => PHP
[28] => MySQL
[29] => 是如
[30] => 如何
[31] => 何实
[32] => 实现
[33] => 现的
)供检索用的表
CREATE TABLE `dict` (
`id` int(11) NOT NULL default '0',
`word` varchar(50) NOT NULL default '',
KEY `word` (`word`)
) TYPE=MyISAM;将文章分词后连同唯一键(id)一同保存到dict中,此动作在文章入库时完成检索时
select * from dict where word='$key'
多键查询时
select * from dict where word='$key1' or word='$key2' ...在汉语中两个字的词组居多,所以拆分成两个字就可以了
当查询字串长度超过两个汉字时,先用word_split分词后组装成查询串
那么搜索人名“徐祖宁”或者其它新名词“法 轮 功”用这种方法不是搜索不到了吗?
正在研究这方面的搜索。
基本的方法是用字典,不过需要优化算法的地方太多了
不过如果数据库的表太大一般的分词程序还是使搜索很艰难。比如我们现在的mysql数据库已经有接近1G的表了
我见过的做得分词最好的就是那个海量搞的那个(绝对不是广告),可惜不提供源码,而且免费版的只提供在windows平台下面的接口
公司的数据库,mysql数据库现在不到1G,真正数据的服务器都1T多了。只是一个小公司,比我们多的有的事,具体就不讲了
现在最大的记录数应该超过了300w,会有一些问题,但搜索引擎,数据库经过一定的优化后还可以正常的使用,数据库也分别在北方和南方两个城市各4台同步(包括做数据库映射和数据备份)。以后肯定整个系统都会有大的修改,但不会脱离linux平台,短时间内还不有大的改变,毕竟涉及的人力财力成本比较大。
我对数据库到底是1G还是1T没有兴趣,我是对数据的类别感兴趣,需要这么大数据量的我知道的有搜索,检索,生物,医学,天文地理等方面,一般公司怎么都不可能用到G,T吧?
那么搜索人名“徐祖宁”或者其它新名词“法 轮 功”用这种方法不是搜索不到了吗?
经过剔除,将会这样插入表:
ID word
--------------
1 我的
1 中国
这时搜索"我的","中国"将不会出现问题,但是如果我搜索"在"呢? 那岂不是搜索不到了?
经过剔除,将会这样插入表:
ID word
--------------
1 我的
1 中国
这时搜索"我的","中国"将不会出现问题,但是如果我搜索"在"呢? 那岂不是搜索不到了?
-----------------------------------其实不应该像你这么考虑的,那我如果搜索"我家"呢?这个比"我在"应该更实际一些吧.如果所有情况都考虑到,这就是另一个google了.唠叨说的算法应该是最实际和普遍的了,java中流行的lucene就是用的这种得算法.
lw86.com (论文搜索引擎) 它的实现方法是:
1、搜索时会保存用户的关键字,可以在后台根据用户的关键字生成或更新字典;
2、在字典中,如果出现 “企业管理”和“企业”这样的词时,会优先使用“企业管理”;
3、对常用的词,如特殊符号,“了”,“啊”,“哦”这些词换成空格,然后用分词。
可以谈谈你是怎么乱搞的吗?
搜索“在线词典”:可以分成这样:"%在%线%词%典%",基本能把所有可能的词组都搜索出来的,
对于海量数据搜索,可以用优化,只要有个常用单词词典就可以,比如词典里保存了"在线",
"词典",那么“在线词典”可以很容易分成 "%在线%词典%",所以用xuzuning,ddboy说的方法就差不多了,
while (取两个字 = msubstr($str,$i++,2))
{
这两个字是单词吗?是就在词后面加%,否则跳过。
}
也可以搜索词典库:
while (取出词典库一个单词)
{
$str = str_replace(取出的单词,取出的单词 .'%', $str);
}当然这样也会有些问题,关于新词,还有最大匹配的问题和歧义问题分词应用在自然语言分析就会比搜索复杂多了。
而具体怎样分词,大家可以参考一下baidu搜索试验结果:·如果搜“徐祖宁宁”,结果为“徐祖”+“宁宁”。(搜人名的情况下,它可能有一个百家姓词典,自动将姓后第一个字归前)
·搜“徐宁愿”,结果为“徐宁愿”。(说明“宁愿”归“徐”所有。同上。因为徐是姓。)
·搜“徐祖宁愿”,结果为“徐祖”+“宁愿”。(因为“宁愿”是词,故“徐”只带“祖”。)
·搜“徐祖宁高”,结果为“徐祖宁”。(因为“宁高”不是关键字,所以“宁”归前词所有。而“高”可能因为是单字,为提高前词搜索效率故被省略。)