如何用pandas与emoji库标准化彩色Emoji并合并同类型计数?
合并同类型Emoji统计的解决方案
问题原因
- 带肤色修饰的Emoji(如👍🏻、👍🏼、👍)属于不同Unicode字符,
emoji.emoji_list会将其视为独立条目,无法自动合并。 - 语义相近的Emoji(如😃、😀)本身是不同的Emoji实体,库默认不会归为同一类,需手动定义分类规则。
方法1:合并带肤色修饰符的同基础Emoji
利用emoji.demojize将Emoji转为文本名称,去除肤色相关后缀后作为分组依据,实现同基础Emoji的合并统计。
import emoji import pandas as pd # 示例数据 data = {'id': [1, 2, 3], 'renderedContent': ['Hello 😃👍🏻', 'How are you? 😀👍🏼', '👍']} df5 = pd.DataFrame(data) # 提取所有Emoji text = df5['renderedContent'].str.cat(sep='\n') emoji_list = pd.DataFrame(emoji.emoji_list(text)) # 标准化Emoji:去除肤色修饰符,得到基础Emoji def normalize_emoji(emoji_char): demojized = emoji.demojize(emoji_char) # 截断肤色修饰符后缀 base_name = demojized.split('_skin_tone')[0] if '_skin_tone' in demojized else demojized # 转回Emoji用于展示 base_emoji = emoji.emojize(base_name) return base_emoji, base_name emoji_list[['base_emoji', 'base_name']] = emoji_list['emoji'].apply(lambda x: pd.Series(normalize_emoji(x))) # 按基础Emoji分组统计 out = (emoji_list.value_counts('base_emoji') .rename_axis('Smiley').rename('Count').reset_index() .assign(Type=lambda x: x['Smiley'].apply(emoji.demojize))) print(out)
运行后,所有带不同肤色的👍会被合并为同一条目,计数为3。
方法2:合并语义同类的Emoji(如不同笑脸)
如果需要将语义相近的Emoji(如😃、😀)归为同一类统计,需自定义分类映射表,将不同Emoji名称映射到统一类别。
import emoji import pandas as pd # 示例数据 data = {'id': [1, 2, 3], 'renderedContent': ['Hello 😃👍🏻', 'How are you? 😀👍🏼', '👍']} df5 = pd.DataFrame(data) # 自定义Emoji分类映射(可根据需求扩展) emoji_categories = { ':grinning_face:': '笑脸类', ':grinning_face_with_big_eyes:': '笑脸类', ':thumbs_up:': '点赞类' } # 提取所有Emoji text = df5['renderedContent'].str.cat(sep='\n') emoji_list = pd.DataFrame(emoji.emoji_list(text)) # 标准化并分类Emoji def categorize_emoji(emoji_char): demojized = emoji.demojize(emoji_char) base_name = demojized.split('_skin_tone')[0] if '_skin_tone' in demojized else demojized # 映射到自定义类别,未匹配的保留原名称 category = emoji_categories.get(base_name, base_name) base_emoji = emoji.emojize(base_name) return base_emoji, category emoji_list[['base_emoji', 'Category']] = emoji_list['emoji'].apply(lambda x: pd.Series(categorize_emoji(x))) # 按类别分组统计 out = (emoji_list.value_counts('Category') .rename_axis('Emoji Category').rename('Count').reset_index()) print(out)
运行后,😃、😀会合并为“笑脸类”(计数2),所有点赞Emoji合并为“点赞类”(计数3)。
关键要点
emoji.demojize是核心处理工具,通过文本化Emoji名称,方便处理修饰符和分类逻辑。- 自定义分类映射表可根据业务需求扩展,覆盖更多需要合并的Emoji类别。
- 仅需合并带肤色的同基础Emoji时,使用方法1即可;需要宽泛语义分类时,使用方法2。
内容的提问来源于stack exchange,提问作者Sebastián
相关产品推荐
相关产品推荐

