- Criando regras XML
Criando regras XML¶
As regras XML são descritas no arquivo source:cogroo3/trunk/CoGrOOBase/src/main/rules/rules.xml, cujo XML Schema é source:cogroo3/trunk/CoGrOOBase/src/main/rules/rules.xsd. Aqui descrevemos como o rules.xml é formado. Para entender em linhas mais gerais como criar novas regras siga o tutorial Como criar ou modificar regras.
Esta é uma referência detalhada do formato do arquivo de regras.
Elemento raiz Rule¶
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Rules xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Rules.xsd"> <Rule ... </Rules>
O elemento raiz Rules pode ter um ou mais filhos do tipo Rule, cada Rule descrevendo uma regra. O elemento Rules pode incluir atributos opcionais, como o xsi:noNamespaceSchemaLocation="Rules.xsd" que permite validação e autocompletar de acordo com o editor XML que você estiver usando.
Elemento Rule¶
<Rule id="int" active="boolean"> <Method>enum:[general|phrase-local|subject-verb]</Method> <Type>string</Type> <Group>string</Group> <Message>string</Message> <ShortMessage>string</ShortMessage> <Pattern ... <Boundaries ... <Suggestion ... <Example ... <ModificationHistory ... </Rule>
O elemento Rule deve ter os atributos id
e active
. id
é um inteiro maior que 0, e deve ser único. active
indica se essa regra está ativa ou não. Algumas regras podem estar desativadas porque por algum motivo não convêm estarem ativas, por exemplo podem causar muitos falsos positivos.
Filhos de Rule¶
Method¶
Campo obrigatório que pode ter um dos valores:
general
: os padrões serão aplicados em qualquer sequencia de tokens da sentença, sem se preocupar com a estrutura de sintagmas, ou sujeito e verbo.phrase-local
: os padrões serão aplicados apenas dentro de um mesmo sintagma, nunca ultrapassando seus limites. É interessante por exemplo concordância entre artigo e substantivo, que só faria sentido se estivessem no mesmo sintagma nominal.subject-verb
: o padrão será aplicado no nível estrutural do sujeito-verbo.
Type¶
Tipo mais geral da regra, como "Crase", ou "Regência".
Group¶
Tipo mais específico da regra, como "Crase antes de verbo", "Regência de verbo intransitivo".
Message¶
Mensagem mais longa e descritiva que será exibida ao usuário quando clicar em "Explicar..." na janela "Ortografia e gramática" do OpenOffice.
ShortMessage¶
Mensagem curta que será exibida ao usuário quando clicar com o direito sobre um erro no OpenOffice.
Pattern¶
É um elemento complexo que pode ter um ou mais filhos do tipo PatternElement
:
<Pattern> <PatternElement ... </Pattern>
Cada PatternElement
se refere a características de um Token ou de um grupo (sintagma ou sujeito). Use uma sequência de PatternElement
para descrever as características de um erro. Quando estas casarem com o texto do usuário o erro será apontado. Mais sobre o elemento PatternElement
em Filhos de PatternElement.
Boundaries¶
É um elemento complexo obrigatório que deve conter os filhos Lower
e Upper
, ambos elementos simples inteiros. Exemplo:
<Boundaries> <Lower>0</Lower> <Upper>-1</Upper> </Boundaries>
Os valores de Boundaries
são usados para apontar qual região em torno da que houve casamento do Pattern
deve ser marcada como errada e também será essa a região substituída pelo OpenOffice.
O elemento Lower
aponta o começo do região. O valor 0
significa que será sublinhada a partir do token em que Pattern
casou. O valor -1
que será um token antes, e o valor 1
um token depois. Similar para Upper
.
Suggestion¶
É um elemento composto opcional que pode ocorrer 0 ou mais vezes como filho de Rule
. Cada um representa uma possível sugestão de correção.
Suggestion
é descrito em Filhos de Suggestion.
Example¶
É um elemento composto obrigatório que deve ocorrer 1 ou mais vezes como filho de Rule
e serve para documentar exemplos de sentenças que a regra deve corrigir, e ainda é usado em testes automatizados. Os filhos de Example
são os elementos Incorrect
e Correct
, ambos strings. Incorrect deve ser uma sentença em que Pattern
casa, e Correct
a mesma sentença corrigida usando uma das sugestões descritas por Suggestion
.
<Example> <Incorrect>Recebemos os cartão de crédito pelo correio.</Incorrect> <Correct>Recebemos os cartões de crédito pelo correio.</Correct> </Example> <Example> <Incorrect>Os copo estão quebrados.</Incorrect> <Correct>Os copos estão quebrados.</Correct> </Example>
ModificationHistory¶
É um elemento composto obrigatório que deve ocorrer 1 ou mais vezes como filho de Rule
e serve para documentar a criação e as modificações da regra. Os filhos de ModificationHistory
são Author
, quem criou ou modificou a regra, Date
, a data da modificação e Comment
um comentário opcional.
<ModificationHistory> <Author>fulano</Author> <Date>2005-11-03T12:44:23.000-03:00</Date> <Comment>Regra criada</Comment> </ModificationHistory> <ModificationHistory> <Author>fulano</Author> <Date>2009-12-03T12:44:23.000-03:00</Date> <Comment>Sugestão corrigida</Comment> </ModificationHistory>
Filhos de PatternElement¶
PatternElement
pode ter dois tipos de filhos: ou um Element
, ou um Composition
.
Element¶
Element
tem a seguinte sequencia de filhos: o boolean opcional Negated
e um ou mais elementos complexo Mask
.
<Element> <Negated>true</Negated> <Mask ... </Element>
Negated
simplesmente inverte o que for definido em Mask
. Ou seja, se Mask
não casar Negated = true
vai inverter isso. Default é Negated = false
.
Mask¶
Mask
é um elemento complexo que define características de um token. Cada Mask pode ter um filho dos tipos:
LexemeMask
Casa se o token for igual ao especificado:
<Mask> <LexemeMask>há</LexemeMask> </Mask>
Aqui casaria se a sentença tiver a palavra "há".
PrimitiveMask
Casa se a primitiva do token for igual ao especificado:
<Mask> <LexemeMask>haver</LexemeMask> </Mask>
Aqui casaria se a sentença tiver qualquer conjugação do verbo haver, por exemplo.
TagMask
É um elemento composto que aceita uma ou mais etiquetas morfossintáticas. Veja mais em Filhos de TagMask.
Casa se todas as etiquetas morfossintáticas descritas coincidam com as do token:
<Mask> <TagMask> <Class>noun</Class> <Gender>female</Gender> <Number>singular</Number> </TagMask> </Mask>
Neste exemplo casaria se a palavra fosse um substantivo feminino singular, como "menina".
TagReference
É um elemento composto que deve ter o atributo inteiro index
e um filho do tipo Property
. index
serve para remeter a um outro PatternElemen
, por exemplo index="0"
remete ao primeiro token que tivemos casamento.
Cada TagReference
pode ter um ou mais elementos Property
. O elemento Property
é um enumerado cujos valores válidos são os nomes dos elementos de TagMask
, portanto: SyntacticFunction
, ChunkFunction
, Class
, Gender
, Number
, Case
, Person
, Tense
, Mood
, Finiteness
e Punctuation
.
TagReference
casa se o token atual tiver as mesmas etiquetas (Property
) do token na posição index
.
<Mask> <TagReference index="1"> <Property>Gender</Property> <Property>Number</Property> </TagReference> </Mask>
Aqui casaria se o elemento atual tiver o mesmo gênero e número do elemento na posição 1, por exemplo, se o elemento na posição 1 for "as" o atual "meninas".
OutOfBounds
O elemento simples OutOfBounds
não precisa de nenhum atributo ou filho. Este elemento casa com os limites de uma sentença e deve ser usado antes ou depois de um PatternElement
que está obrigatoriamente no inicio ou no fim da sentença, respectivamente.
<Mask> <OutOfBounds /> </Mask>
Composition¶
Composition
deve ser usado para criar elementos PatternElement
mais complexos, criados através da combinação de diversos PatternElement
através de operadores And
e Or
.
And¶
O operador And
aceita um ou mais filhos do tipo PatternElement
.
<Composition> <And> <PatternElement ... <PatternElement ... </And> </Composition>
Casaria se todos as características do primeiro e do segundo PatternElement
fossem satisfeitas.
Or¶
O operador Or
aceita um ou mais filhos do tipo PatternElement
.
<Composition> <Or> <PatternElement ... <PatternElement ... </Or> </Composition>
Casaria se ao menos as características do primeiro ou do segundo PatternElement
fosse satisfeita.
And e Or aninhados¶
É possível aninhar operadores And
e Or
. Por exemplo
<Composition> <And> <PatternElement> <Composition> <Or> <PatternElement ... [A] <PatternElement ... [B] </Or> </Composition> </PatternElement> <PatternElement> <Composition> <Or> <PatternElement ... [C] <PatternElement ... [D] </Or> </Composition> </PatternElement> </And> </Composition>
Casaria se (A || B) && (C || D)
.
Filhos de TagMask¶
TagMask
é um elemento complexo que permite uma sequência de filhos opcionais que representam tags morfossintáticas.
<TagMask> <Class>noun</Class> <Gender>female</Gender> <Number>singular</Number> </TagMask>
As etiquetas são derivadas de The Constraint Grammar category set of Palavras
As possíveis tags são:
SyntacticFunction¶
É uma etiqueta aplicada no nível sintático (Token.getSyntacticTag
). Os possíveis valores são:
subject
: sujeitoverb
: verbonone
: função sintática diferente de sujeito e verbo
ChunkFunction¶
É uma etiqueta aplicada no nível sintático (Token.getChunkTag
ou Sentence.getChunks
). Os possíveis valores são:
boundary noun phrase
: limite esquerdo de um sintagma nominalboundary noun phrase main
: limite esquerdo de um sintagma nominal, token principal do sintagmaboundary verb phrase main
: limite esquerdo de um sintagma verbal, token principal do sintagmaintermediary noun phrase
: token intermediário de um sintagma nominalintermediary noun phrase main
: token intermediário de um sintagma nominal, token principal do sintagmaintermediary verb phrase
: token intermediário de um sintagma verbalother
: token não faz parte de sintagma verbal ou nominal
Class¶
Etiqueta aplicada no nível do token e representa a classe da palavra (Token.getMorphologicalTag().getClazz()
)
noun
: substantivoproper noun
: nome própriospecifier
: Specifiers (defined as non-inflecting pronouns, that can't be used as prenominals): e.g. certain indefinite pronouns, nominal quantifiers, nominal relativesdeterminer
: Determiners (defined as inflecting pronouns, that can be used as prenominals): e.g. articles, attributive quantifiers personal pronoun
: Personal pronouns (defined as person-inflecting pronouns) adjective
: Adjectives (including ordinals, excluding participles which are tagged V PCP) adverb
: Adverbs (both 'primary' adverbs and derived adverbs ending in -mente) verb
: Verbs (full verbs, auxiliaries) numeral
: Numerals (cardinals) subordinating conjunction
coordinating conjunction
interjection
hyphen separated prefix
preposition
punctuation mark
unit
Gender¶
Etiqueta aplicada no nível do token e representa o gênero da palavra:
male
female
neutral
Number¶
Etiqueta aplicada no nível do token e representa o número da palavra:
singular
plural
neutral
Case¶
Etiqueta aplicada no nível do token e representa o caso de pronomes pessoais:
nominative
accusative
dative
prepositive
accusative-dative
nominative-prepositive
Person¶
Etiqueta aplicada no nível do token e representa a pessoa do verbo:
first
second
third
first-third
none-first-third
Tense¶
Etiqueta aplicada no nível do token e representa o tempo verbal:
present
preterito imperfeito
preterito perfeito
preterito mais-que-perfeito
future
conditional
preterito perfeito-mais-que-perfeito
Mood¶
Etiqueta aplicada no nível do token e representa o modo do verbo:
indicative
subjunctive
imperative
Finiteness¶
Etiqueta aplicada no nível do token e representa a forma nominal do verbo:
finite
infinitive
participle
gerund
Punctuation¶
Etiqueta aplicada no nível do token e representa a símbolos de pontuação:
abs
: pontuação absoluda como "." nsep
: pontuação que não separa sentença, como "," bin
: pontuação binária, como "(" e ")" rel
: pontuação relativa que depende de outros critérios para separar sentença, como ";"
Filhos de Suggestion¶
O tipo complexo Suggestion
é usado na geração de sugestões. Exemplo:
<Suggestion> <Replace index="0"> <Reference index="1"> <Property>Gender</Property> <Property>Number</Property> </Reference> </Replace> </Suggestion> <Suggestion> <Replace index="1"> <Reference index="0"> <Property>Gender</Property> <Property>Number</Property> </Reference> </Replace> </Suggestion>
Este exemplo gera duas sugestões. Uma oferece substituir o termo que casou na posição 0 por sua flexão de gênero e número alterada para ficar igual ao do elemento na posição 1. De forma similar a outra sugestão oferece substituir o termo que casou na posição 1 por sua flexão de gênero e número alterada para ficar igual ao do elemento na posição 0.
Os filhos de Suggestion
podem ser:
Replace¶
É um tipo complexo que pode ocorrer uma ou mais vezes como filho de Suggestion
. Deve ter um atributo inteiro index
que aponta para o elemento do PatternElement
que deve ser substituído. O índice começa do 0.
Os filhos de Replace
podem ser:
Lexeme¶
Substituir o elemento apontado por Replace
por palavra.
<Suggestion> <Replace index="1"> <Lexeme>à</Lexeme> </Replace> </Suggestion>
TagReference¶
Não está clara a diferença para Reference....
Reference¶
Elemento complexo que tem um atributo obrigatório index
que aponta para um elemento PatternElement
de onde se deve ser extraída as característica discriminadas nos filhos Property
. Essas características serão aplicadas ao elemento apontado por Replace
.
<Reference index="0"> <Property>Gender</Property> <Property>Number</Property> </Reference>
Note que para gerar sugestões o corretor usa o lema da palavra e faz uma busca no dicionário para encontrar variações do lema que satisfazem as características.
ReplaceMapping¶
Usado para substituição condicional. Atributos obrigatórios são index
para apontar para a palavra que deve ser subsistida. O atributo key
é a condição e value
o novo valor. Se o valor de key
for igual a palavra na posição de index
, sugerir trocar por value
.
<Suggestion> <ReplaceMapping index="1" key="fazem" value="faz"/> <ReplaceMapping index="1" key="fizeram" value="fez"/> <ReplaceMapping index="1" key="farão" value="fará"/> </Suggestion>
Neste exemplo, se a palavra na posição 1 for "fazem", sugerir trocar por "faz".
Swap¶
Usado para trocar posições de palavras na sentença. Precisa de 2 atributos. O atributo a
é um inteiro que indica o elemento que deve ser trocado de posição com o elemento apontado por b
:
<Suggestion> <Swap a="1" b="2"/> </Suggestion>
Neste exemplo, inverter os elementos 1 e 2.
SuggestionAsString¶
Não deve ser usado. Foi criado no CoGrOO 1.0 e está aqui para compatibilidade com as regras mais antigas.