用于单词聚类/自然语言处理的PHP库?

7
我正在尝试实现一个相当平凡的“将搜索结果(标题和简短说明)聚类成有意义的命名组”的PHP程序。
经过数小时的谷歌搜索和无数次在SO上搜索(总是得到有趣的结果,但没有真正有用的),我仍然找不到任何PHP库可以帮助我处理聚类。
  • 是否有这样一个PHP库我错过了?
  • 如果没有,是否有任何自由开源软件来处理聚类,并且具有良好的API?

3
基于什么对它们进行聚类?对你来说,什么是有意义的组别? - netcoder
请定义“有意义的命名组”。 - hakre
@netcoder:在一个通用的聚类库中,这并不重要。特征的选择应该决定产生什么样的群组。 - Fred Foo
6个回答

5

像这样:

使用停用词列表,获取所有不在停用词中的单词或短语,计算每个出现次数,按降序排序。

停用词需要是所有常见的英文词汇列表。它还应包括标点符号,并且您需要先preg_replace所有标点符号成为一个单独的单词,例如 "Something, like this." -> "Something , like this ." 或者,您可以直接删除所有标点符号。

$content=preg_replace('/[^a-z\s]/', '', $content); // remove punctuation

$stopwords='the|and|is|your|me|for|where|etc...';
$stopwords=explode('|',$stopwords);
$stopwords=array_flip($stopwords);

$result=array(); $temp=array();
foreach ($content as $s)
if (isset($stopwords[$s]) OR strlen($s)<3)
 {
 if (sizeof($temp)>0)
  {
  $result[]=implode(' ',$temp);
  $temp=array();
  }            
 } else $temp[]=$s;
if (sizeof($temp)>0) $result[]=implode(' ',$temp);

$phrases=array_count_values($result);
arsort($phrases);

现在您有一个按照输入数据中出现频率排序的关联数组。
如何进行匹配取决于您,这主要取决于输入数据中字符串的长度。
我会查看前三个数组键是否与数据中任何其他顶部三个匹配。然后它们就是您的组。
如果您对此有任何困难,请告诉我。

我忘了先提到strtolower(),虽然这应该很明显。 - Alasdair

2
"...将它们聚类成有意义的群组"有点含糊,您需要更具体一些。首先,您可以研究K-Means聚类。请查看此页面和网站:PHP/信息检索和其他有趣的主题编辑:您可以通过将搜索结果与像dmoz RDF数据转储这样的开放目录进行交叉引用,然后枚举匹配的类别来尝试一些数据挖掘。 编辑2:这里是一个关于dmoz/category的问题,也提到了“Faceted Search”!Dmoz/Monster算法计算每个类别和子类别的数量?

谢谢,我已经找到了那个......虽然这是一篇有趣的阅读材料和好的示例代码,但它远不能成为一个库。至于“有意义的组”,这个 Yippy 搜索(注意他们称之为“云”) 很好地说明了我正在尝试实现的东西。 - vzwick
@vzwick:您的意思是...分面? - netcoder
@vzwick 啊,示例网站解释得很清楚。简单的答案是不行 - 你不会找到一个库来自动化地为你完成这个任务。 - zaf

1

如果你只是针对英语进行这个操作,你可以使用WordNet:http://wordnet.princeton.edu/。它是一个广泛用于研究的词典,提供了英语单词的同义词集合等内容。然后,两个单词之间的最短距离可以作为相似性度量来进行聚类,就像 zaf 提出的那样。

显然,这里有一个与WordNet相关的PHP接口:http://www.foxsurfer.com/wordnet/。它在这个问题中被提及:如何使用PHP和WordNet,但我没有尝试过。不过,从PHP向命令行工具进行接口交互也是可行的。


1
你也可以查看Toby Segaran的Programming Collective Intelligence(第3章:发现群组),该书使用Python介绍了这种情况。然而,一旦你理解了它的工作原理,你应该能够在PHP中实现相同的功能。
即使它不是PHP,Carrot2项目提供了几个聚类引擎,并且可以与Solr集成。

0
这可能有些偏离主题,但可以看看OpenCalais。他们有一个Web服务,允许您传入一段文本,它会返回可解析的响应,其中包括在文本中发现的事物,如地点、人物、事实等。您可以使用这些类别来构建您的“云”,并选择要显示的结果。
我已经在PHP中使用过这个库几次,而且一直很容易使用。
再次强调,也许与您想要完成的任务无关。也许您可以发布一个示例,说明您想要完成什么?

0

如果您可以预定义聚合搜索的筛选器(命名组),那么它将变得更加容易。

与依靠使用当前搜索者的输入和他们特定的结果来生成过滤器列表的算法不同,您将使用所有用户最常执行的搜索的聚合,并在匹配时为其标记结果。

您最终会得到一个URL的表格(或其他内容),该表格与标签的表格进行多对多连接,因此每个结果URL可以有几个适当的标签。

当用户搜索时,您只需将其搜索与完整索引进行匹配。但是对于筛选器,您需要从当前结果集中选择前几个结果。

如果您想要查询示例,我可以提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接