用于词聚类/NLP 的 PHP 库?

Posted

技术标签:

【中文标题】用于词聚类/NLP 的 PHP 库?【英文标题】:PHP library for word clustering/NLP? 【发布时间】:2011-12-20 05:26:37 【问题描述】:

我试图实现的是一个相当简单的“获取搜索结果(如标题和简短描述),将它们聚集到有意义的命名组中”在 php 中的程序。

经过数小时的谷歌搜索和无数次 SO 搜索(一如既往地产生有趣的结果,尽管没有什么真正有用的结果),我仍然找不到任何可以帮助我处理集群的 PHP 库。

有没有我可能错过的 PHP 库? 如果没有,是否有任何 FOSS 可以处理集群并具有不错的 API?

【问题讨论】:

根据什么对它们进行聚类?什么是对你有意义的团体? 请定义“有意义的命名组”。 @netcoder:在通用集群库中,这无关紧要。特征的选择应该决定产生什么样的组。 【参考方案1】:

像这样:

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

停用词必须是所有常用英语术语的列表。它还应该包括标点符号,您需要先将所有标点符号 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);

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

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

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

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

【讨论】:

我忘了先提到 strtolower(),虽然它应该很明显。【参考方案2】:

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

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

您最终会得到一个多对多连接到标签表的 URL 表(或其他东西),因此每个结果 url 可以有几个适当的标签。

当用户搜索时,您只需将他们的搜索与完整索引进行匹配。但对于过滤器,您会从当前结果集中获取排名靠前的结果。

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

【讨论】:

【参考方案3】:

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

我在 php 中使用过这个库几次,而且它总是很容易使用。

同样,可能与您尝试做的事情无关。也许您可以发布一个您尝试完成的示例?

【讨论】:

【参考方案4】:

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

尽管不是 PHP,Carrot2 项目提供了多个集群引擎,并且可以与 Solr 集成。

【讨论】:

【参考方案5】:

如果您仅针对英语进行此操作,则可以使用 WordNet:http://wordnet.princeton.edu/。它是一个广泛用于研究的词典,除其他外,它提供了英语单词的同义词集。然后,两个词之间的最短距离可以作为相似度指标,按照 zaf 的建议对自己进行聚类。

显然这里有一个 WordNet 的 PHP 接口:http://www.foxsurfer.com/wordnet/。它出现在这个问题中:How to use word Net with php,但我还没有尝试过。但是,您自己也可以通过 PHP 与命令行工具进行交互。

【讨论】:

【参考方案6】:

“...将它们分成有意义的组”有点含糊,您需要更具体。

对于初学者,您可以研究 K-Means 聚类。

看看这个页面和网站:

PHP/irInformation Retrieval and other interesting topics

编辑:您可以自己尝试一些数据挖掘,方法是使用诸如打开目录dmoz RDF 数据转储之类的东西交叉引用搜索结果,然后枚举匹配的类别。

EDIT2:这是一个 dmoz/类别问题,其中还提到了“分面搜索”!

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

【讨论】:

谢谢,我已经找到了……虽然是一本有趣的读物和很好的示例代码,但它远不是一个库。至于“有意义的群体”,this Yippy search (mind what they call "clouds") 很好地说明了我正在努力实现的目标。 @vzwick:你的意思是……刻面? @vzwick 啊,示例站点说明了一切。简单的答案是否定的——你不会找到一个库来自动为你做这件事。

以上是关于用于词聚类/NLP 的 PHP 库?的主要内容,如果未能解决你的问题,请参考以下文章

java中的词聚类

用于聚类(和分类)短句的 NLP bag-of-words/TF-IDF

为 NLP 聚类/主题建模寻找一个好的数据集

用于距离聚类的 Python 库

用于距离聚类的 Python 库

内置降维聚类等算法,时间序列数据分析Python库Deeptime