◆◆ 请高手谈谈分词技术用PHP+MySQL是如何实现的! ◆◆
google上搜到的全是理论 算法都没有~~ :(
请研究过分词的同志谈谈分词用PHP+MySQL是如何实现的~~~~~~
问题点数:50、回复次数:55Top
1 楼kormen()回复于 2005-05-12 08:52:20 得分 2
分词??啥技术来的?关注。Top
2 楼mrshelly(Shelly)回复于 2005-05-12 09:08:19 得分 1
1 一个词语库。
2 正则~~~~~~~~~~~
如果你还想要加点人工智能。那就比较复杂了~~~~~~Top
3 楼zhiin(┈ Jcan ┈)回复于 2005-05-12 09:20:05 得分 0
比如我这儿有词组字典与权重字典~
我该如何结合这个与正则一起来实现分词呢?
能说说算法如何实现吗?Top
4 楼helloyou0(你好!)回复于 2005-05-12 09:36:10 得分 1
这个东东用php做肯定很慢Top
5 楼xuzuning(唠叨)回复于 2005-05-12 10:12:52 得分 4
<?php
$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分词后组装成查询串
Top
6 楼xuzuning(唠叨)回复于 2005-05-12 10:21:33 得分 0
你还可以剔除dict中不可能成为词组的成分,以减小dict的规模
Top
7 楼zhiin(┈ Jcan ┈)回复于 2005-05-12 10:45:27 得分 0
如果剔除了dict中不可能成为词组的成分时,
那么搜索人名“徐祖宁”或者其它新名词“法 轮 功”用这种方法不是搜索不到了吗?Top
8 楼lawyu(雨淋漓)回复于 2005-05-12 11:58:06 得分 3
强烈关注!
正在研究这方面的搜索。
基本的方法是用字典,不过需要优化算法的地方太多了
不过如果数据库的表太大一般的分词程序还是使搜索很艰难。比如我们现在的mysql数据库已经有接近1G的表了
我见过的做得分词最好的就是那个海量搞的那个(绝对不是广告),可惜不提供源码,而且免费版的只提供在windows平台下面的接口Top
9 楼lawyu(雨淋漓)回复于 2005-05-12 12:03:23 得分 2
另外国外有几种开源的搜索技术,可以参考一下。当然opensourse的终究不可能那么完美Top
10 楼zhiin(┈ Jcan ┈)回复于 2005-05-12 12:10:52 得分 0
谁有好的算法分享一下~~~~~~
Top
11 楼Meteorlet(http://smartdict.cn)回复于 2005-05-12 13:08:50 得分 2
to lawyu(雨淋漓): 你什么数据这么多都上G了?Top
12 楼freescy2002(我要努力)回复于 2005-05-12 13:10:51 得分 2
mark一下Top
13 楼lawyu(雨淋漓)回复于 2005-05-12 13:14:36 得分 0
to:Meteorlet
公司的数据库,mysql数据库现在不到1G,真正数据的服务器都1T多了。只是一个小公司,比我们多的有的事,具体就不讲了Top
14 楼php_love(学习PHP,做个好人)回复于 2005-05-12 14:00:52 得分 2
关注Top
15 楼xuzuning(唠叨)回复于 2005-05-12 14:58:16 得分 0
当单个表的记录数大于100万时,请换用大型数据库。否则效率是很低的!
Top
16 楼unijune(uni)回复于 2005-05-12 16:19:40 得分 0
PHPBB 怎么分词的,有人研究过吗?Top
17 楼lawyu(雨淋漓)回复于 2005-05-12 16:21:53 得分 2
TO: xuzuning(唠叨)
现在最大的记录数应该超过了300w,会有一些问题,但搜索引擎,数据库经过一定的优化后还可以正常的使用,数据库也分别在北方和南方两个城市各4台同步(包括做数据库映射和数据备份)。以后肯定整个系统都会有大的修改,但不会脱离linux平台,短时间内还不有大的改变,毕竟涉及的人力财力成本比较大。Top
18 楼zhiin(┈ Jcan ┈)回复于 2005-05-12 16:38:21 得分 0
好像各位都脱离我的问题了:
比如我这儿有词组字典与权重字典~
我该如何结合这个与正则一起来实现分词呢?
能说说算法如何实现吗?
Top
19 楼Meteorlet(http://smartdict.cn)回复于 2005-05-12 17:29:24 得分 4
to lawyu(雨淋漓)
我对数据库到底是1G还是1T没有兴趣,我是对数据的类别感兴趣,需要这么大数据量的我知道的有搜索,检索,生物,医学,天文地理等方面,一般公司怎么都不可能用到G,T吧?Top
20 楼xuzuning(唠叨)回复于 2005-05-13 08:07:35 得分 0
“比如我这儿有词组字典与权重字典~
我该如何结合这个与正则一起来实现分词呢?
能说说算法如何实现吗?”
给出数据结构,这样才有讨论的基础
Top
21 楼zhiin(┈ Jcan ┈)回复于 2005-05-13 12:39:24 得分 0
词组字典中的一段为:
啊哈
阿爸
阿宝
阿尔巴尼亚
阿尔卑斯山脉
阿尔及尔
阿尔及利亚
阿尔泰山
阿凡提
阿富汗
阿根廷
阿克苏
阿拉伯
阿拉法特
阿里
阿曼
阿门
阿婆
阿斯特
阿嚏
阿姨
阿訇
腌臜
埃及
挨打
捱打
挨饿
捱饿
挨罚
挨骂
哎呀
唉呀
哎哟
唉声叹气
哀兵必败
哀愁
哀辞
哀悼
捱到
权重字典中的一段为:
中国 152
经济 128
企业 123
国家 119
记者 118
我们 116
问题 112
全国 106
人民 102
发展 100
社会 98
进行 97
市场 96
政府 96
本报 96
他们 95
北京 92
我国 87
国际 86
关系 85
公司 85
美国 84
世界 83
地区 82
重要 81
新华社 80
技术 80
会议 80
自己 79
干部 78
职工 78
群众 77
没有 77
今天 76
同志 76
部门 75
加强 75
组织 75
方面 74
通过 72
提高 72
科技 71
金融 70
人员 70
领导 70
文化 70
要求 69
历史 68
今年 68
目前 68
中央 67
情况 67
总理 67
银行 67
主席 66
政策 66
解决 66
报道 66
主要 66
可以 66
精神 66
同时 66
认为 65
社会主义 65
表示 65
提出 65
农业 65
实现 65
这个 65
建立 65
就是 64
举行 64
成为 64
去年 64
农民 64
这些 64
工程 64
作为 64
参加 63
基础 62
香港 62
产品 62
农村 62
代表 62
政治 61
单位 61
进一步 61
制度 61
必须 61
改革 60
图片 60
水平 59
机构 59
思想 59
特别 59
项目 59
提供 59
环境 59
总统 59
委员会 59
坚持 58
需要 58
作用 58
日本 58
这样 58
开始 58
人们 57
世纪 57
取得 57
继续 56
资金 56
国务院 56
学习 56
事业 56
美元 56
以来 55
以及 55
中心 55
质量 55
这种 55
城市 55
指出 55
现在 54
地方 54
决定 54
规定 54
条件 54
共同 54
集团 54
法律 54
增加 54
由于 54
时间 54
促进 54
其中 54
民族 54
为了 54
不断 53
产业 53
已经 53
开展 53
理论 53
希望 53
就业 52
采取 52
得到 52
书记 52
措施 51Top
22 楼xuzuning(唠叨)回复于 2005-05-13 14:26:12 得分 0
不就是我说的“剔除dict中不可能成为词组的成分”吗?Top
23 楼zhiin(┈ Jcan ┈)回复于 2005-05-13 14:47:37 得分 0
TO xuzuning(唠叨):
如果剔除了dict中不可能成为词组的成分时,
那么搜索人名“徐祖宁”或者其它新名词“法 轮 功”用这种方法不是搜索不到了吗?
Top
24 楼xuzuning(唠叨)回复于 2005-05-13 14:56:09 得分 0
“徐祖宁”会收录到你的词组字典中吗?深表怀疑Top
25 楼zhiin(┈ Jcan ┈)回复于 2005-05-13 15:05:33 得分 0
比如:我的家在中国
经过剔除,将会这样插入表:
ID word
--------------
1 我的
1 中国
这时搜索"我的","中国"将不会出现问题,但是如果我搜索"在"呢? 那岂不是搜索不到了?Top
26 楼zhiin(┈ Jcan ┈)回复于 2005-05-14 10:20:13 得分 0
UP UPTop
27 楼hahawen(变态的大龄青年)回复于 2005-05-14 10:37:49 得分 4
比如:我的家在中国
经过剔除,将会这样插入表:
ID word
--------------
1 我的
1 中国
这时搜索"我的","中国"将不会出现问题,但是如果我搜索"在"呢? 那岂不是搜索不到了?
-----------------------------------
其实不应该像你这么考虑的,那我如果搜索"我家"呢?这个比"我在"应该更实际一些吧.
如果所有情况都考虑到,这就是另一个google了.
唠叨说的算法应该是最实际和普遍的了,java中流行的lucene就是用的这种得算法.
Top
28 楼xuzuning(唠叨)回复于 2005-05-14 11:41:32 得分 0
是否需要剔除得由你自己决定的,剔除后当会使命中率下降
我的家在中国
拆分为:我的 的家 家在 在中 中国
显然“家在”是不能被剔除的
单独搜索一个字,比如“在”是没有多大意义的。因为他可以与其他字组成很多具有不同意义的词组
当然这并不但指“在”
你可以考察一下“全文检索”,他对出现频率较高的词都是“视而不见”的
Top
29 楼ddboy(留言版版主)回复于 2005-05-14 13:25:59 得分 4
看看是不是要 www.lw86.com 这种风格,新版的织梦网站管理系统(DedeCms)有这个功能...
Top
30 楼ddboy(留言版版主)回复于 2005-05-14 13:30:14 得分 0
分词算法其实实现并不难,按不同类型的网站,没必要都要一个有几万个词汇的词典。
lw86.com (论文搜索引擎) 它的实现方法是:
1、搜索时会保存用户的关键字,可以在后台根据用户的关键字生成或更新字典;
2、在字典中,如果出现 “企业管理”和“企业”这样的词时,会优先使用“企业管理”;
3、对常用的词,如特殊符号,“了”,“啊”,“哦”。。。这些词换成空格,然后用分词。
Top
31 楼ddboy(留言版版主)回复于 2005-05-14 13:41:27 得分 0
另外,关于速度问题,其实一本小词典和楼上某人所说的1G数据相比(就算是几十M),字典查询占的资源简直可以勿略,所以分词算法并不需过度考虑性能问题。
Top
32 楼zhiin(┈ Jcan ┈)回复于 2005-05-14 17:08:38 得分 0
单独搜索一个字,比如“在”是没有多大意义的。因为他可以与其他字组成很多具有不同意义的词组
当然这并不但指“在”
--------------------------------------------------------
单独搜索一个字可能没什么意义,但是搜索一个人的名字有意义吧!
如果一个搜索连一些人名都搜索不出那还有什么意义?Top
33 楼zhiin(┈ Jcan ┈)回复于 2005-05-14 17:09:30 得分 0
不知google ,baidu 这些搜索引擎的分词算法怎样!Top
34 楼ddboy(留言版版主)回复于 2005-05-14 22:34:02 得分 0
单独搜索一个字可能没什么意义,但是搜索一个人的名字有意义吧!
如果一个搜索连一些人名都搜索不出那还有什么意义?
------------------------------------------------------------
其实词典是这样处理的,如果有
"在职"这个词,分析时先分离出来,到最后把未知词中的常用字符去除,至于词汇问题,一般应用中,可以加入适当的人工干扰,分词只能是保证大部份准确,不可能100%准确的,因为网络的特点是不断出现新词.
Top
35 楼zhiin(┈ Jcan ┈)回复于 2005-05-15 00:38:46 得分 0
楼上的观点我还是不大明白:(
用这种分词方法了那么人名到底是搜到还是搜不到呢?Top
36 楼syre(神仙)回复于 2005-05-15 10:59:58 得分 2
分开的是关键字
比如搜索徐祖宁
这几个字如果不在词典里面可以每个字单独作为单词
同时最大匹配还是会把有“徐祖宁”这个名字的内容搜索出来的
Top
37 楼ddboy(留言版版主)回复于 2005-05-15 12:59:45 得分 0
我不建议把一个字作为一个词的搜索方式,国内好像有一个什么搞分词的,感觉分得乱七八糟,还不如我随便搞搞....
Top
38 楼dadwxf(三个夏天)回复于 2005-05-15 13:57:58 得分 1
mark 一下,要用的时候再来仔细研究Top
39 楼zhiin(┈ Jcan ┈)回复于 2005-05-15 14:00:28 得分 0
TO ddboy(留言版版主) :
可以谈谈你是怎么乱搞的吗?Top
40 楼www0aspsun0com(源码联盟)回复于 2005-05-15 20:28:27 得分 0
做个记号,学习学习Top
41 楼Meteorlet(http://smartdict.cn)回复于 2005-05-16 11:24:11 得分 3
从搜索的角度来说,如果搜索库不是很大,不像baidu,google这样的,完全可以这样:
搜索“在线词典”:可以分成这样:"%在%线%词%典%",基本能把所有可能的词组都搜索出来的,
对于海量数据搜索,可以用优化,只要有个常用单词词典就可以,比如词典里保存了"在线",
"词典",那么“在线词典”可以很容易分成 "%在线%词典%",所以用xuzuning,ddboy说的方法就差不多了,
while (取两个字 = msubstr($str,$i++,2))
{
这两个字是单词吗?是就在词后面加%,否则跳过。
}
也可以搜索词典库:
while (取出词典库一个单词)
{
$str = str_replace(取出的单词,取出的单词 .'%', $str);
}
当然这样也会有些问题,关于新词,还有最大匹配的问题和歧义问题。。。
分词应用在自然语言分析就会比搜索复杂多了。Top
42 楼lzy123456(lzy)回复于 2005-05-16 12:35:46 得分 2
词表中应该不会收录每个作者的姓名。
所以搜到的作者名字我认为应该不是从词表中查出来的吧。
还有,分词算法好多种,有正向最短,正向最长,逆向最短,逆向最长匹配算法。这些可以书上会有详细算法介绍。
唠叨说两字词多,都分成两字词,这个说法我不赞同。应该根据实际情况切分为好吧。Top
43 楼zhiin(┈ Jcan ┈)回复于 2005-05-16 20:43:31 得分 0
哇 好复杂!
不知道谁有现成的源码舍得分享一下!~~`Top
44 楼abaowu(阿宝)回复于 2005-05-17 00:07:52 得分 0
markTop
45 楼zairwolf(君子兰)回复于 2005-05-17 08:15:49 得分 3
大家用一下搜索引擎就会发现,分词的情况只是出现在当整词命中为0的情况下。
而具体怎样分词,大家可以参考一下baidu搜索试验结果:
·如果搜“徐祖宁宁”,结果为“徐祖”+“宁宁”。(搜人名的情况下,它可能有一个百家姓词典,自动将姓后第一个字归前)
·搜“徐宁愿”,结果为“徐宁愿”。(说明“宁愿”归“徐”所有。同上。因为徐是姓。)
·搜“徐祖宁愿”,结果为“徐祖”+“宁愿”。(因为“宁愿”是词,故“徐”只带“祖”。)
·搜“徐祖宁高”,结果为“徐祖宁”。(因为“宁高”不是关键字,所以“宁”归前词所有。而“高”可能因为是单字,为提高前词搜索效率故被省略。)Top
46 楼novo(探索-学习-创新)回复于 2005-05-17 08:23:46 得分 2
一般为查字典吧,不断采集新词汇Top
47 楼ddboy(留言版版主)回复于 2005-05-17 08:54:18 得分 0
搜索人名其实没什么呀,如果是词典没有的词汇,直接搜索就是了,分解什么呀?
徐祖宁 就直接用 徐祖宁 啰
假如: 徐祖宁的妈妈 一般都会被分解为: 徐祖宁 妈妈
这样还有什么不行的地方呀!
当然词典会自动记忆这个词,如果存在 “徐祖宁”这个词,那么会优先采用,如果不存在,存在“徐祖”这个词,但不存在“徐祖宁”,那么实际上分解为:“徐祖 妈妈 宁”
这样还是可以搜索得到徐祖宁的妈妈的!
Top
48 楼zhiin(┈ Jcan ┈)回复于 2005-05-17 10:57:26 得分 0
搜索人名其实没什么呀,如果是词典没有的词汇,直接搜索就是了,分解什么呀?
-----------------------------------------------------------------------
如果词典没有就直接从文章表中搜索吗?
这样是不是影响速度了?Top
49 楼photo123(烂柯居士)回复于 2005-05-17 22:47:52 得分 2
记得以前看到过一种思路,可以解决一些姓名等的分词问题
如果同一组顺序字在文章中反复出现,即可以认为是一个词Top
50 楼leojay1(绯村剑心)回复于 2005-05-17 22:56:19 得分 0
顶~关注Top
51 楼simonlsy(西大浪人)回复于 2005-05-17 23:36:09 得分 0
谁把海量研究版的转成PHP版的就OK了Top
52 楼zhiin(┈ Jcan ┈)回复于 2005-05-18 13:54:37 得分 0
谁把海量研究版的转成PHP版的就OK了
---------------------------------
顶Top
53 楼ddboy(留言版版主)回复于 2005-05-18 16:11:05 得分 0
按楼上的,用权重的方法也不错,但如果有数万个词,我看弄到你手抽筋都弄不完
如果结合搜索引擎的话,可以按搜索次数,或者直接用长度,长的优先也不失是个办法,我举个简单的例子:
网页设计
和
设计
这两词,你就很难定他们的权重了
这情情况,我按长的优先的原则反而有用
Top
54 楼lzy123456(lzy)回复于 2005-05-18 22:01:17 得分 2
为什么不统计 网页设计和设计在文章中出现的次数呢,这样词频不就统计出来了吗,然后这两个词所在的句子的权重根据公式可以计算的
Top
55 楼ddboy(留言版版主)回复于 2005-05-19 10:02:54 得分 0
“统计网页设计和设计在文章中出现的次数”
这样已经是不同的一个级次的查询了,如果直接搜索只用一秒的话,结合起来词频统计就要十秒,这种除了像google这么大型的应用,如果是一般的信息索引,没必要如此,毕竟增加的成本可能上十倍,有点得不偿失。
Top




