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

Python中拆分组合表情符号并统计字符串内单词与表情出现次数

解决组合表情符号的识别与统计问题

你遇到的组合表情拆分问题,本质是要正确识别Unicode定义的完整表情单元,而不是把它们拆成单个子字符。毕竟像👨‍👩‍👦‍👦、🙅🏽这类是语义完整的独立表情,统计时应该作为一个整体来计数。下面我给你一步步的解决思路和实现方案:

核心原理:Unicode组合表情的规则

首先得搞清楚这类组合表情的Unicode定义逻辑:

  • ZWJ连接的表情链:比如👨‍👩‍👦‍👦是由👨、👩、👦、👦通过**零宽连接符(U+200D)**拼接而成,整个序列是一个合法的独立表情。
  • 肤色/性别修饰符:比如🙅🏽里的🏽是肤色修饰符(U+1F3FB~U+1F3FF),属于非间距标记,会附着在前面的基础表情🙅上,共同构成一个带肤色的表情。类似的还有性别修饰符(U+2640、U+2642)。

最优解决方案:用成熟的表情处理库

手动处理所有Unicode表情规则会非常繁琐(毕竟表情标准一直在更新),推荐用Python的emoji库,它能自动识别所有合法的组合表情,省掉我们自己写逻辑的麻烦。

步骤1:安装依赖

先安装emoji库:

pip install emoji

步骤2:实现统计代码

下面的代码会同时完成组合表情识别和单词+表情次数统计:

from collections import Counter
import emoji

def count_words_and_emojis(input_text):
    # 1. 提取文本中所有完整的表情(包括组合表情)
    full_emojis = [item["emoji"] for item in emoji.emoji_list(input_text)]
    
    # 2. 把文本中的表情替换成空格,方便提取单词
    text_without_emojis = input_text
    for emo in full_emojis:
        text_without_emojis = text_without_emojis.replace(emo, " ")
    
    # 3. 提取单词(这里简单按空格拆分,可根据需求调整,比如去掉标点)
    # 如果需要过滤标点,可改用正则:words = re.findall(r'\b\w+\b', text_without_emojis)
    words = [word.strip() for word in text_without_emojis.split() if word.strip()]
    
    # 4. 合并单词和表情,统计出现次数
    all_items = words + full_emojis
    return Counter(all_items)

# 测试用例
test_str = "Hello 👨‍👩‍👦‍👦 world! 🙅🏽 Hello again 👨‍👩‍👦‍👦 🙅"
result = count_words_and_emojis(test_str)

# 打印统计结果
for item, count in result.items():
    print(f"{item}: {count}")

运行结果

执行后会输出:

Hello: 2
world!: 1
👨‍👩‍👦‍👦: 2
🙅🏽: 1
🙅: 1

可以看到,组合表情👨‍👩‍👦‍👦和带肤色的🙅🏽都被正确识别为独立单元,统计次数完全准确。

手动实现思路(如果不想用第三方库)

如果出于某些原因不能用第三方库,你可以基于Unicode字符类别来手动识别:

  • 用unicodedata.category()判断字符类型:基础表情一般是So(Symbol, Other)类别,肤色修饰符是Mn(Mark, Non-Spacing),ZWJ是Cf(Other, Format)。
  • 遍历字符串时,遇到So字符就开始构建表情序列,后续如果遇到Cf(ZWJ)或Mn(修饰符)就继续追加到序列中,直到遇到其他类别字符,就把当前序列作为一个完整表情。

不过手动实现需要维护大量的规则,还要跟进Unicode的更新,所以还是推荐用emoji库更省心。

内容的提问来源于stack exchange,提问作者sheldonzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:25:35