stojg/recommend

此包已被 弃用 且不再维护。未建议替代包。

数据挖掘库

1.0.0 2014-03-24 09:19 UTC

This package is auto-updated.

Last update: 2022-12-12 09:20:42 UTC


README

Build Status Code Coverage Scrutinizer Quality Score StyleCI

此库应使查找不同事物之间的推荐和相似性变得更简单。我为它开发了一些用例

  • 向用户推荐音乐专辑/艺术家列表
  • 推荐与用户当前阅读的文章类似的文章
  • 找到与另一个用户有相同价值观的其他用户(想想配对 ;)

安装

将此库安装到项目的最简单方法是使用 composer

$ composer require stojg/recommend

使用

假设我们有一些数据,其中用户对音乐艺术家在1到5的范围内进行了评分

$artistRatings = array(
	"Abe" => array(
		"Blues Traveler" => 3,
		"Broken Bells" => 2,
		"Norah Jones" => 4,
		"Phoenix" => 5,
		"Slightly Stoopid" => 1,
		"The Strokes" => 2,
		"Vampire Weekend" => 2
	),
	"Blair" => array(
		"Blues Traveler" => 2,
		"Broken Bells" => 3,
		"Deadmau5" => 4,
		"Phoenix" => 2,
		"Slightly Stoopid" => 3,
		"Vampire Weekend" => 3
    ),
	"Clair" => array(
		"Blues Traveler" => 5,
		"Broken Bells" => 1,
		"Deadmau5" => 1,
		"Norah Jones" => 3,
		"Phoenix" => 5,
		"Slightly Stoopid" => 1
	)
);

然后我们将这些数据加载到 Data 类中

$data = new \stojg\recommend\Data($artistRatings);

如果我们想找到布莱尔可能喜欢的艺术家,我们执行推荐方法。

$recommendations = $data->recommend('Blair', new \stojg\recommend\strategy\Manhattan());
var_export($recommendations);

该计算的结果将是

array (
  0 => array (
	'key' => 'Norah Jones',
	'value' => 4,
  ),
  1 => array (
	'key' => 'The Strokes',
	'value' => 2,
  )
)

这意味着布莱尔可能喜欢 Norah Jones 而不喜欢 The Strokes

推荐器通过在 $artistRatings 中找到与布莱尔评分相似的某人来工作。在这种情况下,结果是艾贝,然后它尝试找到艾贝评分但布莱尔没有评分的艺术家,并将它们作为推荐列表返回。

“最近邻”的查找方式取决于选择哪种策略以及数据集的大小和密度。

数据集

一般来说,数据集越大越好。它必须按照以下格式格式化为数组

array(
	'uniqueID' => array(
		'objectID' => (int)'rating'
	)
);

在先前的艺术家评分示例中

* uniqueID = Blair
* objectID = Music Artist
* rating = an numeric value

策略

目前有三种策略,选择哪种策略取决于数据的组织和填充方式。

曼哈顿

如果数据密集(几乎所有的 objectID 在完整数据集中都有非空评分)并且属性值(评分)的大小很重要,这是一个很好的策略。

即所有用户都对所有音乐艺术家进行了评分,并且他们都在同一尺度上达成一致。

皮尔逊

如果数据密集但评分存在评分膨胀,请使用此策略。

即如果用户A对所有艺术家进行了2-4的评分,而用户B对所有艺术家进行了4-5的评分,此策略试图补偿用户A的2分等于用户B的4分的事实。

余弦

如果数据稀疏,请选择此策略。

即如果有包含一万个艺术家的列表,用户很可能只听了其中的一小部分并对其进行了评分。

文章

提供了一个辅助类,用于推荐与另一篇文章类似的文章。实现相当简单,但它应该会给你一个提示,告诉你如何使用自己的数据集扩展此库。

用法

$articleData = new \stojg\recommend\ArticleData();
$allArticles = getFromDatabase();
foreach($allArticles as $article) {
       $articleData->push($article->id, $article->content);
   }
  $recommendedArticle = $articleData->recommend($articleID = 4);