SQL实现:高效统计句子对应类别词频并找出最高匹配类别
高效实现句子词汇类别的词频统计与最高类别提取(SQL方案)
不用手动逐个写regexp_count累加,通过关联表、分组统计加窗口函数就能高效实现需求,具体步骤和代码如下:
核心逻辑
- 将Table1的词汇与Table2的句子做关联,匹配句子中出现的所有目标词汇
- 按句子ID和类别分组,统计每个类别在对应句子中的总出现次数
- 用窗口函数筛选出每个句子中词频最高的类别(支持处理多类别并列最高的场景)
通用SQL示例
WITH category_freq AS ( SELECT t2.ID, t1.Category, -- 统计每个词汇在句子中的出现次数,再按类别求和 SUM(REGEXP_COUNT(t2.Sentence, '(\s|^)' || t1.Word || '(\s|$)')) AS total_count FROM Table2 t2 JOIN Table1 t1 ON REGEXP_LIKE(t2.Sentence, '(\s|^)' || t1.Word || '(\s|$)') GROUP BY t2.ID, t1.Category ), ranked_categories AS ( SELECT ID, Category, total_count, -- 按句子ID分组,按词频降序排名,并列最高的保留多个(用RANK()) RANK() OVER(PARTITION BY ID ORDER BY total_count DESC) AS rnk FROM category_freq ) SELECT ID, Category, total_count AS top_count FROM ranked_categories WHERE rnk = 1;
不同数据库的调整说明
- MySQL/MariaDB:单词边界用
[[:<:]]和[[:>:]],替换正则中的(\s|^)和(\s|$);REGEXP_COUNT仅MySQL 8.0+支持,低版本可通过自定义函数或LEN+REPLACE组合实现计数 - Oracle:单词边界用
\b(需开启正则匹配模式),或用(^|\W)和(\W|$)适配非单词字符场景 - SQL Server:用
\b作为单词边界,REGEXP_COUNT从SQL Server 2017开始支持,低版本可用PATINDEX循环计数
补充说明
- 如果句子中没有匹配到任何Table1的词汇,上述SQL不会返回该ID的记录;若需保留所有ID,可将
JOIN改为LEFT JOIN,并在最后处理空值(比如设置默认类别) - 若要在词频并列时优先选择某一类别,可在窗口函数的
ORDER BY后追加Category字段(例如ORDER BY total_count DESC, Category ASC)
内容的提问来源于stack exchange,提问作者otk_29
相关产品推荐
相关产品推荐

