LR-POR / tools

Tools for checking the compatibility between a lexical resource and a treebank
BSD 3-Clause "New" or "Revised" License
2 stars 0 forks source link

implementar funções em Python para extração de verbos #39

Closed leoalenc closed 2 years ago

leoalenc commented 2 years ago

@arademaker, construí scripts com diversas funções em Python que extraem verbos do Bosque, usando o dicionário criado por meio de valences.py, e geram entradas da gramática, atualizando o índice dos lemas. Componente central da criação de entradas é um mapping de molduras sobre tipos da gramática. Esta issue relaciona-se, além de #11, às seguintes:

https://github.com/LR-POR/PorGram/issues/60 https://github.com/LR-POR/PorGram/issues/19

O objetivo desta issue é melhorar esses scripts meus. Uma atividade talvez para @analununes ou quem se dispuser a isso.

arademaker commented 2 years ago

amostra de 50 entradas para avaliação:

acabar_2 := nonrefl-ine-obj-verb-lex &
  [ STEM < "acabar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_acabar_v_2_rel" ].

ligar_1 := nonrefl-goa-obj-verb-lex &
  [ STEM < "ligar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_ligar_v_1_rel" ].

vetar_1 := trans-verb-lex &
  [ STEM < "vetar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_vetar_v_1_rel" ].

mencionar_1 := trans-verb-lex &
  [ STEM < "mencionar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_mencionar_v_1_rel" ].

relegar_1 := trans-verb-lex &
  [ STEM < "relegar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_relegar_v_1_rel" ].

colmatar_1 := trans-verb-lex &
  [ STEM < "colmatar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_colmatar_v_1_rel" ].

calibrar_1 := trans-verb-lex &
  [ STEM < "calibrar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_calibrar_v_1_rel" ].

chamar_1 := trans-verb-lex &
  [ STEM < "chamar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_chamar_v_1_rel" ].

bater_3 := refl-int-verb-lex &
  [ STEM < "bater" >,
    SYNSEM.LKEYS.KEYREL.PRED "_bater_v_3_rel" ].

indicar_3 := trans-verb-lex &
  [ STEM < "indicar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_indicar_v_3_rel" ].

celebrar_1 := trans-verb-lex &
  [ STEM < "celebrar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_celebrar_v_1_rel" ].

acoplar_1 := nonrefl-dat-obj-verb-lex &
  [ STEM < "acoplar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_acoplar_v_1_rel" ].

concentrar_1 := trans-verb-lex &
  [ STEM < "concentrar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_concentrar_v_1_rel" ].

explodir_1 := trans-verb-lex &
  [ STEM < "explodir" >,
    SYNSEM.LKEYS.KEYREL.PRED "_explodir_v_1_rel" ].

cessar_1 := trans-verb-lex &
  [ STEM < "cessar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_cessar_v_1_rel" ].

amplificar_1 := trans-verb-lex &
  [ STEM < "amplificar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_amplificar_v_1_rel" ].

formular_1 := trans-verb-lex &
  [ STEM < "formular" >,
    SYNSEM.LKEYS.KEYREL.PRED "_formular_v_1_rel" ].

reencontrar_2 := refl-int-verb-lex &
  [ STEM < "reencontrar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_reencontrar_v_2_rel" ].

colher_1 := trans-verb-lex &
  [ STEM < "colher" >,
    SYNSEM.LKEYS.KEYREL.PRED "_colher_v_1_rel" ].

supor_3 := trans-verb-lex &
  [ STEM < "supor" >,
    SYNSEM.LKEYS.KEYREL.PRED "_supor_v_3_rel" ].

passar_3 := refl-int-verb-lex &
  [ STEM < "passar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_passar_v_3_rel" ].

batizar_1 := nonrefl-gen-obj-verb-lex &
  [ STEM < "batizar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_batizar_v_1_rel" ].

cobrar_1 := trans-verb-lex &
  [ STEM < "cobrar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_cobrar_v_1_rel" ].

solicitar_3 := subj-cl-rec-verb-lex &
  [ STEM < "solicitar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_solicitar_v_3_rel" ].

estourar_1 := trans-verb-lex &
  [ STEM < "estourar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_estourar_v_1_rel" ].

treinar_1 := trans-verb-lex &
  [ STEM < "treinar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_treinar_v_1_rel" ].

consubstanciar_1 := trans-verb-lex &
  [ STEM < "consubstanciar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_consubstanciar_v_1_rel" ].

revisitar_1 := trans-verb-lex &
  [ STEM < "revisitar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_revisitar_v_1_rel" ].

votar_2 := trans-verb-lex &
  [ STEM < "votar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_votar_v_2_rel" ].

conformar_1 := refl-com-obj-verb-lex &
  [ STEM < "conformar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_conformar_v_1_rel" ].

valer_1 := trans-verb-lex &
  [ STEM < "valer" >,
    SYNSEM.LKEYS.KEYREL.PRED "_valer_v_1_rel" ].

acompanhar_2 := nonrefl-gen-obj-verb-lex &
  [ STEM < "acompanhar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_acompanhar_v_2_rel" ].

torturar_1 := trans-verb-lex &
  [ STEM < "torturar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_torturar_v_1_rel" ].

punir_1 := trans-verb-lex &
  [ STEM < "punir" >,
    SYNSEM.LKEYS.KEYREL.PRED "_punir_v_1_rel" ].

replicar_1 := ind-cl-verb-lex &
  [ STEM < "replicar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_replicar_v_1_rel" ].

visitar_1 := trans-verb-lex &
  [ STEM < "visitar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_visitar_v_1_rel" ].

reconstruir_1 := trans-verb-lex &
  [ STEM < "reconstruir" >,
    SYNSEM.LKEYS.KEYREL.PRED "_reconstruir_v_1_rel" ].

estudar_1 := trans-verb-lex &
  [ STEM < "estudar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_estudar_v_1_rel" ].

privilegiar_1 := trans-verb-lex &
  [ STEM < "privilegiar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_privilegiar_v_1_rel" ].

contar_5 := nonrefl-com-obj-verb-lex &
  [ STEM < "contar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_contar_v_5_rel" ].

mimetizar_1 := trans-verb-lex &
  [ STEM < "mimetizar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_mimetizar_v_1_rel" ].

demover_1 := trans-verb-lex &
  [ STEM < "demover" >,
    SYNSEM.LKEYS.KEYREL.PRED "_demover_v_1_rel" ].

plantar_1 := trans-verb-lex &
  [ STEM < "plantar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_plantar_v_1_rel" ].

afastar_1 := refl-gen-obj-verb-lex &
  [ STEM < "afastar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_afastar_v_1_rel" ].

adiantar_3 := nom-acc-dat-ditransitive-verb-lex &
  [ STEM < "adiantar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_adiantar_v_3_rel" ].

mentir_1 := nonrefl-dat-obj-verb-lex &
  [ STEM < "mentir" >,
    SYNSEM.LKEYS.KEYREL.PRED "_mentir_v_1_rel" ].

dissolver_1 := trans-verb-lex &
  [ STEM < "dissolver" >,
    SYNSEM.LKEYS.KEYREL.PRED "_dissolver_v_1_rel" ].

reconciliar_1 := trans-verb-lex &
  [ STEM < "reconciliar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_reconciliar_v_1_rel" ].

inscrever_2 := refl-ine-obj-verb-lex &
  [ STEM < "inscrever" >,
    SYNSEM.LKEYS.KEYREL.PRED "_inscrever_v_2_rel" ].

repor_1 := trans-verb-lex &
  [ STEM < "repor" >,
    SYNSEM.LKEYS.KEYREL.PRED "_repor_v_1_rel" ].

Código no sample-eval-valence.py de e9f4bdb

arademaker commented 2 years ago

Em e9f4bdb acrescentei os mapeamentos das molduras extraídas do bosque no etc/valence.py para os tipos da PorGram.

leoalenc commented 2 years ago

Em https://github.com/LR-POR/tools/commit/2190f238228f8d0960b9f26f9336185642d84dfd, incluí as seguintes funções:

  1. get_examples_of_verbtype, que extrai do Bosque os exemplos que correspondem a tipos da PorGram, com base nos mapeamentos de https://github.com/LR-POR/tools/tree/main/etc/ud-types. 2.get_shortest_example, que extrai o exemplo mais curto de uma lista de exemplos.
leoalenc commented 2 years ago

https://github.com/LR-POR/tools/commit/f91956466f6bb1a9950b362f3d9c82ce463c051b contém mudanças e acréscimos que facilitam a outros usuários a criação de novas entradas da PorGram a partir de exemplos do Bosque.

leoalenc commented 2 years ago

Implementei, em https://github.com/LR-POR/tools/commit/4f3b38843ed4a2626f3c75d6043542deb3daf74a, a função compute_stats, que cria tabela m*n, onde m é a aridade de uma moldura e n é a quantidade de molduras com essa aridade, relevante para detecção de molduras excessivamente longas que podem indicar erros de anotação, conforme https://github.com/UniversalDependencies/UD_Portuguese-Bosque/issues/393#.

leoalenc commented 2 years ago

Em https://github.com/LR-POR/tools/commit/dfb654ad9cc4a9fe4248a335021d810f4804035c, implementei a função insert_examples que, aplicada sobre um arquivo TDL com entradas geradas automaticamente a partir de dados do UD_Portuguese-Bosque, insere, em cada entrada lexical, como docstring, o exemplo mais curto do verbo no tipo respectivo. Para tanto, é feita uma reconversão do tipo da PorGram para a lista de molduras correspondentes. A função permite também extrair uma amostra aleatória do arquivo TDL dado, incorporando a funcionalidade de https://github.com/LR-POR/tools/commit/e9f4bdb7f6b9ff90765f24e5bdd592677b835cf2, implementado por @arademaker. Um exemplo extraído de um arquivo gerado pela função:

afastar_1 := refl-gen-obj-verb-lex &
  [ STEM < "afastar" >,
    SYNSEM.LKEYS.KEYREL.PRED "_afastar_v_1_rel" ]
  """
  Como melhorar o ensino superior sem transformar as universidades em «escolões», onde os professores só repetem e se afastam da pesquisa?
  """. 
leoalenc commented 2 years ago

Em https://github.com/LR-POR/tools/commit/15817208d0bfa6c84efd5a14a930a36789b20495, melhorei a função que extrai todas as preposições de todas as molduras valenciais. A lista de preposições revela potenciais erros de anotação do Bosque, problemas que detalharei em issue própria do respectivo repositório.

leoalenc commented 2 years ago

Corrigir problema detectado em https://github.com/LR-POR/PorGram/issues/59#issuecomment-1024587420, causado pelo fato de alguns verbos como cópulas não estarem sendo incorporados ao dicionários de entradas existentes, levando a que o módulo de criação automática de entradas a partir de molduras do Bosque gere duplicatas.

leoalenc commented 2 years ago

Com https://github.com/LR-POR/tools/commit/ed7dff9939e880e3d025fded2fd2eb94c0957203, fecho a questão. Os scripts ValenceExtractor.py e WriteVerbEntries.py permitem agora extrair todas as entradas existentes da PorGram e incluir novas entradas automaticamente a partir de dados do UD Bosque, atualizando os índices, conforme as seguintes issues:

https://github.com/LR-POR/PorGram/issues/60 https://github.com/LR-POR/PorGram/issues/66 https://github.com/LR-POR/PorGram/issues/67 https://github.com/LR-POR/PorGram/issues/69

Fecho a issue. Problemas que surgirem e melhoras que vierem a ser feitas nos scripts serão objeto de issues específicas.

leoalenc commented 2 years ago

Em e9f4bdb acrescentei os mapeamentos das molduras extraídas do bosque no etc/valence.py para os tipos da PorGram.

Novos mapeamentos incluídos com https://github.com/LR-POR/tools/commit/ed7dff9939e880e3d025fded2fd2eb94c0957203.