Синтаксический анализатор солода выдает ошибку утверждения при использовании его с nltk

Я использую солодовый парсер с python nltk. Я успешно загрузил данные тренировок и обновил последнюю версию nltk. Когда я вызываю синтаксический анализатор, он выдает ошибку подтверждения. Ниже приведен код из Python, который также включает в себя трассировку.

 mp = MaltParser("C:/Users/mustufain/Desktop/Python Files/maltparser-1.8.1","C:/Users/mustufain/Desktop/Python Files/maltparser-1.7.2",additional_java_args=['-Xmx512m'])

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    mp = MaltParser("C:/Users/mustufain/Desktop/Python Files/maltparser-1.8.1","C:/Users/mustufain/Desktop/Python Files/maltparser-1.7.2",additional_java_args=['-Xmx512m'])
  File "C:\Python34\lib\site-packages\nltk\parse\malt.py", line 131, in __init__
    self.malt_jars = find_maltparser(parser_dirname)
  File "C:\Python34\lib\site-packages\nltk\parse\malt.py", line 72, in find_maltparser
    assert malt_dependencies.issubset(_jars)
AssertionError
>>> 

2 ответа

TL;DR (In PYTHON3!!):

import urllib.request
urllib.request.urlretrieve('http://www.maltparser.org/mco/english_parser/engmalt.poly-1.7.mco', 'C:\\Users\\mustufain\\Desktop\\engmalt.poly-1.7.mco')
urllib.request.urlretrieve('http://maltparser.org/dist/maltparser-1.8.1.zip', 'C:\\Users\\mustufain\\Desktop\\maltparser-1.8.1.zip')
zfile = zipfile.ZipFile('C:\\Users\\mustufain\\Desktop\\maltparser-1.8.1.zip')
zfile.extractall('C:\\Users\\mustufain\\Desktop\\maltparser-1.8.1\\')

Затем:

from nltk.parse import malt
mp = malt.MaltParser('C:\\Users\\mustufain\\Desktop\\maltparser-1.8.1\\', "C:\\Users\\mustufain\\Desktop\\engmalt.poly-1.7.mco")
mp.parse_one('I shot an elephant in my pajamas .'.split()).tree()

Если все настройки загрузки и переменных среды выполнены правильно, наиболее вероятно, что путь к файлу / директории разделяется в nltk.parse.malt.pyпо адресу https://github.com/nltk/nltk/blob/develop/nltk/parse/malt.py который разделяет каталог и имя файла специально для linux:

def find_maltparser(parser_dirname):
    """
    A module to find MaltParser .jar file and its dependencies.
    """
    if os.path.exists(parser_dirname): # If a full path is given.
        _malt_dir = parser_dirname
    else: # Try to find path to maltparser directory in environment variables.
        _malt_dir = find_dir(parser_dirname, env_vars=('MALT_PARSER',))
    # Checks that that the found directory contains all the necessary .jar
    malt_dependencies = ['','','']
    _malt_jars = set(find_jars_within_path(_malt_dir))
    _jars = set(jar.rpartition('/')[2] for jar in _malt_jars)
    malt_dependencies = set(['log4j.jar', 'libsvm.jar', 'liblinear-1.8.jar'])

    assert malt_dependencies.issubset(_jars)
    assert any(filter(lambda i: i.startswith('maltparser-') and i.endswith('.jar'), _jars))
    return list(_malt_jars)

Ошибка была исправлена ​​и в процессе слияния на https://github.com/nltk/nltk/pull/1292

Изменение этой строки:

_jars = set(jar.rpartition('/')[2] for jar in _malt_jars)

чтобы это решило вашу проблему =)

_jars = set(os.path.split(jar)[1] for jar in _malt_jars)

Ответ, не связанный с самим кодом, но с тем, как вы настроили переменные среды или скачали и сохранили каталоги или файлы синтаксического анализатора солода, см. По https://github.com/nltk/nltk/issues/1294

Другие вопросы по тегам