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

Jam*_* Ko 3 python nlp emoji spacy

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

import spacy

nlp = spacy.load('en')
doc = nlp("Hello bright world :)")
Run Code Online (Sandbox Code Playgroud)

然后使用displaCy可视化doc :

在此输入图像描述

它错误地解析world :)为一个标记.如何修改spaCy以便识别这些附加符号?谢谢.

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

Ine*_*ani 7

是的,spaCy实际上包含了一个非常全面的基于文本的表情符号列表,作为其tokenizer异常的一部分.因此,使用上面的示例并打印单个标记,可以正确标记表情符号:

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

我想这里发生的事情是你实际上遇到了一个有趣的(可能是非理想的)边缘情况和displacy默认情况.为避免标点符号的长依赖性弧,collapse_punct设置默认为True.这意味着在呈现可视化时,标点符号将合并到前一个标记上.通过检查令牌的is_punct属性是否返回来识别标点符号True- 这也恰好是":)"的情况.

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

displacy.serve(doc, style='dep', options={'collapse_punct': False})
Run Code Online (Sandbox Code Playgroud)

(在合并标点符号时,displaCy可视化工具可能应该包括表情符号的例外.这当前很难,因为spaCy没有is_emojiis_symbol标志.但是,它可能是一个很好的添加 - 你可以在这个帖子上投票.)