如何在SQLite中统计文本对话里高频使用的Emoji?
统计SQLite对话中高频Emoji的可行方案
嘿,这个需求我刚好实操过,在DB Browser for SQLite里完全能实现,给你两个思路的方案,你可以根据自己的需求选:
方案一:精准匹配Emoji的Unicode范围(推荐)
这个方法能准确筛选出各类Emoji,避免把其他特殊字符混进来。核心思路是先用递归CTE把每条消息拆成单个字符,再通过Unicode码点判断是否属于Emoji,最后统计频次。
假设你的对话内容存在messages表的content字段里,直接在DB Browser的SQL编辑器里运行这段代码:
WITH RECURSIVE split_messages AS ( -- 初始化:取每条消息的第一个字符 SELECT content, 1 AS pos, substr(content, 1, 1) AS char FROM messages WHERE content IS NOT NULL AND content != '' UNION ALL -- 递归:依次取后续每个字符 SELECT content, pos + 1, substr(content, pos + 1, 1) AS char FROM split_messages WHERE pos < length(content) ) -- 筛选Emoji并统计频次 SELECT char AS emoji, COUNT(*) AS frequency FROM split_messages WHERE -- 覆盖绝大多数常见Emoji的Unicode区间 unicode(char) BETWEEN 0x1F600 AND 0x1F64F -- 表情符号 OR unicode(char) BETWEEN 0x1F300 AND 0x1F5FF -- 符号与象形文字 OR unicode(char) BETWEEN 0x1F680 AND 0x1F6FF -- 交通与地图符号 OR unicode(char) BETWEEN 0x1F1E0 AND 0x1F1FF -- 国旗表情 OR unicode(char) BETWEEN 0x2600 AND 0x26FF -- 杂项符号 OR unicode(char) BETWEEN 0x2700 AND 0x27BF -- 装饰符号 OR unicode(char) BETWEEN 0x1F900 AND 0x1F9FF -- 补充表情符号 GROUP BY emoji ORDER BY frequency DESC;
代码说明:
- 递归CTE
split_messages会把每条消息的内容拆成单个字符,SQLite的substr默认按UTF-8字符处理,不用担心多字节Emoji拆分错误。 unicode(char)函数能获取字符的Unicode码点,通过判断码点是否在Emoji专属区间里,精准筛选目标字符。- 最后按Emoji分组统计,按频次降序排列,最常用的Emoji会排在最前面。
方案二:排除字母/数字/标点(快速凑合用)
如果你不想记Unicode区间,也可以用排除法,把字母、数字和常见标点之外的字符筛选出来统计。不过这个方法可能会混入一些非Emoji的特殊字符(比如数学符号、中文括号等),适合快速验证需求:
WITH RECURSIVE split_messages AS ( SELECT content, 1 AS pos, substr(content, 1, 1) AS char FROM messages WHERE content IS NOT NULL AND content != '' UNION ALL SELECT content, pos + 1, substr(content, pos + 1, 1) AS char FROM split_messages WHERE pos < length(content) ) SELECT char AS emoji, COUNT(*) AS frequency FROM split_messages WHERE -- 排除字母、数字和常见标点,你可以根据自己的需求增减标点符号 char NOT GLOB '[a-zA-Z0-9.,!?;:''"-()<>]' GROUP BY emoji ORDER BY frequency DESC;
小提示:
如果你的对话里有带肤色修饰、性别修饰的组合Emoji(比如👨🏿💻),上面的方法会把它们拆成单个字符统计。要是需要统计完整的组合Emoji,就得更复杂的逻辑去识别多字符组合,不过一般日常统计单个Emoji的频次已经足够啦。
内容的提问来源于stack exchange,提问作者Dom Vito
相关产品推荐
相关产品推荐

