визуализировать визуализацию распознавания сущностей в Plotly Dash - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу визуализировать фрагмент визуализации распознавания сущностей Spacy в приложение Plotly Dash.

HTML-код визуализации ER для рендеринга выглядит следующим образом:

<div class="entities" style="line-height: 2.5">
<mark class="entities" style="background: ...>
<span>...</span>
</mark>
<mark class="entities" style="background: ...>
<span>...</span>
</mark>
</div>

Я пробовалпарсинг HTML с использованием BeautifulSoup и конвертирование HTML в Dash с помощью следующего кода.Но когда я запускаю convert_html_to_dash (html_parsed) , он выдает KeyError: 'style'

html_parsed = bs.BeautifulSoup(html, 'html.parser')

def convert_html_to_dash(el, style = None):
    if type(el) == bs.element.NavigableString:
        return str(el)
    else:
        name = el.name
        style = extract_style(el) if style is None else style
        contents = [convert_html_to_dash(x) for x in el.contents]
    return getattr(html,name.title())(contents, style=style)

def extract_style(el):
    return {k.strip():v.strip() for k,v in [x.split(": ") for x in 
el.attrs["style"].split(";")]}

1 Ответ

0 голосов
/ 05 декабря 2018

Не каждый тег имеет атрибут style.Для тегов, которые этого не делают, вы пытаетесь получить доступ к несуществующему ключу в словаре attrs.Python отвечает: KeyError.

. Если вместо этого вы используете get(), он будет возвращать значение по умолчанию, а не поднимать KeyError.Вы можете указать значение по умолчанию в качестве второго аргумента для get():

return { k.strip() : v.strip() for k, v in
             [ x.split(': ') for x in el.attrs.get('style', '').split(';') ]
       }

Здесь я выбрал пустую строку в качестве значения по умолчанию.

Только с этим изменением ваш код по-прежнемуостается несколько ломким.Что если ввод не совсем соответствует ожидаемому?

С одной стороны, после двоеточия может не быть пробела.Изменение split(': ') на split(':') заставит его работать, даже если пробела нет - если он есть, он все равно будет удален, поскольку вы звоните strip() после разделения.

А что если после разделения на';' вы получаете что-то кроме пары ключ-значение в списке?Лучше всего проверить, является ли она допустимой парой (содержит ровно одно двоеточие), и пропустить ее в противном случае.

Ваш код становится:

return { k.strip() : v.strip() for k, v in
             [ x.split(':') for x in el.attrs.get('style', '').split(';')
               if x.count(':') == 1 ] }

Обратите внимание, что я выбрал одно-кавычки.Ваш код использует оба, но лучше выбрать один и придерживаться его.

...