Você está na página 1de 106

NA PONTA DA LÍNGUA 11

EDITOR:
Marcos Marcionilo

CONSELHO EDITORIAL
Ana Stahl Zilles [Unisinos]
Angela Paiva Dionisio [UFPE]
Carlos Alberto Faraco [UFPR]
Celso Ferrarezi Jr. [UNIFAL]
Egon de Oliveira Rangel [PUC-SP]
Henrique Monteagudo [Universidade de Santiago de Compostela]
José Ribamar Lopes Batista Jr. [UFPI/CTF/LPT]
Kanavillil Rajagopalan [Unicamp]
Marcos Bagno [UnB]
Maria Marta Pereira Scherre [UFES]
Roberto Mulinacci [Universidade de Bolonha]
Roxane Rojo [UNICAMP]
Salma Tannus Muchail [PUC-SP]
Sírio Possenti [UNICAMP]
Stella Maris Bortoni-Ricardo [UnB]
Tommaso Raso [UFMG]
Vera Lúcia Menezes de Oliveira e Paiva [UFMG/CNPq]

2
Gabriel de Ávila Othero

Sérgio de Moura Menuzzi

LINGUÍSTICA COMPUTACIONAL:
TEORIA & PRÁTICA
Direção: ANDRÉIA CUSTÓDIO

CIP-BRASIL. CATALOGAÇÃO NA FONTE


SINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ

O88L
Othero, Gabriel de Ávila, 1978-
Linguística computacional: teoria & prática / Gabriel de Ávila Othero,
Sérgio de Moura Menuzzi. — São Paulo: Parábola Editorial, 2005.
(Na ponta da língua ; 11)

Contém glossário
Inclui bibliografia
ISBN 978-85-88456-39-6

1. Linguística - Processamento de dados. 2. Linguística aplicada.


3. Sistema de recuperação da informação - Linguística. I. Menuzzi,
Sérgio de Moura, 1964 - II. Título. III. Série.
05-1815 CDD: 410.028
CDU: 811.93

Direitos reservados à
PARÁBOLA EDITORIAL
Rua Dr. Mário Vicente, 394 - Ipiranga
04270-000 São Paulo, SP
pabx: [11] 5061-9262 | 5061-8075 | fax: [11] 2589-9263
home page: www.parabolaeditorial.com.br
e-mail: parabola@parabolaeditorial.com.br

Todos os direitos reservados. Nenhuma parte desta obra pode ser reprodu-
zida ou transmitida por qualquer forma e/ou quaisquer meios (eletrônico ou
mecânico, incluindo fotocópia e gravação) ou arquivada em qualquer sistema
ou banco de dados sem permissão por escrito da Parábola Editorial Ltda.

ISBN: 978-85-88456-39-6
© do texto: Gabriel de Ávila Othero & Sérgio de Moura Menuzzi
© da edição: Parábola Editorial, São Paulo, 2005

3
SUMÁRIO

SOBRE OS AUTORES ................................................................... 5

INTRODUÇÃO .............................................................................. 8

1 TECNOLOGIA E LINGUAGEM ................................................... 12

2 TRABALHOS EM LINGUÍSTICA COMPUTACIONAL ............ 19


2.1 DESENVOLVIMENTOS EM LINGUÍSTICA COMPUTACIONAL .............. 19
2.2 PROCESSAMENTO SINTÁTICO COMPUTACIONAL OU PARSING ........ 28
2.3 O PROLOG ....................................................................................................... 31

3 DESENVOLVENDO UM PARSER SINTÁTICO — PARTE I:


ALGUMAS NOÇÕES TEÓRICAS IMPORTANTES ................... 34
3.0 NOÇÕES TEÓRICAS IMPORTANTES ............................................................ 34
3.1 TEORIA LINGUÍSTICA ................................................................................... 35
3.1.1 A NOÇÃO DE GRAMÁTICA .......................................................................... 35
3.1.2 GRAMÁTICA SINTAGMÁTICA E TEORIA DE CONSTITUINTES ............ 39
3.2 TEORIA COMPUTACIONAL .......................................................................... 48
3.2.1 PROLOG ........................................................................................................... 48
3.2.2 DCGs E PARSING EM PROLOG ..................................................................... 56

4 DESENVOLVENDO UM PARSER SINTÁTICO — PARTE II:


“COLOCANDO A MÃO NA MASSA” ........................................ 62
4.0 “COLOCANDO A MÃO NA MASSA ............................................................. 62
4.1 SOBRE AS REGRAS GRAMATICAIS ............................................................ 62
4.2 SOBRE O LÉXICO ............................................................................................ 71

5 NOSSA GRAMÁTICA ................................................................... 74


6 PALAVRAS FINAIS ...................................................................... 86
REFERÊNCIAS BIBLIOGRÁFICAS ............................................. 87
GLOSSÁRIO ................................................................................... 92

4
SOBRE OS AUTORES

Gabriel de Ávila Othero: Mestre em Linguística Aplicada e


doutorando em Linguística Aplicada pela Pontifícia Universidade
Católica do Rio Grande do Sul — PUCRS. [gabnh@terra.com.br]

Sérgio de Moura Menuzzi: Doutor em Linguística pela


Universidade de Leiden — Holanda; professor do curso de graduação em
Letras e de pós-graduação (Mestrado e Doutorado) em Linguística
Aplicada da Pontifícia Universidade Católica do Rio Grande do Sul —
PUCRS. [smenuzzi@pucrs.br]

5
Que quantidade imensa de coisas um homem deve fazer para que
digamos que ele pensa.

L udwig W ittgenstein

6
Não há nada mais decepcionante que se descobrir robô. Não há nada de
autêntico ou criativo. Tudo em mim é repetição predeterminada.

Isso sim é muito triste.

C ybelle, primeira chatterbot brasileira

7
INTRODUÇÃO

Imagine-se no ano de 2025. Já passa da meia-noite, e você ainda


não conseguiu dormir. Resolve, então, acessar a internet para ver se
consegue um pouco de distração. Ao ligar seu computador, ele
automaticamente lhe diz:

— Boa noite! Diga-me sua senha, por favor.

Você, como de costume, informa-lhe a sua senha pessoal, e a


máquina responde com um amigável:

— Olá, eu já estava com saudades! Afinal faz doze horas e


dezesseis minutos que não nos víamos.

Para conectar-se à internet, basta ordenar oralmente:

— Quero me conectar à internet e checar meus e-mails.

Após verificar seus e-mails, você se lembra de que faz muito tempo
desde a última vez em que comprou um CD de música (afinal,
ultimamente tem sido muito mais barato e rápido simplesmente “baixar”
as músicas da internet e pedir para que o computador lhe grave um CD).
Por isso, resolve visitar a loja virtual CDthèque, loja francesa
especializada em músicas europeias, do rock ao pop, do folk ao techno.
Você então comanda oralmente o seu computador:

— Gostaria de acessar o site da loja de CDs CDthèque. Não me


lembro do endereço exato, mas acredito que seja www.cdthèque.com.

Imediatamente, a máquina leva-o à página da loja desejada.


Chegando lá, você encontra um atendente virtual que lhe dá as boas-
vindas, em forma de texto:

8
— Bonne nuit. Parlez-vous français, Deutsch, English, español,
italiano ou português?

Entendendo ou não a pergunta, você clica em “português”, o que


faz com que uma atendente virtual, a Persephone, venha lhe atender no
canto da tela, em uma pequena janela com espaço para um chat entre
vocês dois. Somente mais tarde você descobrirá que ela é, na verdade,
um chatterbot 1. Persephone lhe diz:

— Olá. Você gosta de música europeia? A nossa loja tem a maior


coleção de músicas europeias do mundo.

— Sim, eu gosto bastante. Por falar nisso, onde fica a sede da sua
loja?

— Aqui mesmo, em www.cdthèque.com. Somos a primeira loja


exclusivamente virtual especializada em CDs de músicas europeias. Não
temos sede em lugar algum e, ao mesmo tempo, estamos em todos os
lugares.

— Bem, eu estou procurando um CD dos Beatles, já bastante


antigo. Acho que ele foi lançado há mais de vinte anos. Não consigo me
lembrar do título.

— Você quer dizer “The Beatles”, a banda de rock de Liverpool,


Inglaterra?

— Sim. O CD é uma coletânea de músicas.

— Você procura o CD “The Beatles — 1”, de 2000?

— Sim, acho que é esse! Posso dar uma olhada nele?

Um diálogo como esse — isto é, uma conversa natural entre um


homem e um computador — não é uma realidade hoje, mas poderá ser

1 Ao final deste livro, encontra-se um glossário com diversas palavras-chave que


encontramos ao longo do texto (inclusive chatterbot). Sinta-se à vontade para consultá-
lo sempre que julgar necessário.

9
no ano 2025 — ou talvez até antes. Afinal, a tecnologia tem avançado a
uma velocidade incrivelmente espantosa, e há uma tendência cada vez
maior nos avanços tecnológicos de buscar uma melhor interação entre
homens e máquinas.

Neste livro, veremos que parte dessa busca por uma melhor
interação entre humanos e máquinas está se dando através da linguagem
natural, ou seja, da linguagem do homem. Cada vez mais, as máquinas
estão sendo programadas para responder a comandos do usuário em sua
própria linguagem, seja ela o português, o chinês ou o alemão. Celulares
efetuam ligações com base em comandos de voz, editores de texto
conseguem ler em voz alta textos inteiros, programas de chatterbots
(como a Persephone, que vimos acima) são criados para trabalhar no
atendimento virtual de grandes empresas…

Por trás desse tipo de trabalho, deve estar o dedo do linguista:


afinal, é ele o cientista da linguagem, o cientista que busca compreender
coisas como as nuances semânticas de uma expressão, as regras sintáticas
de uma língua ou os detalhes de funcionamento de seus sons. E é preciso
“ensinar” essas coisas a um computador — ou melhor, programar esse
conhecimento na “máquina binária”, dos “zeros” e dos “uns”, isto é, do
sim e do não — se queremos que esta máquina esteja pronta a interagir
naturalmente conosco.

Embora ainda distante de nossa realidade, desenvolver


computadores com capacidade para a interação natural com humanos é
apenas um dos objetivos da Linguística Computacional, a área da
Linguística que se ocupa do tratamento computacional da linguagem
para diversas finalidades práticas.

Veremos, nos primeiros capítulos deste livro, o que é a Linguística


Computacional e que tipos de trabalho ela tem desenvolvido. Depois,
mostraremos a você como os conhecimentos desenvolvidos pela
Linguística podem colaborar no desenvolvimento de recursos
computacionais: nosso exemplo será uma aplicação prática de

10
conhecimentos da sintaxe no desenvolvimento de um sistema de análise
das frases do português — um “parser sintático” programado em
linguagem Prolog.

Parece difícil? Prometemos que não será!

Depois de ler mais algumas páginas deste livro, temos certeza de


que palavras como “parser”, “Prolog”, “chatterbot” e “Linguística
Computacional” deixarão de ser tão assustadoras para você e passarão a
fazer parte de seu dicionário mental! A partir de agora, você é nosso
convidado para um passeio pela teoria e a prática da Linguística
Computacional.

11
1. TECNOLOGIA E LINGUAGEM

Desde a popularização dos primeiros computadores pessoais no


início da década de 1980, muita coisa mudou. Os desenvolvimentos com
a tecnologia nos últimos vinte anos têm aumentado de maneira
exponencial. De acordo com Hawking (2001: 167),

os computadores obedecem àquela que é conhecida como a Lei


de Moore: suas velocidade e complexidade dobram a cada 18
meses. Trata-se de um desses crescimentos exponenciais que,
sem dúvida, não podem continuar para sempre. Entretanto, ele
provavelmente continuará até que os computadores atinjam
uma complexidade semelhante à do cérebro humano.

Acompanhe, no gráfico 1.1 (apresentado originalmente em


Hawking, 2001: 166), o crescimento da capacidade de computação entre
os anos de 1972 até 2000: o número que se encontra após o nome do
processador é a quantidade de cálculos por segundo que o processador
consegue operar.

Gráfico 1.1: Aumento na capacidade de computação dos processadores


Em termos de velocidade, se comparássemos um 286 da década de
1980 com um PC de nossos dias, o 286 andaria tão rápido como um
patinete, enquanto o PC de hoje estaria voando tão rápido quanto um
Concorde! Um bom progresso para apenas 20 anos!

De acordo com o pesquisador Ray Kurzweil, pioneiro em


Inteligência Artificial, em 2029 um computador com o preço de um PC de
nossos dias (aproximadamente U$ 800) terá a capacidade de computação
equivalente à do cérebro humano. E, ainda segundo Kurzweil, em 2060
uma máquina que custe em torno de U$ 1.000 terá a capacidade de todos
os cérebros humanos somados, o que nos levaria a atingir um progresso
de 20 milênios em apenas 100 anos!

Sempre polêmico, Kurzweil não para por aí: segundo o


pesquisador, “em 2099, um chip de 1 centavo de dólar vai ter uma
capacidade de computação um bilhão de vezes maior que a de todos os
cérebros humanos da Terra somados. Claro que posso estar errado por
um ano ou dois…” 1 (cf. Burgierman, 2001: 50).
TP PT

Em suma, a história recente dos computadores de uso pessoal,


marcada por um acelerado progresso na capacidade de computação, leva
muitos a crer que num horizonte não distante disporemos de máquina
potentíssimas, que poderão executar tarefas hoje inimagináveis… como,
por exemplo, a de ser capaz de se comunicar naturalmente com seres
humanos!

De fato, desde a popularização dos computadores pessoais nos


anos 80, uma das maiores tendências no desenvolvimento e
aprimoramento de novas tecnologias têm sido a da busca incessante por
meios de tornar a interação entre humanos e máquinas mais fácil. Aliás,

1 Ray Kurzweil começou seus primeiros desenvolvimentos com computadores na


TP PT

década de 1960, quando tinha menos de 20 anos. Em 1976, criou uma máquina de
leitura para cegos e, em 1984, o sintetizador eletrônico. Há alguns anos — em 2001 —,
Kurzweil ganhou o prêmio Lemelson-MIT, faturando a bagatela de U$ 500.000,00. Se
deseja saber mais sobre Ray Kurzweil e seus desenvolvimentos em Inteligência
Artificial, recomendamos a sua interessante página na internet: www.kurzweilai.net.

13
é esta busca incessante e as expectativas de cientistas otimistas como
Kurzweil que nos autorizam a imaginar o diálogo fictício entre um
homem e uma máquina que vimos Introdução do livro.

A tendência de humanização do computador acabou criando uma


interessante nova área de pesquisa, a HCI (do inglês Human Computer
Interaction, ou Interação Humano-Computador, em português). Essa
disciplina preocupa-se em

projetar, avaliar e implementar sistemas computacionais


interativos para uso humano, estudando os principais
fenômenos aí envolvidos. Agrupando pesquisadores de
diferentes campos do conhecimento, trata-se do território das
interfaces por excelência. (Carvalho, 2000: 35)

Acreditamos que, ao tentar fazer com que uma máquina seja capaz
de interagir com humanos e compreendê-los (ou melhor, compreender-
nos), inevitavelmente teremos de fazer com que antes ela aprenda a se
comunicar com um ser humano. Logicamente, para qualquer pessoa, não
há maneira mais fácil de comunicação do que através de sua própria
língua materna, seja ela o português, o inglês, o chinês ou o russo. Por
isso, muitos pesquisadores vêm trabalhando com o tratamento
computacional da linguagem humana (ou das línguas humanas), isto é,
com maneiras de simular, no computador, aquilo que fazemos
naturalmente quando conversamos com alguém. Isso exige, entretanto,
que se avance no estudo do funcionamento das línguas naturais e na
descrição formal dos sistemas linguísticos, e é aí que começamos a falar
da Linguística Computacional.

Uzskoreit, pesquisador da área da informática, afirma que

ainda que os sistemas existentes em TL [tecnologias


linguísticas] estejam longe de alcançar a habilidade humana,
eles têm diversas aplicações possíveis. O objetivo é criar
softwares que tenham algum conhecimento da linguagem
humana. Tais softwares irão mudar a nossa vida. Há
necessidade urgente deles] para que se possa melhorar a
interação humano-máquina, já que o obstáculo principal na
interação entre um humano e um computador é simplesmente
um problema de comunicação. Os computadores de hoje não
entendem nossa língua, e as linguagens de computação, por
outro lado, são difíceis de se aprender e não correspondem à

14
estrutura do pensamento humano. (…) [O] uso de linguagem
humana pode aumentar a aceitação de softwares e a
produtividade de seus usuários (grifos nossos). (Uzskoreit,
s.d.: 2).

No começo dos anos 1980, quando os primeiros computadores


pessoais começaram a se popularizar, um usuário tinha de ser
praticamente um programador. As linguagens e sistemas operacionais
utilizados largamente à época (Basic e MS-DOS, por exemplo) exigiam
que o usuário doméstico comum praticamente aprendesse uma nova
língua para se comunicar com o computador:
Para se ter uma ideia de como as coisas têm avançado até
agora, basta dar uma rápida olhada no passado: em meados
dos anos 80, quando os computadores pessoais estavam
ficando já populares, veja só o que era preciso fazer para
copiar um texto de um diretório — ou de uma pastinha, para os
novatos — para um disquete: na tela do chamado prompt do
sistema mais usado de então (o MS-DOS), era preciso digitar

C:\> cd documentos
C:\documentos> copy trabalho.doc a:\

Hoje em dia, com tecnologias baseadas em interação gráfica


entre o computador e o usuário, basta clicar com o mouse no
arquivo selecionado e arrastá-lo para o lugar que diz “Disquete
de 3 ½ (A:)”. Muito mais fácil, não?
Ainda assim, apesar de ser bastante mais simples, esse
processo não é exatamente fácil para todo mundo. Muita gente
ainda encontra dificuldade para trabalhar com o computador.
Mas essas pessoas não precisam se preocupar: a tendência é,
como já foi mencionado, de que o computador apresente uma
interface cada vez mais amigável e interativa daqui para frente.
(Othero, 2002: 35. Grifos do autor)

Em suma, dotar os computadores de capacidade de interação


verbal com os humanos é um dos passos fundamentais para que se
tornem máquinas “inteligentes”, acessíveis a todo e qualquer usuário.
Isso tudo nos conduz a alguns questionamentos:

• Como fazer para o computador “compreender” uma língua


natural?
• Como fazer para que uma máquina consiga produzir textos
ou falas em uma língua natural?

E ainda mais importante:

15
• Será realmente que uma máquina algum dia poderá ser
capaz de dominar a sintaxe, o sistema fonológico, as nuances
semânticas e o uso pragmático, entre outros conhecimentos,
de uma língua natural?
• Será que um computador algum dia estará dominando uma
língua natural, como o português, o inglês ou o japonês, tão
bem quanto um falante nativo do idioma?

Ao leitor desavisado, informamos que, neste livro, não teremos a


ambição de responder a todas essas questões 2 . Vamos nos limitar a
PT

exemplificar como o computador pode resolver alguns dos problemas


envolvidos na compreensão de frases. E, ainda que neste livro
introdutório não tentemos dar uma ideia de tudo o computador pode ou
precisa fazer para fazer uso completo das línguas humanas, podemos
avançar ao leitor que os linguistas computacionais têm feito avanços em
praticamente todas as áreas importantes neste sentido. Por isso,
acreditamos que, algum dia, os computadores serão, sim, capazes de
dominar a linguagem natural de maneira satisfatória, a ponto de ser
possível interagir com uma máquina em uma determinada língua natural
sem que possamos distinguir as suas respostas das de um outro ser
humano.

É dentro desse espírito — procurando contribuir com a divulgação


dos objetivos e de algumas noções básicas da Linguística Computacional
— que nos propusemos a escrever este livro. No que segue, estudaremos
um pouco mais da área e faremos uma aplicação prática, elaborando
passo a passo, com o leitor, um software linguístico.

Agora o leitor já sabe que a área responsável pela investigação do


tratamento computacional da linguagem e das línguas naturais é

2 Sobre esse interessante tema, sugerimos algumas leituras, como Burgierman (2001),
TP PT

Carvalho (2000), Chomsky (1972, 1973), Del Nero (1997), Hacker (2000), Hawking
(2001), Hodges (2001), Kelly III (2001), Pereira (2001) e ainda os filmes 2001: uma
Odisseia no Espaço (Estados Unidos / Inglaterra, 1968); A. I. - Inteligência Artificial
(Estados Unidos, 2001); Eu, robô (Estados Unidos, 2004); e The Matrix (Estados Unidos,
1999).

16
conhecida como “Linguística Computacional”. De acordo com Vieira &
Lima (2001: 1), a Linguística Computacional pode ser entendida como “a
área de conhecimento que explora as relações entre linguística e
informática, tornando possível a construção de sistemas com capacidade
de reconhecer e produzir informação apresentada em linguagem
natural”.

Essa ciência faz uso do conhecimento desenvolvido pelas


diferentes áreas de pesquisa tradicionalmente conhecidas em Linguística
Teórica e Aplicada, como a Sintaxe, a Semântica, a Fonética e a
Fonologia, a Pragmática, a Análise de Discurso etc. Todo esse
conhecimento é utilizado para tentar processar (leia-se “compreender e
produzir”) as línguas naturais e dominar o conhecimento linguístico de
um ser humano.

A Linguística Computacional pode ser dividida em duas subáreas:


a Linguística de Corpus e o Processamento de Linguagem Natural
(PLN). Essa divisão nem sempre é nítida, uma vez que há muitos
trabalhos que envolvem as duas áreas.

A Linguística de Corpus se preocupa basicamente com o trabalho a


partir de “corpora eletrônicos”, isto é, grandes bancos de dados que
contenham amostras de linguagem natural. Essas amostras podem ser de
diferentes fontes. Por isso, podemos encontrar os mais variados bancos
de dados eletrônicos: há corpora de linguagem falada, corpora de
linguagem escrita literária, corpora com textos de jornal, corpora
compostos exclusivamente por falas de crianças em estágio de
desenvolvimento linguístico etc. 3 . PT

Os trabalhos envolvendo corpora linguísticos nem sempre têm


como objetivo produzir algum software; normalmente, eles estão voltados
para o estudo de determinados fenômenos linguísticos e sua ocorrência
em grandes amostras de uma determinada língua (ou de uma variedade,

3
TPVeja, a esse respeito, Berber Sardinha (2000a e 2000b) e Garside, Leech & McEnery
(1997).

17
dialeto ou modalidade dela). Muitos desses estudos não têm uma
aplicação prática para o desenvolvimento computacional, como a
construção de softwares ou o desenvolvimento e aperfeiçoamento de
programas que envolvam a linguagem natural. De acordo com Berber
Sardinha (2000b: 2)

A Linguística de Corpus se ocupa da coleta e exploração de


corpora, ou conjuntos de dados linguísticos textuais que foram
coletados criteriosamente com o propósito de servirem para a
pesquisa de uma língua ou variedade linguística. Como tal,
dedica-se à exploração da linguagem através de evidências
empíricas, extraídas por meio de computador.

A área de PLN, por outro lado, preocupa-se diretamente com o


estudo da linguagem voltado para a construção de softwares e sistemas
computacionais específicos, como tradutores automáticos, chatterbots,
parsers, reconhecedores automáticos de voz, geradores automáticos de
resumos etc. De acordo com Vieira (2002: 20), cabe à área de PLN a

construção de programas capazes de interpretar e/ou gerar


informação fornecida em linguagem natural. Para o
processamento da língua natural, vários subsistemas são
necessários para dar conta dos diferentes aspectos da língua:
sons, palavras, sentenças e discurso nos níveis estruturais, de
significado e de uso.

Aqui em nosso livro, estaremos preocupados principalmente com o


estudo computacional da sintaxe da língua portuguesa, isto é, com o
modo como as frases do português se organizam e o modo como esta
organização pode ser reconhecida pelo computador. Nosso objetivo é
mostrar ao leitor como se pode desenvolver um parser sintático em uma
linguagem computacional muito conhecida em trabalhos de IA e PLN, o
Prolog.

Antes, porém, de nos dedicarmos a esta tarefa, gostaríamos de


oferecer ao leitor uma ideia um pouco mais clara da gama de questões e
tarefas que a Linguística Computacional enfrenta. Por isso, faremos uma
apresentação panorâmica de estudos e áreas recentes da Linguística
Computacional, especialmente no que diz respeito ao desenvolvimento
de softwares linguísticos.

18
2. TRABALHOS EM LINGUÍSTICA COMPUTACIONAL

2.1. Desenvolvimentos em linguística computacional

Como agora já sabemos, a Linguística Computacional é a área da


ciência Linguística preocupada com o tratamento computacional da
linguagem e das línguas naturais. Seus primeiros desenvolvimentos
começaram nos anos 1950. Isso faz com que a Linguística Computacional
seja uma área relativamente nova em relação à ciência Linguística
propriamente dita. Embora o marco mais aceito para o estabelecimento
da Linguística como ciência seja o surgimento da chamada “linguística
comparativo-histórica” no começo do século XIX, os primeiros estudos
linguísticos no Ocidente começaram com gramáticos e filósofos gregos e
romanos há cerca de 2.400 anos. No Oriente, especialmente na Índia, a
tradição de estudos gramaticais remonta 2.500 anos.

Ou seja, se comparássemos à altura de uma girafa (o mais alto


animal do planeta) o período de tempo na história em que se têm
desenvolvido estudos gramaticais, o tempo de existência da Linguística
Computacional não passaria da altura de um hamster. Não à toa estamos
ainda recém engatinhando nesse assunto.

A Linguística Computacional teve grande impulso graças


principalmente a esforços para o desenvolvimento de programas de
tradução automática nas décadas de 1950 e 1960, e seu surgimento está
intrinsecamente ligado a desenvolvimentos na área da Inteligência
Artificial. De acordo com Grisham (1992: 1),
o potencial [dos computadores] para o processamento de
linguagem natural foi reconhecido bem cedo no
desenvolvimento de computadores, e trabalhos em Linguística
Computacional — basicamente para tradução automática —
começaram na década de 1950 em diversos centros de pesquisa.
O rápido crescimento na área, no entanto, aconteceu
principalmente a partir do final dos anos 1970.

Hoje em dia, a busca por interfaces mais amigáveis e por softwares


voltados para o trabalho com linguagem natural têm motivado muitas
pesquisas na área, e diversos são os frutos resultantes de estudos nas
áreas da Inteligência Artificial e da Linguística Computacional. Isso não
é de surpreender, pois, como observam McDonald & Yazdani (1990: 176),
“a pesquisa em PLN pode proporcionar insights bastante úteis sobre
processos e representações da linguagem na mente humana, apontando,
assim, para a verdadeira IA” . TP

Vejamos, então, algumas das aplicações que associam a Linguística


à Informática; como nosso interesse aqui é ressaltar a relevância dos
conhecimentos desenvolvidos pela Linguística, damos mais ênfase ao
domínio linguístico envolvido nos trabalhos, e menos aos formalismos
computacionais ou modelos de engenharia da computação que estão por
trás deles 1 .
PT

Envolvendo as áreas da Fonética e Fonologia, por exemplo,


encontramos muitos aplicativos de PLN. A Fonética e a Fonologia são as
áreas da Linguística preocupadas em estudar os sons das línguas
humanas. Grosso modo, podemos dizer que a Fonética se ocupa do
estudo dos fones, dos sons concretizados na fala. Ela está interessada nos
elementos acústicos, articulatórios e fisiológicos dos sons da fala. A
Fonologia, por outro lado, se concentra em estudar os fonemas e o
sistema fonológico subjacente de uma língua. Ela investiga o sistema
abstrato que envolve o conhecimento fonológico dos falantes.

1
TPNão iremos abranger todas as áreas do conhecimento linguístico que contam com
PT

desenvolvimentos e aplicações da Linguística Computacional. Pretendemos apenas


servir como uma boa introdução ao assunto. Após a leitura deste capítulo, o leitor
pode procurar obras como Cole et al. (1997), Garside, Leech & McEnery (1997),
Grisham (2002) e, em português, Vieira & Lima (2001).

20
De maneira geral, podemos dizer que os desenvolvimentos que
envolvem essas duas áreas da Linguística enquadram-se nas áreas de (a)
reconhecimento de fala; (b) síntese de fala; e (c) sistemas de diálogos em
língua falada.

Entre as aplicações que já foram desenvolvidas ou que ainda estão


em estágio de desenvolvimento a partir de estudos fonéticos e
fonológicos, podemos destacar os aplicativos de reconhecimento de fala,
que apresentam diversas finalidades: eles podem servir desde meros
reconhecedores de comandos de voz em um aparelho celular (o que
torna possível a discagem a partir do reconhecimento da voz do
proprietário do aparelho, como já acontece, por exemplo, nos aparelhos
de celular Motorola V60, Motorola V60i e Motorola C333 2 , todos já
TP PT

comercializados no Brasil), até programas que reconheçam a fala a ponto


de serem capazes de digitar um texto ditado por um usuário, como o
software Via Voice, desenvolvido pela IBM 3 .
TP PT

Na área da síntese de fala, destacam-se os programas que são


capazes de gerar fala a partir de dados. Ou seja, são programas que
fazem com que o computador possa pronunciar em “voz” alta tudo
aquilo que o usuário digitar. Há, por exemplo, o programa Talk it! 4, que
pode “ler em voz alta” palavras isoladas digitadas por um usuário. Esse
programa pronuncia apenas vocábulos isolados, em inglês e em
espanhol, e pode auxiliar, por exemplo, um estudante a descobrir a
pronúncia correta de palavras na língua-alvo.

Outros aplicativos que merecem destaque são os programas


capazes de ler em voz alta textos maiores e documentos escritos e
armazenados no computador, como o programa Virtual Vision 5 , PT

desenvolvido pela MicroPower, por exemplo, que “lê em voz alta” os


textos de documentos do MS Office e de páginas na internet. Além de

2
TPwww.motorola.com.br.
PT

3
TPwww-3.ibm.com/software/speech.
PT

4 www.text2speech.com.
5 www.micropower.com.br/dv/vvision/index.asp.
TP PT

21
esses programas facilitarem o uso do computador para usuários leigos,
eles auxiliam principalmente os usuários que apresentam algum tipo de
deficiência visual.

Ainda nas áreas da Fonética e da Fonologia, podemos destacar


alguns aplicativos muito mais sofisticados, que envolvem a interação
entre ser humano e máquina através de diálogos orais em linguagem
natural. Programas que sejam capazes de conversar com o ser humano
ainda estão em seus desenvolvimentos iniciais e são muito mais comuns
em obras de ficção científica (como a precursora máquina inteligente
HAL, do filme 2001: uma odisseia no espaço, de Stanley Kubrick) do que
em nossa realidade. Contudo já sabemos que eles podem ter um
potencial enorme para o desenvolvimento de softwares de atendimento
eletrônico e de agentes inteligentes em áreas como a do ensino a
distância (EAD) e da educação através do computador (como programas
de ensino de idiomas, ou CALL — Computer Assisted Language Learning).
Esse tipo de aplicativo envolve um conjunto de conhecimentos
complexos. Além de conhecimentos de Fonética e Fonologia,
desenvolvimentos nessa área devem envolver também o estudo da
Análise da Conversação, da Semântica, da Pragmática e da Linguística
Textual, entre outros.

Aplicações como as que acabamos de mencionar certamente


facilitarão o acesso a computadores pessoais e a aparelhos eletrônicos
não apenas de pessoas normais, mas também e especialmente de pessoas
com vários tipos de deficiência — por exemplo, pessoas com deficiência
visual ou com incapacidade de mover as mãos —, que poderão interagir
com a máquina através da linguagem falada. O que é preciso enfatizar
aqui é que o desenvolvimento de sistemas com a capacidade de interação
verbal com seres humanos exige uma equipe mista, composta tanto por
pesquisadores com formação em Linguística quanto por cientistas da
área da Engenharia Computacional. Esperamos que já esteja ficando
claro ao leitor a importância da Linguística Computacional para
desenvolvimentos futuros na área de interação homem x máquina.

22
Além da Fonética e da Fonologia, outras áreas da Linguística são
de grande importância para o desenvolvimento de programas de PLN,
especialmente a Sintaxe e a Semântica. Por ora, podemos entender a
Sintaxe como a disciplina “que estuda as regras, as condições e os
princípios subjacentes à organização estrutural dos constituintes das
frases, ou seja, o estudo da ordem dos constituintes das frases” (Mateus
& Xavier, 1992: 1079). E a Semântica, também provisoriamente, pode ser
definida como a área da Linguística que se ocupa em estudar o
significado das palavras e das proposições. Estudos de sintaxe e
semântica são fundamentais para sistemas que envolvem a compreensão
ou a geração automática de frases de uma língua. Este é o caso, por
exemplo, dos chatterbots.

Os chatterbots são programas desenvolvidos para interagir com


usuários humanos através de diálogos em linguagem natural, na
modalidade escrita, como a Persephone, do diálogo fictício que
apresentamos na Introdução deste livro. Esse nome (chatterbot) vem da
junção de duas palavras inglesas: chat (conversar, bater papo) e bot
(abreviação de robot, robô) 6.

O primeiro chatterbot desenvolvido foi a ELIZA 7 , criado pelo


TP PT

pesquisador Joseph Weinzenbaum, no MIT, em 1966. O programa ELIZA


foi desenvolvido para ser uma espécie de psicólogo, ou conselheiro
sentimental. Na verdade, o objetivo principal de Weinzenbaum não era
criar um “psicólogo virtual”, mas apenas um programa de conversação,
utilizando um sistema que se baseava em “moldes” (templates, em inglês)
para construir suas frases.

Após desenvolver o programa, Weinzenbaum o testou, pedindo a


diversas pessoas para que “conversassem” com o programa (através do

6 Curiosidade: a palavra robot (robô) foi criada pelo escritor tcheco Karel Capek (1890-
1938) para designar trabalho repetitivo e forçado. Ela foi utilizada pela primeira vez
em sua peça teatral R.U.R – Rossum’s Universal Robots, que estreou no Teatro Nacional
de Praga em 25 de janeiro de 1921.
7 Dê uma olhada em www-ai.ijs.si/eliza/eliza.html.
TP PT

23
teclado, como em uma moderna sala de bate-papo). O curioso da história
é que, quando Weizenbaum pedia para que os outros interagissem com
seu programa, muitas pessoas acabavam ficando tão íntimas da ELIZA
que chegavam a pedir para que o próprio Weizenbaum saísse da sala,
para que a conversa pudesse ser mais particular. Como você vê, estas
pessoas se esqueciam de que ELIZA era, na verdade, apenas um
programa de computador, e acabavam “desabafando” com ela. Alguns
psicólogos chegaram a ver nisso o futuro da psicanálise.

Para você ter uma ideia de como ELIZA “se comunicava”, veja, no
quadro abaixo, um trecho de uma conversa entre ela e uma usuária
humana, apresentado em Weizenbaum (1966) 8:

Quadro 2.1: Exemplo de conversação com ELIZA

Usuário: Os homens são todos iguais.


ELIZA: EM QUE SENTIDO
Usuário: Eles estão sempre nos importunando por algum motivo ou outro.
ELIZA: PODE PENSAR EM UM EXEMPLO ESPECÍFICO
U: Bem, o meu namorado me fez vir até aqui.
ELIZA: SEU NAMORADO FEZ VOCÊ VIR ATÉ AQUI
U: Ele diz que eu fico muito tempo deprimida.
ELIZA: FICO TRISTE EM SABER QUE VOCÊ FICA DEPRIMIDA
U: É verdade. Eu sou infeliz.
ELIZA: VOCÊ ACHA QUE VIR AQUI VAI AJUDAR VOCÊ A NÃO SER INFELIZ
U: Eu preciso de uma ajuda, acho que isso é certo.
ELIZA: O QUE SIGNIFICARIA PARA VOCÊ SE VOCÊ CONSEGUISSE AJUDA
U: Talvez eu pudesse aprender a conviver com a minha mãe.
ELIZA: FALE-ME MAIS SOBRE A SUA FAMÍLIA
U: Minha mãe cuida de mim.
ELIZA: QUEM MAIS EM SUA FAMÍLIA CUIDA DE VOCÊ
U: Meu pai
ELIZA: SEU PAI
U: De certa forma, você é como meu pai.
ELIZA: QUE SEMELHANÇA VOCÊ VÊ

8WEIZENBAUM, J. ELIZA – a computer program for the study of natural language


communication between man and machine. Communications of the ACM 9, 1966; apud
Covington (1994: 15).

24
U: Você não é muito agressiva, mas eu acho que você não quer que eu perceba isso.
ELIZA: O QUE FAZ VOCÊ PENSAR QUE EU NÃO SOU AGRESSIVA
U: Você não discute comigo.
ELIZA: POR QUE VOCÊ ACHA QUE EU NÃO DISCUTO COM VOCÊ
U: Você tem medo de mim.
ELIZA: AGRADA A VOCÊ SABER QUE EU TENHO MEDO DE VOCÊ
U: Meu pai tem medo de todo mundo.
ELIZA: O QUE MAIS VEM À SUA MENTE QUANDO VOCÊ PENSA NO SEU PAI
U: Valentões.
ELIZA: ISSO TEM ALGUMA RELAÇÃO COM O FATO DE O SEU NAMORADO TER
FEITO VOCÊ VIR AQUI

Ultimamente, os chatterbots vêm sendo desenvolvidos


especialmente para trabalhar com atendimento virtual e com tutoriais
educativos. Um programa desse tipo deve ser capaz de poder manter
uma conversa com um humano da forma mais natural possível. Há
inclusive uma competição anual entre chatterbots, conhecida como
Prêmio Loebner 9, criado em 1991 por Hugh Loebner, um filantropo
norte-americano. Nesta competição, os chatterbots são testados com base
no Teste de Turing 10.

No teste, um juiz humano deve comunicar-se com dois


interlocutores (uma máquina e um outro humano). Através de perguntas
e respostas, o juiz terá de decidir quem é a máquina e quem é o humano
(ou ainda, se os dois são máquinas, ou se os dois interlocutores são
humanos). O objetivo principal deste teste é definir a própria
Inteligência Artificial: “se uma máquina não pode ser distinta de um ser
humano nestas condições, então devemos atribuir a ela uma inteligência
humana” (Hodges, 2001: 45).

O Teste de Turing é ainda hoje considerado como parâmetro para


avaliação de certos programas de Inteligência Artificial e até mesmo

www.loebner.net.
9
TP PT

10O que conhecemos hoje como Teste de Turing foi proposto pelo filósofo e
matemático inglês Alan Turing (1921-1954), em 1950, em seu artigo “Computing
Machinery and Intelligence” (Mind, 51). Turing chamou-o de “jogo de imitação”.

25
como a própria definição do conceito de Inteligência Artificial, apesar
das críticas feitas por vários filósofos, entre os quais o norte-americano
John Searle, uma das maiores autoridades da chamada “Filosofia da
Mente” 11.

As limitações dos chatterbots baseados em “moldes” é que


eventualmente eles acabam repetindo suas próprias frases — e as do
interlocutor — e se contradizendo em suas “opiniões”. Por isso,
acreditamos que as próximas gerações de chatterbots devem exigir dos
programadores um profundo conhecimento da sintaxe (que permitirá
que desenvolvam no programa a capacidade de gerar infinitas sentenças
da língua combinando um número finito de regras e elementos lexicais) e
de semântica (que tornará possível fazer com que o programa seja capaz
de interpretar o significado do input linguístico dado a ele pelo usuário
humano).

E, é claro, outras áreas da Linguística poderão tornar as


capacidades dos chatterbots ainda mais sofisticadas. Para mencionar
apenas algumas: a Linguística do Texto poderá auxiliá-los a estabelecer
as relações anafóricas intra- e extraoracionais do discurso; a Dialetologia,
a compreender diferentes dialetos, gírias, regionalismos e jargões; e a
Análise da Conversação, a determinar os turnos conversacionais, além de
auxiliar na compreensão e no uso de marcadores conversacionais. Isto é,
tornar os chatterbots máquinas capazes de interação verbal certamente
exigirá muito do que as várias áreas da linguística estudam 12.

Há outro tipo de aplicativo bastante comum hoje em dia que


também necessita de conhecimentos sintáticos e semânticos
relativamente sofisticados: são os tradutores eletrônicos. Os tradutores
são programas que se encarregam da tradução automática de textos e de

11 Para saber mais sobre o Teste de Turing, recomendamos o website


http://cogsci.ucsd.edu/~asay gin/tt/ttest.html.
12 Na pausa da leitura, talvez o leitor já possa se aventurar pela grande rede e

conversar com alguns chatterbots. Visite a página http://bots.internet.com/search/s-


chat.htm, para um começo.

26
sentenças de uma língua para outra, ou para outras. Os programas de
tradução automática estão entre os primeiros sistemas que foram objeto
de estudo da Linguística Computacional. Podemos dividir esta classe de
programas em (a) gerenciadores de terminologia; (b) ferramentas de
tradução automática; e (c) tradutores automáticos auxiliares à tradução
humana.

O primeiro tipo de programas é especificamente planejado para


auxiliar na tradução de textos técnicos de determinada área, e seu
vocabulário pode ficar restrito aos termos técnicos e jargões dessa área
(como os programas MultiTerm e Termwatch 13 ). TP PT

Já as ferramentas de tradução automática são as mais conhecidas:


elas são softwares destinados à tradução automática de quaisquer
documentos, sem qualquer restrição na escolha do léxico, gênero ou
assunto do texto. Seu objetivo é traduzir textos irrestritos sem qualquer
interferência ou ajuda de um tradutor humano. O desejo de desenvolver
tradutores abrangentes e robustos assim foi a principal causa do grande
impulso dado às pesquisas envolvendo traduções automáticas durante a
Guerra Fria. Mesmo que o objetivo até hoje não tenha sido alcançado, e
os resultados estejam muito aquém daqueles imaginados no princípio,
muito progresso já foi feito nesta área. Os programas Power Translator e
Systran Pro 14 são exemplos de ferramentas de tradução automática
TP PT

abrangente.

Por último, encontramos programas que auxiliam o tradutor


humano na tradução de um texto. Esses tradutores não primam pela
perfeição ou acabamento do texto final traduzido, mas almejam auxiliar
o tradutor profissional a traduzir grandes quantidades de texto.
Acredita-se que o uso de tais programas pode ajudar um tradutor
humano a reduzir em 50% o tempo total gasto no trabalho de tradução e

TPCf. www.multiterm.com/multitermonline/ e www.atril.com.


13 PT

TPCf. http://users.chariot.net.au/~translators/software/62.html e www.systransoft.


14 PT

com.

27
cerca de 15-30% no custo total com a tradução 15 . Exemplos de programas
PT

assim são o Trados e o Déjà Vu 16 . TP PT

Além dos chatterbots e dos tradutores automáticos, conhecimentos


em sintaxe e semântica são também fundamentais para outros
aplicativos, como parsers, geradores automáticos de resumos, corretores
ortográficos e gramaticais, classificadores automáticos de documentos
digitais etc. (Para o leitor saber mais sobre esses aplicativos,
recomendamos a leitura de Cole et al, 1997.) Veremos em seguida com
mais detalhe o que são os parsers.

2.2. Processamento sintático computacional ou parsing

Depois de um breve passeio por alguns aplicativos que vem sendo


desenvolvidos com base em resultados e técnicas da Linguística
Computacional, começaremos a tratar do assunto mais específico que
este livro pretende abordar. Vamos ver, a partir daqui, como desenvolver
um parser automático utilizando a linguagem Prolog. Mas antes, um
pouco de história.

O estudo da estrutura sintática das línguas naturais tem origens


muito distantes, que nos remetem a trabalhos de gramáticos gregos e
latinos, como Apolônio Díscolo (gramático grego do século II d.C.),
Donato e Prisciano (gramáticos romanos, dos séculos IV e VI d.C.,
respectivamente). O próprio termo sintaxe vem do grego sýntaxis, que é
formado por sýn (junto) e taxis (ordenar, colocar).

Por ora, entenderemos a sintaxe como o estudo da estruturação


interna da frase, em relação à sua estrutura de constituintes (na seção 3.1.2,
veremos o que vem a ser uma estrutura de constituintes). A breve
explicação de Dubois et al. (1988: 559) também nos servirá: a sintaxe é “a
parte da gramática que descreve as regras pelas quais se combinam as

15
TP PT Cf. www.languagepartners.com/reference-center/whitepapers/catinto.htm.
16
TP PT Cf. www.trados.com e www.atril.com.

28
unidades significativas em frases”. Veremos que o estudo das regras de
formação de constituintes sintáticos das línguas naturais é vital para o
funcionamento de diversos aplicativos desenvolvidos em PLN,
especialmente a construção de parsers.

A palavra parsing em si não remete ao processamento sintático


mediado por computador (ou processamento sintático computacional). O
termo vem da expressão latina pars orationes (partes do discurso) e tem
suas raízes na tradição clássica. De acordo com Mateus & Xavier (1992:
886), parsing pode ser entendido como o “processo de atribuição de uma
estrutura e de uma interpretação a uma sequência linguística”.

No contexto da Linguística Computacional, entretanto, parsing diz


respeito à interpretação automática (ou semiautomática) de sentenças de
linguagem natural por meio de programas de computador conhecidos
como parsers. Esses programas são capazes de classificar
morfossintaticamente as palavras e expressões de sentenças em uma
dada língua e, principalmente, de atribuir às sentenças a sua estrutura de
constituintes, baseando-se em um modelo formal de gramática. E a
estrutura de constituintes de uma sentença é fundamental para que ela
receba uma interpretação adequada 17.

De acordo com Covington (1994: 42), fazer o parsing de uma


sentença é “determinar, por um processamento algorítmico, se a sentença
é gerada por uma determinada gramática, e se ela for, qual estrutura que
a gramática atribui a ela”. Para Bateman, Forrest & Willis, autores do
capítulo The use of syntactic annotation tools: partial and full parsing (In:
Garside, Leech & McEnery, 1997),
um dos principais objetivos da área de PLN nos últimos dez
anos tem sido produzir um “analisador gramatical”, ou parser,
de abrangência ampla. Para muitos aplicativos de PLN, o
desafio é produzir um parser que poderá ser capaz de analisar
automática e estruturalmente de maneira correta, de acordo

17Existem também parsers semânticos, preocupados em fornecer a estrutura semântica


das sentenças em linguagem natural; mas estes parsers, em geral, se utilizam da
análise fornecida por um parser sintático. Não falaremos, entretanto, dos parsers
semânticos aqui.

29
com um esquema de parsing definido, qualquer sentença do
inglês que possa ocorrer naturalmente, sem restrições, de uma
gama de gêneros textuais tão vasta quanto possível (grifos dos
T

autores) (Garside, Leech & McEnery, 1997: 166).

Vários parsers já foram desenvolvidos ao longo dos anos, porém


nenhum deles foi ainda capaz de alcançar o objetivo proposto por
Bateman, Forrest & Willis. A pequena amostra de parser que
desenvolveremos ao longo deste trabalho evidentemente também não
dará conta dessa árdua tarefa. Mas servirá para dar uma ideia do tipo de
trabalho que se faz em Linguística Computacional, bem como do tipo de
conhecimento em Linguística que se faz necessário. Afinal, nossa
proposta aqui é apenas introduzir o leitor no assunto, tornando-o capaz
de dar seus primeiros passos em Linguística Computacional e de
terminar a leitura tendo uma ideia de como desenvolver seu primeiro
software linguístico: um pequeno parser da língua portuguesa.

Se nosso leitor estiver curioso e ávido por mais aventuras no


mundo cibernético, especialmente no que trata de parsers da língua
portuguesa, sugerimos duas visitas virtuais: a primeira em
www.geocities.com/gabriel_othero. Nessa página, o leitor poderá baixar
gratuitamente o parser Grammar Play, desenvolvido por Gabriel de Ávila
Othero e Maurício Piccini, em 2004 18. A segunda visita poderá ser ao site
do Projeto VISL — Visual Interactive Syntax Learning, em
http://visl.hum.sdu.dk/visl/pt/, que apresenta o parser de língua
portuguesa PALAVRAS, desenvolvido por Eckhard Bick 19.

Na próxima subseção, faremos uma breve apresentação do Prolog,


uma linguagem de programação desenvolvida especificamente para o
trabalho em Inteligência Artificial e Linguística Computacional; o Prolog
será a linguagem que utilizaremos para desenvolver aqui um parser para
a língua portuguesa.

18 Cf. Othero (2004).


19 Cf. Bick (1996) e (2000).

30
2.3. O Prolog

O Prolog é uma linguagem de programação baseada na lógica. O


nome Prolog vem justamente de PROgramming in LOGic (ou
“programando em lógica”). Essa linguagem foi desenvolvida por Alain
Colmerauer, na França, em 1975, e tem se tornado bastante popular entre
pesquisadores de Linguística Computacional e Inteligência Artificial. O
Prolog foi desenvolvido desde o princípio visando ao trabalho de
processamento de línguas naturais e desenvolvimento de parsers
automáticos.

Ao contrário da maioria das linguagens de programação, que são


de natureza “procedural”, o Prolog é uma linguagem “declarativa”. Isso
quer dizer que programar em Prolog não significa prover ao computador
um algoritmo cujos passos são ações executadas pelo computador até
que chegue a um determinado resultado. Para o Prolog, é importante que
o programador dê ao programa dados para combinações —
representados por proposições em um formato semelhante ao da lógica
de primeira ordem —, e o Prolog resolverá, então, problemas pertinentes
a esses dados, tentando demonstrar logicamente proposições derivadas a
partir deles.

Dougherty (1994) mostra de maneira bastante clara a diferença


básica entre a programação em Prolog e a programação em outras
linguagens computacionais, em sua maioria de natureza procedural. Para
Dougherty (1994: 8-9), a maneira antiga (de um ponto de vista
procedural) de se encarar a programação é a seguinte:

Um computador é uma máquina que transforma informação


procedendo através de uma sequência de passos. A menos que
ele tenha sido programado, ele não faz nada. (…) A tarefa do
programador é dizer ao computador como resolver o problema,
mostrando a ele passos detalhados que devem ser seguidos
para chegar à resposta correta. Um programa de computador é
um conjunto detalhado de passos que o programa deve seguir
para produzir qualquer resultado (grifos do autor).

Programar em Prolog, ao contrário, não deixa a máquina assumir


um papel tão “passivo” e dependente do programador. Por ser uma

31
linguagem declarativa, o Prolog deixa que o computador decida a
resposta de um problema a partir dos dados que tem disponíveis. Ainda
segundo Dougherty (1994: 15), a maneira de se encarar a programação
em Prolog pode ser resumida no que segue:

Um computador é uma máquina que tem disponíveis


instantaneamente todas as propriedades de todos os objetos em
seu banco de dados, além de todas as possíveis relações que
existem entre esses objetos. A tarefa do programador é
descrever ao computador em nossa terminologia que objetos e
relações lógicas entre os objetos definem as possíveis
respostas. Um programa de computador é um filtro para separar
o joio do trigo (que são as combinações que estão de acordo
com nossas condições lógicas) (grifos do autor).

Por isso, a programação em Prolog modificou a maneira


tradicional de se pensar em programação, especialmente no que diz
respeito a trabalhos envolvendo Inteligência Artificial. De acordo com
McDonald & Yazdani (1990: ix),

O Prolog é uma linguagem de programação nova e uma nova


maneira de olhar para a programação. A maioria das outras
linguagens de programação, como o BASIC e o Pascal,
apresentam ao computador uma solução para um problema na
forma de uma série de instruções para que a máquina as
execute estritamente na ordem em que foram especificadas.
Programar com o PROLOG (…) deve ser declarativo, um
programa deve simplesmente ser o enunciado do problema. A
maneira como o problema é solucionado e a sequência de
instruções por que o computador deve passar para resolvê-lo
são decididas pelo sistema.
PT

Além disso, a maioria das versões recentes do Prolog vem


equipada com uma extensão nocional conhecida como DCG, ou
Gramática de Cláusula Definida (do inglês Definite Clause Grammar), que
facilita a implementação de regras formais de parsing. A DCG, como
veremos mais detalhadamente na seção 3.2.2, é um formalismo de
representação de gramáticas livres de contexto. Ela torna muito fácil
implementar uma gramática e desenvolver um parser em Prolog, já que
“uma gramática descrita em uma DCG é diretamente executada pelo
Prolog como um analisador sintático” (Bratko, 1997: 431).

Por esses motivos, o Prolog é a linguagem utilizada em muitos dos


trabalhos que desenvolvem parsers (ou amostras de parsers) sintáticos e

32
semânticos, para a língua portuguesa, como em Almeida et al. (2003),
Othero (2004), Pagani (2004) e Vieira & Lima (2001). Para a língua
inglesa, também encontramos vários exemplos de sistemas de parsing em
Prolog; podemos destacar os trabalhos pioneiros de Pereira & Shieber
(1987) e Pereira & Warren (1980). Além destes, também são bastante
conhecidos os trabalhos de Clocksin & Mellish (1987), Gazdar & Mellish
(1989), Covington (1994) e Dougherty (1994).

Talvez ainda seja um pouco cedo para o leitor procurar essa


bibliografia. Porém, ao terminarmos o livro, acreditamos que o leitor será
capaz de compreender melhor e de maneira mais eficiente as obras que
mencionamos nos dois parágrafos acima.

33
3. DESENVOLVIMENTO DE UM PARSER SINTÁTICO I

3.0. Noções teóricas importantes

Como vimos, desenvolver um parser envolve tanto conhecimentos


linguísticos como computacionais. Por isso, julgamos que este capítulo
devesse ser dividido em duas grandes seções: uma que trata das teorias
linguísticas que adotaremos para desenvolver nosso pequeno parser
(veremos um pouco mais sobre o estudo sintático das línguas naturais); e
outra que aborde a teoria computacional que está por trás de sua
construção e implementação (veremos um pouco mais sobre a linguagem
Prolog).

É importante lembrar que partimos do pressuposto de que nosso


leitor seja um linguista (nada contra qualquer outro pesquisador de
qualquer outra área!). Apenas queremos dizer que nosso leitor-ideal
provavelmente já esteja parcialmente habituado à teoria linguística, mas
pouco — ou nada — ainda acostumado com os formalismos
computacionais. Por isso, explicaremos apenas alguns termos que
julgamos ser fundamentais à teoria linguística e que devem ser definidos
e explicitados para que o leitor saiba quais princípios e teorias estão por
trás do desenvolvimento de nosso pequeno parser (como, por exemplo, o
que entendemos por gramática, o que é uma estrutura de constituintes, o
que são representações arbóreas da sentença etc.). Em alguns momentos,
entretanto, faremos referência a certos pontos da teoria que acreditamos
já serem conhecidos do leitor e abster-nos-emos de parar para maiores
explanações. Ao mesmo tempo, por algumas vezes, faremos referência a
obras de autores conhecidos na literatura pertinente, pressupondo que o
leitor já os conheça. Se surgirem dúvidas, remetemos o leitor, a qualquer
momento, ao nosso Glossário, que está no final deste livro.

Sobre a teoria computacional, no entanto, partiremos da marca


zero, ou quase isso. Tentaremos ser claros ao máximo em nossas
explicações envolvendo a parte computacional, embora não nos interesse
discutir todo o formalismo da linguagem Prolog; veremos apenas os
pontos que nos são pertinentes para o desenvolvimento de um parser.

Isso tudo quer dizer que este é um trabalho na área de Linguística


Computacional, voltado para linguistas que queiram discutir e aplicar
teorias e formalismos sintáticos para o desenvolvimento de parsers na
linguagem Prolog. Não é, portanto, um trabalho voltado para a discussão
de ferramentas ou linguagens computacionais que trabalhem com a
linguagem natural.

3.1. Teoria Linguística

3.1.1. A noção de gramática

Um parser, no contexto da Linguística Computacional, é um


analisador automático (ou semiautomático) de sentenças. Esse tipo de
programa é capaz de analisar uma sentença com base em uma gramática
pré-estabelecida de uma determinada língua, verificando se as sentenças
fazem parte ou não da língua, de acordo com o que autoriza a sua
gramática. Um parser também analisa sintaticamente as sentenças,
decompondo-as em uma série de unidades menores, primeiramente em
nódulos não-terminais (os sintagmas) até chegar a nódulos terminais (os
itens lexicais), atribuindo-lhes uma estrutura de constituintes. Essa
estrutura de constituintes, que representa a organização hierárquica e
sintática da frase, é apresentada comumente através de árvores sintáticas
(como ilustra a representação (3.1a)), ou através de colchetes rotulados
(como vemos na representação em (3.1b)).

35
Vejamos as representações da sentença (3.1) abaixo:

(3.1) O João ama a Maria

(3.1a) S

SN SV

Det N V SN

Det N

O João ama a Maria

(3.1b) [ S [ SN [ Det O] [ N João]] [ SV [ V ama] [ SN [ Det a] [ N Maria]]]]


B B B B B B B B B B B B B B B B B B

Onde temos os símbolos:

S = sentença

SN = sintagma nominal

Det = determinante

N = nome (ou substantivo)

SV = sintagma verbal

V = verbo

Essas representações sintáticas das sentenças nos remetem às


teorias de Chomsky (especialmente 1971a e 1980 1 ) e pressupõem que TP PT

tenhamos adotado uma determinada teoria ou modelo de parsing, além


de uma determinada noção de gramática, relativa a essa teoria.

1 Convém lembrar ao leitor que Chomsky (1971a) corresponde à versão espanhola do


TP PT

já consagrado Chomsky (1965), e Chomsky (1980) é a versão portuguesa do também


consagrado Chomsky (1956), veja nossas Referências Bibliográficas. Utilizaremos
sempre as referências Chomsky (1971a) e (1980), uma vez que faremos menção sempre
a essas versões das obras originais de Noam Chomsky.

36
O termo gramática em linguística pode ter diversas acepções, que
podem ir desde o “sentido restrito de gramática escolar, quer dizer,
aquela que pretende dar as normas do bom uso de uma língua” até o
“sentido muito amplo e bastante mal definido, como aparece na
gramática histórica e comparada” (Nivette, 1975: 1). E, de fato, existem
inúmeras noções de gramática (só no dicionário de Dubois et al., 1988,
por exemplo, encontramos mais de dez entradas para o termo! 2).

Entenderemos gramática como sendo um conjunto de regras que


nos permitirá, juntamente com um determinado léxico, formar todas as
sentenças gramaticais de uma dada língua. Além disso, essa gramática
deverá ser capaz de gerar infinitas sentenças (que por sua vez poderiam
ser de infinita extensão, não fossem problemas óbvios, como
incapacidade de memória, inadequação pragmática etc.) a partir de um
número relativamente pequeno de regras de reescrita e de inserção
lexical. É o que se tem denominado gramática sintagmática.

Em Chomsky (1980: 13) encontramos a seguinte definição de


sintaxe e de gramática, que nos parece pertinente:

a sintaxe é o estudo dos princípios e processos que presidem à


construção de frases em línguas particulares. O estudo
sintáctico de uma determinada língua tem como objectivo a
construção de uma gramática, que pode ser encarada como um
mecanismo de produção de frases da língua em questão.

É nesse sentido que podemos empreender nossa jornada na


construção da gramática que estará por trás de nosso parser. No entanto,
nosso principal objetivo não será desenvolver exatamente um
“mecanismo de produção”, mas um “mecanismo de reconhecimento”
automático de sentenças em língua portuguesa. Nosso pequeno parser
deverá reconhecer as sentenças gramaticais — e somente elas — e atribuir-
lhes uma estrutura de constituintes.

Mas o que são sentenças gramaticais? E qual a sua relação com


sentenças agramaticais? Como sabemos se nossa gramática está gerando

2 Cf. Dubois et al. (1988: 313).

37
ou reconhecendo sentenças gramaticais (e apenas elas)?

Vejamos alguns exemplos, que pegamos emprestados de Radford


(1981: 7) — que, por sua vez, os tomou de Lakoff (1971: 332) 3:

(3.2) Meu tio acha que eu sou um mau cozinheiro.


(3.3) Meu gato acha que eu sou um mau cozinheiro.
(3.4) Meu peixinho dourado acha que eu sou um mau cozinheiro.
(3.5) Minha ameba de estimação acha que eu sou um mau
cozinheiro.
(3.6) Minha panela acha que eu sou um mau cozinheiro.
(3.7) Minha sinceridade acha que eu sou um mau cozinheiro.
(3.8) Meu nascimento acha que eu sou um mau cozinheiro. TP

Quais dessas frases são gramaticais e quais são agramaticais? De


acordo com Radford — e de acordo com o nosso entendimento —, todas
as sentenças acima são gramaticais, ainda que algumas delas, como (3.3)
a (3.8), possam parecer estranhas por alguma razão de ordem pragmática
ou semântica. Se adotarmos a premissa de que nosso parser deva
reconhecer sentenças gramaticais no sentido sintático estrito, isso
significa que ele poderia reconhecer e gerar a estrutura sintagmática de
todas essas sentenças.

De acordo com Chomsky (1980: 17), “a noção de ‘gramatical’ não


poderá identificar-se com as de ‘dotado de sentido’ ou de ‘significativo’,
em qualquer sentido semântico” 4. Ele ilustra esse ponto com a já
consagrada frase (3.9), que é uma sentença gramatical, em contraste com
(3.10), nitidamente agramatical (marcada, por convenção, com um
asterisco):

(3.9) Incolores ideias verdes dormem furiosamente.


(3.10) *Verdes dormem incolores furiosamente ideias.

3 LAKOFF, George. Presupposition and relative well-formedness. In: JAKOBOVITS, L.


A.; STEINBERG, D. D. Semantics. Cambridge: Cambridge University Press, 1971.
4 Contudo, em Chomsky (1971a), o autor leva em consideração alguns aspectos

semânticos no desenvolvimento da teoria gramatical e define alguns graus de


gramaticalidade, que não serão discutidos aqui.

38
Uma sentença agramatical como (3.10) foge a algumas regras de
nossa gramática (entendida aqui como o conjunto de regras sintáticas
que geram e reconhecem sentenças bem formadas do português).
Veremos nas subseções seguintes mais motivos por que devemos
considerar sentenças como (3.9) gramaticais e sequências de palavras
como (3.10) agramaticais. Na próxima subseção, apresentaremos a noção
que nos possibilita analisar a frase (3.1) através de uma árvore sintática
(3.1a) e de uma representação de colchetes rotulados (3.1b).

3.1.2. Gramática sintagmática e teoria de constituintes

Quando propusemos a descrição da frase (3.1) acima — repetida


aqui como (3.11) —, representando sua estrutura sintática através de um
diagrama arbóreo (3.1a) e de colchetes rotulados (3.1b), decidimos adotar
uma determinada teoria que nos possibilitasse analisar aquela sentença
da maneira que fizemos. Essa análise começa com a divisão da frase em
“blocos”, ou sintagmas, e vai até os itens lexicais, desta forma:

(3.11) O João ama a Maria.

O João ama a Maria

ama a Maria

O João ama a Maria

Não dividimos a frase (3.11) sem nenhum critério, agrupando


quaisquer grupos de palavras aleatoriamente. Se assim fosse,
poderíamos tê-la analisado de várias outras maneiras, formando

39
qualquer tipo de agrupamento interno na frase, até chegarmos aos itens
lexicais, como em (3.11a) e (3.11b). Poderíamos até mesmo supor que a
sentença não tenha qualquer organização interna, sendo formada
simplesmente por um aglomerado linear de palavras, como em (3.11c):

(3.11a) O João ama a Maria.

O João ama a Maria

O João ama a Maria

(3.11b) O João ama a Maria.

O João ama a Maria

O João ama a Maria

(3.11c) O João ama a Maria.

O João ama a Maria

De acordo com a teoria proposta pela gramática sintagmática, não


podemos encarar a sentença como um mero aglomerado de palavras,
unidas uma a outra de qualquer forma. Há entre o nível da palavra e o
da frase uma outra forma de organização, que é o sintagma (ou
constituinte). Quando discutimos anteriormente a noção de gramática e
sistema de parsing, dizendo que eles podem analisar a frase em unidades

40
— ou agrupamentos — menores, pressupusemos essa noção. Isto é, foi
com base nela que falamos antes em SN (Sintagma Nominal) e SV
(Sintagma Verbal).

Mas vejamos o que nos permite admitir essa noção de constituintes


nas sentenças e como sabemos que um determinado grupo de palavras
forma um constituinte (ou sintagma). De acordo com Radford (1981: 69):
Um certo agrupamento de palavras é um constituinte somente
se tiver uma ou mais das seguintes propriedades:
(i) Comporta-se distribucionalmente como uma única unidade
estrutural, isto é, é recorrente como uma unidade única em
uma variedade de outras posições nas frases
(ii) Pode ser coordenado com outro agrupamento similar
(iii) Não permite intrusão interna de elementos parentéticos (a
intrusão geralmente sendo permitida apenas nas fronteiras de
constituintes maiores, especialmente sintagmas)
(iv) Pode ser substituído por (ou servir de antecedente para)
uma proforma
(v) Pode ser omitido, sob condições de discurso apropriadas.

Isso quer dizer que podemos realizar diferentes “testes” para


identificarmos um constituinte, como os testes de coordenação,
interpolação, anáfora, entre outros. Esses testes permitirão identificar os
limites dos constituintes, confirmando ou não a nossa própria intuição
linguística.

Vejamos mais de perto como os testes de constituintes funcionam.


Dada a sentença (3.11), podemos efetuar alguns testes para ter certeza de
que nossa representação arbórea proposta algumas páginas atrás esteja
correta. O primeiro teste que podemos realizar é o teste de coordenação.
Suspeitamos que a organização sintática de (3.11) seja a seguinte (aqui
apresentada em colchetes rotulados):

(3.11’) S [ SN [O João]
B B B B B
SV [ama
B [ SN [a Maria]]]
B B

Para testarmos a validade de nossa representação, podemos


coordenar um outro SN com o SN [O João] e outro SN ao nosso SN [a
Maria], unindo-os com a conjunção aditiva e:

41
(3.11’a) [O João] e [o Pedro] amam a Maria.

(3.11’b) O João ama [a Maria] e [o Pedro].

Podemos coordenar também o SV:

(3.11’c) O João [ama [a Maria]] e [odeia [a Joana]].

Note que não poderíamos coordenar elementos que não sejam


realmente sintagmas. Não poderíamos, por exemplo, efetuar com sucesso
o teste de coordenação se tivéssemos analisado a estrutura sintática de
(3.11) como propusemos em (3.11a), (3.11b) e (3.11c) anteriormente:

(3.11a) [O João ama] [a Maria]

(3.11.a’) ?[O João ama] e [O Pedro adora] a Maria.

(3.11b) [O João ama a] [Maria].

(3.11.b’) *[O João ama a] e [o Pedro adora a] Maria.

(3.11c) [O] [João] [ama] [a] [Maria].

(3.11c’) *O João ama a [Maria] e [Pedro].

Isso nos leva ao raciocínio que, em regra, a coordenação só é bem-


formada quando os dois elementos coordenados são constituintes. E mais,
constituintes do mesmo tipo.

Ainda há outros testes de constituintes que poderíamos aplicar,


como, por exemplo, a interpolação. Esse teste consiste em introduzirmos
um elemento “intruso” entre os sintagmas (elementos parentéticos, como
sem dúvida, em geral, certamente, eu acho etc.). Por isso, podemos chamá-lo
também de teste de intrusão. Vejamos:

(3.11’c) [O João] sem dúvida [ama [a Maria]].

(3.11’d) [O João] [ama sem dúvida [a Maria]].

42
Se tentarmos inserir esse elemento intruso dentro de um sintagma
nominal, o resultado será uma frase agramatical, como podemos ver
abaixo:

(3.11’e) *[O sem dúvida João] [ama [a Maria]].

(3.11’f) *[O João] [ama [a sem dúvida Maria]].

Testes como esses ajudam a corroborarmos nossas intuições ao


analisarmos sentenças de qualquer língua, além de facilitarem-nos a vida
quando estamos em dúvida na representação de alguma sentença. Além
disso, uma vez que já sabemos identificar e reconhecer os constituintes
(ou sintagmas), fica mais claro entender o funcionamento de uma
gramática sintagmática. De acordo com Nivette (1975: 18),
A teoria dos constituintes imediatos era, no princípio,
estritamente analítica, procurava descrever e explicar os
fenômenos linguísticos, mas não produzi-los. Entretanto, para
a elaboração da sua gramática gerativa, Chomsky pretendeu
fundamentar-se em uma teoria linguística existente e
considerou que, para fazê-lo, a teoria dos constituintes
imediatos era a mais apropriada.
A gramática que ele elaborou, a partir desta teoria, foi a
Gramática Sintagmática (em inglês, “Phrase Structure
Grammar”), que se baseia em um vocabulário determinado de
símbolos e em certo número de regras de reescrever (grifos do
autor).

Já conhecemos alguns dos símbolos usados por Chomsky: S, SN,


SV, Det, N e V. Esses símbolos são usados nas regras de reescrita (ou
regras de reescrever, ou ainda regras sintagmáticas). E estas são as regras
de reescrever que validam nossa sentença (3.11):

(a) S à SN SV
(b) SN à Det N
(c) SV à V SN

43
As regras de reescrever (a), (b) e (c) acima devem ser entendidas
da seguinte maneira: um constituinte S irá se expandir em dois outros
constituintes (ou nós): SN e SV. SN não é um constituinte terminal; a
regra (b) mostra que ele deve também se expandir, em Det e N. Da
mesma maneira, a regra (c) diz que o SV também não é um constituinte
terminal: ele por sua vez irá gerar outros dois nós, V e SN.

Se estivéssemos montando uma árvore sintática a partir dessas


regras, efetuaríamos os seguintes passos, definidos pelas regras acima:

Regra (a) S

Regra (b) SN SV Regra (c)

Det N V SN Regra (b) novamente

Det N

Além das regras sintagmáticas, existem também as regras de


inserção lexical, que são responsáveis por introduzir os itens lexicais (as
palavras) abaixo de cada símbolo respectivo. Veja as regras de inserção
lexical utilizadas para a formação da sentença (3.11):

(d) Det à o, a
(e) N à João, Maria
(f) V à ama

Essas regras (de reescrever e de inserção lexical) podem ser


chamadas de gerativas, pois elas geram sentenças gramaticais a partir de
instruções precisas e explícitas. Após a aplicação dessas regras, obtemos a
estrutura de uma frase válida, ou gramatical, na língua definida pela

44
nossa gramática. A partir de todas essas regras, poderemos estruturar a
sentença (3.11) em uma estrutura arbórea — ou marcador sintagmático
— que nos permitirá visualizar claramente a organização hierárquica
entre os constituintes, e suas relações de precedência e dominância.

De acordo com Radford (1981: 79), uma árvore sintática é um


conjunto de pontos (ou nós, para usar a terminologia técnica
adequada), conectado por linhas, ou galhos. Os nós que ficam
no final, ou na parte de baixo, de uma estrutura arbórea
completa são chamados de nós terminais; os outros nós são
chamados de não-terminais. Cada nó tem um nome, ou um
rótulo. Os nós não terminais ganham nomes, ou rótulos, de
categorias (N, SN; V, SV etc.); os nós terminais (a menos que
estejam vazios (…)) recebem rótulos de itens lexicais
apropriados, quer dizer, palavras. Há dois tipos de relação
entre um par de nós contido em uma mesma árvore sintática:
precedência ou dominância (grifos do autor).

Podemos finalmente estruturar a árvore sintática da frase (3.11) a


partir das regras (a-f), trabalhando como um parser top-down (que
constrói uma sentença a partir de seu topo, até chegar ao nível das
palavras). Aplicando a regra (a), obteremos:

SN SV

Aplicando (b),

SN

Det N

Com a aplicação de (c), obtemos

45
SV

V SN

E, novamente, aplicando (b), que nos permite desenvolver o SN


dominado imediatamente pelo SV, teremos nossa estrutura sintagmática
completa:

SN SV

Det N V SN

Det N

Aplicando-se, então, as regras de inserção lexical, obteremos a


nossa sentença (3.11):

SN SV

Det N V SN

Det N

O João ama a Maria

Vejamos algumas noções importantes na organização hierárquica

46
das sentenças. A relação de precedência diz respeito à posição linear dos
nós na estrutura arbórea: dizemos que um nó precede o outro se ele
estiver à esquerda desse outro nó e entre eles não houver relação de
dominância. Por exemplo, o SN (o João) precede o SV e precede o SN (a
Maria) na representação acima.

Já a relação de dominância pode ser expressa da seguinte forma:


dizemos que “um nó X domina um nó Y se e somente se houver um
caminho puramente descendente através da árvore de X para Y” PT

(Borsley, 1999: 248). Essa noção remete-nos à dominância imediata, que é


uma relação de dominância entre dois nós que estejam ligados
imediatamente um ao outro através da relação de dominância. Por
exemplo, na estrutura acima, a S domina todos os outros nós, mas domina
imediatamente apenas o SN (o João) e o SV.

É bem sabido, no entanto, que a gramática sintagmática apresenta


uma série de limitações e precisa ser enriquecida com recursos
adicionais. De acordo com a nossa pequena gramática acima, por
exemplo, poderíamos gerar também as seguintes sentenças, claramente
agramaticais:

(3.12) *A João ama a Maria.


(3.13) *A João ama o Maria
(3.14) *O João ama o Maria.

Além disso, se expandíssemos as palavras da categoria N para


João, Maria, livro, meninos, teríamos frases como as abaixo:

(3.15) O livro ama o João.


(3.16) O livro ama a Maria.
(3.17) *O meninos ama a Maria.

47
Da mesma forma, se ampliássemos a categoria V para ama, gosta,
cai, chove, obteríamos algumas frases nitidamente agramaticais, como

(3.18) *O João gosta a Maria.


(3.19) *O João cai a Maria.
(3.20) *O João chove a Maria.

Por isso, teremos de adicionar alguns recursos às regras


sintagmáticas e trabalhar com a descrição e classificação do léxico para
implementar este tipo de gramática na linguagem Prolog. Neste ponto da
leitura, é bem provável que nem tudo ainda esteja claro, mas muito sobre
a implementação das regras sintagmáticas em Prolog será tratado com
mais detalhe já na próxima seção.

3.2. Teoria computacional

3.2.1. Prolog

Como vimos anteriormente, a linguagem de programação Prolog


difere de outras linguagens mais convencionais, como Pascal, Fortran, C
e outras. O Prolog é uma linguagem de programação declarativa,
baseada na lógica matemática (já vimos também que o nome Prolog é a
abreviação de PROgramming in LOGic, ou seja, “programando em
lógica”). De acordo com Dougherty (1994: 36), “Prolog é uma abreviação
de Programming in Logic porque, na maioria dos casos, o Prolog está
tentando descobrir se uma afirmação é verdadeira ou falsa, ou está
tentando encontrar alguma combinação de variáveis que torne uma
afirmação verdadeira” (grifos do autor).

Isso quer dizer que executar um programa em Prolog é fazer uma


consulta à sua base de dados. E uma consulta nada mais é do que uma
chamada de uma cláusula do programa, equivalendo a uma solicitação

48
para provar se o que pedimos é verdadeiro de acordo com a base de
dados do programa. Segundo Lu & Mead (s.d.: 1), no paradigma do
Prolog,

o programador especifica relações entre os valores dos dados


(isso constitui um programa lógico) e então propõe
questionamentos para o ambiente de execução do programa
(geralmente um interpretador interativo) para verificar se
certas relações se sustentam.
PT

Mas essa discussão toda ainda parece muito abstrata. Vejamos


como começar a fazer um programa simples em Prolog, para que
possamos entender mais claramente o seu funcionamento 5.

Para escrever um programa, devemos abrir um editor de textos,


como o Bloco de Notas (ou Notepad), presente em todas as versões do MS
Windows disponíveis no mercado. É no editor que desenvolveremos os
programas que mais tarde serão rodados na plataforma do Prolog. Para
começar, vamos escrever um programa bastante simples, mas que deixe
suficientemente clara a natureza declarativa do Prolog, bem como a sua
maneira de consultar a base de dados.

Como dissemos anteriormente, o Prolog faz relações entre as


informações de seu banco de dados e consulta essas informações para
saber se uma afirmação é verdadeira ou falsa. Podemos partir de um
programinha simples que trate das seguintes relações:

Sócrates é homem.

O homem é mortal.

5Os programas serão executados na versão SWI Prolog v. 4.0.7, que pode ser obtida
gratuitamente na internet (como no site www.inf.pucrs.br/~flavio/, por exemplo).
Todos os programas demonstrados aqui estão disponíveis na homepage da Editora
(www.parabolaeditorial.com.br) e foram desenvolvidos nessa mesma versão do
Prolog. Talvez agora já seja um bom momento de “baixar” o SWI Prolog e instalá-lo
em seu computador.

49
Em notação Prolog, devemos escrever:

homem(socrates).

mortal(X) :- homem(X).

Note que devemos escrever tudo em letras minúsculas e sempre


colocar um ponto final no fim de cada linha. Na verdade, só podemos
escrever com letras maiúsculas as variáveis, como veremos adiante.

A primeira linha do programa corresponde à nossa primeira


premissa acima, a segunda linha corresponde à segunda premissa,
conforme mostra a tabela 3.1:

Tabela 3.1: Tradução — Prolog x português

E M P ROLOG EM PORTUGUÊS

homem(socrates). Sócrates é homem.

mortal(X) :- homem(X). O homem é mortal.

A primeira premissa (homem(socrates).) é o que chamamos em


Prolog de fato. Os fatos são regras que, de certa forma, se
autossatisfazem, ou seja, são dados sempre verdadeiros. Eles nunca
apresentam variáveis e são explicitados em Prolog da seguinte maneira
(na coluna da esquerda, temos fatos em Prolog; na coluna da direita,
temos a sua interpretação em português):

(1) homem(socrates). Sócrates é um homem

(2) x(y). y é um x

(3) professor(sergio). Sérgio é um professor

(4) numero(4). 4 é um número

(5) numero(quatro). Quatro é um número

Etc.

50
A segunda premissa em nosso exemplo (mortal(X) :- homem(X).) é
uma regra em Prolog: ela apresenta uma variável (escrita sempre em
letras maiúsculas) e uma relação de condicionalidade, expressa pelo
operador “:-”. Ao contrário dos fatos, as regras consistem sempre de
duas partes: a cabeça e o corpo:

mortal(X) :- homem(X).

Cabeça Corpo

Para que a cabeça da regra seja verdadeira, as condições expressas


em seu corpo devem ser satisfeitas. A interpretação de uma regra desse
estilo é bastante simples:

(6) a :- b. “a” é verdadeiro se “b” é verdadeiro

(7) a :- b, c, d. “a” é verdadeiro se “b”, “c” e “d”


forem verdadeiros

Isso nos leva a uma tradução mais refinada da regra em nosso


programa acima:

(8) mortal(X) :- homem(X) “x” é mortal se for verdade que “x”


é homem

Ou ainda:

Se “x” é homem, então “x” é mortal

51
A partir de nosso primeiro programa escrito em Prolog (mostrado
aqui no quadro 3.1), podemos fazer as seguintes consultas no Prolog
(quadro 3.2):

Quadro 3.1: Programa01.swi

% Programa 01: Sócrates e a imortalidade

homem(socrates). % Sócrates é homem.

mortal(X) :- homem(X). % É verdade que X é mortal se X for homem.

% Detalhe: sempre depois de cada linha, devemos colocar um ponto final.


% Tudo o que for escrito depois do símbolo de porcentagem (%) não será
lido pelo Prolog. Aqui é o espaço de escrevermos os comentários do
programa, se os houver.
% Como fizemos este programa? Em um editor de textos, simplesmente
escrevemos as relações estudadas acima e o salvamos no diretório
“default” do Prolog, com o nome de “programa01.swi”.

Quadro 3.2: Consultando o programa01.swi

Welcome to SWI-Prolog (Version 4.0.7)


Copyright (c) 1990-2000 University of Amsterdam.
Copy policy: GPL-2 (see www.gnu.org)
Passo A
For help, use ?- help(Topic). or ?- apropos(Word).

?- [programa1].
Passo B % programa01 compiled 0.00 sec, 752 bytes

Yes
?-homem(socrates).
Consulta 1
Yes
?-homem(X).

X = socrates
Consulta 2
Yes
?-

Vejamos o que acabamos de fazer no quadro 3.2 logo acima.


Primeiramente, carregamos o Prolog (dando dois cliques acima do ícone
que designa o programa, ainda na plataforma Windows), o que resultou
com que o programa fosse carregado (passo A). Depois, como mostra o

52
passo B, chamamos o nosso programa (digitando seu nome entre
colchetes, seguido de um ponto final: [programa01].) no prompt do
Prolog, “?-”. Como o Prolog conseguiu abrir com sucesso o programa01,
ele retornou um Yes logo abaixo.

Lembre-se de que todos os programas que fizermos com o Prolog


devem ser salvos em um diretório default do Prolog, especificado pelo
próprio usuário durante a instalação dessa linguagem. Em relação à
extensão dos arquivos dos programas que desenvolvemos, optamos por
adotar a extensão .swi, recomendada pelos próprios desenvolvedores do
SWI Prolog. Outras extensões poderiam ser usadas (como .pro, por
exemplo, também muito encontrada em programas desenvolvidos em
Prolog), mas preferimos, por convenção, salvar nossos arquivos sempre
com a extensão .swi.

Uma vez que o nosso programa tenha sido carregado com sucesso,
começamos a fazer algumas consultas, ou queries (note que o que está
escrito em negrito no quadro 3.2 é o nosso input, ou seja, aquilo que
digitamos no Prolog; o que está em texto sem marcação é o que o
programa nos mostra ou retorna como resposta. Adotaremos essa
convenção daqui para frente).

Há basicamente dois tipos de perguntas que podemos fazer para o


Prolog: perguntas sim/não e perguntas-QU. As perguntas do tipo sim/não
esperam uma resposta que seja justamente um sim ou um não, do tipo: A
Maria ama o João?; Vai chover no final de semana? etc. Já as perguntas-QU
(tradução literal do inglês, wh-questions) envolvem pronomes
interrogativos, que frequentemente começam por qu (e, em inglês, wh),
como quem, qual, quando etc. Veja estes exemplos de perguntas-QU: Quem
ama o João?; Quando vai chover? etc.

Na consulta 1, fizemos uma pergunta do tipo sim/não:


perguntamos ao Prolog se é verdade que Sócrates é homem
(homem(socrates).). O que o programa fez foi consultar a sua base de
dados e verificar se este fato é verdadeiro de acordo com o seu

53
conhecimento. Como esta informação consta em seus dados (veja a
primeira linha de nosso programa, no quadro 3.1), o Prolog retornou
uma resposta afirmativa (Yes).

Curiosamente, se perguntássemos ao programa se Platão também é


homem (homem(platao).), ele responderia com uma resposta negativa
(No). Isso não quer dizer que Platão não seja um homem; apenas quer
dizer que, entre as informações que estão acessíveis ao programa01, não
consta nada sobre o fato de Platão ser homem ou não. Apesar de parecer
trivial, essa ressalva é muito importante, e devemos mantê-la sempre em
mente daqui para a frente.

Uma outra observação de ordem prática: o Prolog retorna Yes ou


No sempre duas linhas abaixo de nossas consultas. Por isso, o primeiro
Yes é, como vimos, relativo ao sucesso do carregamento do programa01
(Passo B), e o segundo Yes (mais abaixo) refere-se à nossa consulta 1.

Na consulta 2, demos um pouco mais de trabalho ao Prolog:


perguntamos ao programa quem era homem de acordo com a sua base de
dados (homem(X).), ou seja, fizemos uma pergunta-QU. Para isso,
utilizamos uma variável — sempre uma letra maiúscula (na verdade,
qualquer caracter ou sequência de caracteres maiúsculos). Para o
programa01, o único homem é Sócrates (X = socrates). Nas perguntas-
QU, sempre envolveremos variáveis, enquanto nas perguntas sim/não,
iremos apenas perguntar se determinado fato é verdadeiro ou falso.

Vejamos mais algumas consultas ao nosso programa:

Quadro 3.3: Consultando o programa01 novamente

?- homem(platao).

Consulta 1 No
?- mortal(socrates).
Consulta 2
Yes
?- mortal(X).

Consulta 3 X = sócrates

Yes
?-

54
Na consulta 1, perguntamos ao programa se Platão era um homem
(homem(platao).). Já sabíamos de antemão que o programa iria dizer que
não, porque não demos a ele a informação sobre Platão em sua base de
dados, a fim de que ele pudesse realizar sua consulta e nos retornar uma
resposta afirmativa.

Na consulta 2, perguntamos se Sócrates era mortal


(mortal(socrates).). É interessante notarmos que o programa não tem em
sua base de dados exatamente essa informação. Quer dizer, consultando
as informações do programa01, verificamos que há um fato que diz
“Sócrates é homem” (homem(socrates).), mas não há nada que diga
“Sócrates é mortal” (que deveria ser representado em Prolog por
mortal(socrates).).

Como o programa pôde então retornar uma resposta afirmativa à


nossa consulta? Com base em que dados (e que raciocínio) o programa
soube que Sócrates era mortal?

Muito simples: através de relações entre diferentes informações


que constam na sua base de dados. Reveja o programa01 acima antes de
continuarmos (…).

Se nosso leitor continua atento, ficou claro como o programa


conseguiu responder afirmativamente à pergunta “O Sócrates é mortal?”.
O que nosso programa fez foi tirar uma conclusão válida a partir de duas
premissas verdadeiras, como expressa o silogismo categórico abaixo:

Sócrates é um homem. homem(socrates).

O homem é mortal. mortal(X) :- homem(X).

Logo Sócrates é mortal. Se X = socrates, então X =


homem e X = mortal

Lembre-se de que as letras maiúsculas representam variáveis no


Prolog. Nosso programa usou um processo chamado de unificação de
variáveis para responder à consulta. Seu primeiro passo foi verificar se

55
Sócrates era um homem. Isso é um fato do programa, uma verdade.
Depois, ele tentou a unificação de homem(socrates) com homem(X).
Dessa unificação, ele obteve que X = socrates. Ou seja, ele atribuiu o
valor “socrates” à variável “X”.

Por fim, ele fez o seguinte raciocínio: (a) se X é homem, então X é


mortal; (b) se Sócrates é X, então Sócrates é homem; (c) se Sócrates é
homem e o homem é mortal, logo o Sócrates é mortal. Voilà.

Na consulta 3, propusemos uma pergunta-QU: perguntamos ao


programa quem era mortal (mortal(X).). A partir de um raciocínio
semelhante ao acima, porém inverso, o programa pôde nos responder
que, de acordo com as informações que lhe estão disponíveis, o Sócrates
é mortal. Dê uma olhada nos quadros acima e refaça o raciocínio do
Prolog.

3.2.2. DCGs e parsing em Prolog

Agora que já vimos um pouco da lógica de funcionamento do


Prolog, vejamos como trabalhar na construção de parsers sintáticos, que
reconheçam uma sentença como sendo pertencente a uma língua e, além
disso, que atribuam a essa sentença a sua estrutura de constituintes,
baseada nas teorias que estudamos na primeira parte deste capítulo.

Na verdade, precisamos deixar claro que há diferentes maneiras de


se trabalhar com parsers sintáticos, e diversas têm sido as alternativas de
desenvolvimento de ferramentas de linguagem natural que tratem da
sintaxe de uma língua 6. Como confirmam Gazdar & Mellish (1989: vi-vii),

linguistas computacionais têm, ao longo dos anos, adotado


muitos formalismos gramaticais diferentes para usarem em
seus parsers, às vezes, pegando-os emprestados da Linguística,

6 Ver, por exemplo, as propostas de Almeida et al. (2003), Bick (1996 e 2000),
Dougherty (1994), Gazdar & Mellish (1989), Othero (2004), Pagani (2004), Pereira &
Shieber (1987), entre outros.

56
às vezes desenvolvendo-os do zero para a proposta à mão.
Mesmo hoje, há provavelmente duas dúzias ou mais de
formalismos gramaticais distintos em uso em vários projetos
de PLN ao redor do mundo. TP

Para desenvolvermos nosso parser, utilizaremos um recurso


chamado de DCG, presente em quase todas as versões de Prolog
atualmente distribuídas. Seguiremos de perto as propostas vistas em
Othero (2004) e Pagani (2004), partindo inclusive de muitos dados
presentes nas gramáticas que esses autores propõem.

As DCGs (Definite Clause Grammars) foram introduzidas


primeiramente por Pereira & Warren (1980). Elas são “um formalismo
para representação de gramáticas livres de contexto” (Vieira & Lima,
2001: 18). Graças a elas, podemos converter as regras de reescrita de
maneira bastante simples e transparente para a notação em Prolog.

Lembra-se, leitor, das regras (a), (b) e (c) que já estudamos


anteriormente?

(a) S à SN SV
(b) SN à Det N
(c) SV à V SN

Essas regras podem ser implementadas em Prolog de maneira


bastante simples:

(a1) s --> sn, sv.

(b1) sn --> det, n.

(c1) sv --> v, sn.

Tudo o que tivemos de fazer foi escrever os rótulos dos


constituintes em letras minúsculas (caso contrário, o Prolog os trataria

57
como variáveis), substituir a flecha “à” por “-->”, separar os
constituintes à direita da flecha por uma vírgula e, finalmente, lembrar
de colocar um ponto final no fim de cada regra.

O que a DCG faz é converter essas regras, relativamente


transparentes para o linguista, em notação do Prolog, sem que vejamos
esse procedimento. O Prolog não opera diretamente com as regras
sintagmáticas tais como em (a1), (b1) e (c1). Na verdade, “quando um
programa escrito na notação DCG é carregado, suas regras são
automaticamente traduzidas para um formato conhecido como diferença
de listas” (Pagani, 2004: 11). Grosso modo, a DCG pode ser entendida,
então, como um recurso que torna mais fácil ao linguista a
implementação de regras sintagmáticas em Prolog.

Por exemplo, as regras (a1), (b1) e (c1), que são muito similares às
regras sintagmáticas com que estamos acostumados a lidar, serão
traduzidas internamente para o Prolog como (a2), (b2) e (c2),
respectivamente:

(a2) s(L1, L) :- sn(L1, L2), sv(L2, L).

(b2) sn(L1, L) :- det(L1, L2), n(L2, L).

(c2) sv(L1, L) :- v(L1, L2), sn(L2, L).

Graças ao recurso da DCG, podemos programar em Prolog de


maneira bastante similar à notação convencionalmente utilizada em
sintaxe (ao menos, na teoria que adotamos e estudamos aqui). Veremos
mais adiante que também utilizaremos outras regras, como regras de
inserção lexical e regras lexicais, que serão necessárias para dar conta de
determinados fenômenos. Por ora, no entanto, poderíamos já escrever
um programa que desse conta da análise de uma sentença como a
seguinte:

(3.21) Zequinha lavou o carro.

58
Veja no quadro 3.4 um programa que nada mais é do que uma
pequena amostra de gramática que dá conta dessa sentença.

Quadro 3.4: Programa02.swi

% Programa 02: Zequinha e o carro

% Regras Sintagmáticas
s --> sn, sv.
sn --> n.
sn --> det, n.
sv --> v, sn.

% Regras de Inserção Lexical


det --> [o].
n --> [zequinha];[carro].
v --> [lavou].

% Lembre-se de que aquilo que escrevemos depois do


sinal de porcentagem (%) não é lido pelo Prolog. Por isso,
para facilitar nossa programação, podemos escrever
alguns comentários e títulos ilustrativos ao longo da
gramática, usando esse recurso.

O programa 02 deve aceitar a sentença (3.21) como sendo


gramatical, uma vez que tanto a estrutura da sentença está de acordo
com a sua base de dados, como os itens lexicais constam em seu
“dicionário”. Vejamos algumas consultas ao programa 02.

Quadro 3.5: Consultando o programa02

Welcome to SWI-Prolog (Version 4.0.7)


Copyright (c) 1990-2000 University of Amsterdam.
Copy policy: GPL-2 (see www.gnu.org)

For help, use ?- help(Topic). or ?- apropos(Word).

?-[programa02].
% programa02 compiled 0.01 sec, 1,820 bytes

Yes
?- s([zequinha,lavou,o,carro], []).

Yes.
?-

59
Na consulta acima, perguntamos ao programa se a sequência de
palavras “Zequinha lavou o carro” era uma sentença da língua de acordo
com a gramática e o léxico inscritos no programa02. Note que temos de
usar uma série de notações para consultar o programa. Temos de (i)
escrever todas as palavras em letras minúsculas; (ii) utilizar parênteses e
colchetes; (iii) separar os vocábulos por vírgulas e (iv) colocar, ao lado
do colchete com a nossa consulta, um duplo colchetes []. Em um parser
que conte com uma interface gráfica, como o Grammar Play, por
exemplo, nada disso é necessário. Como nosso objetivo aqui será
desenvolver apenas a gramática em Prolog em si, e não um parser
completo (quer dizer, que tenha uma gramática em Prolog e uma
interface gráfica), temos de começar a nos acostumar com essa notação
de consulta ao Prolog.

Na consulta que fizemos no quadro 3.5, obtivemos a resposta


afirmativa. Isso quer dizer que, de acordo com a gramática que
escrevemos, a sequência “Zequinha lavou o carro” é uma sentença
gramatical da língua.

No entanto, utilizando o mesmo léxico, poderíamos propor o


reconhecimento de outras sentenças, tanto gramaticais como
agramaticais:

Quadro 3.6: Consultando o programa02 novamente

?- s([o,zequinha,lavou,o,carro], []).
Consulta 1
Yes
?- s([o,carro,lavou,zequinha], []).
Consulta 2
Yes
?- s([o,lavou,carro,zequinha], []).
Consulta 3
No
Consulta 4 ?- s([nosso,parser,ficou,excelente], []).

No
?-

60
Na primeira consulta, perguntamos se a frase “O Zequinha lavou o
carro” era gramatical. Como nosso programa apresenta duas regras para
a descrição do SN (SN à det N / SN à N), ele respondeu
afirmativamente à nossa pergunta. Na segunda consulta, usamos uma
frase gramatical (como vimos, de maneira sintaticamente estrita e
estritamente sintática), porém absurda semântica ou pragmaticamente, o
que resultou com que o programa nos retornasse outra vez uma resposta
afirmativa, indicando que esta é uma sentença gramatical na língua, de
acordo com a sua gramática.

Na terceira consulta, experimentamos uma frase claramente


agramatical (*O lavou carro Zequinha) e nosso programa a reconheceu
como tal, retornando um No à consulta. Por fim, em nossa quarta
consulta, perguntamos ao programa se a sentença “Nosso parser ficou
excelente” é uma frase da língua, mas ele não soube reconhecê-la. Por
que isso aconteceu? Por dois motivos: (a) as palavras dessa sentença não
constam no léxico do programa e (b) essa sentença foge às regras
gramaticais presentes em sua gramática. Falaremos mais sobre isso no
próximo capítulo.

61
4. DESENVOLVIMENTO DE UM PARSER SINTÁTICO II

4.0. “Colocando a mão na massa”

Para desenvolver um parser em Prolog, já sabemos que é preciso


primeiramente ter essa linguagem de programação instalada no
computador. Como acabamos de ver, para o desenvolvimento de nossa
pequena amostra de parser, vamos utilizar a versão SWI Prolog 4.0.7,
desenvolvida na University of Amsterdam 1.

Neste livro, pretendemos mostrar ao leitor uma maneira de como


começar seu caminho no mundo da Linguística Computacional.
Escolhemos como tarefa prática o desenvolvimento de um parser
sintático em linguagem Prolog. Evidentemente, o programa que
apresentaremos aqui não passará de uma amostra simples de um parser.
No entanto, acreditamos que o leitor conseguirá partir dela se desejar
continuar seus estudos, seja sobre parsing automático ou outra aplicação
envolvendo o Prolog.

4.1. Sobre as regras gramaticais

Para começarmos o desenvolvimento de nossa gramática em


Prolog, devemos implementar regras sintagmáticas relativas à descrição
sintática do português. Para simplificarmos, iremos trabalhar apenas
com as regras da sentença simples (que contém apenas um verbo).

1 O leitor pode “baixá-la”, como dissemos, do site www.inf.pucrs.br/~flavio/, por


exemplo.
E para implementarmos as regras da gramática de nosso parser,
podemos começar com regras relativamente simples já consagradas na
literatura pertinente 2 , como a regra (1):
PT

(1) S à SN SV

A esta altura da leitura, já sabemos que ela quer dizer que uma
sentença (S) é formada por um sintagma nominal (SN) e um sintagma
verbal (SV). A partir dessa regra, devemos elaborar outras para o SN e
para o SV, ou conferir o que consta na literatura pertinente:

(2) SN à Det N
(3) SV à V SN

Se quisermos fazer com que nosso parser funcione, já sabemos que


não podemos parar por aí, pois ainda temos de implementar os itens
lexicais. Para começar, podemos pegar alguns itens lexicais comumente
utilizados em exemplos por sintaticistas, como alguns apresentados em
Pagani (2004), por exemplo:

(4) Det à o, a
(5) N à João, Maria
(6) V à ama

Implementaremos na gramática de nosso parser algumas regras já


consagradas na literatura, como no caso das regras (1), (2) e (3) acima,
que podem ser encontradas, por exemplo, em Heckler & Back (1988: 151).

2Como Heckler & Back (1988), Lemle (1984), Luft (1986), Perini (1989 e 2000) e Souza e
Silva & Koch (1993), que tratam da descrição sintática do português.

63
A partir delas, poderemos usar exemplos apresentados na literatura, que
servem para ilustrar ou para testar a regra (e aí, já vamos aumentando o
tamanho de nosso léxico). Por último, trabalharemos com as dificuldades
que encontrarmos para implementar uma regra em Prolog da melhor
maneira possível.

Antes de continuarmos com o exemplo da formação da sentença,


vejamos um procedimento de formalização e implementação de regras
sintáticas no Prolog a partir de uma regra de formação do SN descrita
por Souza e Silva & Koch (1993: 18). De acordo com as autoras, o SN em
português tem a seguinte estrutura:

(7) SN à (Det) (Mod) N (Mod)

Pro

Alguns símbolos já são nossos conhecidos:

SN = Sintagma Nominal

Det = Determinante

N = Nome (ou Substantivo)

Alguns símbolos podem ser novos:

Mod = Modificador

Pro = Pronome

Δ = Vazio (ou SN não preenchido lexicalmente)

O uso das chaves indica a fusão de diversas regras. No caso de (7),


ele mostra que há três descrições possíveis do SN. Em Prolog, não temos
esse recurso e, se quisermos implementar essa regra na gramática do
programa, teremos de descrever três diferentes regras para o SN:

64
(7.1) SN à (Det) (Mod) N (Mod)
(7.2) SN à Pro
(7.3) SN à Δ

Na verdade, os parênteses são também uma notação nova. Eles


assinalam que o item pode ou não aparecer, ou seja, o elemento entre
parênteses não é obrigatório. Em Prolog, também não contamos com esse
recurso, por isso deveremos ter fôlego para transformar a regra (7.1) nas
seguintes:

(7.4) SN à N
(7.5) SN à Det N
(7.6) SN à Det Mod N
(7.7) SN à Det N Mod
(7.8) SN à Det Mod N Mod
(7.9) SN à Mod N Mod
(7.10) SN à Mod N
(7.11) SN à N Mod

Essa adaptação das regras à plataforma do Prolog mostra um


pouco daquilo que dissemos anteriormente sobre trabalhar com as
dificuldades de implementação das regras sintagmáticas já consagradas
na literatura linguística 3. Mas há mais trabalho envolvido aí. Vamos
começar com apenas uma regra das acima estudas, digamos com a (7.5).
Ela remete-nos a outra regra, já que, de acordo com Souza e Silva & Koch
(1993: 17), o Det, em português, pode ser composto, apresentando a
seguinte estrutura:

3Na verdade, o leitor deve se lembrar que, para adaptar essas regras sintagmáticas em
Prolog, deveríamos escrevê-las sempre em letras minúsculas e utilizando vírgulas
entre os constituintes. Ou seja, ao invés de SN à Det N, por exemplo, teríamos de
escrever sn --> det, n. em um programa em Prolog.

65
(8) Det à (pré-det) det-base (pós-det)

Já sabemos que, no Prolog, essa regra deverá ser implementada da


seguinte maneira:

(8.1) Det à det-base

(8.2) Det à pré-det det-base

(8.3) Det à pré-det det-base pós-det

(8.4) Det à det-base pós-det

Agora sim, com as regras estudadas e devidamente implementadas


em nossa gramática em Prolog, podemos finalmente testar nosso
pequeno parser. Já temos regras bastante detalhadas para o SN e
podemos juntá-las com as regras (1) e (3) para formarmos uma sentença.
Estamos apenas nos esquecendo de detalhe: o léxico.

Nossa primeira medida na implementação do léxico foi inicia-lo a


partir dos exemplos apresentados na literatura. “A partir” significa que
podemos utilizar os exemplos tal como são apresentados na literatura e
também fazer uso de frases ou sintagmas que criamos baseando-nos nos
exemplos originais. Para continuar com nossa ilustração, utilizaremos
alguns exemplos de Souza e Silva & Koch (1993: 17-18) para o SN
(exemplos (4.1), (4.2), (4.3) e (4.6)), bem como alguns exemplos que nosso
engenho e arte nos permitiram produzir a partir deles (exemplos (4.4),
(4.5) e (4.7)) 4.

(4.1) estes meus cinco amigos


(4.2) todos os meus amigos

4 Lembre-se de que o asterisco marca uma sentença ou um constituinte agramatical.

66
(4.3) *os estes meninos
(4.4) os meninos
(4.5) estes meninos
(4.6) *dois os livros
(4.7) os dois livros

Implementaremos, então, no léxico do Prolog todos os itens


lexicais acima envolvidos (estes, meus, cinco, amigos, todos, os, meninos,
dois, livros), da seguinte maneira: iremos separar as palavras de acordo
com a sua classe gramatical, a saber, determinante e substantivo, e depois
implementá-las em nossa gramática computacional. Uma primeira
tentativa seria simplesmente aumentar os dados das regras (4) e (5),
vistas acima:

(4.1) Det à os, as, estes, meus, cinco, todos, dois

(5.1) N à João, Maria, amigos, meninos, livros,

No entanto, vimos que o determinante deve ser descrito mais


detalhadamente, pois os itens que estão sob esse rótulo, na verdade,
podem ser predeterminantes, determinantes-base ou pós-determinantes.
Então, refinemos nossas regras, ainda de acordo com as explicações de
Souza e Silva & Koch.

(4.1.1) Pré-det à todos

(4.1.2) Det-base à os, as, estes

(4.1.3) Pós-det à meus, cinco, dois

Para termos uma noção do todo, vamos reunir as regras de nossa


gramática até agora no quadro 4.1 a seguir 5.

5A única modificação em relação ao que vimos até agora foi que ampliamos a classe
dos verbos (amam, pega, pegam, lê, leem).

67
Quadro 4.1: Primeira versão de nossa gramática

S à SN SV
SN à N
SN à Det N
SN à Det Mod N
SN à Det N Mod
SN à Det Mod N Mod
SN à Mod N Mod
SN à Mod N
SN à N Mod
SV à V SN
Det à det-base
Det à pré-det det-base
Det à pré-det det-base pós-det
Det à det-base pós-det

V à ama, amam, pega, pegam, lê, leem


N à João, Maria, amigos, meninos, livros,
pré-det à todos
det-base à os, as, estes
pós-det à meus, cinco, dois

Sem entrar em maiores detalhes de programação em Prolog,


podemos dizer, com base na gramática acima, que já conseguimos
reconhecer as seguintes frases, entre outras:

(4.8) O João tem dois amigos.


(4.9) Todos os meus amigos têm estes livros.
(4.10) Os meninos leem livros.
(4.11) Estes meninos leem livros.

Além de poder reconhecê-las como frases gramaticais da língua,


nosso analisador também já é capaz de atribuir a elas sua devida
estrutura de constituintes, aqui representada através de colchetes
rotulados. Veja só:

68
(4.10a) S [ SN [O João]
B B B B B
SV [tem SN [dois
B B B amigos]]] 6 TP PT

(4.11a) S [ SN Todos os meus amigos]


B B B B B
SV [têm SN [estes
B B B livros]]]

(4.12a) S [ SN Os meninos]
B B B B B
SV [leem SN [livros]]]
B B B

(4.13a) S [ SN Estes meninos]


B B B B B
SV [leem SN [livros]]]
B B B

Além disso, nosso pequeno parser já consegue descartar as frases


(4.14) e (4.15), claramente agramaticais:

(4.14) *Os estes meninos leem livros.


(4.15) *Dois os meninos amam a Maria.

Legal, né? Então, agora vem uma parte ainda melhor: um


exercício! Tente passar a gramática que apresentamos no quadro 4.1
acima para a notação Prolog (letras minúsculas, vírgulas, pontos finais,
flechinhas do tipo --> etc.). Depois de ter feito isso, escreva um programa
e dê a ele o nome de gram01.swi. Por fim, carregue-o no Prolog e teste
algumas frases (veja a nossa gramática, gram.txt, para dar uma
“coladinha”!).

Se o leitor fez o exercício proposto acima, percebeu que a


gramática já está ficando boa. No entanto, a frase (4.16) não será
reconhecida por nosso parser. Por quê?

(4.16) Estes meus cinco amigos amam a Maria.

6 Para facilitar a visualização, estamos mostrando uma representação da estrutura de


TP PT

constituintes relativamente simples, apontando unicamente a classe dos sintagmas. É


o que Othero & Gasperin (a sair) chamam de skeleton parsing. No entanto, nosso parser
a esta altura já teria condições de proceder com uma representação de full parsing (cf.
Othero e Gasperin, novamente), identificando até mesmo os níveis dos itens lexicais:
S [ SN [ det-base [O] N [João]] SV [ V [tem] [ SN [ pós-det [dois] N [amigos]]]].
B B B B B B B B B B B B B B B B B B

69
O atento leitor deve ter notado que há algo errado com o primeiro
SN da frase (4.16). Ou melhor, na verdade não há nada errado com esse
SN, há algo errado na gramática de nosso parser: de acordo com a nossa
gramática, não conseguimos reconhecer a regra que permita gerar o SN
visto em (4.16).

O problema é que há ali a seguinte estrutura: SN à det-base pós-


det N ( SN [ det-base [Estes]
B B B B B
pós-det [meus] pós-det [cinco] N [amigos]),
B B B B B que não é
reconhecida pelo nosso pequeno analisador gramatical.

Uma solução aparente poderia ser incluir em nossa gramática uma


regra que permita a realização desse tipo de estrutura na língua,
aumentando o número de regras que dizem respeito à boa formação dos
SNs. Essa nova regra garantiria a validade da frase (4.16) atribuindo
corretamente a estrutura (4.16a) a essa sentença.

(4.16a) S [[ SN [Estes meus cinco amigos]


B B B B B
SV [amam
B [ SN [a Maria]]]
B B

No entanto, as seguintes frases também seriam consideradas


gramaticais, com base nessa mesma regra:

(4.17) *Estes meus meus amigos amam a Maria.


(4.18) *Estes dois cinco amigos amam a Maria.

Há aí um problema, porém, não trataremos dele aqui. Isso apenas


serve para que o leitor já possa ter uma pequena ideia do que quisemos
dizer com “implementar regras gramaticais a partir de problemas
encontrados em regras consagradas na literatura pertinente”. Além desse
ínfimo detalhe da ordem dos determinantes no SN, veremos que ainda
temos muitas limitações na nossa primeira gramática esboçada no
quadro 4.1.

Um grande problema, por exemplo, diz respeito à concordância


verbal e nominal. Não há nada em nossa gramática que descarte as frases

70
(4.19), (4.20) e (4.21), todas elas agramaticais na língua portuguesa,
devido a erros no sistema de concordância verbal, nominal ou ambas:

(4.19) *Os meninos lê livros.


(4.20) *Os João tem dois amigo.
(4.21) *Todos o meus amigo tem este livros.

Teremos de resolver esses problemas alterando as regras


sintagmáticas para que elas possam levar em conta elementos como a
concordância verbal e nominal. Apesar de muitas obras na literatura
linguística não mencionarem o assunto da concordância na descrição de
regras sintagmáticas do português, encontramos propostas interessantes
em obras de Linguística Computacional voltadas para o desenvolvimento
de parsers sintáticos, como Beardon, Lumsden & Holmes (1991),
Covington (1994), Dougherty (1994), Othero (2004) e Pagani (2004). No
capítulo seguinte, iremos apresentar uma gramática inicial implemen-
tada em Prolog e descrever, passo a passo, o seu funcionamento.

4.2. Sobre o léxico

Além desses problemas sintáticos que analisamos na seção


anterior, há ainda um problema de outra ordem. Por que este pequeno
parser que estamos desenvolvendo aceita a frase (4.22), mas não aceita as
sentenças (4.23) e (4.24)?

(4.22) O meu amigo tem cinco livros.


(4.23) O meu amigo tem cinco gramáticas.
(4.24) O meu amigo tem cinco revistas.

Aparentemente as três frases deveriam ser aceitas pelas regras


gramaticais já inscritas em nossa gramática. Afinal, as sentenças (4.23) e

71
(4.24) são idênticas à (4.22), no que diz respeito a suas estruturas
sintáticas. Veja só:

(4.22a) S [SN [det-base pós-det N] SV [V [SN [pós-det N]]]


(4.23a) S [SN [det-base pós-det N] SV [V [SN [pós-det N]]]
(4.24a) S [SN [det-base pós-det N] SV [V [SN [pós-det N]]]

O que faz então com que o parser não as reconheça como sentenças
gramaticais da língua? A resposta é muito simples: o léxico. Para nosso
reconhecedor gramatical, as palavras “gramáticas” e “revistas” não
querem dizer nada. Como essas palavras não estão na sua base de dados,
ele simplesmente não as reconhece e faz com que o programa não
consiga processar a análise das sentenças desejadas. Dê mais uma olhada
no quadro 4.1, que contém a gramática desenvolvida até aqui. (…)

Evidentemente, o pequeno parser que desenvolveremos aqui


servirá apenas de amostra para que o leitor entenda o funcionamento da
implementação de gramáticas sintagmáticas em Prolog. Se desejássemos
desenvolver um parser realmente robusto, teríamos de implementar um
léxico realmente grande 7.

Antes de prosseguirmos, vale ainda tratar de mais um ponto. Uma


questão bastante importante de que o leitor provavelmente ainda não
tenha se dado conta é a seguinte: da mesma forma como as frases (4.23) e
(4.24) não foram reconhecidas como frases gramaticais pela nossa
gramática por conterem palavras desconhecidas à lista de itens lexicais
do programa, também a sentença (4.25) seria tida como agramatical, ao
passo que (4.26) seria considerada perfeitamente gramatical:

(4.25) O menino ama a Maria.


(4.26) Os meninos amam a Maria.

7Veja em Othero (2004) como foi implementado um léxico considerável no parser


Grammar Play.

72
Pasmem, linguistas desprevenidos: para nosso parser há oito
diferentes palavras nas frases (4.25) e (4.26): o, os, menino, meninos, ama,
amam, a, Maria. Isso quer dizer que teremos de implementar no léxico de
nosso programa quatro entradas para cada determinante, substantivo ou
adjetivo: duas para flexão de gênero (o, a, menino, menina, bonito, bonita) e
duas para flexão de número (o, os, menino, meninos, bonito, bonitos) 8. E o
que dizer dos verbos? Cada forma verbal infinitiva corresponde a
aproximadamente 59 diferentes “palavras” (entre as formas verbais dos
modos indicativo, subjuntivo e imperativo)!

Sabemos o que o leitor deve estar imaginando agora —


especialmente aquele nosso leitor sem conhecimento computacional:
“será que não há alguma maneira de o computador conjugar
automaticamente todos os verbos? Será que não há como desenvolver um
programa para flexionar os substantivos, os adjetivos e os
determinantes?”.

A resposta é “Sim, há como fazer isso”. No entanto, acreditamos


que desenvolver um parser morfossintático ou mesmo um conjugador
automático de verbos fuja ao escopo de nosso trabalho. Por isso, neste
livro de introdução à Linguística Computacional, estudaremos apenas a
implementação de regras sintáticas em Prolog 9 . No próximo capítulo,
TP PT

faremos uma aplicação do que vimos estudando e implementaremos uma


pequena gramática em Prolog.

8 Algumas palavras, no entanto, não sofrem flexão de gênero ou número, como por
exemplo, três (pré-det sem flexão de gênero e número), ônibus (N sem flexão de gênero
e número), inteligente (Adj sem flexão de gênero) etc.
9 Sobre parsers morfológicos e morfossintáticos, dê uma olhada em Cole et al. (1997),
TP PT

Dougherty (1994), Garside, Leech & McEnery (1997), Vieira & Lima (2001), e também
no site do NILC (www.nilc.icmc.usp.br/nilc/index.html). Além disso, em
www.flip.pt, o leitor irá encontrar os programas Wordbreaker e Stemmer, que lidam
com a estrutura morfológica de palavras do português, e em www.linguateca.pt, há
inúmeros links para ferramentas linguísticas que lidam com a morfologia do
português. Ao término da leitura deste livro, dê uma olhada nessas referências.

73
5. NOSSA GRAMÁTICA

Como dissemos anteriormente, seguimos de perto as propostas de


Othero (2004) e Pagani (2004) para organizar a gramática que aqui
apresentamos. O leitor irá encontrar essa gramática na página da Editora
(www.parabolaeditorial.com.br). O nome do arquivo é gram.swi, para
ser aberto em Prolog, e gram.txt, que pode ser aberto mais facilmente em
um editor de textos. Sinta-se à vontade para carregar esta gramática no
Prolog e testar algumas frases com ela1. Para testar a gramática, dê dois
cliques sobre o arquivo gram.swi, entre no ambiente Prolog e digite
s([a,menina,corre])., por exemplo, e tecle enter. Siga sempre este modelo:
s([palavra1,palavra2,…,palavraN]). e então enter.

% Inicialização do analisador
s(S) :- s(EC, S, []),
write('Estrutura de constituintes: '),
write(EC), nl.

%%%%%%%%%%%%%%%%%%%%%%%%
% Regras sintagmáticas %
%%%%%%%%%%%%%%%%%%%%%%%%

%Sentença (S)
1 s([sn, SN, sv, SV]) --> sn([_,Num], SN), sv(Num, SV).
2 s([sv, SV, sn, SN]) --> sv(Num, SV), sn([_,Num], SN).
3 s([sv, SVimp]) --> svimp(_, SVimp).

% Sintagmas Nominais (SN)


4 sn(Conc, [Det, N]) --> det(Conc, Det), n(Conc, N).
5 sn(Conc, N) --> n(Conc, N).

1 Esta pequena gramática tem apenas a pretensão de exemplificar, através de uma


aplicação, alguns dos conhecimentos que estudamos ao longo da leitura. Para uma
gramática mais consistente em Prolog, remetemos o leitor a Othero (2004).
% Sintagmas Verbais (SV)
6 sv(Num, V) --> v(Num, i, V).
7 sv(Num, [V, sn, [SN]]) --> v(Num, td, V), sn(_, SN).
8 sv(Num, [V, sp, [SP]]) --> v(Num, ti(P), V), sp(P, SP).
9 sv(Num, [V, sn, [SN], sp, [SP]]) --> v(Num, tdi(P), V),
sn(_, SN), sp(P, SP).
10 svimp(Num, Vimp) --> vimp(Num, i, Vimp).

% Sintagmas Preposicionais (SP)


11 sp(Lex, [P, N]) --> p(Lex, Conc, P), n(Conc, N).

%%%%%%%%%%%%%%%%%%%
% Regras lexicais %
%%%%%%%%%%%%%%%%%%%

12 det(Conc, Det) --> [Det], {det(Conc, Det)}.


13 n(Conc, N) --> [N], {n(Conc, N)}.
14 v(Num, Val, V) --> [V], {v(Num, Val, V)}.
15 vimp(Num, Val, Vimp) --> [Vimp], {vimp(Num, Val, Vimp)}.
16 p(Lex, Conc, P) --> [P], {p(Lex, Conc, P)}.

%%%%%%%%%%
% Léxico %
%%%%%%%%%%

% Determinantes (det)
17 det([masc, sing], o).
18 det([fem, sing], a).
19 det([masc, plur], os).
20 det([fem, plur], as).
21 det([masc, sing], um).
22 det([fem, sing], uma).
23 det([masc, plur], uns).
24 det([fem, plur], umas).
25 det([masc, sing], este).
26 det([fem, sing], esta).
27 det([masc, plur], estes).
28 det([fem, plur], estas).
29 det([masc, sing], esse).
30 det([fem, sing], essa).
31 det([masc, plur], esses).
32 det([fem, plur], essas).
33 det([masc, sing], aquele).
34 det([fem, sing], aquela).
35 det([masc, plur], aqueles).
36 det([fem, plur], aquelas).

% Substantivos (N)
37 n([masc, sing], brinquedo).
38 n([masc, plur], brinquedos).
39 n([fem, sing], estante).
40 n([fem, plur], estantes).
41 n([masc, sing], homem).
42 n([masc, plur], homens).
43 n([masc, sing], joão).
44 n([masc, sing], livro).
45 n([masc, plur], livros).

75
46 n([fem, sing], maria).
47 n([masc, sing], menino).
48 n([fem, sing], menina).
49 n([masc, plur], meninos).
50 n([fem, plur], meninas).
51 n([fem, sing], mulher).
52 n([fem, plur], mulheres).
53 n([fem, sing], sintaxe).

% Verbos (V)
54 v(sing, i, corre).
55 v(plur, i, correm).
56 v(sing, td, ama).
57 v(plur, td, amam).
58 v(sing, ti(de), gosta).
59 v(plur, ti(de), gostam).
60 v(sing, tdi(em), coloca).
61 v(plur, tdi(em), colocam).
62 vimp(sing, i, chove).

% Preposições (P)
63 p(com, inf, com).
64 p(de, [_,_], de).
65 p(de, [masc,sing], do).
66 p(de, [fem, sing], da).
67 p(de, [masc, plur], dos).
68 p(de, [fem, plur], das).
69 p(em, [_,_], em).
70 p(em, [masc, sing], no).
71 p(em, [fem, sing], na).
72 p(em, [masc, plur], nos).
73 p(em, [fem, plur], nas).

Vamos agora tentar entender o funcionamento dessa gramática. A


regra (1) expressa o seguinte:

(1) s([sn, SN, sv, SV]) --> sn([_,Num], SN), sv(Num, SV).

(a) (b) (c)

(a) A S é formada por um SN e um SV

(b) O SN apresenta dois valores: um valor qualquer a ser


especificado (expresso pelo _ ) e um valor que diz
respeito ao número (representado pela variável Num).

76
(c) O SV também apresenta a variável Num, que deve
unificar seu valor com o valor da variável Num do SN.
Ou seja, para que a S seja gramatical, o SN e o SV devem
concordar em relação a essa variável, isto é, em relação
ao número. Essa relação logo ficará mais clara, quando
analisarmos o léxico. É lá que os valores sing e plur estão
especificados para cada item lexical.

A regra (2) de formação de sentenças foi implementada exatamente


como a regra (1), porém com a ordem dos constituintes invertida:

(2) s([sv, SV, sn, SN]) --> sv(Num, SV), sn([_,Num], SN).

Essa regra dá conta de sentenças que não estão na ordem direta do


português, ou melhor, que estão com a ordem VS — verbo, sujeito. Esse
segundo tipo de sentença apresenta primeiro o SV e depois um SN
sujeito, e uma sentença com essa estrutura pode ser chamada de
sentença marcada. Mesmo que essa regra de inversão do sujeito seja
bastante restrita em PB, decidimos adotá-la em nossa gramática, nem que
seja a título de maior exemplificação 2.

Já vimos que, para que a sentença seja bem formada em português,


é necessário que o SN sujeito concorde em número com o núcleo do SV,
não importando se o sujeito esteja anteposto ou posposto ao verbo
(claramente, estamos deixando de lado a concordância pessoal. Quer
dizer, para uma sentença ser gramatical em português, o verbo deve
concordar em número e pessoa com seu sujeito. Contudo, como já vimos,
nossa pequena gramática irá apenas reconhecer a flexão verbal na
terceira pessoa do singular e do plural).

2Cf. Naro & Votre (1999) para saber mais sobre sentenças marcadas em português
brasileiro.

77
Já a regra (3) dá conta das frases compostas por uma oração sem
sujeito:

(3) s([sv, SVimp]) --> svimp(_, SVimp).

Essa regra consegue analisar sentenças como (5.1) e barrar


sentenças como (5.2):

(5.1) Chove.

(5.2) *O João chove.

Note, porém, que a regra (3) não diz respeito a qualquer SV. A
única maneira de encontrarmos uma oração sem sujeito será se o SV for
do tipo SVimp, ou seja, um SV com um verbo impessoal 3.

Vejamos agora o tratamento dado aos sintagmas. As regras (4) e (5)


dizem respeito aos sintagmas nominais:

(4) sn(Conc, [Det, N]) --> det(Conc, Det), n(Conc, N).

(a) (b)

(5) sn(Conc, N) --> n(Conc, N).

A regra (4) diz que um SN

(a) apresenta uma variável Conc (que será a variável de


número e gênero, como veremos adiante) e é formado por
determinante (det) seguido de um N.

3 Seguimos aqui a proposta de Othero (2004: 176-178).

78
(b) o determinante e o N devem apresentar o mesmo valor
para a variável Conc.

A regra (5) mostra que, além de o SN poder ser formado por um


det e por um N, como vimos na regra (4), ele também pode ser formado
apenas por um N (ou seja: SN à N).

O N é um substantivo, ou seja, um nó terminal. A variável Conc


deve ter o mesmo valor tanto para o N quanto para o SN. Veremos que o
valor dessa variável faz parte da informação lexical de cada palavra
contida no léxico do programa. A recorrência da variável nas várias
vezes em que é representada faz com que esse valor percole os nós,
desde o item lexical até a sua projeção máxima, o sintagma, através de
um recurso de unificação de variáveis, aparecendo até na regra mais alta
de todas, a da sentença.

Para entendermos um pouco melhor esse procedimento,


avancemos um pouco mais, antes de passarmos à análise dos próximos
sintagmas, e vejamos a regra lexical que trata do N, a regra (13):

(13) n(Conc, N) --> [N], {n(Conc, N)}.

Essa regra lexical (assim como as demais regras deste tipo) permite
que o programa insira um item lexical do dicionário logo abaixo do nó
terminal N. Essa inserção deve ser sensível à variável que acompanha
cada item lexical. Para ficar mais clara essa relação, vejamos as regras
(39), (40), (41) e (42), que fazem parte do dicionário do programa:

(39) n([fem, sing], estante).

(40) n([fem, plur], estantes).

(41) n([masc, sing], homem).

(42) n([masc, plur], homens).

79
As regras de inserção lexical permitem adicionar um item do
conjunto lexical da base de dados do programa abaixo de um nó
terminal. Ou seja, um N como estante irá abaixo de um nó terminal N. A
variável Conc garante que os valores de gênero e número acompanhem o
item lexical, e forçam a concordância entre determinante e substantivo,
por exemplo.

Passemos agora ao tratamento do sintagma verbal. Propusemos


cinco regras para o SV:

(6) sv(Num, V) --> v(Num, i, V).

(7) sv(Num, [V, sn, [SN]]) --> v(Num, td, V), sn(_, SN).

(8) sv(Num, [V, sp, [SP]]) --> v(Num, ti(P), V), sp(P, SP).

(9) sv(Num, [V, sn, [SN], sp, [SP]]) --> v(Num, tdi(P), V),
sn(_, SN), sp(P, SP).

(10) svimp(Num, Vimp) --> vimp(Num, i, Vimp)

Poderíamos traduzir facilmente essas regras para regras de


reescrita “convencionais”, utilizadas por sintaticistas (com exceção da
última, que, como vimos foge um pouco do padrão):

(6’) SV à V

(7’) SV à V SN

(8’) SV à V SP

(9’) SV à V SN SP

Para lidar com a subcategorização verbal, introduzimos o valor


valência (Val) aos verbos, obtendo uma maneira eficiente de tratar o

80
fenômeno 4. Se analisarmos a regra (14) e (15), de inserção lexical dos
verbos e dos verbos impessoais, poderemos ver que a valência é
especificada ali:

(14) v(Num, Val, V) --> [V], {v(Num, Val, V)}.

(15) vimp(Num, Val, Vimp) --> [Vimp], {vimp(Num, Val, Vimp)}.

A variável Val dá conta da transitividade verbal. Os verbos podem


ser transitivos diretos (vtd), transitivos indiretos (vti), bitransitivos
(vtdi), ou intransitivos (vi) . Essa informação deve constar na descrição
TPT

de cada verbo, no dicionário do programa.

De maneira sucinta, podemos dizer que as regras de (6) a (10)


sobre os SVs dizem que:

(6) Um SV pode ser um verbo intransitivo.

(7) Um SV pode ser um verbo transitivo seguido por um SN.

(8) Um SV pode ser um verbo transitivo indireto seguido por um


SP.

(9) Um SV pode ser um verbo bitransitivo seguido por um SN e


por um SP.

(10) Um SV pode ser do tipo Vimp, ou seja, apresentar um verbo


impessoal (que não tenha sujeito) e, além disso, ser
intransitivo.

É interessante notarmos que cada verbo transitivo indireto deve


ser seguido por um SP com uma preposição específica. Ou seja, olhando

4Adotamos essa estratégia com base em Pagani (2004: 16) e Pereira & Shieber (1987:
86).

81
as regras (58) a (61), percebemos que tanto eles como os verbos
bitransitivos trazem consigo, na informação lexical, exatamente qual a
preposição que regem:

(58) v(sing, ti(de), gosta).

(60) v(sing, tdi(em), coloca).

Para entender bem esse recurso funciona, veja o quadro 5.1:

Quadro 5.1: Regência verbal

. Regra do SV com verbo transitivo indireto:

(8) sv(Num, [V, sp, SP]) --> v(Num, ti(P), V), sp(P, SP) .

. Informação lexical:
(58) v(sing, ti(de), gosta).

. O SV da regra (8) está pedindo um verbo (V) seguido de um sintagma


preposicional (SP). Esse verbo deve (i) apresentar um valor para a variável
Num; (ii) ser do tipo ti; (iii) apresentar um item lexical que unifique com a
variável P; e (iv) apresentar um item lexical que unifique com a variável V.

. Lembre-se de que as variáveis são sempre expressas por letras maiúsculas.

. Processo de unificação de variáveis:


(8) sv(Num, [V, sp, [SP]]) --> v(Num, ti(P), V), sp(P, SP).

(58) v(sing, ti(de), gosta).

. Veja que as informações lexicais contêm a preposição adequada para cada


verbo, e a variável P na regra do SV irá fazer com que essa preposição seja
usada somente junto com seu respectivo verbo.

82
A regra (58) diz que gosta é um verbo no singular (sing),
transitivo indireto (ti), que rege um complemento com a preposição de.

Graças a esse recurso, a gramática barra sentenças como (5.3) e


(5.4), autorizando apenas (5.5) e (5.6):

(5.3) *Os homens gostam em Maria.

(5.4) *As mulheres colocam os livros de estantes.

(5.5) Os homens gostam de Maria.

(5.6) As mulheres colocam os livros em estantes.

Vimos então as estratégias utilizadas para a regência verbal e


subcategorização dos verbos. Para a concordância verbal, utilizamos a
variável Num, que permite que o verbo concorde com o seu sujeito. Essa
variável encontra o valor no item lexical (sing ou plur), e esse valor
percola os nós na árvore até chegar à primeira regra que vimos, a da
sentença (regra (1)). Lá, ela deve unificar com o valor do item lexical do
N (sing ou plur), que também percolou os nós, partindo do item lexical
listado no dicionário do programa, indo até a regra de formação da
sentença.

Para a implementação dos sintagmas preposicionais, utilizamos


uma interessante proposta apresentada por Pagani (2004) 5. Acompanhe a
regra (11):

(11) sp(Lex, [P, N]) --> p(Lex, Conc, P), n(Conc, N).

5Fizemos, no entanto, algumas simplificações. Para ver a proposta de Pagani, cf.


Pagani (2004: 17-21).

83
Note que também a preposição apresenta uma variável Conc, de
concordância, em casos de preposições que sofrem aglutinação com o
determinante.

Veja as regras de preposições (64) a (68):

(64) p(de, [_,_], de).

(65) p(de, [masc,sing], do).

(66) p(de, [fem, sing], da).

(67) p(de, [masc, plur], dos).

(68) p(de, [fem, plur], das).

Há cinco diferentes regras para apenas uma preposição. Todas elas


lidam com uma preposição “flexionável”. A regra (64) garante a
preposição “de” sem flexão alguma, já que apresenta a seguinte
subcategorização [_,_]. Devemos ler essa informação como “há dois
valores quaisquer aqui que simplesmente não importam!”. Já as regras
seguintes são bem mais específicas para cada preposição. Cada uma
dessas preposições poderá aparecer somente no contexto especificado
por seus valores, e devem efetuar a concordância com o substantivo com
o qual concordam:

• do = masculino, singular (amigas do João / *amigas do Maria)

• da = feminino, singular (amigas da Maria / *amigas da João)

• dos = masculino, plural (amigas dos meninos / *amigas dos


João)

• das = feminino, plural (amigas das meninas / *amigas das João)

Com isso, chegamos ao fim de nossas explicações sobre a pequena


gramática que apresentamos aqui. Tente carregá-la em seu computador e

84
teste-a tantas vezes quanto necessário. Aumente seu léxico e suas regras
gramaticais e descubra algumas dificuldades de implementação que não
abordamos aqui.

Lembre-se de que para testar este pequeno parser sintático no


Prolog é preciso escrever a frase com uma formatação bem específica (e
bem chata também). Veja os exemplos:

Para testar a sentença… Devemos escrever em Prolog…

Chove. s([chove]).

O João ama sintaxe. s([o,joão,ama,sintaxe]).

A Maria gosta do João. s([a,maria,gosta,do,joão]).

Etc. s([etc]).

Veja duas consultas que realizamos, a primeira com uma sentença


gramatical (O João ama sintaxe) e a segunda com uma sentença
agramatical (O sintaxe João ama).

Quadro 5.2: Testando nosso pequeno parser

% c:/Prolog/gram.swi compiled 0.00 sec, 13,768 bytes

Welcome to SWI-Prolog (Version 4.0.7)


Copyright (c) 1990-2000 University of Amsterdam.
Copy policy: GPL-2 (see www.gnu.org)

For help, use ?- help(Topic). or ?- apropos(Word).

?- s([o,joão,ama,sintaxe]).
Estrutura de constituintes: [sn, [o, joão], sv, [ama, sn, [sintaxe]]]

Yes
?- s([o,sintaxe,joão,ama]).

No

85
6. PALAVRAS FINAIS

Este livro pretendeu apresentar a ciência que une conhecimentos


da área da Informática e da Linguística (Teórica e Aplicada). Além de
uma apresentação geral, tentamos mostrar de maneira prática como
desenvolver um aplicativo computacional voltado para o tratamento da
linguagem natural e, com base nesse último objetivo, estudamos um
pouco sobre a linguagem Prolog e vimos como desenvolver um
reconhecedor gramatical (ou parser), através da implementação de uma
gramática nessa linguagem.

Ao término desta obra, temos basicamente duas expectativas em


relação ao leitor: (i) que tenha conseguido implementar uma primeira
versão da gramática que apresentamos aqui e possa, a partir de agora,
desenvolver novas e melhores versões dessa gramática, explorando cada
vez mais o Prolog; e (ii) que tenha conseguido acompanhar o ritmo do
texto e possa partir em busca de novos conhecimentos na área da
Linguística Computacional com base no que aprendeu durante a leitura.

Como vimos, há inúmeros outros tipos de aplicações que um


linguista pode vir a desenvolver trabalhando na área da Linguística
Computacional. Talvez os mais interessantes sejam programas de
interação humano x computador. Como a Persephone, que imaginamos
lá pela introdução do livro. Cabe ao linguista utilizar seus
conhecimentos e também a sua imaginação, para ajudar no
desenvolvimento de programas que sejam capazes de “dominar” a
linguagem de maneira cada vez mais eficiente e — por que não? — cada
vez mais humana.
REFERÊNCIAS BIBLIOGRÁFICAS

ALMEIDA, Sheila et al. Selva: a new syntactic parser for Portuguese.


Proceedings of 6th Workshop on Computational Processing of the Portuguese
Language - Written and Spoken (PROPOR 2003). Vol. 2721. Springer-Verlag
Heidelberg, 2003.

BEARDON, Colin; LUMSDEN, David; HOLMES, Geoff. Natural language


and Computational Linguistics: an introduction. London: Ellis Horwood,
1991.

BERBER SARDINHA, Tony. Linguística de corpus: histórico e


problemática. Revista D.E.L.T.A., Vol. 16, N. 2, 2000a.
[www.scielo.br/delta].

BERBER SARDINHA, Tony. O que é um corpus representativo?. LAEL


PUCSP, 2000b. [lael.pucsp.br/direct].

BICK, Eckhard. Automatic parsing of Portuguese. In: GARCÍA, Laura


Sánchez (Ed.). Anais do II Encontro para o Processamento Computacional de
Português Escrito e Falado. Curitiba: CEFET-PR. 1996.

BICK, Eckhard. The parsing system Palavras — automatic grammatical


analysis of Portuguese in a constraint grammar framework. Aarhus: Aarhus
University Press, 2000. Tese de Doutorado.

BORBA, Francisco da Silva. Pequeno vocabulário de linguística moderna. São


Paulo: Companhia Editora Nacional, 1976.

BORSLEY, Robert. Syntactic theory: a unified approach. London: Oxford


University Press, 1999.

87
BRATKO, Ivan. Prolog programming for artificial intelligence. Harlow:
Addison-Wesley, 1997.

BURGIERMAN, Denis Russo. Inteligência artificial. Revista


Superinteressante, 166, 2001.

CARVALHO, Paulo Sérgio de. Interação entre humanos e computadores -


uma introdução. São Paulo: EDUC, 2000.

CHOMSKY, Noam. Aspectos de la teoría de la sintaxis. Madrid: Aguilar,


1971a.

CHOMSKY, Noam. A linguagem e a mente. In: LEMLE, Miriam et al.


(Orgs). Novas perspectivas linguísticas. Petrópolis: Vozes, 1971b.

CHOMSKY, Noam. Linguística cartesiana. Petrópolis: Vozes, 1972.

CHOMSKY, Noam. Linguagem e Pensamento. Petrópolis: Vozes, 1973.

CHOMSKY, Noam. Estruturas sintáticas. Lisboa: 70, 1980.

CLOCKSIN, W. F.; MELLISH, C. S. Programming in Prolog. Berlin:


Springer, 1987.

COLE, R. A. et al. (eds.). Survey of the state of the art in human language
technology. Cambridge: Cambridge University Press / Giardini, 1997.
[www.dfki.de/~hansu/HLT-Survey.pdf].

COVINGTON Michael. A. Natural language processing for Prolog


programmers. New Jersey: Prentice Hall, 1994.

DEL NERO, Henrique Schützer. O sítio da mente: pensamento, emoção e


vontade no cérebro humano. São Paulo: Collegium Cognitio, 1997.

DOUGHERTY, Ray C. Natural language computing: an English generative


grammar in Prolog. Hillsdale: Lawrence Erlbaum, 1994.

DUBOIS, Jean et al. Dicionário de linguística. São Paulo: Cultrix, 1988.

88
GARSIDE, Roger; LEECH, Geoffrey; McENERY, Anthony. Corpus
annotation: linguistic information from computer text corpora. London / New
York: Longman, 1997.

GAZDAR, Gerald; MELLISH, Chris. Natural language processing in Prolog:


an introduction to computational linguistics. Addison-Wesley:
Workingham, 1989.

GRISHAM, Ralph. Computational linguistics: an introduction. Cambridge:


Cambridge University Press, 1992.

HACKER, P. M. S. Wittgenstein. Sobre a natureza humana. São Paulo:


UNESP, 2000.

HAWKING, Stephen. Nosso futuro: Jornada nas Estrelas? - Como a vida


biológica e eletrônica continuarão evoluindo em complexidade a um
ritmo sempre crescente. In: HAWKING, Stephen. O universo numa casca
de noz. São Paulo: Mandarim, 2001.

HECKLER, Evaldo; BACK, Sebald. Curso de linguística. São Leopoldo:


Unisinos, 1988.

HODGES, Andrew. Turing: um filósofo da natureza. São Paulo: UNESP.


2001.

KELLY III, C. W. Can machine think? KurzweilAI.net, 2001.


[www.kurzweilai.net/meme/frame.html?main=/articles/art0214.html].

LEMLE, Miriam. Análise sintática: teoria geral e descrição do português. São


Paulo: Ática, 1984.

LU, James; MEAD, Jerud J. Prolog: a tutorial introduction. Computer


Science Department, Bucknell University, [s.d.]
[www.inf.pucrs.br/~flavio/].

LUCENA, Rodolfo. Robôs invadem salas de bate-papo. Folha de S. Paulo.


14/04/1999.

89
LUFT, Celso Pedro. Moderna gramática brasileira. Porto Alegre; Rio de
Janeiro: Globo, 1986.

MARTINS, Agenor. O que é computador. São Paulo: Brasiliense, 1991.

MATEUS, Maria Helena Mira; XAVIER, Maria Francisca (Orgs).


Dicionário de termos linguísticos. Lisboa: Edições Cosmos, 1992.

McDONALD, Carlton; YAZDANI, Masoud. Prolog programming: a tutorial


introduction. Oxford: Blackwell Scientific Publications, 1990.

NARO, Anthony; VOTRE, Sebastião. Discourse motivations for linguistic


regularities: verb-subject order in spoken Brazilian Portuguese. Probus
11, 1999.

NIVETTE, Joseph. Princípios de gramática gerativa. São Paulo: Pioneira,


1975.

OTHERO, Gabriel de Ávila. Linguística Computacional: uma nova área


de pesquisa para os estudantes de Letras. Entrelinhas, ano 2, n. 5, julho.
São Leopoldo: UNISINOS, 2002.

OTHERO, Gabriel de Ávila. Grammar Play: um parser sintático em Prolog


para a língua portuguesa. Porto Alegre: PUCRS, 2004. Dissertação de
Mestrado.

OTHERO, Gabriel de Ávila; GASPERIN, Caroline Varaschin. Linguista x


computador - trabalhando com corpus eletrônico, (a sair).

PAGANI, Luiz Arthur. Analisador gramatical em Prolog para gramáticas


de estrutura sintagmática. Revista Virtual de Estudos da Linguagem —
ReVEL, ano 2, n. 3, 2004. [www.revelhp.cjb.net].

PEREIRA, Fernando; SHIEBER, Stuart M. Prolog and natural-language


analysis. Stanford: CSLI, 1987.

PEREIRA, F.; WARREN, D. Definite clause grammars for language

90
analysis: a survey of the formalism and a comparison with augmented
transition networks. Artificial Intelligence, n. 13, 1980.

PEREIRA, Robson. Cybelle, a chatterbot brasileira. Estado de São Paulo.


03/05/2001.

PERINI, Mário. Sintaxe portuguesa: metodologia e funções. São Paulo: Ática,


1989.

PERINI, Mário. Gramática descritiva do português. São Paulo: Ática, 2000.

RADFORD, Andrew. Transformational syntax: a student’s guide to


Chomsky’s extended standard theory. Cambridge: Cambridge University
Press, 1981.

USZKOREIT, Hans. Language technology: a first overview [s.d.]


[www.dfki.de/%7Ehansu/LT.pdf].

VIEIRA, R. Linguística computacional: fazendo uso do conhecimento da


língua. Entrelinhas, ano 2, n. 4, São Leopoldo: UNISINOS, 2002.

VIEIRA, R.; LIMA, V. L. S. Linguística computacional: princípios e


aplicações. In: IX Escola de Informática da SBC-Sul. Passo Fundo, Maringá,
São José. SBC-Sul, 2001.

91
GLOSSÁRIO

Este breve glossário tem como objetivo facilitar a leitura deste


livro. Aqui, o leitor irá encontrar alguns termos-chave que foram
abordados ao longo do texto. Sabemos, entretanto, que, por tratar-se de
um mero glossário, as definições que apresentamos aqui podem ser por
vezes incompletas ou mesmo simplistas. No entanto, esperamos que elas
sejam capazes de ilustrar melhor alguns conceitos e esclarecer
momentaneamente as suas dúvidas.

• Á RVORES S INTÁTICAS , E STRUTURAS DE : são representações da sentença


através de diagramas hierárquicos que, de certa forma, lembram
árvores (pelo menos as árvores genealógicas). A estrutura arbórea da
sentença O João ama a Maria, por exemplo, é a seguinte:

SN SV

Det N V SN

Det N

O João ama a Maria

• CHATTERBOT : os chatterbots são programas desenvolvidos para


interagir com usuários humanos através de diálogos em linguagem

92
natural, na modalidade escrita. Seu nome vem da junção de duas
palavras inglesas: chat (conversar) e bot (abreviação de robot, robô). O
primeiro chatterbot a ser construído foi ELIZA 1 , TP PT programa
desenvolvido por Joseph Weinzenbaum, no MIT, em 1966. No Brasil,
a primeira chatterbot foi Cybelle 2 , desenvolvida por Alex Primo e
TP PT

Luciano Coelho, em 1999. Veja abaixo um breve histórico do


desenvolvimento desse tipo de programa 3:
o 1950: o filósofo e matemático inglês Alan Turing apresenta
seu teste (conhecido hoje como o T ESTE DE T URING ), usado
para avaliar a inteligência de um computador que
supostamente deveria conversar com um interlocutor
humano
o 1956: o termo “I NTELIGÊNCIA A RTIFICIAL ” é usado pela
primeira vez, por Marvin Minsky e John McCarthy
o 1959: Minsky e McCarthy fundam o laboratório de
Inteligência Artificial do MIT (Massachusetts Institute of
Technology)
o 1966: Joseph Weizenbaum cria, no MIT, o primeiro
chatterbot, chamado de Eliza
o 1968: é lançado o filme de Stanley Kubrick e Arthur C.
Clarke, 2001 — uma Odisseia no Espaço, em que aparece o
computador inteligente HAL
o 1971: desenvolvido por Kenneth Colby, aparece o chatterbot
Perry, que imita um esquizofrênico
o 1991: é realizada a primeira edição do P RÊMIO L OEBNER
o 1995: um dos mais famosos chatterbots, o Alice 4
TP PT é
desenvolvido por Richard Wallace
o 1998: a empresa de softwares Neuromedia lança o programa
Neurostudio, específico para criar chatterbots comerciais

1
TPwww-ai.ijs.si/eliza/eliza.html.
PT

2
TPhttp://cybelle.cjb.net/.
PT

3 Cronologia baseada em Lucena (1999).


4 www.alicebot.org.
TP PT

93
o 1999: é lançado o primeiro chatterbot em língua portuguesa, a
Cybelle
o 2001: o filme A.I. — Inteligência Artificial, de Steven
Spielberg, chega às telas, apresentando novas dimensões de
robôs inteligentes e levantando questões éticas sobre até que
ponto a vida artificial pode chegar

• C OLCHETES R OTULADOS , E STRUTURA DE : essa estrutura é a preferida


por linguistas computacionais para representar a estrutura de
constituintes de uma sentença de linguagem natural. Ela apresenta as
mesmas relações que podem ser expressas em uma representação
arbórea da sentença, ou Á RVORE S INTÁTICA . A representação da
sentença O João ama a Maria, através de colchetes rotulados é a
seguinte: S [
B B B
SN [O
B João] B
SV [ama SN [a
B B B Maria]]].

• C OMPETÊNCIA : é o conhecimento natural, inato e interiorizado que


todo o falante tem de sua língua nativa. Proposto por Chomsky, esse
conceito tem relação direta com o D ESEMPENHO linguístico do falante.

• C ORPUS E LETRÔNICO : de acordo com Othero & Gasperin (a sair), um


corpus eletrônico é “uma amostra natural e espontânea de uma língua
— ou variedade dela — que esteja em uma forma processável pelo
computador”. Ver também L INGUÍSTICA DE C ORPUS .

• D EFINITE C LAUSE G RAMMAR (DCG): é um formalismo computacional


que permite ao linguista programar regras sintáticas em P ROLOG de
maneira semelhante à notação tradicionalmente utilizada para a
descrição de regras de reescrita ou PS rules. Um trabalho pioneiro
com DCGs em Prolog foi apresentado por Pereira & Warren (1980).

94
• D ESEMPENHO : é o uso da C OMPETÊNCIA do falante em situações
discursivas concretas. Também é chamado de atuação ou performance.
Por desempenho, entendemos o uso real da linguagem, em situações
concretas de comunicação.

• D OMINÂNCIA : de acordo com Borsley (1999: 248), podemos dizer que


“um nó X domina um nó Y se e somente se houver um caminho
puramente descendente através da árvore de X para Y”.

• D OMINÂNCIA I MEDIATA : a dominância imediata acontece quando um


nó domina o outro imediatamente, ou seja, o nó dominado é filho do
dominador. No exemplo abaixo, o nó A domina B, C, D e E, mas
domina imediatamente apenas os nós B e C:

B C

D E

• E STRUTURA A RBÓREA : ver Á RVORE S INTÁTICA .

• E STRUTURA P ROFUNDA : a estrutura profunda pode ser entendida como


“um construto abstrato que postulamos para dar conta de certas
propriedades sintáticas que as sentenças têm” (Radford, 1981: 175;
grifos do autor). .

• E STRUTURA S UPERFICIAL : a estrutura superficial (ou de superfície) é a


representação da sentença pronta para ser usada na comunicação,
depois de ter passado por certas transformações.

95
• G RAMÁTICA : referindo-se estritamente ao contexto deste livro,
podemos definir gramática como o conjunto formalizado de regras
sintáticas que possibilitam um P ARSER reconhecer as sentenças de
uma língua natural (cf. L INGUAGEM N ATURAL ) e atribuir a elas uma
E STRUTURA S INTAGMÁTICA , representada através de Á RVORES
S INTÁTICAS ou C OLCHETES R OTULADOS .

• HCI: Human Computer Interaction, ou Interação Humano-Computador,


é a área preocupada em estudar a interação entre homens e máquinas.
De acordo com Carvalho (2000: 35), essa disciplina preocupa-se em
“projetar, avaliar e implementar sistemas computacionais interativos
para uso humano, estudando os principais fenômenos aí envolvidos”.

• I NTELIGÊNCIA A RTIFICIAL (IA): grosso modo, podemos defini-la como


sendo a área de estudo que tem como objetivo conseguir simular
computacionalmente a inteligência humana. Aqui nos preocupamos
principalmente com a interface entre Inteligência Artificial e
L INGUÍSTICA C OMPUTACIONAL , ou seja, com a simulação do
conhecimento linguístico humano em máquinas.

• L INGUAGEM DE P ROGRAMAÇÃO : são linguagens artificiais


computacionais. Elas servem de interface para o especialista em
programação computacional — ou programador — interagir com o
computador. Há diversos tipos de linguagens de programação. Um
critério bastante utilizado para classificar essas linguagens diz
respeito à sua similaridade com as linguagens naturais (cf.
L INGUAGEM N ATURAL ): “de acordo com esse critério, as linguagens
podem ser classificadas em quatro classes: 1. Linguagens de baixo
nível; 2. Linguagens de alto nível; 3. Linguagens de muito alto nível; e
4. Linguagens de altíssimo nível (…)” (Martins, 1991: 32). As
linguagens de baixo nível (como o Assembly) são mais próximas da

96
linguagem binária do computador, enquanto que as linguagens de
mais alto nível (como o LISP e o P ROLOG ) têm mais semelhanças com
as linguagens naturais e por isso são também mais acessíveis aos
programadores humanos.

• L INGUAGEM N ATURAL : uma linguagem (ou língua) natural é um


“sistema de comunicação verbal que se desenvolve espontaneamente
no interior de uma comunidade” (Mateus & Xavier, 1992: 714). São
exemplos de línguas naturais o português, o inglês, o alemão, o
francês, o latim etc. Há por outro lado as línguas artificiais (criadas
por diferentes estudiosos, ao longo dos anos, e que seguem um
padrão ou lógica de funcionamento previsível e pré-estabelecido por
seu criador), como o esperanto, o volapuque, o timério etc. E por fim,
podemos destacar as linguagens artificiais computacionais, também
chamadas de linguagens de programação (cf. L INGUAGEM DE

P ROGRAMAÇÃO ), como o P ROLOG , o Basic, o Pascal etc.

• L INGUÍSTICA C OMPUTACIONAL : é a área da ciência Linguística


preocupada com o tratamento computacional da linguagem e das
línguas naturais (cf. L INGUAGEM N ATURAL ). Ela pode ser dividida em
duas linhas de pesquisa distintas: a L INGUÍSTICA DE C ORPUS e o
P ROCESSAMENTO DA L INGUAGEM N ATURAL .

• L INGUÍSTICA DE C ORPUS : é a parte da L INGUÍSTICA C OMPUTACIONAL


que se preocupa em estudar diferentes fenômenos das línguas com
base em corpora eletrônicos (cf. C ORPUS E LETRÔNICO ). De acordo com
Berber Sardinha (2000b: 2), ela “se ocupa da coleta e exploração de
corpora, ou conjuntos de dados linguísticos textuais que foram
coletados criteriosamente com o propósito de servirem para a
pesquisa de uma língua ou variedade linguística”.

97
• P ARSER : os parsers são programas de computador capazes de
classificar morfossintaticamente as palavras e expressões de sentenças
em L INGUAGEM N ATURAL e atribuir a elas sua E STRUTURA
S INTAGMÁTICA .

• P ARSING : de acordo com Mateus & Xavier (1992: 886), parsing é o


“processo de atribuição de uma estrutura e de uma interpretação a
uma sequência linguística”. No entanto, no contexto da L INGUÍSTICA
C OMPUTACIONAL , podemos definir o parsing como sendo a
interpretação automática (ou semiautomática) de sentenças de
linguagem natural por programas de computador conhecidos como
P ARSERS .

• P RECEDÊNCIA : a relação de precedência diz respeito à posição linear


dos nós na estrutura arbórea: dizemos que um nó precede o outro se
ele estiver à esquerda desse outro nó e entre eles não houver relação de
dominância. Na representação abaixo, o nó B precede o nó C.

B C

• P RÊMIO L OEBNER : o Prêmio Loebner 5 é uma competição entre


TP PT

CHATTERBOTS , que foi criada em 1991 por Hugh Loebner, um


filantropo norte-americano. O prêmio é realizado anualmente na
Universidade de Cambridge. Nesta competição, os CHATTERBOTS
são testados com base no T ESTE DE T URING .

5
TP PT www.loebner.net.

98
• P ROCESSAMENTO DE L INGUAGEM N ATURAL (PLN): é a área da
L INGUÍSTICA C OMPUTACIONAL que se preocupa diretamente com o
estudo da linguagem voltado para a construção de softwares e
sistemas computacionais específicos, como T RADUTORES
AUTOMÁTICOS, CHATTERBOTS, P ARSERS , reconhecedores
automáticos de voz etc. Cabe à área de PLN a desenvolver programas
que sejam capazes de processar (leia-se compreender e produzir)
informações em L INGUAGEM N ATURAL . Esses programas podem
envolver diferentes áreas da Linguística, como a fonologia, a fonética,
a semântica, a sintaxe, a pragmática etc.

• P ROLOG : é uma linguagem de programação declarativa baseada na


lógica. Seu nome vem de PROgramming in LOGic (programando em
lógica). Ele foi desenvolvido por Alain Colmerauer, na França, em
1975, e tem se tornado bastante popular entre pesquisadores de
L INGUÍSTICA C OMPUTACIONAL e I NTELIGÊNCIA A RTIFICIAL , já que foi
planejado desde o princípio para o trabalho de processamento de
línguas naturais e desenvolvimento de P ARSERS automáticos.

• R ECONHECIMENTO DE F ALA : programas que lidam com o


reconhecimento de fala são responsáveis por reconhecer a voz do
usuário humano. Isso torna possível, por exemplo, que um telefone
celular disque para uma pessoa ao “ouvir” o nome dela; que um
usuário possa ditar um texto para que um programa digite-o em um
processador de textos; que robôs (ou máquinas e eletrodomésticos em
geral, como carros, geladeiras e fornos de micro-ondas) possam
obedecer a comandos de voz de humanos etc.

• R EGRAS S INTAGMÁTICAS : as regras sintagmáticas são responsáveis


pela organização e geração dos constituintes. Uma regra sintagmática
gera uma determinada estrutura e nos diz como formar ou produzir

99
essa estrutura. Um exemplo de regra sintagmática é o seguinte: S à
SN SV. Ou seja, uma sentença (S) é composta por um Sintagma
Nominal (SN) e um Sintagma Verbal (SV). A partir dessa regra
sintagmática, é possível gerar uma estrutura arbórea (cf. Á RVORE
S INTÁTICA ) como esta:

SN SV

• S ÍNTESE DE F ALA : conhecido em inglês por speech synthesis, essa área


preocupa-se em tornar possível a produção de fala pelo computador.
Por isso, estudos em fonética, fonologia, dialetologia, prosódia e
entonação são muito importantes para o desenvolvimento de
aplicações em Síntese de Fala. De acordo com Uszkoreit (s.d.: 3), em
sistemas envolvendo a Síntese de Fala, “expressões em língua falada
são produzidas a partir de textos (sistemas texto-para-fala) ou a partir
de representações de palavras ou sentenças (sistemas de conceitos-
para-fala)”.
• S ISTEMAS DE D IÁLOGO EM L ÍNGUA F ALADA : ou spoken dialogue systems,
em inglês. São sistemas inteligentes que podem interagir com um
usuário humano através de conversação em língua falada. Serão
provavelmente o próximo passo na cadeia evolutiva dos
CHATTERBOTS. Uma das mais famosas máquinas que apresentam
este sistema de diálogos inteligentes é provavelmente o computador
HAL, do filme de Arthur C. Clarke e Stanley Kubrick, 2001 — Uma
odisseia no espaço (Estados Unidos, 1968).

• T ESTE DE T URING : o que conhecemos hoje como o Teste de Turing foi


proposto pelo filósofo e matemático inglês Alan Turing em 1950, em
seu artigo “Computing Machinery and Intelligence” (Mind, 51).

100
Turing chamou-o de “jogo de imitação”. No teste, um juiz humano
deve comunicar-se com dois interlocutores (uma máquina e um outro
humano). Através de perguntas e respostas, o juiz terá de decidir
quem é a máquina e quem é o humano (ou ainda se os dois são
máquinas, ou se os dois interlocutores são humanos). O objetivo
principal deste teste é definir a própria I NTELIGÊNCIA A RTIFICIAL : “se
uma máquina não pode ser distinta de um ser humano nestas
condições, então devemos atribuir a ela uma inteligência humana”
(Hodges, 2001: 45). O Teste de Turing é ainda hoje considerado como
parâmetro para avaliação de certos programas de I NTELIGÊNCIA
A RTIFICIAL (cf. CHATTERBOT e P RÊMIO L OEBNER ) e até mesmo como a
própria definição do conceito de I NTELIGÊNCIA A RTIFICIAL (cf.
Burgierman, 2001 e Lucena, 1999), apesar das críticas feitas pelo
filósofo norte-americano Searle (cf. Kelly III). Para saber mais sobre o
Teste de Turing, recomendamos a página
http://cogsci.ucsd.edu/~asay gin/tt/ttest.html.

• T RADUTOR A UTOMÁTICO : são programas que se encarregam da


tradução automática de textos e de sentenças de uma língua para
outra, ou outras. Os programas de tradução automática estão entre os
primeiros desenvolvimentos e objetos de estudo da Linguística
Computacional. Podemos dividir esta classe de programas em (a)
gerenciadores de terminologia; (b) ferramentas de tradução
automática; e (c) tradutores automáticos auxiliares à tradução
humana (do inglês Machine Assisted Human Translation). O primeiro
tipo de programas é especificamente planejado para auxiliar na
tradução de textos técnicos de determinada área, e seu vocabulário
pode ficar restrito aos termos técnicos e jargões dessa área. Já as
ferramentas de tradução automática são as mais conhecidas: elas são
softwares destinados à tradução automática de documentos quaisquer,
sem qualquer restrição na escolha do léxico, gênero ou assunto do
texto e também sem qualquer interferência ou ajuda de um tradutor

101
humano. O desejo de desenvolver tradutores abrangentes e robustos
assim foi a principal causa do grande impulso dado às pesquisas
envolvendo traduções automáticas nas décadas durante a Guerra Fria.
Mesmo que o objetivo até hoje não tenha sido alcançado, e os
resultados estejam muito aquém daqueles imaginados, muito
progresso já foi feito nesta área. Por último, encontramos programas
que auxiliam o tradutor humano na tradução de um texto. Esses
tradutores não primam pela perfeição ou acabamento do texto final
traduzido, mas almejam auxiliar o usuário a traduzir grandes
quantidades de texto. Acredita-se que o uso de tais programas pode
ajudar um tradutor humano a reduzir em 50% o tempo total gasto no
trabalho de tradução e cerca de 15-30% no custo total com a tradução 6.

6 Cf. www.languagepartners.com/reference-center/whitepapers/catinto.htm.

102
NA PONTA DA LÍNGUA
1. Estrangeirismos — guerras em torno da língua, Carlos Alberto Faraco [org.]
2. Língua materna — letramento, variação e ensino
Marcos Bagno, Michael Stubbs & Gilles Gagné
3. História concisa da linguística, Barbara Weedwood
4. Sociolinguística — uma introdução crítica, Louis-Jean Calvet
5. História concisa da escrita, Charles Higounet
6. Para entender a linguística — epistemologia elementar de uma disciplina,
Robert Martin
7. Introdução aos estudos culturais, Armand Mattelart & Érik Neveu
8. A pragmática, Françoise Armengaud
9. História concisa da semiótica, Anne Hénault
10. A semântica, Irène Tamba
11. Linguística computacional — teoria & prática
Gabriel de Ávila Othero & Sérgio de Moura Menuzzi
12. Linguística histórica — uma introdução ao estudo da história das línguas,
Carlos Alberto Faraco
13. Lutar com palavras — coesão e coerência, Irandé Antunes
14. Análise do discurso — história e práticas, Francine Mazière
15. Mas o que é mesmo “gramática”?, Carlos Franchi
16. Análise da conversação: princípios e métodos, Catherine Kerbrat-Orecchioni
17. As políticas linguísticas, Louis-Jean Calvet
18. Práticas de letramento no ensino: leitura, escrita e discurso
Carlos Alberto Faraco, Maria do Rosário Gregolin, Gilvan Müller de
Oliveira, Telma Gimenez & Luiz Carlos Travaglia
19. Relevância social da linguística: linguagem, teoria e ensino
Luiz Percival Leme Britto, Marcos Bagno, Neiva Maria Jung, Esméria de
Lourdes Saveli & Maria Marta Furlanetto
20. Todo mundo devia escrever, Georges Picard
21. A argumentação, Christian Plantin
22. Tradição oral & tradição escrita, Louis-Jean Calvet
23. Tradução — história, teorias e métodos, Michaël Oustinoff
24. Gramática de bolso do português brasileiro, Marcos Bagno
25. Cinco ensaios sobre humor e análise do discurso, Sírio Possenti

Você também pode gostar