CompLin / nheengatu

Tools and resources for the computational processing of Nheengatu (Modern Tupi)
7 stars 1 forks source link

correção de `Avila2021:0:0:542` e casos análogos: oração com `iobj` sem `obj` #454

Closed leoalenc closed 1 month ago

leoalenc commented 1 month ago

Em Avila2021:0:0:542, o nó 8 tem como núcleo regente o nó 9, fazendo com que o verbo que rege iobj não governe também um obj, o que normalmente não deve ocorrer (ver https://universaldependencies.org/u/dep/iobj.html). Independentemente disso, pusanga 'remédio' é claramente um argumento de meẽ 'dar' (nó 5).

heliolbs commented 1 month ago

@leoalenc , dei uma pausa na implementação do script de captura dos casos análogos da tarefa 2 para consultar o Grew-Match. Usando a consulta abaixo, é possível ver que, no banco de árvores v2.14, há 57 ocorrências de verbos com iobj mas sem obj.

pattern {
  X [upos = VERB];
  X -[iobj]-> Y;
}
without { X -[obj]-> O }

Entretanto, alguns dos verbos das ocorrências têm ccomp, o que me deixou na dúvida sobre filtrar esse caso ou não. Talvez seja por influência da gramática tradicional; vou investigar. Modificando levemente a consulta acima, usei a consulta abaixo para concluir que há apenas 10 ocorrências de verbos na v2.14 com iobl mas sem obj e sem ccomp.

pattern {
  X [upos = VERB];
  X -[iobj]-> Y;
}
without { X -[obj|ccomp]-> O }

Vou retomar amanhã a implementação do script para termos as informações exatas sobre a versão do banco em desenvolvimento aqui no nosso repositório.

leoalenc commented 1 month ago

@leoalenc , dei uma pausa na implementação do script de captura dos casos análogos da tarefa 2 para consultar o Grew-Match. Usando a consulta abaixo, é possível ver que, no banco de árvores v2.14, há 57 ocorrências de verbos com iobj mas sem obj.


pattern {

  X [upos = VERB];

  X -[iobj]-> Y;

}

without { X -[obj]-> O }

Entretanto, alguns dos verbos das ocorrências têm ccomp, o que me deixou na dúvida sobre filtrar esse caso ou não. Talvez seja por influência da gramática tradicional; vou investigar. Modificando levemente a consulta acima, usei a consulta abaixo para concluir que há apenas 10 ocorrências de verbos na v2.14 com iobl mas sem obj e sem ccomp.


pattern {

  X [upos = VERB];

  X -[iobj]-> Y;

}

without { X -[obj|ccomp]-> O }

Vou retomar amanhã a implementação do script para termos as informações exatas sobre a versão do banco em desenvolvimento aqui no nosso repositório.

@heliolbs , excelente trabalho! Conforme a teoria das dependências universais, nos casos de que estamos tratando,ccomp equivale a um obj. Aquela função é como se fosse um objeto direto realizado através de uma sentença. Os casos que realmente demandam atenção são mesmo esses que não possuem nem obj nem ccomp. Esses casos não constituem necessariamente erros, porque pode ser que tenhamos um obj implícito. Precisam ser verificados manualmente um a um.

heliolbs commented 1 month ago

@heliolbs , excelente trabalho! Conforme a teoria das dependências universais, nos casos de que estamos tratando,ccomp equivale a um obj. Aquela função é como se fosse um objeto direto realizado através de uma sentença. Os casos que realmente demandam atenção são mesmo esses que não possuem nem obj nem ccomp.

Que bom, @leoalenc . Então minha intuição estava certa. Com relação à verificação do banco de árvores atual, após incluir e rodar a função abaixo dentro do módulo AnnotateConllu do meu clone local, obtive resultados idênticos aos da consulta à v2.14 pelo Grew-Match. A única exceção foi a própria sentença desta questão, Avila2021:0:0:542, que já havia sido corrigida por você. Isso indica que nenhuma sentença que satisfaça as condições do cenário avaliado aqui foi incluída no banco de árvores após o lançamento da v2.14. A sentença Rodrigues1890:1-2-2:101:101 aparece duas vezes, pois há dois verbos nela que satisfazem o cenário.

Esses casos não constituem necessariamente erros, porque pode ser que tenhamos um obj implícito. Precisam ser verificados manualmente um a um.

Vou verificar cada sentença a procura de objs implícitos.

Sentenças extraídas:

Navarro2016:0:0:206
Avila2021:4:1:25
Avila2021:4:2:26
Avila2021:0:0:36
Avila2021:0:0:241
Avila2021:0:0:562
Rodrigues1890:1-2-2:101:101
Rodrigues1890:1-2-2:101:101
Magalhaes1876:2:24:67

Função:

def getSentencesIssue454():
    """
    Scan the treebank for sentences with verbs governing iobj but not either obj or ccomp. Returns a list of sent_id values. The current results are identical to what Grew-Match returns.
    >>> getSentencesIssue454()
['Navarro2016:0:0:206', 'Avila2021:4:1:25', 'Avila2021:4:2:26', 'Avila2021:0:0:36', 'Avila2021:0:0:241', 'Avila2021:0:0:562', 'Rodrigues1890:1-2-2:101:101', 'Rodrigues1890:1-2-2:101:101', 'Magalhaes1876:2:24:67']
    """
    with open(TREEBANK_PATH, 'r', encoding='utf-8') as f:
        txt = f.read()

    tree_list_txt = txt.split('\n\n')

    sent_id_pattern = re.compile('# sent_id = (.*)')

    line_pattern = re.compile(r'\n(\d{1,2})\t.*\t.*\t([A-Z2]*)\t[A-Z2]*\t.*\t(\d{1,2})\t([a-z]*)\t.*\t.*')

    yrl = []

    for arvore in tree_list_txt:
        verbs = []
        ccomp_heads = []
        obj_heads = []
        iobj_heads = []
        tree = {
            'verbs' : verbs,
            'ccomp_heads' : ccomp_heads,
            'obj_heads' : obj_heads,
            'iobj_heads' : iobj_heads
            }

        first_line = arvore.split('\n')[0]
        search_result = sent_id_pattern.search(first_line)

        if search_result:
            sent_id = search_result.group(1)
            tree.update({'sent_id' : sent_id})
            yrl.append(tree)

        lines= re.findall(line_pattern, arvore)
        for line in lines:

            if line[1] == 'VERB':
                verbs.append(line[0])

            if line[3] == 'ccomp':
                ccomp_heads.append(line[2])

            if line[3] == 'obj':
                obj_heads.append(line[2])

            if line[3] == 'iobj':
                iobj_heads.append(line[2])

    sentences = []

    for arvore in yrl:
        verbs = arvore['verbs']
        ccomp_heads = arvore['ccomp_heads']
        obj_heads = arvore['obj_heads']
        iobj_heads = arvore['iobj_heads']
        for verb_id in verbs:
            if verb_id in iobj_heads and verb_id not in obj_heads and verb_id not in ccomp_heads:
                sentences.append(arvore['sent_id'])

    return sentences
leoalenc commented 1 month ago

Sentenças extraídas:

Navarro2016:0:0:206

obj do verbo meẽ 'dar' implícito, mencionado na oração anterior

Avila2021:4:1:25

A mesmo situação acima.

Avila2021:4:2:26

Há um objeto direto nulo anafórico regido por xari 'entregar' na segunda oração, correferente do objeto implícito da oração anterior.

Avila2021:0:0:36

O verbo encaixado meẽ 'dar' é ccomp, não xcomp. Correção feita. Ver #230.

Avila2021:0:0:241

Há um objeto direto nulo anafórico.

Avila2021:0:0:562

Objeto direto nulo anafórico.

Rodrigues1890:1-2-2:101:101

Objeto direto nulo anafórico.

Rodrigues1890:1-2-2:101:101

Objeto direto nulo anafórico.

Magalhaes1876:2:24:67

Aqui parece ocorrer uma variante do verbo nheẽ 'falar' sem objeto direto. Talvez seja o caso de corrigir o iobj para obl.

leoalenc commented 1 month ago

Em Avila2021:0:0:542, o nó 8 tem como núcleo regente o nó 9, fazendo com que o verbo que rege iobj não governe também um obj, o que normalmente não deve ocorrer (ver https://universaldependencies.org/u/dep/iobj.html). Independentemente disso, pusanga 'remédio' é claramente um argumento de meẽ 'dar' (nó 5).

  • [x] corrigir head do nó 8 (@leoalenc )
  • [ ] levantar casos análogos de erro (@heliolbs )

A tarefa 2 gerou #460. Portanto, vou considerar essa tarefa concluídas e fechar a presente questão após o commit abaixo.