\documentstyle[11pt,latin]{artigo} \addtolength{\textheight}{0.15\textheight} \addtolength{\textwidth}{0.15\textwidth} \setlength{\oddsidemargin}{0.5 in} \setlength{\evensidemargin}{0.5 in} \begin{document} \title{Tratamento automático de lexias compostas} \author{Ulisses Pinto, J. João Almeida} \date{Agosto 1995} \maketitle \begin{abstract} ~ \end{abstract} Introdução Terminologia usada locuções - features - strings - jspell - Na definição de expressões regulares são usados alguns sinais com o seguinte significado: + indica uma ou mais repetições da expressão que o antecede. * indica zero ou mais repetições da expressão que o antecede. | indica ou ex. [a | b | c] significa a ou b ou c Motivação Há um sem número de aplicações de processamento de linguagem natural, que beneficiariam de um utilitário de pré-agrupamento de palavras formando assim lexias compostas, podemos citar por exemplo as áreas de: . tradução automática: a maioria das expressões não fazem sentido noutra língua se traduzidas à letra, o que significa que antes de fazer a tradução da forma "normal" teria de haver uma espécie de pré-processador que se encarregaria de traduzir as expressões. ex. boa como o milho - as good as corn . information retrieval: para aceder selectivamente a uma grande quantidade de texto, é necessário normalizá-lo e indexá-lo, mas não faria grande sentido que as palavras constituintes de uma lexia composta fossem agrupadas com a palavra isolada, por ex. a palavra "gato" na locução "gato pingado" não tem está de nenhuma forma relacionado com o mamífero gato, por isso quem quisesse pesquisar informação sobre gatos não teria interesse em encontrar uma entrada relativa a gato pingado. Para além disso pode querer- se procurar locuções no texto, havendo por isso a necessidade de existirem entradas indexadas de lexias compostas. . tratamento sintáctico/semântico de Linguagem Natural: caso não seja devidamente tratado o caso das locuções surgem situações de categorias de palavras cujo posicionamento na frase não faz sentido de acordo com uma gramática, e como estas locuções são extremamente frequentes o tratamento sintáctico daria resultados incorrectos. No caso do tratamento semântico o caso é ainda mais grave, já que em muitas locuções, nomeadamente expressões idiomáticas, o significado da locução não é de forma alguma deduzível a partir da semântica das palavras que a constituem, logo a única hipótese de tratamento semântico correcto desses casos é ter a indicação explícita da semântica da locução . Questões básicas a considerar O reconhecimento de uma composta não se limita evidentemente a uma simples comparação de strings, já que as próprias palavras que compõem a locução podem ser flexionadas. Em alguns casos é importante restringir o tipo de flexões que podem ser feitas a partir das palavras (Por exemplo, certas palavras devem ser restringidas apenas em género e ou número). Deve ser dada a possibilidade de indicar features para a locução definida, pois de outro modo a sua utilidade em gramáticas seria muito limitada. Igualmente importante é a possibilidade das features da locução serem herdadas no seu todo ou em parte de alguma das palavras que a constituem - ex. a locução "acertar em cheio" deveria também retornar informação sobre o tempo, o número e a pessoa que seriam evidentemente herdados do "acertar". Problemas adicionais . ambiguidade Como se verá mais adiante as palavras das locuções são guardadas através do seu radical e das respectivas features, mas esta solução não é pacífica, já que para uma mesma palavra existem frequentemente várias soluções possíveis. ex. o radical da palavra "era" tanto pode ser o verbo "ser" como a própria "era" (uma era histórica). O problema da ambiguidade existe igualmente na altura do reconhecimento da locução, já que uma palavra pode ter dois radicais diferentes, será eventualmente necessário seguir dois ou mais caminhos diferentes até que o radical de uma palavra que se siga não faça matching com o radical de um dos caminhos e assim nos faça desistir dele. Este problema foi implementado, fazendo uma pesquisa em árvore seguindo simultaneamente vários ramos dessa árvore. . categorização e semântica Para que as locuções encontradas sejam convenientemente tratadas é normalmente necessário que lhes estejam associadas categorias gramaticais e respectiva semântica, acontece que essa categoria gramatical não pode ser em grande parte dos casos uma categoria atómica do tipo adjectivo, nome comum, advérbio, etc. tratando-se então de uma categoria gramatical de nível superior - SN, SV ou mesmo uma Frase completa. Seria útil a existência de um programa que pudesse determinar automaticamente a categoria gramatical destas locuções. . interdependência com o nível sintáctico Certas locuções têm um constituinte que pode ser preenchido por um largo nº de possibilidades, esse constituinte pode por sua vez ser constituído por várias palavras. Ex. a locução "levar à certa" também é usado em casos do tipo "levar alguém à certa" em que este alguém seria o nome de uma pessoa, ou uma referência à mesma. Isto deveria poder ser indicado usando uma sintaxe do tipo levar [NP] à certa em que faria matching até com expressões mais complicadas como: levei o meu rico tio à certa . verbos reflexivos e restrições Durante a construção do dicionário de compostas verificou-se frequentemente o caso de expressões que só faziam sentido quando o verbo que fazia parte da sua constituição estava na forma reflexiva, todas as flags poderiam variar - tempo, pessoa, número, etc. - mas o verbo tinha de estar na forma reflexiva. ex. fazer-se engraçado pode correctamente fazer matching com fiz-me engraçado, fez-se engraçado, mas não com "fez engraçado". No fundo o que se pretende é a introdução de restrições associadas a palavra(s) da locução que indiquem que todas as flexões são possíveis desde que se verifique determinada condição. Formato de definição de locuções Expressão modos de controlar morfologias A principal complicação na implementação dum sistema deste tipo é o tratamento de flexões, que também é necessário em palavras compostas, é fundamental que por ex. a partir da entrada "andar à nora" se consiga reconhecer também "andei à nora", "andou à nora", etc., isto significa que devemos dar a indicação de qual(ais) a(s) palavra(s) passíveis de serem flexionadas. Uma notação possível seria algo do género: andar* à nora que teria o significado de andar [todas as flexões associadas a andar] à nora. Normalmente é útil que a locução tenha também features. Essas features podem ser indicadas explicitamente mas podem ser herdadas de uma das palavras que a compõem. Neste caso o * para além de indicar flexão indica simultaneamente que é a palavra a partir da qual se irão herdar features. Devemos também considerar a situação de existirem duas palavras flexionáveis na mesma palavra composta - ex. "acesso directo" no plural é "acessos directos", o que significaria que se deviam pôr dois sinais indicadores de flexão, o que nos cria o problema adicional de saber qual deles é que é relevante para determinar as features finais da palavra composta. Uma forma de resolver esta questão é usar dos tipos de sinais diferentes para indicar flexão, um dos quais indicaria que a palavra é flexionável e que se deve ir buscar as suas features, o outro apenas indicaria que a palavra é flexionável mas as suas features podem ser ignoradas para efeito de determinação das features finais - este segundo sinal poderia ser '%' e seria posto também imediatamente à frente da palavra flexionável. Pode também acontecer que se pretenda indicar uma palavra como aquela a partir da qual devem ser herdadas features sem no entanto pretender que ela tenha qualquer tipo de flexão, para este efeito foi escolhido o sinal '&'. Sendo assim podemos definir uma entrada no dicionário como: (palavra[sinal[nfeatures]])+ ['/' atrib_features] sinal = ['*' | '%' | '&'] nfeatures = feat ['-' feat]* atrib_freatures = feat '=' valor [',' feat '=' valor]* feat = sequência de letras que são normalmente iniciais da feature que representam ex. "andar* depenado%G-N" - neste caso ambas as palavras são flexionáveis, a palavra "andar" sem restrições e "depenado" em Género (G) e Número (N), não estão a ser indicadas features para a locução de modo que seriam herdadas as da palavra que tem o '*', no entanto talvez fosse mais correcto indicar que esta locução funcionava como um Sintagma Verbal e neste caso teríamos: "andar* depenado%G-N/CAT=SV" Ao indicar /CAT=SV está-se a fazer a indicação explícita das features, forçando a que a categoria da locução seja uma determinada. No entanto, grande parte das features correspondentes a palavras da locução continua a ser interessante enquanto para a caracterização completa da locução em termos de features, pelo que há todo o interesse na existência de uma operação que combine as features da palavra com as indicadas explicitamente - a operação plus de features - são mantidas todas as features da palavra, mas são-lhe acrescentadas as novas features indicadas explicitamente, caso haja sobreposição, i.e., dois valores diferentes para a mesma feature, o valor final seria o indicado explicitamente. Interface . como programa etiquetador Neste modo de utilização, o programa recebe texto de input, e como output, escreve esse mesmo texto anotado, pondo cada uma das expressões encontradas dentro de chavetas, e pondo à frente dentro de parêntesis rectos a categoria respectiva. ex. "a Joana abriu a bolsa vagarosamente" teria como resultado "a Joana {abriu a bolsa}[CAT=v,T=pp,P=3,N=s] vagarosamente" . como biblioteca C: A existência desta biblioteca é essencial para poder utilizar flexivelmente o reconhecimento de compostas noutros programas. A função básica desta biblioteca seria a "get_next_lexia", que dado uma string, retornaria a próxima lexia, fosse ela um palavra singular ou uma composta e a posição na string imediatamente a seguir ao fim da lexia, isto teria utilidade para a próxima chamada a get_next_lexia. Isto é na realidade um pouco mais complicado, já que umas compostas podem conter outras mais pequenas (ex. {{a pé} firme} ) ou palavra(s) do fim de uma composta podem ser o início de outra. Sendo assim para uma dada string de input há na realidade uma lista de lexias possíveis e respectivas posições de continuação correspondendo às várias hipóteses a considerar. get_next_lexia; comparar fp; lexia=word|composta; composta=texto*feats discussão dos reticulados, imbricados ou não quando se fosse buscar uma nova palavra, possivelmente segunda ou terceira palavra de uma palavra composta, seria ela própria um início potencial de uma palavra composta. De notar também que para um conjunto de n palavras que formam uma palavra composta pode haver simultaneamente um subconjunto de m palavras (m < n) que também foram uma palavra composta. Pode também acontecer que as palavras devam ser interpretadas independentemente umas das outras. Interessa pois que todas estas situações sejam consideradas, podendo assim termos um output do género: Constituintes da package de compostas e sua invocação A utilização do package compostas passa primeiro pela criação de um ficheiro intermédio que contém as expressões num formato mais manuseável que o ficheiro de texto inicial que continha a definição de compostas dada pelo utilizador. Mais tarde o ficheiro criado será usado no reconhecimento de locuções num texto. ex. de invocação para construção do ficheiro: barv expr-por.txt port.hash arv.out expr-por.txt - o dicionário de compostas port.hash - um dicionário de palavras isoladas criado pelo jbuild que faz parte do jspell. arv.out - o ficheiro criado. ex. de invocação do programa que irá efectivamente fazer o reconhecimento das expressões: arvr port.hash arv.out Estrutura interna de representação As palavras são armazenadas sob a forma de uma árvore, em que cada folha tem um tamanho variável de células, igual ao número de palavras desse nível da árvore cujas palavras anteriores são comuns. De notar que por razões de eficiência (para evitar a geração polinomial de hipóteses) optou-se por guardar nas folhas da árvore, não as palavras tal e qual aparecem no dicionário de compostas, mas sim o seu radical sendo acrescentadas no fim da árvore as condições que restringem as compostas aparentemente encontradas, às features permitidas pelo dicionário original. ex. as compostas a braços abrir mão abrir o coração abrir o jogo abrir os braços dariam origem a uma árvore do tipo: De notar que na árvore aparece "braço" e não "braços" porque "braços" não é radical e "braço" é-o. Deve ser também salientado que todos os ramos da árvore apontam no fim para uma sequência comum embora departamentada. É aqui que serão indicadas as features da composta e de cada uma das palavras que a constituem, bem como a indicação de qual o nº de ordem da palavra a partir da qual serão herdadas features para a composta. Nota: o número de ordem da primeira palavra é o 0, da 2ª o 1, e assim sucessivamente. Cada elemento desta sequência tem uma estrutura tipo: n_def_feat [features]+ / feature_glob n_def_feat - nº de ordem da palavra cujas features serão herdadas features - features que restringem as flexões possíveis da palavra feature_glob - features da composta indicadas explicitamente no dicionário inicial. ex. a composta "bom senso&" daria origem à descrição em features: 1[CAT=adj][CAT=nc, G=m]/ 1 - indica que se vai herdar features da palavra 1 (2ª palavra), [CAT=adj] são as features de "bom" e [CAT=nc, G=m] são as features de "senso". A seguir à / não aparece nada porque no dic. também não existia uma classificação global da composta. Surgiu um problema de representação na árvore quando se deparou com compostas em que uma continha completamente a outra: ex. a pé a pé firme já que a árvore correspondente a criar seria do tipo o que estaria evidentemente num formato não standard, já que cada célula não pode simultaneamente apontar para uma folha abaixo e para a sequência de features. O problema foi resolvido criando uma folha com conteúdo nulo, e assim a nossa árvore passaria a: Representação das palavras da composta Na figuras das árvores acima, são mostradas as palavras dentro da célula. Na realidade o que é posto nas células não é a própria palavra, mas sim um identificador único que a representa e que é retornado pelo jspell. No entanto foi também considerado o caso de palavras constituintes da composta que por qualquer razão não se pretende que façam parte do dicionário, talvez por não fazerem sentido isoladamente, mas apenas dentro da composta a que pertencem. Assim em vez do identificador, pode-se ter a própria palavra guardada por extenso, no nosso ficheiro de output, embora radicalizada. Poderia ser no entanto recomendável, emitir um aviso quando se se deparou com uma palavra desconhecida já que se pode tratar mesmo de um erro de dactilografia ou caso se pretenda acrescentar essa palavra ao dicionário. Análise de resultados Na concepção do programa de reconhecimento de compostas, houve um a preocupação de eficiência que se reflectiu nos resultados obtidos, nomeadamente, para um ficheiro de locuções com 4500 entradas aplicado a um corpus retirado do jornal "Público" de 10 000 000 caracteres foram detectadas 4716 locuções em 53 minutos. Trabalho futuro Restrições Já foi referido a importância da existência de restrições para limitar certo tipo de flexões. Se assumirmos que o jspell, já retorna a indicação que a palavra era reflexiva, podámos ter uma entrado do tipo: fazer*R=1 engraçado em que R=1 significava que a reflexividade tinha de existir. outra hipótese seria ter a condição no fim da frase fazer* engraçado/$1.R=1 esta segunda aproximação tinha a vantagem de poder ser usada também para restringir concordâncias ex. gato*N pingado%N/$1.N=$2.N A condição final $1.N=$2.N impediria matching com locuções do tipo "gatos pingado" Alternativos e opcionais Existem muitas expressões que podem ser escritas de forma ligeiramente diferente, mas significam exactamente o mesmo, essa diferença pode resultar da remoção de uma partícula, por não é absolutamente necessário que exista ou pela substituição por outra partícula. Assim é útil a existência de um mecanismo de indicação de palavras alternativas e palavras opcionais. ex. de entrada com alternativas: " andar* [no | ao] engate" Esta entrada faria matching tanto com "andar no engate" como com "andar ao engate". ex. de entrada com opcionais: "alto e [a] bom som" Esta entrada faria matching tanto com "alto e bom som" como com "alto e a bom som" Patterns na definição de lexias compostas: Muitas vezes uma locução pode ter no seu interior um componente variável, em que é impraticável enunciar todas as hipóteses e que pode ser constituído por mais que uma palavra Esse componente podendo ser por exemplo um sintagma nominal. ex. a composta fazer de alguém gato sapato deveria fazer matching com fazer do irmão gato sapato fazer da imã gato sapato fez dele gato sapato faz do meu rico tio gato sapato A introdução desta potencialidade implica naturalmente uma interacção com o nível gramatical. verbos operativos e classes há certo tipo de verbos que aparecem com bastante frequência nas locuções e que funcionam um pouco como verbos auxiliares, na medida em que o seu conteúdo semântico na locução é virtualmente nulo. ex. na locução "chegar para as encomendas", o verbo "chegar" não tem aqui a sua semântica habitual. Acontece também que muitos destes verbos podem substituir-se sem alterar o significado da locução. ex. "vir tarde e a más horas" é equivalente a "chegar tarde e a más horas" em vez de ter duas entradas independentes ou apenas uma entrada do tipo "[vir | chegar] tarde e a más horas" poder-se-ia incluir estes dois verbos numa classe sendo usada essa classe querendo indicar que é aceitável qualquer um dos verbos que a constituem. estruturação Em muitos casos a sobreposição pura e simples de features não é satisfatória, já que desta foram se pode perder informação importante. Para se lidar com um resultado único em que existam features com o mesmo nome é necessária a existência de algum nível de estruturação. Adivinhar a categoria e features de uma locução Dada a enorme quantidade de expressões existentes, seria extremamente útil haver uma forma de determinar automaticamente a sua classificação gramatical. Isto teria de ser feito baseado em pistas. Por exemplo um verbo seguido de um SN, pode ter como categoria um SV. Há no entanto muitos casos em que isto não é possível, tendo então o utilizador de indicar explicitamente a categoria. Bibliografia Dicionário de expressões populares portuguesas de: Guilherme Augusto Simões \end{document}