CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  PHP

◆◆  请高手谈谈分词技术用PHP+MySQL是如何实现的!  ◆◆

楼主zhiin(┈ Jcan ┈)2005-05-12 08:47:20 在 Web 开发 / PHP 提问

 
  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

相关问题

  • 出售分词组件
  • 分词(提词)函数?
  • 求中文分词词库
  • 中文分词检索系统
  • 如何理解lucene默认的中文分词结果?
  • 随便谈谈
  • 谈谈工资
  • 谈谈VC
  • 谈谈心请
  • 高分!请问哪里可以找到自动分词相关的资料!

关键词

  • 算法
  • 数据库
  • 搜索引擎
  • 查询
  • 数据
  • 分词
  • 搜索
  • 词典
  • 词
  • 徐祖

得分解答快速导航

  • 帖主:zhiin
  • kormen
  • mrshelly
  • helloyou0
  • xuzuning
  • lawyu
  • lawyu
  • Meteorlet
  • freescy2002
  • php_love
  • lawyu
  • Meteorlet
  • hahawen
  • ddboy
  • syre
  • dadwxf
  • Meteorlet
  • lzy123456
  • zairwolf
  • novo
  • photo123
  • lzy123456

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo