【问题标题】:Extract all Emojis from string and ignore Fitzpatrick modifiers (skin tones etc.) in Python从字符串中提取所有表情符号并忽略 Python 中的 Fitzpatrick 修饰符(肤色等)
【发布时间】:2018-01-19 11:59:06
【问题描述】:

我最近遇到了一个问题,我需要提取字符串中的所有表情符号来计算特定表情符号的出现次数。 Emoji python package 让我提取所有表情符号,但我总是得到特定的修饰符,例如将肤色提取为单独的表情符号。我想忽略肤色和其他 Fitzpatrick 修饰符Variant Selectors(参见this page for typesbackground on Fitzpatrick from Wikpedia)。以下代码将导致 Fitzpatrick 修饰符被选为单独的表情符号(这不是我需要的):

import emoji
def extract_emojis(str):
  return list(c for c in str if c in emoji.UNICODE_EMOJI)

示例:这个表情符号❤️ 实际上由两部分组成,一个心(Unicode 代码点:U+2764)和一个红色修饰符(Unicode 代码点:U+fe0f)。 print(repr('❤️')) 导致:\u2764\ufe0f - 两个独立的 unicode,但只有一个表情符号。单独的第二个代码点本身没有意义,但它作为来自return list(c for c in str if c in emoji.UNICODE_EMOJI) 的列表中的单独表情符号返回。

【问题讨论】:

  • 我删除了这部分。我在写这个问题的时候已经有了答案,我只是觉得这个答案可能对其他人也很有趣。
  • 感谢您的解释,这完全有道理!我希望这个帖子现在符合规则。

标签: python unicode utf-8 emoji


【解决方案1】:

这是一种忽略肤色和其他修饰符并将所有这些表情符号变体视为一个表情符号的解决方案。来自 Martijn Pieters 的answer 帮助我编写了以下解决方案来解决我的问题:

import emoji
import unicodedata

def checkEmojiType(strEmo):
    if unicodedata.name(strEmo).startswith("EMOJI MODIFIER"):
        return False
    else:
        return True
def extract_emojis(str):
    return list(c for c in str if c in emoji.UNICODE_EMOJI and checkEmojiType(c))

[编辑] 但是..目前,上述解决方案似乎不支持零宽度连接器(请参阅下面的评论)。您可以使用以下代码自行测试:

n = '?‍⚕️' #copy the medical emoji with zero-width joiner (http://www.unicode.org/emoji/charts/emoji-zwj-sequences.html). This should only fall back to a double-emoji if not otherwise available
#extract all emojis with the function from above
nlist = def_functions.extract_emojis(n)
for xstr in nlist:
    #print codepoints
    print('Emoji Extract: U+%04x' % ord(xstr))
for _c in n:
    #print all Unicode Codepoints directly
    print('Each Codepoint: U+%04x' % ord(_c))

这是输出:

EmojiExtract: U+1f468
EmojiExtract: U+2695
Each Codepoint: U+1f468
Each Codepoint: U+200d
Each Codepoint: U+2695
Each Codepoint: U+fe0f

Emoji Extract 没有加入这两个 Emoji(这是意料之中的)。

【讨论】:

  • 请注意,上面的答案并不完整(我刚刚意识到)。还有其他形式的表情符号组合,显然称为Emoji ZWJ Sequences,它们同样由几个 Unicode 代码点构成。我还没有找到删除这些的解决方案。 here are some examples
猜你喜欢
  • 2022-06-22
  • 1970-01-01
  • 2019-11-02
  • 2018-06-05
  • 2021-01-14
  • 2017-12-31
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
相关资源
最近更新 更多