用于单词聚类/ NLP的PHP库?

时间:2011-11-02 11:05:04

标签: php nlp cluster-analysis information-retrieval

我想要实现的是一个相当微不足道的“获取搜索结果(如标题和简短描述),将它们聚合成有意义的命名组”PHP中的程序。

经过数小时的谷歌搜索和无数次搜索(尽管总是产生有趣的结果,虽然没什么用处)但我仍然无法找到任何可以帮助我处理聚类的PHP库。

  • 那里有一个我可能错过的PHP库吗?
  • 如果没有,是否有任何处理群集的FOSS并且有一个不错的API?

6 个答案:

答案 0 :(得分:5)

像这样:

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

停用词必须是所有常用英语术语的列表。它还应该包括标点符号,你需要首先将所有标点符号preg_replace成一个单独的单词,例如“像这样的东西。” - > “像这样的东西。”或者,您可以删除所有标点符号。

$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);

现在,您有一个关联数组,按照输入数据中出现的术语频率的顺序排列。

您希望如何进行匹配取决于您,这在很大程度上取决于输入数据中字符串的长度。

我会看到前三个数组键中的任何一个是否与数据中任何其他前三个数组中的任何一个匹配。这些就是你的小组。

如果您对此有任何疑问,请告诉我。

答案 1 :(得分:2)

“......将它们聚集成有意义的群体”有点模糊,你需要更具体。

对于初学者,您可以查看K-Means聚类。

查看此页面和网站:

PHP/irInformation Retrieval and other interesting topics

编辑:您可以通过交叉引用搜索结果来尝试一些数据挖掘,例如打开目录dmoz RDF数据转储,然后枚举匹配的类别。

EDIT2 :这是一个dmoz / category问题,也提到了“分面搜索”!

Dmoz/Monster algorithme to calculate count of each category and sub category?

答案 2 :(得分:1)

如果你这样做只是为了英文,你可以使用WordNet:http://wordnet.princeton.edu/。它是一种广泛用于研究的词典,除其他外,还提供英语单词的同义词集。然后,两个单词之间的最短距离可以作为一个相似度量,以自己聚集为zaf提议。

显然,这里有一个WordNet的PHP界面:http://www.foxsurfer.com/wordnet/。它提出了这个问题:How to use word Net with php,但我还没试过。但是,与PHP自己的命令行工具连接也是可行的。

答案 3 :(得分:1)

您还可以查看Toby Segaran的Programming Collective Intelligence(第3章:发现群组),其中介绍了使用Python的这个用例。但是,一旦了解了它的工作原理,您就应该能够在PHP中实现它。

即使它不是PHP,Carrot2项目也提供了几个集群引擎,可以与Solr集成。

答案 4 :(得分:0)

这可能很遥远,但请查看OpenCalais。他们有一个Web服务,允许您传递一个文本块,它将传递给您回复它在文本中找到的事物的可解析的响应,例如地点,人物,事实等。您可以使用这些类别来构建您的“云”,也选择要显示的结果。

我已经在php中使用了这个库几次,并且它总是很容易使用。

同样,可能与您尝试做的事情无关。也许你可以发一个你想要完成的事情的例子吗?

答案 5 :(得分:0)

如果您可以预先定义分面搜索的过滤器(命名组),那么它将更容易。

不是依赖于使用当前搜索者输入及其特定结果生成过滤器列表的算法,而是使用所有用户最常执行的搜索的聚合,然后如果匹配则使用它们标记结果。 / p>

您最终会在多对多联接中将表格(或其他内容)连接到一个标记表,因此每个结果网址都可以包含多个相应的标记。

当用户搜索时,您只需将搜索与完整索引匹配即可。但是对于过滤器,您可以从当前结果集中获取最佳结果。

如果你愿意,我会处理查询示例。