2

我正在为我的应用程序创建一个新的搜索系统。现在的想法是使用查询松弛来从数据库中获得更广泛的结果,然后计算它与用户的相关性。问题出在算法上。我正在考虑使用最近邻算法,但我对如何使用它有点不确定。

如何获取数据库中记录与用户搜索的相关性(以 % 为单位)?

我需要在属性distancecategory中执行此操作。换句话说,当我查询数据库时,距离乘以 2 并且通过选择它的父类别来放宽类别。

一个例子:如果用户搜索最远 30 公里外的东西并且类别是“足球”,我将从数据库中获取直到 60 公里的所有记录和“ballSports”(在树中,如:sports->fullContact ->ballSports->soccer,所以我会参加足球、橄榄球、橄榄球等运动)。

还需要考虑用户属性的权重来计算此百分比。如果用户认为类别比距离更重要,则在计算相关性时必须考虑到这一点。

类别树的一个很好的例子和计算距离的公式可以在第 3 页找到:http ://reference.kfupm.edu.sa/content/d/i/a_distributed_case_based_reasoning_appli_58512.pdf

如何将该公式应用于属性?顺便说一句,我使用的是 MongoDB,所以所有数据都在文档中,与其他表没有关系。

谢谢

4

1 回答 1

2

我从假设您使用经典关系数据库和表具有如下平面结构的搜索结果开始:

| 类别 ID | 纬度 | 经度 | parentCategoryId |

因此,基于父类别的放松类别可能是基于用户输入的类别的父节点对子节点的简单树搜索(假设您已经在内存中创建树)。您可以在类别表上使用 sql 连接,但根据我的经验,它更好地将算法的东西应用到 java - 它更容易测试/重构,并且您可以获得各种具有预测时间/空间复杂性的算法。另一方面,Sqls 可能会让您对执行计划成本有些头疼,这有时在不同的数据库提供者之间会有很大差异。

如何根据距离和多类别匹配获得与用户的相关性百分比?如果用户输入足球,首先显示什么 - 足球或红宝石?

嗯,这是一个非常好的问题,我不知道有什么好的答案,但我要做的是使用来自谷歌搜索的现有数据以下列方式:鉴于用户输入了足球球类运动的子项)

  • 为所有按距离排序的足球比赛分配最高相关性(用户输入)
  • 根据字球运动(父类别)与子类别名称一起使用的 频率,将相关性分配给相关类别。
    • 对于 ' ball sport football ',在谷歌搜索中将是 ' 599,000,000 ' 结果
    • 对于 ' ball sport rugby ' 这将是'89 ,200,000 ' 在谷歌搜索中的结果
    • 基于上述,显示所有足球比赛按距离排序,然后是所有足球比赛(谷歌排名第一),然后是所有橄榄球比赛(谷歌排名第二)。

谷歌搜索结果排名您可以轻松地以编程方式预先计算或动态检索(除非您计划经常更改类别,否则我不会动态进行)

作为用户,我会对这个输出感到满意,让我知道你的想法:-)

编辑:我读过论文,看起来在你的情况下,相似度公式可以简化为计算两个词之间的相似度。

做到这一点的一种方法是获得两个类别的单词 gram 的谷歌排名('足球橄榄球'会给你'199,000,000'和'足球足球'会给你'441,000,000')。它看起来足够好。

为什么我对谷歌排名如此着迷?这些人拥有基于体育网站、文章及其与您的领域问题相关的数据的大量数据。如果是论文(Western Air Ltd.) - 他们的数据特定于他们的内部领域,他们必须使用他们的领域来处理我们的相似性(如特征数量,每个特征的重要性权重等)

于 2012-10-01T12:06:20.980 回答