我有两个充满电影的SQL Server表。一个称为ML_movies,另一个称为GL_movies。每个表包含大约35,000个电影标题。每个表唯一包含的内容是模糊的movieID,电影标题和发行年份。我想将它们合并并删除重复项,这可能会给我一个包含70,000部电影的数据集。
但是,没有重复是至关重要的。我尝试使用Levenshtein_Distance算法,但是比较两个字符串并发现最少的字符交换数被证明太不一致了。
这将有效地返回ML_movies中与(在这种情况下)“ The Trip”最相似的前10个标题。但是我不得不硬编码两个标题
相反,我需要它来搜索GL_movies中最相似的标题。
如何在表A中找到与电影B最接近的电影标题的记录?
谢谢您的帮助!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在处理这种情况时,可以采用几种方法来提高效率和准确性。一种可能的解决方案是使用SQL Server的内置功能或扩展它以实现更高级的文本相似度比较,而不是直接依赖Levenshtein距离。以下是一个分步指南,帮助你合并两个表并去除重复项,同时考虑标题的相似性:
movie_title
列添加全文索引或唯一索引,这将加速后续的查询操作。SQL Server提供了全文搜索功能,可以用来查找相似的文本内容。虽然主要用于全文本搜索,但也可以用于一定程度上的相似性匹配。
-- 假设已经对 movie_title 创建了全文索引
SELECT TOP(10)
ML_movies.movieID, ML_movies.movie_title,
SIMILARITY(ML_movies.movie_title, 'The Trip') AS SimilarityScore
FROM
ML_movies
WHERE
CONTAINS(ML_movies.movie_title, 'FORMSOF(INFLECTIONAL, "The Trip")')
ORDER BY
SimilarityScore DESC;
如果全文搜索不能满足需求,你可以考虑编写一个自定义的T-SQL函数来计算字符串相似度,例如基于Jaccard相似度、余弦相似度或其他更适合文本的算法。然后在查询中使用这个函数来找出最相似的标题。
一旦确定了如何比较相似度,接下来就是实际合并数据并去重的过程。这可以通过以下步骤完成:
UNION
或UNION ALL
结合GROUP BY
或窗口函数(如ROW_NUMBER()
)来合并数据,并选择每个标题组中最“原始”或评分最高的记录作为保留项。WITH CTE_Similarities AS (
SELECT
movieID, movie_title, year,
ROW_NUMBER() OVER (PARTITION BY movie_title ORDER BY SomeSimilarityFunction(movie_title) DESC) as rn
FROM (
SELECT movieID, movie_title, year FROM ML_movies
UNION ALL
SELECT movieID, movie_title, year FROM GL_movies
) combined_movies
),
DistinctMovies AS (
SELECT movieID, movie_title, year
FROM CTE_Similarities
WHERE rn = 1 -- 只保留每个标题最相似的一个
)
SELECT * INTO Final_Movies FROM DistinctMovies;
请注意,上述示例中的SomeSimilarityFunction
需要替换为你实际实现的相似度计算函数。
通过这些步骤,你应该能够有效地合并两个表,同时识别并删除重复的电影标题,即使它们存在微小的差异。记得根据实际情况调整SQL语句和相似度算法,以达到最佳效果。