如何从Python中的字符串中提取表情符号和标志?

时间:2018-03-14 11:45:19

标签: python string emoji data-cleaning

import emoji

def emoji_lis(string):
_entities = []
for pos,c in enumerate(string):
    if c in emoji.UNICODE_EMOJI:
        print("Matched!!", c ,c.encode('ascii',"backslashreplace"))
        _entities.append({
            "location":pos,
            "emoji": c
            })
return _entities

emoji_lis(" مدیحہ  así, se  ds ")
  • 匹配!! \ U0001f467
  • 匹配!! \ U0001f3ff
  • 匹配!! \ U0001f60c
  • 匹配!! \ U0001f495
  • 匹配!! \ U0001f46d

我的代码适用于所有其他表情符号,但我如何检测国家/地区标记?

2 个答案:

答案 0 :(得分:2)

这是一篇关于如何Unicode encodes country flags的文章。它们表示为两个regional indicator symbols的序列(代码点范围从U + 1F1E6到U + 1F1FF),但显然不是两个符号的每个可能组合对应于一个国家(因此是一个标志)。您可以假设没有“坏”组合发生或维护(或导入)具有(当前)270个有效符号对的集合。

然后有区域旗帜。这些表示为黑色标记代码点(U + 1F3F4),后跟一个tags(代码点U + E0001,范围从U + E0020到U + E007F)拼写区域标识符的序列(例如,用于flag or Wales将是“gbwls”),加上“取消标记”代码点(U + E007F)。

除此之外,你当然还有常规表情符号的表情符号。前面提到的black flag (U+1F3F4)就是其中之一,但你也有triangular flag (U+1F6A9)等等。你应该已经能够检测到其中的大多数,因为它们就像其他表情符号一样。 然而,我们在这里做得不够。你有复合表情符号的问题,它影响一些标志,但也影响许多其他表情符号。在你的例子中,你可以看到输入字符串中黑人女性的匹配表情符号是一个“基础”女人表情符号,然后是这个棕色的补丁。这是因为black woman emoji由两个代码点woman (U+1F469)dark skin tone (U+1F311)组成。在许多其他情况下,您需要两个代码点,中间加上zero-width joiner (U+200D),以指定您希望它们合并。有时您还需要输入variation selector (typically 16, U+FE0F)来表示您希望将事物用作表情符号。您可以阅读有关此in this article的更多信息。在标志的情况下,你有rainbow flag (U+1F3F3, U+FE0F,‍ U+200D, U+1F308),它会读作“白旗,变异选择器16(使用白旗表情符号,不是文本),零宽度木匠,彩虹”;或pirate flag (U+1F3F4,‍ U+200D, U+2620, U+FE0F),其中包括“黑旗,零宽度木匠,骷髅和交叉骨,变异选择器16(使用骷髅和交叉骨表情符号,而非文字)”。

现在,有不同的方法可以处理所有这些,但在您当前的方法中,您一次迭代一个代码点,因此您将无法检测复杂的表情符号。你可以拥有一大堆所有有趣的序列(标志,一些复合表情符号等)并在输入中查找它们。您可以检查当前字符是否为区域指示符号,如果是这种情况,请尝试读取下一个代码点以形成一个标志(并为其余的单个简单表情符号解析)。我不确定你的案例的最佳解决方案是什么(在复杂性/利益权衡方面),但你应该知道表情符号编码的细微差别以及你可能发现的陷阱。

答案 1 :(得分:1)

我不认为图书馆的任何地方都可以这样做。但是,这可以通过函数来​​完成:

\U0001F1E6\U0001F1E8是第一个unicode标志,\U0001F1FF\U0001F1FC是最后一个,因此几乎覆盖了所有这些标志。引起一些问题的Theres 3 more

这是一个检查输入是否为标志的函数:

def is_flag_emoji(c):
    return "\U0001F1E6\U0001F1E8" <= c <= "\U0001F1FF\U0001F1FC" or c in ["\U0001F3F4\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", "\U0001F3F4\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", "\U0001F3F4\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f"]

测试:

>>> is_flag_emoji('a')
False
>>> is_flag_emoji('')
False
>>> is_flag_emoji("""""")
True

因此,您可以相应地将if语句更改为if c in emoji.UNICODE_EMOJI or is_flag_emoji(c):

但是有一个问题;由于通过连接多个字符来制作很多标记,因此您可能无法识别表情符号。

>>> s
' here is more text  and more'
>>>emoji_lis(s)
Matched!!  b'\\U0001f1fe'
Matched!!  b'\\U0001f1ea'
Matched!!  b'\\U0001f1e9'
[{'location': 0, 'emoji': ''}, {'location': 1, 'emoji': ''}, {'location': 22, 'emoji': ''}]