Skip to content
Alexandre Rademaker edited this page May 2, 2019 · 13 revisions

The main function is:

(conllu.edit:conlluedit sentences tranformations)

O argumento sentences é uma lista de objetos da classe cl-conllu:sentence. O argumento tranformations é uma lista de transformações, em que cada tranformation é uma lista com definições, relações e ações. A função retorna uma lista indicando as alterações realizadas (vide exemplo). Os objectos sentence passados para a função são alterados, não são criadas cópias.

transformations :=  (transformation ...) 
transformation  :=  (definition* relation* action*)

definition := (filter*)
filter     := (OP field value) | (not filter)
OP         := ~ | = 

relation   := (= id id field field) | (distance id id min max) 
              | (< id id ...) | (not relation)
action     := (set id field value) | (set id id field field) 
              | (set id field lambda-form) | last

(TODO: terminar grammar. definições, relacions ou actions podem ser nil?)

Definitions lista de definition, em que cada uma é a descrição dos tokens a serem correspondidos usando seus respectivos campos.

((= form "Boom") (= id 1))

A expressão (= form "Boom") selecionar tokens com form igual a “Boom”. A expressão (= id 1) selecionar tokens com id igual a 1. Vários critérios para um único token podem serem especificados com sub-listas.

(((= form "Boom") (= upostag "VERB")) (= id "1")) 

Para os critérios, além do operador de igualdade, =, dois outros operadores são permitidos. Expressões regulares podem serem utilizadas com o operador ~ e o operador de negação not.

(~ upostag ".*")
(not (= id 4))

A lista relation, em que cada uma define o relacionamento que dois tokens devem possuir. Refere-se a cada token em definitions com o número de sua posição. No exemplo abaixo, os tokens 1 e 2 devem ter duas relações entre eles:

((= 1 2 form form) (distance 1 2 1 10))

Equivalência: os valores dos campos dos tokens especificados devem serem iguais. No exemplo abaixo, o form do token 1 deve ser igual ao valor upostag do token 2.

(= 1 2 form upostag) 

Podemos usar a forma (> 1 2 3 ...) para ((= 1 2 head id) (= 2 3 head id) ...).

A distância especifica a distância entre dois tokens pela suas diferenças de ids. Abaixo, a distância do token 1 para o token 2 deve estar entre 1 (min) e 10 (max). Os valores min e max são opcionais, o valor padrão do min é 1 e o valor padrão do max é o valor de min.

(distance 1 2 1 10)

Critério negativo: not.

(not (= 1 2 form upostag)) 
(not (distance 1 2 1 10))

A lista de expressões action, em que cada uma representa as alterações a serem feitas aos tokens que cumpriram as definitions e relations.

((set 1 form "Super") (set 2 id 10))

A expressão (set 1 form "Super") alterar o valor do form do token 1 para “Super”. A expressão (set 2 id 2) alterar o valor do id do token 2 para 2. Também é possível aplicar uma função ao valor do campo do token.

(set 2 upostag #'(lambda (string) ...)) 

A função lambda irá receber um argumento, o valor do campo upostag do token 2 e irá alterar o valor do campo com o resultado retornado pela função. Também podemos basear valor a ser definido em outro token. No exemplo abaixo, a ação irá lterar o valor do form do token 1 para o valor da upostag do token 2.

(set 1 2 form upostag) 

Uma forma abreviada (> 1 2 3 ...) para dizermos que ((set 1 2 head id) (set 2 3 head id) ...).

Temos ainda a função last, que sinaliza que, se essa transformation realizou alterações na sentence com sucesso, transformations posteriores não serão aplicadas a essa sentence.

((set 2 form "oi") ... (last))

(TODO: descrever o workflow para que a sentença acima faça sentido.)

Exemplo

Uma ou mais regras podem ser passadas para a função juntamente com a lista de sentenças a serem examinadas:

CL-CONLLU> (conllu.editor:conlluedit sents '((rule
					      :vars ((~ form "[Éé]")
						     (= form "de")
						     (= lemma "ele"))
					      :rels ((> 3 1)
						     (> 3 2))
					      :acts ((> 2 3)
						     (> 1 2)
						     (set 3 1 form form)))
					     (rule
					      :vars ((~ form ".*")
						     (~ form ".*")
						     (~ form ".*")
						     (~ form ".*")
						     (~ form ".*"))
					      :rels ((> 1 2 3 4 5))
					      :acts ((> 5 4 3 2 1)))))
Transformation 1 changed 3 tokens of Sentenca CF633-1 
Transformation 2 changed 4 tokens of Sentenca CF633-1 
Transformation 1 changed 3 tokens of Sentenca CF892-3 
Transformation 2 changed 4 tokens of Sentenca CF892-3 
(("CF892-3"
  (2
   ((3 HEAD "2" 2) (2 HEAD "1" 2) (6 HEAD "3" 2) (9 HEAD "6" 2) (6 HEAD "3" 2)
    (9 HEAD "6" 2) (14 HEAD "6" 2) (14 HEAD "6" 2) (3 HEAD "2" 2)
    (14 HEAD "6" 2) (17 HEAD "14" 2) (6 HEAD "3" 2) (9 HEAD "6" 2)
    (9 HEAD "6" 2) (9 HEAD "6" 2) (3 HEAD "2" 2) (6 HEAD "3" 2) (1 HEAD "3" 2))
   ((2 HEAD "1" 1) (1 HEAD "3" 1) (6 HEAD "3" 1) (6 HEAD "3" 1) (14 HEAD "6" 1)
    (3 HEAD "2" 1) (3 HEAD "2" 1))
   ((1 HEAD "3" 3) (3 HEAD "2" 3) (6 HEAD "3" 3) (2 HEAD "1" 3))
   ((3 HEAD "2" 2) (2 HEAD "1" 2) (3 HEAD "2" 2) (1 HEAD "3" 2)))
  (1 ((3 HEAD "0" 2)) ((2 HEAD "3" 1)) ((3 FORM "ele" "É"))))
 ("CF633-1"
  (2
   ((3 HEAD "2" 2) (2 HEAD "1" 2) (3 HEAD "2" 2) (5 HEAD "3" 2) (3 HEAD "2" 2)
    (3 HEAD "2" 2) (14 HEAD "3" 2) (3 HEAD "2" 2) (19 HEAD "3" 2)
    (3 HEAD "2" 2) (3 HEAD "2" 2) (24 HEAD "3" 2) (24 HEAD "3" 2)
    (28 HEAD "24" 2) (3 HEAD "2" 2) (28 HEAD "24" 2) (24 HEAD "3" 2)
    (28 HEAD "24" 2) (3 HEAD "2" 2) (24 HEAD "3" 2) (19 HEAD "3" 2)
    (19 HEAD "3" 2) (3 HEAD "2" 2) (3 HEAD "2" 2) (14 HEAD "3" 2)
    (11 HEAD "3" 2) (7 HEAD "5" 2) (7 HEAD "5" 2) (5 HEAD "3" 2)
    (1 HEAD "3" 2))
   ((2 HEAD "1" 1) (1 HEAD "3" 1) (3 HEAD "2" 1) (24 HEAD "3" 1) (3 HEAD "2" 1)
    (3 HEAD "2" 1) (3 HEAD "2" 1) (5 HEAD "3" 1) (3 HEAD "2" 1) (3 HEAD "2" 1))
   ((1 HEAD "3" 3) (3 HEAD "2" 3) (2 HEAD "1" 3))
   ((3 HEAD "2" 2) (2 HEAD "1" 2) (1 HEAD "3" 2)))
  (1 ((3 HEAD "0" 2)) ((2 HEAD "3" 1)) ((3 FORM "ele" "É")))))

A função retorna o que foi realizado de alterações nas sentenças:

((errors) 
 (sentece-id
  (rule-index
   ((token-id token-field old-value new-value)
    ...))
  ...)
 ...)
Clone this wiki locally