5

假设我们有买家和卖家试图在市场上找到对方。买家可以用关键字标记他们的需求;卖家可以对他们销售的东西做同样的事情。我有兴趣找到根据卖家的两个关键字集根据卖家与特定买家的相关性对卖家进行排名的算法。

这是一个例子:

buyer_keywords = {"furry", "four legs", "likes catnip", "has claws"} 

然后我们有两个潜在的卖家,我们需要根据它们的相关性对它们进行排序:

seller_keywords[1] = {"furry", "four legs", "arctic circle", "white"}
seller_keywords[2] = {"likes catnip", "furry", 
                      "hates mice", "yarn-lover", "whiskers"}

如果我们只使用关键字的交集,我们不会得到太多的区分:两者都在 2 个关键字上相交。如果我们将交集计数除以集合并集的大小,卖家 2 实际上做得更差,因为关键字数量更多。这似乎为任何不纠正关键字集大小的方法引入了自动惩罚(我们绝对不想惩罚添加关键字)。

为了让问题更加结构化,假设我们对关键字属性的强度有一些真实的衡量标准(每个卖家的总和必须为 1),例如:

seller_keywords[1] = {"furry":.05, 
                      "four legs":.05, 
                      "arctic circle":.8, 
                      "white":.1}

seller_keywords[2] = {"likes catnip":.5, 
                      "furry":.4, 
                      "hates mice":.02, 
                      "yarn-lover":.02, 
                      "whiskers":.06}

现在我们可以总结命中的价值:所以现在卖家 1 的得分仅为 0.1,而卖家 2 的得分为 0.9。到目前为止,一切都很好,但现在我们可能会得到第三个卖家,其关键字集非常有限,非描述性的:

seller_keywords[3] = {"furry":1}

这会将他们推到顶峰,因为他们唯一的关键字受到任何点击,这并不好。

无论如何,我的猜测(和希望)是这是一个相当普遍的问题,并且存在具有已知优势和局限性的不同算法解决方案。这可能是 CS101 中涵盖的内容,所以我认为这个问题的一个好的答案可能只是指向相关参考资料的链接。

4

2 回答 2

8

我认为您正在寻找使用余弦相似度;这是一项基本技术,可以让您在第一次 hack 中走得更远。直观地说,您创建了一个向量,其中您知道的每个标签都有一个特定的索引:

terms[0] --> aardvark
terms[1] --> anteater
...
terms[N] --> zuckerberg

然后在这个空间中为每个人创建向量:

person1[0] = 0     # this person doesn't care about aardvarks
person1[1] = 0.05  # this person cares a bit about anteaters
...
person1[N] = 0

现在每个人都是这个 N 维空间中的一个向量。然后,您可以使用余弦相似度来计算它们之间的相似度。计算上,这与求两个向量之间的夹角基本相同。您想要一个接近 1 的余弦,这意味着向量大致共线——它们在大多数维度上具有相似的值。

要改进此指标,您可能需要对向量中的元素使用tf-idf加权。Tf-idf 将淡化流行术语(例如,“iPhone”)的重要性,并提升与此人特别相关的不流行术语的重要性。

结合 tf-idf 权重和余弦相似度对于大多数此类应用程序来说效果很好。

于 2011-02-28T14:00:12.820 回答
0

您正在寻找的是所谓的分类法。标记内容并按相关顺序对其进行排序。

您可能找不到一些现成的算法,但您可以从一个实际案例开始:Drupal 分类文档提供了一些指南,并检查搜索模块的来源。

基本上,排名是基于术语的频率。如果使用少量标签定义产品,它们将具有更大的权重。仅出现在少数产品页面上的标签意味着它非常具体。你不应该以静态的方式定义你的话的强度;但在他们的上下文中检查它们。

问候

于 2011-02-28T13:44:50.843 回答