开发者社区 问答 正文

用SQL清理数据

我有两个充满电影的SQL Server表。一个称为ML_movies,另一个称为GL_movies。每个表包含大约35,000个电影标题。每个表唯一包含的内容是模糊的movieID,电影标题和发行年份。我想将它们合并并删除重复项,这可能会给我一个包含70,000部电影的数据集。

但是,没有重复是至关重要的。我尝试使用Levenshtein_Distance算法,但是比较两个字符串并发现最少的字符交换数被证明太不一致了。

HG{WEMNUV_6B}ZG@U{M8ZML.png

这将有效地返回ML_movies中与(在这种情况下)“ The Trip”最相似的前10个标题。但是我不得不硬编码两个标题

相反,我需要它来搜索GL_movies中最相似的标题。

如何在表A中找到与电影B最接近的电影标题的记录?

谢谢您的帮助!

展开
收起
游客syccbxcrjoo2g 2019-11-29 14:58:43 637 分享 版权
阿里云 AI 助理回答

在处理这种情况时,可以采用几种方法来提高效率和准确性。一种可能的解决方案是使用SQL Server的内置功能或扩展它以实现更高级的文本相似度比较,而不是直接依赖Levenshtein距离。以下是一个分步指南,帮助你合并两个表并去除重复项,同时考虑标题的相似性:

1. 数据预处理

  • 标准化文本:在进行比较之前,确保所有电影标题都进行了统一处理,比如转换为小写、移除特殊字符、空格标准化等。
  • 创建索引:如果尚未创建,为movie_title列添加全文索引或唯一索引,这将加速后续的查询操作。

2. 使用SQL Server的全文搜索

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;

3. SQL Server的自定义相似度函数

如果全文搜索不能满足需求,你可以考虑编写一个自定义的T-SQL函数来计算字符串相似度,例如基于Jaccard相似度、余弦相似度或其他更适合文本的算法。然后在查询中使用这个函数来找出最相似的标题。

4. 合并数据并去重

一旦确定了如何比较相似度,接下来就是实际合并数据并去重的过程。这可以通过以下步骤完成:

  • 临时表/CTE:首先,使用上面的方法将相似度高的记录插入到一个临时表或公用表表达式(CTE)中,标记出哪些是重复的或非常相似的。
  • 合并与去重:利用UNIONUNION 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语句和相似度算法,以达到最佳效果。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答