NLTK MaltParser не будет анализировать - PullRequest
2 голосов
/ 02 марта 2012

Я пытаюсь использовать MaltParser из NLTK.

Я мог бы приступить к настройке парсера:

import nltk
parser = nltk.parse.malt.MaltParser()
parser.config_malt()
parser.train_from_file('malt_train.conll')

но когда дело доходит до фактического разбора, парсер возвращает ошибку:

File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/nltk/parse/malt.py", line 98, in raw_parse
return self.parse(words, verbose)
File "/Library/Python/2.7/site-packages/nltk/parse/malt.py", line 85, in parse
return self.tagged_parse(taggedwords, verbose)
File "/Library/Python/2.7/site-packages/nltk/parse/malt.py", line 139, in tagged_parse
return DependencyGraph.load(output_file)
File "/Library/Python/2.7/site-packages/nltk/parse/dependencygraph.py", line 121, in    load
return DependencyGraph(open(file).read())
IOError: [Errno 2] No such file or directory:'/var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_output.conll'

Вот команда, которая выдает ошибку (из malt.py):

['java', '-jar /usr/lib/malt-1.6.1/malt.jar', '-w /var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T', '-c malt_temp', '-i /var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_input.conll', '-o /var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_output.conll', '-m parse']

Я попытался запустить команду jus java, и вот что я получаю:

 The file entry 'malt_temp_singlemalt.info' in the mco file '/var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_temp.mco' cannot be loaded.  

Также пробовал то же самое с предварительно обученными engmalt.poly.mco и engmalt.linear.mco

Любые предложения приветствуются.

РЕДАКТИРОВАТЬ: Вот полная функция от malt.py

def tagged_parse(self, sentence, verbose=False):
    """
    Use MaltParser to parse a sentence. Takes a sentence as a list of
    (word, tag) tuples; the sentence must have already been tokenized and
    tagged.

    @param sentence: Input sentence to parse
    @type sentence: L{list} of (word, tag) L{tuple}s.
    @return: C{DependencyGraph} the dependency graph representation of the sentence
    """

    if not self._malt_bin:
        raise Exception("MaltParser location is not configured.  Call config_malt() first.")
    if not self._trained:
        raise Exception("Parser has not been trained.  Call train() first.")

    input_file = os.path.join(tempfile.gettempdir(), 'malt_input.conll')
    output_file = os.path.join(tempfile.gettempdir(), 'malt_output.conll')

    execute_string = 'java -jar %s -w %s -c %s -i %s -o %s -m parse'
    if not verbose:
        execute_string += ' > ' + os.path.join(tempfile.gettempdir(), "malt.out")

    f = None
    try:
        f = open(input_file, 'w')

        for (i, (word,tag)) in enumerate(sentence):
            f.write('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % 
                    (i+1, word, '_', tag, tag, '_', '0', 'a', '_', '_'))
        f.write('\n')
        f.close()

        cmd = ['java', '-jar %s' % self._malt_bin, '-w %s' % tempfile.gettempdir(), 
               '-c %s' % self.mco, '-i %s' % input_file, '-o %s' % output_file, '-m parse']
        print cmd

        self._execute(cmd, 'parse', verbose)

        return DependencyGraph.load(output_file)
    finally:
        if f: f.close()

1 Ответ

2 голосов
/ 08 августа 2012

Я не уверен, что проблема все еще не решена (но я думаю, что она уже решена), но поскольку у меня были те же проблемы некоторое время назад, я хотел бы поделиться своими знаниями.

Прежде всего, MaltParser-Jar не принимает файл .connl с прямым путем к файлу перед ним. Как видно выше. Почему это так ... Я не знаю.

Но вы можете легко это исправить, изменив командную строку на что-то вроде этого:

            cmd = ['java', '-jar %s' % self._malt_bin,'-w %s' %self.working_dir,'-c %s' % self.mco, '-i %s' % input_file, '-o %s' % output_file, '-m parse']

Здесь теперь каталог файла .conll устанавливается с помощью параметра -w. Используя это, вы можете загрузить любой файл .conll из любой данной папки. Я также изменяю с tempfile.gettempdir() на self.working_dir, потому что в «оригинальной» версии NLTK папка / tmp / всегда указывается в качестве рабочего каталога. Даже если вы инициализируете Maltparser с другим рабочим каталогом.

Надеюсь, эта информация кому-нибудь поможет.

Другое дело, если вы хотите разобрать много предложений как один раз, но каждое по отдельности и не зависеть от всех других предложений, вам нужно добавить пустую строку в файл input.conll и снова начать нумерацию для каждого предложения с 1.

...