You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL实现:高效统计句子对应类别词频并找出最高匹配类别

高效实现句子词汇类别的词频统计与最高类别提取(SQL方案)

不用手动逐个写regexp_count累加,通过关联表、分组统计加窗口函数就能高效实现需求,具体步骤和代码如下:

核心逻辑

  1. 将Table1的词汇与Table2的句子做关联,匹配句子中出现的所有目标词汇
  2. 按句子ID和类别分组,统计每个类别在对应句子中的总出现次数
  3. 用窗口函数筛选出每个句子中词频最高的类别(支持处理多类别并列最高的场景)

通用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:50:33