2017-01-07 5 views
1

В настоящее время я использую интерфейс Python для Stanford Parser.Stanford Parser for Python: Формат вывода

from nltk.parse.stanford import StanfordParser 
    import os 

    os.environ['STANFORD_PARSER'] ='/Users/au571533/Downloads/stanford-parser-full-2016-10-31' 
    os.environ['STANFORD_MODELS'] = '/Users/au571533/Downloads/stanford-parser-full-2016-10-31' 
    parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") 

    new=list(parser.raw_parse("The young man who boarded his usual train that Sunday afternoon was twenty-four years old and fat. ")) 
    print new 

Выход я получаю выглядит примерно так:

[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('NP', [Tree('DT', ['The']), Tree('JJ', ['young']), Tree('NN', ['man'])]), Tree('SBAR', [Tree('WHNP', [Tree('WP', ['who'])]), Tree('S', [Tree('VP', [Tree('VBD', ['boarded']), Tree('NP', [Tree('PRP$', ['his']), Tree('JJ', ['usual']), Tree('NN', ['train'])]), Tree('NP', [Tree('DT', ['that']), Tree('NNP', ['Sunday'])])])])])]), Tree('NP', [Tree('NN', ['afternoon'])]), Tree('VP', [Tree('VBD', ['was']), Tree('NP', [Tree('NP', [Tree('JJ', ['twenty-four']), Tree('NNS', ['years'])]), Tree('ADJP', [Tree('JJ', ['old']), Tree('CC', ['and']), Tree('JJ', ['fat'])])])]), Tree('.', ['.'])])])] 

Однако, мне нужна только часть речевых меток, поэтому я хотел бы иметь выход в таком формате, который выглядит как слово /тег.

В java можно указать -outputFormat 'wordsAndTags', и он дает именно то, что я хочу. Любой намек на то, как реализовать это в Python?

Помощь была бы высоко оценена. Спасибо!

PS:. Пытались использовать Stanford POSTagger, но это гораздо менее точны на некоторые слова я интересуюсь

+0

Не могли бы вы изменить в примере того, как вы хотите, чтобы результат выглядел? –

+0

Для предложения в приведенном выше коде, например: ['The/DT', 'young/JJ', 'man/NN'], либо список строковых элементов, либо список кортежей или таблицы будь умницей. Суть в том, что мне не нужна информация дерева зависимостей, но только части речи для каждого слова. Благодаря! :) – roberta

ответ

1

Если посмотреть на the NLTK classes for the Stanford parser, вы можете увидеть, что метод raw_parse_sents() Безразлично» t отправьте опцию -outputFormat wordsAndTags, которую вы хотите, и вместо этого отправит -outputFormat Penn. Если вы вывели свой класс из StanfordParser, вы можете переопределить этот метод и указать формат wordsAndTags.

from nltk.parse.stanford import StanfordParser 

class MyParser(StanfordParser): 

     def raw_parse_sents(self, sentences, verbose=False): 
     """ 
     Use StanfordParser to parse multiple sentences. Takes multiple sentences as a 
     list of strings. 
     Each sentence will be automatically tokenized and tagged by the Stanford Parser. 
     The output format is `wordsAndTags`. 

     :param sentences: Input sentences to parse 
     :type sentences: list(str) 
     :rtype: iter(iter(Tree)) 
     """ 
     cmd = [ 
      self._MAIN_CLASS, 
      '-model', self.model_path, 
      '-sentences', 'newline', 
      '-outputFormat', 'wordsAndTags', 
     ] 
     return self._parse_trees_output(self._execute(cmd, '\n'.join(sentences), verbose)) 
+0

Звучит неплохо! Можно ли показать вам быстрый пример того, как это сделать? Я еще не очень хороший программист: D Спасибо! – roberta

+0

Спасибо! Еще одна проблема: она выдает сообщение об ошибке: «MyParser не имеет атрибута« _make_tree »», который, по-видимому, требуется _parse_trees_output в stanford.py> GenericStanfordParser (ParserI). Спасибо за помощь! – roberta

+0

А, я вижу. Попробуйте наследовать от 'StanfordParser'. –

 Смежные вопросы

  • Нет связанных вопросов^_^