Используйте tkinter для рисования nltk внутри ноутбука jupyter

Я пытаюсь нарисовать график (встроенный) nltk Внутри jupyter-notebook, Но получил ошибку:

TclError: no display name and no $DISPLAY environment variable

Я пытался установить $DISPLAY на разные значения:

$env DISPLAY=0.0
# or
$env DISPLAY=inline
# or
$env DISPLAY=

но получил ошибку (или похожую):

TclError: couldn't connect to display "0.0"

вот мой код https://github.com/hyzhak/nltk-experiments/blob/master/main.ipynb последняя ячейка.

Окружающая среда: официальный док Anaconda3 - continuumio/anaconda3:4.4.0 https://github.com/ContinuumIO/docker-images. С nltk==3.2.3 внутри.

Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:09:58) 
Type "copyright", "credits" or "license" for more information.

IPython 5.3.0 -- An enhanced Interactive Python.

Как я мог решить эту ошибку и встроенный nltk график внутри jupyter notebook?

Обновление 1

http://www.nltk.org/_modules/nltk/draw/tree.html соответствии с источниками дерева рисования nltk, которое оно использует tkinter,

Обновление 2

Я задавал тот же вопрос в официальном репозитории nltk github https://github.com/nltk/nltk/issues/1765

Обновление 3

Я думаю, что причиной ошибки может быть безголовый хост (докер). Я установил xvfb но, кажется, это достаточно примечание.

RUN apt-get install -y xvfb

Решение

я думал так xvfb запускается по умолчанию, но должен выполняться явно. Таким образом, после того, как я запустил его, я мог сделать скриншоты графа дерева nltk.

2 ответа

import os
import nltk
from IPython.display import Image

chunkGram = r"""Chunk: {<RB.?>*<VB.?>*<NNP>+<NN>?}"""
chunkParser = nltk.RegexpParser(chunkGram)

tagged = [('Tonight', 'NN'), ('we', 'PRP'), ('are', 'VBP'), ('comforted', 'VBN'), ('by', 'IN'), ('the', 'DT'), ('hope', 'NN'), ('of', 'IN'), ('a', 'DT'), ('glad', 'JJ'), ('reunion', 'NN'), ('with', 'IN'), ('the', 'DT'), ('husband', 'NN'), ('who', 'WP'), ('was', 'VBD'), ('taken', 'VBN'), ('so', 'RB'), ('long', 'RB'), ('ago', 'RB'), (',', ','), ('and', 'CC'), ('we', 'PRP'), ('are', 'VBP'), ('grateful', 'JJ'), ('for', 'IN'), ('the', 'DT'), ('good', 'JJ'), ('life', 'NN'), ('of', 'IN'), ('Coretta', 'NNP'), ('Scott', 'NNP'), ('King', 'NNP'), ('.', '.')]
chunked = chunkParser.parse(tagged)
nltk.draw.tree.TreeView(chunked)._cframe.print_to_file('output.ps')
os.system('convert output.ps output.png')

Image(filename='output.png') 

[из]:

введите описание изображения здесь

Попробуйте включить следующий фрагмент в свой код

import os
import matplotlib as mpl
if os.environ.get('DISPLAY','') == '':
    print('no display found. Using non-interactive Agg backend')
    mpl.use('Agg')
import matplotlib.pyplot as plt

Несмотря на. Ваша проблема в том, что вызов Matplotlib по умолчанию для бэкэнда, использующего x, по-видимому, вызывает проблему. Этот ответ ни в коем случае не является единственным возможным решением, но я думаю, что это решит вашу проблему. Помните, что перед импортом pyplot важно переключить бэкэнд.

Кроме того, вы можете попробовать IPython.core.display.display(chunked).

Убедитесь, что ваш сервер ноутбука запущен с установленным флагом -X.

def jupyter_draw_nltk_tree(tree):
    from IPython.display import Image, display
    from nltk.draw import TreeWidget
    from nltk.draw.util import CanvasFrame
    import subprocess
    cf = CanvasFrame()
    tc = TreeWidget(cf.canvas(), tree)
    tc['node_font'] = 'arial 13 bold'
    tc['leaf_font'] = 'arial 14'
    tc['node_color'] = '#005990'
    tc['leaf_color'] = '#3F8F57'
    tc['line_color'] = '#175252'
    cf.add_widget(tc, 10, 10)
    cf.print_to_file('tmp_tree_output.ps')
    cf.destroy()

    args = (['convert', 'tmp_tree_output.ps', 'tmp_tree_output.png'])
    subprocess.call(args)
    display(Image(filename='tmp_tree_output.png'))
    os.system('rm tmp_tree_output.ps tmp_tree_output.png')

jupyter_draw_nltk_tree(chunked)
Другие вопросы по тегам