2015-05-26 3 views
11

Там было много MaltParser и/или NLTK вопросы, связанные:Разбор несколько предложений с MaltParser использованием NLTK

Теперь есть более стабилизированный вариант MaltParser API в NLTK: https://github.com/nltk/nltk/pull/944 но есть проблемы, когда дело доходит до разбора несколько предложений одновременно.

Синтаксический одно предложение, в то время как штраф:

_path_to_maltparser = '/home/alvas/maltparser-1.8/dist/maltparser-1.8/' 
_path_to_model= '/home/alvas/engmalt.linear-1.7.mco'  
>>> mp = MaltParser(path_to_maltparser=_path_to_maltparser, model=_path_to_model) 
>>> sent = 'I shot an elephant in my pajamas'.split() 
>>> sent2 = 'Time flies like banana'.split() 
>>> print(mp.parse_one(sent).tree()) 
(pajamas (shot I) an elephant in my) 

Но разбор списка предложений не возвращает объект: граф зависимостей

_path_to_maltparser = '/home/alvas/maltparser-1.8/dist/maltparser-1.8/' 
_path_to_model= '/home/alvas/engmalt.linear-1.7.mco'  
>>> mp = MaltParser(path_to_maltparser=_path_to_maltparser, model=_path_to_model) 
>>> sent = 'I shot an elephant in my pajamas'.split() 
>>> sent2 = 'Time flies like banana'.split() 
>>> print(mp.parse_one(sent).tree()) 
(pajamas (shot I) an elephant in my) 
>>> print(next(mp.parse_sents([sent,sent2]))) 
<listiterator object at 0x7f0a2e4d3d90> 
>>> print(next(next(mp.parse_sents([sent,sent2])))) 
[{u'address': 0, 
    u'ctag': u'TOP', 
    u'deps': [2], 
    u'feats': None, 
    u'lemma': None, 
    u'rel': u'TOP', 
    u'tag': u'TOP', 
    u'word': None}, 
{u'address': 1, 
    u'ctag': u'NN', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 2, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NN', 
    u'word': u'I'}, 
{u'address': 2, 
    u'ctag': u'NN', 
    u'deps': [1, 11], 
    u'feats': u'_', 
    u'head': 0, 
    u'lemma': u'_', 
    u'rel': u'null', 
    u'tag': u'NN', 
    u'word': u'shot'}, 
{u'address': 3, 
    u'ctag': u'AT', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'AT', 
    u'word': u'an'}, 
{u'address': 4, 
    u'ctag': u'NN', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NN', 
    u'word': u'elephant'}, 
{u'address': 5, 
    u'ctag': u'NN', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NN', 
    u'word': u'in'}, 
{u'address': 6, 
    u'ctag': u'NN', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NN', 
    u'word': u'my'}, 
{u'address': 7, 
    u'ctag': u'NNS', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NNS', 
    u'word': u'pajamas'}, 
{u'address': 8, 
    u'ctag': u'NN', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NN', 
    u'word': u'Time'}, 
{u'address': 9, 
    u'ctag': u'NNS', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NNS', 
    u'word': u'flies'}, 
{u'address': 10, 
    u'ctag': u'NN', 
    u'deps': [], 
    u'feats': u'_', 
    u'head': 11, 
    u'lemma': u'_', 
    u'rel': u'nn', 
    u'tag': u'NN', 
    u'word': u'like'}, 
{u'address': 11, 
    u'ctag': u'NN', 
    u'deps': [3, 4, 5, 6, 7, 8, 9, 10], 
    u'feats': u'_', 
    u'head': 2, 
    u'lemma': u'_', 
    u'rel': u'dep', 
    u'tag': u'NN', 
    u'word': u'banana'}] 

Почему что использование parse_sents() не вернуть итерабельность parse_one?

я мог, однако, просто ленюсь и делаю:

_path_to_maltparser = '/home/alvas/maltparser-1.8/dist/maltparser-1.8/' 
_path_to_model= '/home/alvas/engmalt.linear-1.7.mco'  
>>> mp = MaltParser(path_to_maltparser=_path_to_maltparser, model=_path_to_model) 
>>> sent1 = 'I shot an elephant in my pajamas'.split() 
>>> sent2 = 'Time flies like banana'.split() 
>>> sentences = [sent1, sent2] 
>>> for sent in sentences: 
>>> ... print(mp.parse_one(sent).tree()) 

Но это не решение, которое я ищу. Мой вопрос: как ответить, почему нет parse_sent() возвратить итерабельность parse_one(). и как это можно было бы зафиксировать в коде NLTK?


После @NikitaAstrakhantsev ответил, я пытался это выводит дерево разбора в настоящее время, но это, кажется, смущен и помещает оба предложения в один перед разбором его.

# Initialize a MaltParser object with a pre-trained model. 
mp = MaltParser(path_to_maltparser=path_to_maltparser, model=path_to_model) 
sent = 'I shot an elephant in my pajamas'.split() 
sent2 = 'Time flies like banana'.split() 
# Parse a single sentence. 
print(mp.parse_one(sent).tree()) 
print(next(next(mp.parse_sents([sent,sent2]))).tree()) 

[выход]:

(pajamas (shot I) an elephant in my) 
(shot I (banana an elephant in my pajamas Time flies like)) 

Из кода он, кажется, делать что-то странное: https://github.com/nltk/nltk/blob/develop/nltk/parse/api.py#L45

Почему это анализатор абстрактный класс в NLTK является свисты два предложения в один до разбора? Я неправильно вызываю parse_sents()? Если да, то каков правильный способ позвонить parse_sents()?

ответ

5

Как я вижу в ваших образцов кода, вы не вызываете tree() в этой строке

>>> print(next(next(mp.parse_sents([sent,sent2])))) 

пока вы звоните tree() во всех случаях с parse_one().

В противном случае я не вижу причин, почему это могло произойти: parse_one() метод ParserI не преодолено в MaltParser и все это делает, просто вызывая parse_sents() из MaltParser см the code.

Upd:The line you're talking about не называется, потому что parse_sents() переписан в MaltParser и непосредственно называется.

Единственное, что у меня есть, это то, что java lib maltparser работает некорректно с входным файлом, содержащим несколько предложений (я имею в виду this block - где запускается Java). Возможно, исходный анализатор солода изменил формат, и теперь это не '\n\n'. К сожалению, я не могу запустить этот код самостоятельно, потому что maltparser.org не работает на второй день. Я проверил, что входной файл имеет ожидаемый формат (предложения разделены двойной конечной точкой), поэтому очень маловероятно, что оболочка python объединяет предложения.

+0

спасибо !! Теперь он выводит дерево, но это неправильное дерево, см. Обновленный вопрос. – alvas

+0

Я обновил свой ответ, но не с решением - просто замечания –

+0

Нашел ошибку !!! Я ослепленный https://github.com/alvations/nltk/blob/patch-1/nltk/parse/malt.py#L56 'yield '\ n \ n'' был в неправильном отступе !!! gosh ... – alvas

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