NLTK не смог найти файл gs
Я пытаюсь использовать NLTK, инструментарий на основе естественного языка Стэнфорда.
После установки необходимых файлов я запускаю демонстрационный код:
http://www.nltk.org/index.html
>>> import nltk
>>> sentence = """At eight o'clock on Thursday morning
... Arthur didn't feel very good."""
>>> tokens = nltk.word_tokenize(sentence)
>>> tokens
['At', 'eight', "o'clock", 'on', 'Thursday', 'morning',
"Артур", "сделал", "не", "чувствовать", "очень", "хорошо", "." )
>>> tagged = nltk.pos_tag(tokens)
>>> tagged[0:6]
[('At', 'IN'), ('eight', 'CD'), ("o'clock", 'JJ'), ('on', 'IN'),
( "Четверг", "NNP" ), ( "утро", "NN" )]
>>> entities = nltk.chunk.ne_chunk(tagged)
>>> entities
Затем я получаю сообщение:
LookupError:
===========================================================================
NLTK was unable to find the gs file!
Use software specific configuration paramaters or set the PATH environment variable.
Я попробовал Google, но там никто не скажет, что отсутствует файл gs.
Ответы
Ответ 1
Я тоже столкнулся с этой ошибкой.
gs
означает ghostscript. Вы получаете ошибку, потому что ваш chunker пытается использовать ghostscript для рисования дерева синтаксиса предложения, примерно так:
![введите описание изображения здесь]()
Я использовал IPython; для отладки проблемы я задал длину трассировки verbose
с помощью команды %xmode verbose
, которая печатает локальные переменные каждого кадра стека. (см. полный отрывок ниже). Имена файлов:
file_names=['gs', 'gswin32c.exe', 'gswin64c.exe']
Небольшой поиск Google для gswin32c.exe
сказал мне, что это ghostscript.
/Users/jasonwirth/anaconda/lib/python3.4/site-packages/nltk/__init__.py in find_file_iter(filename='gs', env_vars=['PATH'], searchpath=(), file_names=['gs', 'gswin32c.exe', 'gswin64c.exe'], url=None, verbose=False)
517 (filename, url))
518 div = '='*75
--> 519 raise LookupError('\n\n%s\n%s\n%s' % (div, msg, div))
520
521 def find_file(filename, env_vars=(), searchpath=(),
LookupError:
===========================================================================
NLTK was unable to find the gs file!
Use software specific configuration paramaters or set the PATH environment variable.
===========================================================================
Ответ 2
Достаточно добавить к Джейсону Вирту ответ. В Windows эта строка кода будет искать "gswin64c.exe" в переменной среды PATH, однако установщик ghostscript не добавляет двоичный код в PATH, поэтому для этого вам нужно найти, где установлен ghostscript и добавьте подпапку /bin в PATH.
Например, в моем случае я добавил C:\Program Files\gs\gs9.19\bin в PATH.
Ответ 3
Просто добавьте к предыдущим ответам, если вы замените "сущности" на "печать (сущности)", вы не получите ошибку.
Без print() консоль/ноутбук не знает, как "нарисовать" объект дерева.
Ответ 4
В дополнение к Алексу Кинману, я также получаю ту же ошибку, даже после установки ghostscript и добавления ее в путь nltk. Использование print() позволяет печатать объекты, и даже с этой ошибкой мне кажется, что я могу получить вывод ниже, но, к сожалению, пока нет дерева.
Tree('S', [('At', 'IN'), ('eight', 'CD'), ("o'clock", 'NN'), ('on', 'IN'), ('Thursday', 'NNP'), ('morning', 'NN'), Tree('PERSON', [('Arthur', 'NNP')]), ('did', 'VBD'), ("n't", 'RB'), ('feel', 'VB'), ('very', 'RB'), ('good', 'JJ'), ('.', '.')])
Ответ 5
Если ghostscript по какой-то причине недоступен для вашей платформы или не удается установить, вы также можете использовать замечательный пакет networkx для визуализации таких деревьев:
import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout
import matplotlib.pyplot as plt
def drawNodes(G,nodeLabels,parent,lvl=0):
def addNode(G,nodeLabels,label):
n = G.number_of_nodes()
G.add_node(n)
nodeLabels[n] = label
return n
def findNode(nodeLabels,label):
# Travel backwards from end to find right parent
for i in reversed(range(len(nodeLabels))):
if nodeLabels[i] == label:
return i
indent = " "*lvl
if lvl == 0:
addNode(G,nodeLabels,parent.label())
for node in parent:
if type(node) == nltk.Tree:
n = addNode(G,nodeLabels,node.label())
G.add_edge(findNode(nodeLabels,parent.label()),n)
drawNodes(G,nodeLabels,node,lvl+1)
else:
print node
n1 = addNode(G,nodeLabels,node[1])
n0 = addNode(G,nodeLabels,node[0])
G.add_edge(findNode(nodeLabels,parent.label()),n1)
G.add_edge(n0,n1)
G = nx.Graph()
nodeLabels = {}
drawNodes(G,nodeLabels,entities)
options = {
'node_color': 'white',
'node_size': 100
}
plt.figure(1,figsize=(12,6))
pos=graphviz_layout(G, prog='dot')
nx.draw(G, pos, font_weight='bold', arrows=False, **options)
l = nx.draw_networkx_labels(G,pos,nodeLabels)
![NLTK Token Tree plotted with NetworkX]()