依赖解析(括号格式) - 西班牙语 - 使用 nltk 和 stanford-nlp 标签

dependency parsing (bracket format) - spanish - using nltk and stanford-nlp tag

我正在尝试解析西班牙语的纯文本语料库以获得类似 SNLI 语料库(用于蕴含)的结果,我在下面附上了 snli 语料库的摘录。

教堂的天花板有裂缝。 ((教堂)((有(裂缝(在(天花板)))))。)) (ROOT(S(NP(DT)(NN教堂))(VP(VBZ了)(NP(NP(NNS破解))(PP(IN中)(NP(DT了)(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)

我的输出是使用 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 的西班牙语实例使用不同的标签集,在 Spanish FAQ 页面上有详细说明。

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 .)))

感谢您的友好反馈。我尝试了您获取输出的方法,但它使用的是 UD 标签集,但什么也没做:

(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, updated 2016-09-12) (Spanish model) and not this page(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 标签集中使用的标签集,这是准确且完美的。我尝试使用相同的解析器(解析器:spanishPCFG.ser.gz),但我得到的结果与 SNLI 语料库(括号格式)的格式不同,并且它有一些 utf8 代码问题('español' 尚未被识别):

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)
我不知道如何得到我想要的结果。