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
相关产品推荐
相关产品推荐

