是否可以使用 spaCy 解析表情符号?

Is it possible to parse emojis using spaCy?

是否可以使用 spaCy Python 库正确标记 :):(;~( 等表情符号?例如如果我运行下面的代码:

import spacy

nlp = spacy.load('en')
doc = nlp("Hello bright world :)")

然后使用 displaCy:

可视化文档

它错误地将 world :) 解析为一个标记。我如何修改 spaCy 以便它识别这些额外的符号?谢谢。

编辑: 发现以下内容:https://github.com/ines/spacymoji 但我认为它只支持像 ✨ 这样的 Unicode 表情符号,而不支持像 :)?[=19 这样的 ASCII 表情符号=]

是的,spaCy 实际上包括一个相当全面的 list of text-based emoticons 作为其标记器异常的一部分。因此,使用上面的示例并打印单个标记,表情符号被正确标记:

doc = nlp("Hello bright world :)")
print([token.text for token in doc])
# ['Hello', 'bright', 'world', ':)']

我认为这里发生的是你实际上遇到了一个有趣的(可能是 non-ideal)默认值 displacy 的边缘情况。为了避免标点符号的依赖弧太长,collapse_punct setting 默认为 True。这意味着当呈现可视化时,标点符号被合并到前面的标记上。标点符号是通过检查令牌的 is_punct 属性 returns True 来识别的——“:)”也是如此。

在您的示例中,您可以通过在传递给 displacy.serve 的选项中将 collapse_punct 设置为 False 来解决此问题:

displacy.serve(doc, style='dep', options={'collapse_punct': False})

(displaCy 可视化器在合并标点符号时可能应该包括表情符号的例外。这目前很难,因为 spaCy 没有 is_emojiis_symbol 标志。但是,它可能是将来的一个很好的补充——你可以投票给它on this thread。)

现在看来是可以的。 您需要先安装 spacymoji 模块。 Here 是说明。 您可以检查令牌列表是否有任何表情符号或特定令牌is_emoji,还有一些其他有用的功能。

spacymoji 需要 spaCy v2.0.0 或更高版本。

pip install spacymoji

以下示例取自 git 页面。但是您可以在 this blog.

中使用带有 spaCy 的 spacymoji 扩展找到更全面的解释
import spacy
from spacymoji import Emoji

nlp = spacy.load('en')
emoji = Emoji(nlp)
nlp.add_pipe(emoji, first=True)

doc = nlp(u"This is a test  ")
assert doc._.has_emoji == True
assert doc[2:5]._.has_emoji == True
assert doc[0]._.is_emoji == False
assert doc[4]._.is_emoji == True
....

希望这对以后的人有所帮助...