Я уже безуспешно задавал этот вопрос о stackoverflow и решил продублировать его здесь.
Согласно источникам nltk
он рисует график по tkinter (GUI)
но мне нужно встроить этот график в jupyter notebook
. И я пытаюсь сделать это внутри официального докера от anaconda3, другими словами, мне здесь не нужен всплывающий графический интерфейс, а просто изображение внутри записной книжки, которое должно отображаться на стороне сервера с помощью nltk lib.
Как я мог это преодолеть с помощью nltk? Может быть, есть сторонние библиотеки, которые могут там помочь?
Исходники моей попытки здесь - последняя 18 ячейка.
chunkGram = r"""Chunk: {<RB.?>*<VB.?>*<NNP>+<NN>?}"""
chunkParser = nltk.RegexpParser(chunkGram)
for i in tokenized_text[:5]:
words = nltk.word_tokenize(i)
tagged = nltk.pos_tag(words)
chunked = chunkParser.parse(tagged)
chunked.draw()
PS:
в то же время встроенный matplotlib работает как шарм. Могу ли я использовать matplotlib для рендеринга графиков?
Спасибо!
хорошо, возможная работа может быть:
1 установка Xvfb
,
2 делаем скриншот дерева и потом
3 преобразование ps в png
3 встраивание преобразованного скриншота обратно в jupyter
но как по мне это больше похоже на грязный хак. Должен быть более надежный способ визуализации дерева.
Я думаю, это хорошая идея отойти от tkinter
для графиков и перейти к библиотекам, никогда не использующим графические построения, например, matplotlib
/ seaborn
.
Отказ от tkinter в целом - хорошая идея, но уже есть поддержка рендеринга деревьев как встроенных PNG в записных книжках:
`` ''
импортировать nltk
из IPython.display import display
parser = nltk.RegexpParser (r'NP: {<[NJ]. *> +} ')
tree = parser.parse (nltk.corpus.brown.tagged_sents () [0])
дисплей (дерево)
`` ''
У меня это не работает на удаленном сервере ноутбуков Jupyter. _repr_png_()
дерева вызывает CanvasFrame()
, который хочет создать окно tkinter (и на удаленном сервере нет отображения). Не совсем уверен, каков правильный обходной путь.
nltk = 3.2.4
ipython == 6.2.1
jupyter-core == 4.4.0
Хороший улов!
Кто-то другой только что открыл новый выпуск (№ 1887) о том же. Не уверен в процедуре, но можем ли мы их объединить?
Просто чтобы добавить к решению rmalouf, которое у меня работает после нескольких настроек:
Mac
Юпитер
Python 2.7
Чтобы это работало, у вас должен быть установлен ghostscript: https://wiki.scribus.net/canvas/Installation_and_Configuration_of_Ghostscript
варить установить ghostscript
Если это не удается из-за xcrun: error: неверный путь активного разработчика
Затем сначала сделайте следующее
см. http://mds.is/xcrun-error/
xcode-select - установить
Недавно я собрал чистый пакет для рисования дерева python => SVG, который можно использовать как заменяющую замену Tree
репру на основе png в Jupyter. Это может не подходить для всех, кто использует NLTK, поскольку для него требуется Python 3+, он все еще находится на довольно ранней стадии цикла выпуска (и частично нацелен на выполнение множества других вещей, которые, возможно, менее актуальны для этой аудитории). Но он решает проблемы, поднятые в этой ветке (и https://github.com/nltk/nltk/issues/1887), которые также меня мучили:
https://github.com/rawlins/svgling
(nb, если вы хотите полностью избежать проблем, связанных с tkinter в Jupyter, вам также может потребоваться удалить _repr_png_()
из Tree
. Это потому, что Jupyter пробует все доступные _repr_*_
функции, даже хотя он отображает только один в типичных обстоятельствах и сохраняет вывод всех в файле записной книжки.)
Самый полезный комментарий
Отказ от tkinter в целом - хорошая идея, но уже есть поддержка рендеринга деревьев как встроенных PNG в записных книжках:
`` ''
импортировать nltk
из IPython.display import display
parser = nltk.RegexpParser (r'NP: {<[NJ]. *> +} ')
tree = parser.parse (nltk.corpus.brown.tagged_sents () [0])
дисплей (дерево)
`` ''