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: sujeito
verb: verbo
none: 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 nominal
boundary noun phrase main: limite esquerdo de um sintagma nominal, token principal do sintagma
boundary verb phrase main: limite esquerdo de um sintagma verbal, token principal do sintagma
intermediary noun phrase: token intermediário de um sintagma nominal
intermediary noun phrase main: token intermediário de um sintagma nominal, token principal do sintagma
intermediary verb phrase: token intermediário de um sintagma verbal
other: 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: substantivo
proper noun: nome próprio
specifier: Specifiers (defined as non-inflecting pronouns, that can't be used as prenominals): e.g. certain indefinite pronouns, nominal quantifiers, nominal relatives
determiner: 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.

VISL_-_PALAVRAS_tag_set.pdf (211 KB) William Colen, 11/07/2011 19:08 hs