【问题标题】:Processing Emojis in SQLite在 SQLite 中处理表情符号
【发布时间】:2018-10-02 03:09:09
【问题描述】:

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

我在想是否有办法检查一个字符是否不是字母/数字/标点符号,然后我可以计算所有不符合先决条件列表的字符的频率。也就是说,我不熟悉 SQLite 命令以及如何完成它。

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

【问题讨论】:

  • 您必须这样做一次还是持续进行?
  • @paul 不是 100% 确定您的意思,但只有一次。我想对单个文件运行一次分析。

标签: sql encoding sqlite emoji


【解决方案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

【讨论】:

    【解决方案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
    

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

    【讨论】:

    • 这是一个验证答案的 sqlfiddle:sqlfiddle.com/#!5/eccd6/2
    • 我认为这里的问题是“文本”字段也会有普通文本,所以我需要以某种方式区分。
    【解决方案3】:

    可能不是最有效的示例,但您可以使用 group_concat 函数将文本合并为单个字符串,然后使用递归 cte 将其转换为单个字符表。您可以使用大于 7F(see asii table)的十六进制函数过滤掉所有“正常”acii 字符,您可能需要根据您的表情符号是什么以及您是否有大量非拉丁 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;
    

    【讨论】:

      猜你喜欢
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2012-08-05
      • 2022-10-04
      • 2021-01-12
      • 1970-01-01
      • 2019-08-21
      相关资源
      最近更新 更多