在SQLite中处理表情符号

Processing Emojis in SQLite

提问人:Dom Vito 提问时间:4/22/2018 更新时间:11/27/2019 访问量:2512

问:

我希望使用 SQL Lite 确定哪些表情符号在文本对话中使用最多。我正在使用DB浏览器,表情符号的显示方式就像在iMessage中一样(见下图),但我对如何计算它们感到困惑。

我在想,如果有一种方法可以检查并查看字符是否不是字母/数字/标点符号,那么我可以计算所有不符合先决条件列表的字符的频率。也就是说,我不熟悉SQLite命令以及如何实现它。

有没有更好的方法呢?如果您需要更多上下文来回答这个问题,请告诉我。

Emoji Example

SQL编码 SQLite 表情符号

评论

0赞 CL. 4/22/2018
相关新闻: 检测所有表情符号
0赞 paul 4/24/2018
您必须这样做一次,还是持续进行?
0赞 Dom Vito 4/24/2018
@paul不是100%确定你的意思,但只有一次。我想在单个文件上运行一次分析。

答:

0赞 paul 4/24/2018 #1

我可以看到直接使用SQLite执行此操作的唯一方法是从源代码编译SQLite,以便您可以添加对 .regex_replace

但是,您只计划执行一次,重新编译 SQLite 可能有点矫枉过正。

相反,您可以将列复制到纯文本文件中,并运行以下命令:text

sed 's/\(.\)/\1\n/g' temp.txt | sed 's/[[:alnum:].-]//g' | sort -r | uniq -c

这将变成以下内容:

Hello! Are you stuck? 🤔 I saw 🐻🐻🐻 in the park!!!!! 🎂🎂🎂🎂🎂🎂 - all lies. Easy as 123! 😎😎😎😎😎😎😎😎😎😎😎

到:

  1 🤔
 11 😎
  3 🐻
  6 🎂
  1 ?
  7 !
 17
 50

希望这足以让你达到你的目标。最后两个条目用于制表符和空格。

sed是一个 Linux 命令,因此,如果您运行的是 Windows,则可能需要在此处获取 Windows 版本:https://github.com/mbuilov/sed-windows

0赞 Adam Silenko 4/26/2018 #2

构建表情符号表,在文本字段中包含表情符号字符串,然后尝试以下操作:

SELECT emojis.text, sum(length(replace(message.text, emojis.text, emojis.text || '_')) - length( message.text))
FROM message
INNER JOIN emojis ON message.text LIKE '%' || emojis.text || '%'
GROUP BY emojis.text

您可以使用此方法计算消息中任何文本的出现次数...

评论

0赞 Adam Silenko 5/3/2018
下面是一个验证答案的 sqlfiddle:sqlfiddle.com/#!5/eccd6/2
0赞 Dom Vito 5/11/2018
我认为这里的问题是“文本”字段也将具有普通文本,因此我需要以某种方式进行区分。
0赞 Donald 11/27/2019 #3

可能不是最有效的示例,但您可以使用 group_concat 函数将文本合并到单个字符串中,然后使用递归 cte 将其转换为单个字符表。您可以使用大于 7F 的十六进制函数过滤掉所有“正常”acii 字符(参见 asii 表),您可能需要根据你的表情符号是什么以及您是否有大量非拉丁 unicode 在那里。然后,如果您只想要总数,则可以进行计数,或者如果您想知道单个表情符号计数是多少,则可以使用计数进行分组。

WITH RECURSIVE theChars (
    position
    ,charValue
    )
AS (
    SELECT 2
        ,substr((
                SELECT group_concat(TEXT, '')
                FROM message
                ), 1, 1)

    UNION ALL

    SELECT position + 1
        ,substr((SELECT group_concat(TEXT, '') FROM message)
            ,position
            ,1)
    FROM theChars LIMIT length((SELECT group_concat(TEXT, '') FROM message))
    )
SELECT charValue,count(*)
FROM theChars
WHERE hex(charValue) > '7F'
group by charValue;