有没有办法在 Dash 仪表板上呈现 spaCy 的 NER 输出?

Posted

技术标签:

【中文标题】有没有办法在 Dash 仪表板上呈现 spaCy 的 NER 输出?【英文标题】:Is there a way to render spaCy's NER output on a Dash dashboard? 【发布时间】:2021-06-16 21:07:05 【问题描述】:

我正在尝试将 spaCy 的 NER 预训练模型合并到我的 Dash 仪表板中。我知道Dash 目前没有能力呈现原始 html,所以我正在寻找解决方案。我在网上广泛搜索,但没有找到解决方案。 目前,我有一个如下所示的仪表板:

[仪表板]

如果可能,我希望SpaCy 的 NER 输出显示在下方。例如,请看下图:

[NER 示例输出]

如果有人设法找到适用于Dash 的解决方案,请告诉我。如果不可能,那也不是世界末日。我知道它可以在Flask 中完成,尽管用 HTML 编码更难!

非常感谢!

【问题讨论】:

【参考方案1】:

不可能通过置换将其呈现在一行中。但是,您应该能够通过 python 函数抽象 html 并手动呈现结果。这是一个示例应用:

import dash
import dash_html_components as html

import spacy
from spacy.displacy.render import DEFAULT_LABEL_COLORS


# Initialize the application
app = dash.Dash(__name__)


def entname(name):
    return html.Span(name, style=
        "font-size": "0.8em",
        "font-weight": "bold",
        "line-height": "1",
        "border-radius": "0.35em",
        "text-transform": "uppercase",
        "vertical-align": "middle",
        "margin-left": "0.5rem"
    )


def entbox(children, color):
    return html.Mark(children, style=
        "background": color,
        "padding": "0.45em 0.6em",
        "margin": "0 0.25em",
        "line-height": "1",
        "border-radius": "0.35em",
    )


def entity(children, name):
    if type(children) is str:
        children = [children]

    children.append(entname(name))
    color = DEFAULT_LABEL_COLORS[name]
    return entbox(children, color)


def render(doc):
    children = []
    last_idx = 0
    for ent in doc.ents:
        children.append(doc.text[last_idx:ent.start_char])
        children.append(
            entity(doc.text[ent.start_char:ent.end_char], ent.label_))
        last_idx = ent.end_char
    children.append(doc.text[last_idx:])
    return children


text = "When Sebastian Thrun started working on self-driving cars at Google in 2007, few people outside of the company took him seriously."
nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
print("Entities:", doc.ents)

# define de app
app.layout = html.Div(
    children=render(doc)
)

# Run the app
if __name__ == "__main__":
    app.run_server(debug=True)

这会产生以下结果:

在上面的示例中,entnameentbox 函数将分别生成 html.Spanhtml.Mark,其样式从 displacy 中的输出 html 复制而来。然后,函数entity将前面两个函数抽象出来,轻松生成实体框。最后,render 函数将 spacy 的 Doc 对象转换为 Dash html 组件列表,可以在 Dash 布局中使用。

【讨论】:

您好,感谢您的回复。效果很好!请问你怎么知道如何做到这一点?我对 Dash 很陌生,而且我没有 HTML 经验。我只是想知道您是否知道我可以参考的任何好资源? 欢迎您@cellan!开始使用 Dash 的最佳方式是通过文档:dash.plotly.com。具体来说,“布局”一章涵盖了 Dash 中样式的基础知识。一旦你了解了 Dash 如何通过 html 组件与 HTML 交互,以及通过 style 参数与 CSS 交互,你就可以开始将 HTML/CSS 转换为 Dash 组件;这正是我在这里所做的。在这种特殊情况下,我能够通过一个简单的检查元素找到样式。 太棒了!再次感谢!

以上是关于有没有办法在 Dash 仪表板上呈现 spaCy 的 NER 输出?的主要内容,如果未能解决你的问题,请参考以下文章

输入变量值后,使用 Dash(来自 Plotly)在仪表板上输出值

在不同的 Windows 服务器上部署 plotly dash 仪表板

如何禁用闪亮的 bs4Dash 仪表板控制栏(右侧栏)

在没有初始化段的情况下播放 mpeg dash 流

如何在 python(dash)仪表板中显示 png 文件和 csv 表

在烧瓶应用程序中设置 python dash 仪表板