0

我目前正在尝试弄清楚如何计算两条记录之间的相似度。我的第一条记录来自一个停用的广告——所以我想找到例如关于某些 VARCHAR 字段相等性的 10 个最相似的广告。

我想不通的是,如果有任何 MySQL 函数,它可以以任何方式帮助我 - 或者我是否需要以某种奇怪的方式比较字符串?

编辑#1

相似性将由这些字段定义:

  • 标题(权重:50 %)

  • 含量(重量:40%)

  • 类别(重量:10 %)

编辑#2

我希望计算是这样的:

标题:在标题字段中匹配的单词(仅匹配 >2 个字母的单词)。

描述:在标题字段中匹配的单词(仅匹配 >2 个字母的单词)。

类别:匹配类别,如果不匹配,则与权重较小的父类别匹配:)

这个等式可以是:

#1 是旧的、不活跃的帖子,#2 是活跃的帖子:

#2 标题在 #2 的 10 个单词中的 3 个单词与 #1 标题匹配。这给出了 30% 匹配 = 30 分。

#2 描述在 #2 的 400 个单词中匹配 10 个单词中的 #1 描述。这给出了 4% 的匹配 = 4 分。

#2 类别与 #1 的类别不匹配,因此 0 % 匹配。这给了0分。

那么 #2 的总和将是 34 分。:)

编辑#3

这是我的查询 - 但它不会返回不同的行,而是很多相同的行。

SELECT
            a.AdvertisementID as A_AdvertisementID,
            IF(a.Topic LIKE a2.Topic, 50, 0) + IF(a.Description LIKE a2.Description, 40, 0) + IF(a.Cate_CategoryID LIKE a2.Cate_CategoryID, 10, 0) as A_Score,
            a.AdvertisementID as A_AdvertisementID,
            a.Topic as A_Topic,
            LEFT(a.Description, 300) as A_Description,
            a.Price as A_Price,
            a.Type as A_Type
        FROM
            ".DB_PREFIX."A_Advertisements a2,
            ".DB_PREFIX."A_Advertisements a
        WHERE
            a2.AdvertisementID <> a.AdvertisementID
            AND
            a.AdvertisementID = :a_id
        ORDER BY
            A_Score DESC
4

1 回答 1

2

如果您可以从字面上比较您感兴趣的字段,您可以让 MySQL 使用IF()函数执行简单的评分计算,例如

select 
  foo.id,
  if (foo.title='wantedtitle', 50, 0) +
  if (foo.content='wantedcontent', 40, 0) +
  if (foo.category='wantedcategory', 10, 0) as score
from foo
order by score desc
limit 10

可以使用 like 来实现基本的“查找片段”

select 
  foo.id,
  if (foo.title like '%wantedtitlefragment%', 50, 0) +
  if (foo.content like '%wantedcontentfragment%', 40, 0) +
  if (foo.category like '%wantedcategoryfragment%', 10, 0) as score
from foo
order by score desc
limit 10

还有其他技术,但它们在 MySQL 中实现起来可能很慢。例如,您可以计算两个字符串之间的Levenstein 距离- 请参阅这篇文章以获取示例实现。

于 2013-11-02T20:08:59.520 回答