在含重复语句的SQL字符串中识别唯一语句
嘿,我之前也处理过类似的长文本重复内容问题,针对你这个VARCHAR(MAX)字段的情况,分享几个实用的思路,从SQL原生处理到结合工具的方案都有:
1. 先标准化文本格式,解决标点不规范问题
因为字段里标点混乱,第一步得把文本“捋顺”,统一格式才能更精准识别重复内容。可以用SQL的字符串替换函数,把各种不规范的标点、特殊字符统一替换成空格或标准分隔符:
SELECT Notes_Comments, -- 把常见标点替换为空格,再合并连续空格 REPLACE( TRANSLATE(Notes_Comments, '.,!?;:"''()[]{}<>', ' '), ' ', ' ' ) AS Cleaned_Text FROM YourTable
这里用TRANSLATE批量替换标点,再用REPLACE合并连续空格,得到更规整的文本。
2. 基于语句分割的基础去重
如果重复内容是以“语句”为单位粘贴的,可以先把文本分割成候选语句,再去重。先把各种可能的语句结束符(比如.、!、?)统一替换为换行符,再用STRING_SPLIT分割:
WITH CleanedData AS ( SELECT ID, -- 假设表有主键ID用来关联原记录 -- 统一语句分隔符为换行符 REPLACE(REPLACE(REPLACE(Notes_Comments, '.', CHAR(10)), '!', CHAR(10)), '?', CHAR(10)) AS Split_Ready_Text FROM YourTable WHERE LEN(Notes_Comments) > 500 -- 只处理较长的记录,提升性能 ), SplitSentences AS ( SELECT ID, TRIM(value) AS Sentence FROM CleanedData CROSS APPLY STRING_SPLIT(Split_Ready_Text, CHAR(10)) WHERE TRIM(value) <> '' -- 过滤空的分割结果 ) -- 提取每个记录下的唯一语句 SELECT ID, Sentence FROM SplitSentences GROUP BY ID, Sentence
3. 高频子串识别,定位重复粘贴内容
如果重复内容是零散的子字符串(不是完整语句),可以用滑动窗口生成候选子串,统计出现频率来识别重复:
WITH Substrings AS ( SELECT ID, -- 生成长度20-100的子串(可根据实际调整范围) SUBSTRING(Notes_Comments, pos.i, len.LEN) AS SubStr, -- 用哈希值减少字符串比较开销 HASHBYTES('SHA2_256', SUBSTRING(Notes_Comments, pos.i, len.LEN)) AS SubStrHash FROM YourTable -- 生成位置序列,步长设为5减少计算量 CROSS JOIN (SELECT TOP 20000 i FROM (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS i FROM sys.all_columns) t WHERE i <= 100000) pos -- 生成子串长度范围 CROSS JOIN (SELECT TOP 81 LEN FROM (SELECT 20 + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) -1 AS LEN FROM sys.all_columns) t WHERE LEN <= 100) len WHERE pos.i + len.LEN <= LEN(Notes_Comments) ) -- 找出出现多次的重复子串 SELECT SubStr, COUNT(DISTINCT ID) AS OccurrenceCount FROM Substrings GROUP BY SubStr, SubStrHash HAVING COUNT(DISTINCT ID) > 1 -- 可调整为具体次数,比如>3
注意:这个方法计算量较大,建议只针对长度超过阈值的记录,或者限制子串的长度范围。
4. 进阶方案:结合NLP工具做语义级重复识别
SQL的字符串处理能力有限,如果要识别语义上相似的重复内容(比如换了标点但意思一样的句子),建议把数据导出到Python或R,用NLP工具处理:
- 用
spaCy生成句子的语义嵌入向量,计算向量相似度来识别重复语句 - 用
difflib库做文本相似度匹配,找出重复或高度相似的子串
这种方案能处理更复杂的重复场景,比SQL原生方法精准度更高。
内容的提问来源于stack exchange,提问作者devdave
相关产品推荐
相关产品推荐

