анализ зависимостей (формат скобок) - испанский - с использованием тегов nltk и stanford-nlp - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь разобрать текстовый корпус испанского языка, чтобы получить такой результат, как SNLI corpus (используется для привязки), ниже я привел выдержку из snli corpus.

В церкви есть трещины в потолке. ((Церковь) ((имеет (трещины (в (потолок)))).)) (ROOT (S (NP (DT The) (NN церковь)) (VP (VBZ имеет) (NP (NP (NNS трещины)) (PP (IN in) (NP (DT the) (NN потолок))))) (..)))

Я попробовал следующий код, но вывод был не очень хорошим.

from nltk import Tree
from functools import reduce
from nltk.parse.corenlp import CoreNLPParser

def binarize(tree):
    """
    Recursively turn a tree into a binary tree.
    """
    if isinstance(tree, str):
        return tree
    elif len(tree) == 1:
        return binarize(tree[0])
    else:
        label = tree.label()
        return reduce(lambda x, y: Tree(label, (binarize(x), binarize(y))), tree)
    
parser = CoreNLPParser(url='http://localhost:9002')
#parse, = parser.raw_parse('you could say that they regularly catch a shower, which adds to their exhilaration and joie de vivre')
parse, = parser.raw_parse('si idioma no es elegido entonces elegir español por defecto.')
print(parse)
t = parse
bt = binarize(t)
print(bt)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Спасибо за ваш отзыв. Я попробовал ваш способ получения вывода, но он использует UD tagsets и ничего не делает:

(ROOT
  (sentence
    (sn
      (grup.nom
        (SCONJ si)
        (NOUN idioma)
        (NOUN no)
        (AUX es)
        (VERB elegido)
        (ADV entonces)
        (VERB elegir)
        (ADJ español)
        (ADP por)
        (NOUN defecto)))
    (PUNCT .)))

Я вижу, что мне нужно подключиться к Stanford parser (Stanford CoreNLP 3.7.0, обновлено 2016-09-12) (испанская модель), а не эта страница (Stanford CoreNLP 3.9.1, обновлено 2018/04/05). Следующий проанализированный пример взят из демонстрационной страницы парсера Стэнфорда, на которой я ищу точный результат:

(ROOT
  (sentence
    (sadv
      (grup.adv (rg si)))
    (sn
      (grup.nom (nc0s000 idioma)))
    (neg (rn no))
    (grup.verb (vsip000 es) (vmp0000 elegido))
    (S
      (sadv
        (grup.adv (rg entonces)))
      (S
        (infinitiu (vmn0000 elegir))
        (s.a
          (grup.a (aq0000 español)))
        (sp
          (prep (sp000 por))
          (sn
            (grup.nom (nc0s000 defecto))))))
    (fp .)))

Что точно и отлично сделано для наборов тегов, используемых в наборах тегов Ancora, о которых вы также упоминали выше. Я попытался использовать тот же парсер (Parser: spanishPCFG.ser.gz), но у меня был такой результат, который не совпадает с форматом корпуса SNLI (формат скобок), и у него есть некоторая проблема с кодом utf8 ('-' в слове ' Испанский не распознан):

mark(elegido-5, si-1)
nsubj(elegido-5, idioma-2)
neg(elegido-5, no-3)
cop(elegido-5, es-4)
root(ROOT-0, elegido-5)
mark(elegir-7, entonces-6)
advcl(elegido-5, elegir-7)
det(.-12, espa-8)
appos(espa-8, ol-9)
case(defecto-11, por-10)
nmod(ol-9, defecto-11)
punct(elegir-7, .-12)
Я понятия не имею, как получить желаемый результат.
0 голосов
/ 31 октября 2018

Мой вывод производится с использованием stanford-spanish-corenlp-2017-06-09-models.jar, который можно скачать здесь: https://nlp.stanford.edu/software/lex-parser.shtml#Download

По некоторым причинам использование более новых версий файла models.jar приводит к другим результатам.

Удостоверьтесь и положите испанский .jar в папку с остальной частью Stanford Core NLP (я использовал последнюю 2018-10-05).

Затем, когда вы запускаете сервер Stanford Core NLP, убедитесь и запустите его на испанском языке:

 java -mx3g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -serverProperties StanfordCoreNLP-spanish.properties -port 9000 -timeout 15000

Обратите внимание, что испанский экземпляр CoreNLPTagger использует другой набор тегов, который подробно описан на странице Часто задаваемые вопросы по испанскому языку .

from nltk.parse.corenlp import CoreNLPParser

parser = CoreNLPParser(url='http://localhost:9000')

parsed = parser.raw_parse('si idioma no es elegido entonces elegir español por defecto.')

for node in parsed:
    print(node)

Пример вывода ниже:

(ROOT
  (sentence
    (S
      (S
        (conj (cs si))
        (sn (grup.nom (nc0s000 idioma)))
        (neg (rn no))
        (grup.verb (vsip000 es)))
      (S (participi (aq0000 elegido))))
    (S
      (sadv (grup.adv (rg entonces)))
      (S
        (infinitiu (vmn0000 elegir))
        (s.a (grup.a (aq0000 español)))
        (sp (prep (sp000 por)) (sn (grup.nom (nc0s000 defecto))))))
    (fp .)))
...