有没有办法在 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)
这会产生以下结果:
在上面的示例中,entname
和 entbox
函数将分别生成 html.Span
和 html.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 仪表板