我目前正试图弄清楚如何计算两个记录之间的相似性。我的第一张唱片是来自停用的广告 - 所以我想找到例如关于某些VARCHAR字段相等性的10个最相似的广告。
我无法弄清楚的是,如果有任何MySQL函数,可以以任何方式帮助我 - 或者我是否需要以某种奇怪的方式比较字符串?
相似性将由以下字段定义:
标题(重量:50%)
内容(重量:40%)
类别(重量:10%)
我希望计算结果如下:
标题:标题字段中匹配的单词(仅匹配单词> 2个字母)。
描述:标题字段中匹配的单词(仅匹配单词> 2个字母)。
Catgory:匹配类别,如果不匹配,则匹配父类别且权重较小:)
这个等式可能是:
#1是旧的非活动帖子,#2是活跃帖子:
#2标题在#2的总共10个单词中的3个单词中匹配#1标题。 这样可以获得30%的匹配= 30分。
#2描述匹配#2总共10个单词中的#1描述 400字。这给出了4%的匹配= 4分。
#2类别与#1类别不匹配,因此0%匹配。那 得0分。
然后总和将是#2的34分。 :)
这是我的查询 - 但它不会返回不同的行,而是返回相同的行。
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
答案 0 :(得分: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
使用类似
可以实现基本的“找到片段”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 distance - 有关示例实现,请参阅this post。