Как использовать анализатор солода в python nltk

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

Я загрузил предварительно подготовленную модель (engmalt.linear-1.7.mco) из http://www.maltparser.org/mco/mco.html. BUt Я не знаю, как разбирать мои предложения, используя этот файл грамматики и анализатор солода (с помощью интерфейса python для солода). Я загрузил последнюю версию анализатора солода (1.7.2) и переместил его в '/usr/lib/'

import nltk; 
parser =nltk.parse.malt.MaltParser()
txt="This is a test sentence"
parser.train_from_file('/home/rohith/malt-1.7.2/engmalt.linear-1.7.mco')
parser.raw_parse(txt)

после выполнения последней строки отправляется следующее сообщение об ошибке

Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
parser.raw_parse(txt)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/malt.py", line 88, in raw_parse
return self.parse(words, verbose)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/malt.py", line 75, in parse
return self.tagged_parse(taggedwords, verbose)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/malt.py", line 122, in tagged_parse
return DependencyGraph.load(output_file)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/dependencygraph.py", line 121, in load
return DependencyGraph(open(file).read())
IOError: [Errno 2] No such file or directory: '/tmp/malt_output.conll'

Пожалуйста, помогите мне разобрать это предложение, используя этот анализатор солода.

Ответ 1

Edited

Обратите внимание, что ответ больше не работает из-за обновленной версии API MaltParser в NLTK с августа 2015 года. Этот ответ сохранен ради цели.

Пожалуйста, ознакомьтесь с этими ответами, чтобы заставить MaltParser работать с NLTK:

Отказ от ответственности. Это не вечные решения. Ответ в приведенной выше ссылке (опубликовано в феврале 2016 г.) будет работать пока. Но когда MaltParser или NLTK API меняются, он также может изменить синтаксис на использование MaltParser в NLTK.


Пара проблем с вашей настройкой:

  • Вход в train_from_file должен быть файлом в формате CoNLL, а не предварительно подготовленной моделью. Для файла mco вы передаете его конструктору MaltParser, используя параметры mco и working_directory.
  • Распределение кучи java по умолчанию недостаточно велико, чтобы загрузить этот конкретный файл mco, поэтому вам нужно будет указать java для использования большего количества кучи с параметром -Xmx. К сожалению, это невозможно с существующим кодом, поэтому я только что проверил в изменении, чтобы разрешить дополнительные параметры конструктора для java args. См. здесь.

Итак, вот что вам нужно сделать:

Сначала получите последнюю версию NLTK:

git clone https://github.com/nltk/nltk.git

(ПРИМЕЧАНИЕ. Если вы не можете использовать версию NLTK git, вам придется вручную обновить файл malt.py или скопировать его из здесь, чтобы иметь собственную версию.)

Во-вторых, переименуйте файл jar в malt.jar, что ожидает NLTK:

cd /usr/lib/
ln -s maltparser-1.7.2.jar malt.jar

Затем добавьте переменную окружения, указывающую на синтаксический анализатор солода:

export MALTPARSERHOME="/Users/dhg/Downloads/maltparser-1.7.2"

Наконец, загрузите и используйте анализатор солода в python:

>>> import nltk
>>> parser = nltk.parse.malt.MaltParser(working_dir="/home/rohith/malt-1.7.2", 
...                                     mco="engmalt.linear-1.7", 
...                                     additional_java_args=['-Xmx512m'])
>>> txt = "This is a test sentence"
>>> graph = parser.raw_parse(txt)
>>> graph.tree().pprint()
'(This (sentence is a test))'