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