Processamento de
Linguagem Natural
Ilson Wilmar Rodrigues Filho, Dr.
http://www.inf.ufsc.br/~ilson
[email protected]
João Bosco da Mota Alves, Dr.
[email protected]
Bibliografia
BARROS, F. A.; ROBIN, J. – Processamento de Linguagem Natural.
Departamento de Informática, Universidade Federal de Pernambuco,
Recife, março de 1997.
FERNANDO, P.; MENEZES, B. – Linguagens Formais e Autômatos.
Porto Alegre: Instituto de Informática da UFRGS: Sagra Luzzatto Editores,
1997.
GAL, A.; LAPALME, G. – Prolog for Natural Language Processing. John
Wiley & Sons Ltd., 1991.
GAZDAR, G.; MELLISH, C. – Natural Language in Prolog. AddisonWeslwy Publishing Company, 1989,
JOSÉ NETO, J. – Introdução à Compilação. Rio de Janeiro. LTC – Livros
Técnicos e Científicos Editora S. A., 1987.
Bibliografia
MONARD, M. C. & NICOLETTI, M. do C. – Programas Prolog para
Processamento de Listas e Aplicações, Janeiro de 1993 – Versão 2.0
MOREIRA, N. – Processamento de Linguagem Natural, Mestrado de
Lingüística Portuguesa Descritiva, Faculdade de Letras da Universidade
do Porto
NUNES, M. das G. V. at al. – Introdução ao Processamento das Línguas
Naturais. São Carlos: Notas Didáticas do ICMC No. 38, Instituto de
Ciências Matemáticas e de Computação, 1999.
PINERO, R. B. – Lenguajes Formales y Autómatas. Centro de
Inteligencia Artificial, Instituto Tecnológico y de Estudios Superiores de
Monterrey. Enero de 1997.
TOWSEND, C. – Técnicas Avançadas em Turbo Prolog, Rio de Janeiro:
Editora Campus, 1990.
Avaliação
Exercícios para serem resolvidos individualmente e um
trabalho (que pode ser feito em grupo) que deve ser
entregue no dia da apresentação (seminário).
Média Final = N1 x 0.4 + N2 x 0.3 + N3 x 0.3
onde:
N1 = Média Aritmética dos exercícios
N2 = Nota do Trabalho
N3 = Nota da Apresentação do trabalho (seminário)
Processamento de Linguagem
Natural
O processamento de linguagem natural
é o estudo dos sistemas
computacionais para compreensão e
geração de línguas naturais faladas e
escritas.
Divisões do PLN
• lingüística computacional ou
processamento de linguagem natural:
tratamento da língua escrita.
• reconhecimento e síntese de voz: tratamento
da língua falada.
Outras Denominações
 Processamento
de Linguagem Natural:
Inteligência Artificial
 Lingüística Computacional: Lingüística
 Outros termos propostos: Processamento
Computacional das Línguas, Engenharia da
Linguagem. Especificamente para a língua
portuguesa tem sido sugerido: Processamento
Computacional do Português,
Processamento Computacional da Língua
Portuguesa.
Histórico
 PLN
nasceu com o computador:
 2a Guerra: militares americanos tinham
interesse de traduzir automaticamente
conversações gravadas dos russos;
 A comunidade científica precisava de
traduções de trabalhos estrangeiros - a cada
dia fazia-se novas descobertas científicas.
Tradução Automática
 A possibilidade
de fazer tradução
automática de publicações sobre tecnologia
e ciência deixou os cientistas animados.
Essa foi uma das razões para que
pesquisas fossem financiadas na área.
Primeiros Sistemas de PLN
 Primeiros
trabalhos sobre PLN:
 tradução automática - começaram em
1946. Eram trabalhos sobre tradução
russo-inglês.
 tradução palavra por palavra;
 traduções: listas de palavras
chaves.
Histórico
1948: Preocupação com as regras de
construção de frases foi levada em
consideração (num trabalho do inglês
Pichens).
 Primeiro congresso sobre tradução
automática foi realizado no ano de 1952,
nos EUA, no MIT – Massachusetts Institute
of Technology com a participação de 18
pesquisadores.

O Relatório ALPAC

Relatório ALPAC (Automatic Language
Processing Advisory Comitee) - relatório
encomendado pelo governo norteamericano à Academia de Ciências daquele
país sobre as pesquisas em tradução
automática. O relatório publicado em 1966
teve um teor fortemente negativo que
provocou o corte das verbas de
financiamento
Renascimento do Interesse na
Tradução Automática

Anos 80: renascimento do interesse na
tradução automática, na Europa, em função
da criação da Comunidade Européia.
 1982: projeto EUROTRA - sistema de
tradução automática para nove línguas
de países que constituíam a Comunidade
Européia.
Modelos Conceituais
Modelos formais ou modelos
baseados em regras;
 Modelos estatísticos;
 Modelos conexionistas

Áreas de Aplicação de técnicas
de PLN
(1) Acesso a banco de dados;
(2) Recuperação de informação;
(3) Extração de informação;
(4) Tradução automática;
(5) Geração de resumos.
Acesso a Banco de Dados
 Acesso
a banco de dados são feitos
usualmente utilizando-se “query languages”
Recuperação de Informação
Recuperação de Informação é o estudo e
desenvolvimento de técnicas que permitam
encontrar documentos relevantes de uma
coleção de documentos.

Recuperação de Informação
Extração de Informação
Na extração de informação procura-se por
informações diretamente nos textos ,
mostrando a informação ao invés de
documentos.
 Técnicas utilizadas: baseadas na busca de
determinadas palavras chaves (denominadas de
tags), tais como
- Nome de pessoas
- Nome de empresas;

Tradução Automática

Tradução automática é a tradução por
computador de frases dadas numa língua para
outra língua.

Os primeiros trabalhos utilizavam
dicionários bilingües e faziam tradução
palavra a palavra.
A teoria lingüística começou a ser incorporada
nos sistemas de tradução automática com os
trabalhos de Noam Chomsky.

Gramática
 Segundo Chomsky, o conhecimento que o falante de
uma língua natural teria da mesma poderia ser
descrita através de um conjunto finito de regras.
 Tais regras seriam universais, ou seja, valeriam
para todas as línguas. Elas poderiam gerar um
número infinito de frase de uma língua.
 Uma frase seria gramatical (pertencente à língua)
ou agramatical (não pertencente à língua).
Problemas em Processamento
de Linguagem Natural

Homonímia Lexical: um exemplo clássico
é: manga = parte de uma peça de vestuário
destinada a cobrir os braços / manga = fruto
da mangueira
Problemas em Processamento
de Linguagem Natural

Ambigüidade sintática: a sentença aceita
duas análises sintáticas diferentes. Exemplo:
Viajando pela primeira vez para a
Europa, cruzei com um grupo de jovens
brasileiros.
Quem viajou pela primeira vez? Eu ou o
grupo de jovens brasileiros?
Problemas em Processamento
de Linguagem Natural
 Ambigüidade de Escopo: Percebe-se às vezes que a
sentença indica dois ou mais escopos. Exemplos:
Apesar de ser exímio advogado, o procurador da
Universidade não cumpre todas as disposições
estatutárias.
Essa sentença poderia significar que:
- O procurador descumpre todas as disposições (Descumpre todas = tem por norma violar a legislação)
 O procurador cumpre as disposições, mas não todas
(não tem por norma violar a legislação, mas comete
falhas).
Problemas em Processamento
de Linguagem Natural

Diferentes correferências possíveis: é a
compatibilidade de um anafórico com dois
ou mais antecedentes distintos, também
chamada de ambigüidade anafórica.
Exemplo: O ladrão entrou na casa do prefeito
e tirou toda a sua roupa.
Conhecimento do Mundo
 A compreensão da linguagem natural implica num
determinado grau de conhecimento do mundo.
Exemplo: "as mães com filhos menores de dez anos".
Tal expressão poderia er as seguintes representações
lógicas:
1. {x | З y, M(x,y) ^ i(y) < 10};
2. {x | З y, M(x,y) ^ i(x) < 10};
3. {x | З (y,z), M(x,y) ^ M(x,z) ^ i(y) < 10} ^ i(x) < 10}
onde: M(x,y) significa x é mãe de y;
i(x) significa idade de x;
i(y) significa idade de y.
Fases do Desenvolvimento de
um Sistema de PLN
(1) Análise morfológica;
(2) Análise Sintática;
(3) Análise Semântica;
(4) Análise do Discurso;
(5) Análise Pragmática.
Análise Morfológica

É o estudo da estrutura e da classificação
das palavras em função do uso:
substantivos
artigos
adjetivos
pronomes
verbos
numerais
advérbios
preposições
conjunção
interjeição
Regras morfológicas
 As línguas naturais possuem regras morfológicas
que produzem as possíveis variantes de cada
palavra. Exemplo:
construir tem como variantes, entre outras,
construção e construído.
Um pedaço da palavra (constru) se repete nas
demais, que receberam a aposição do que
chamamos de sufixos. Este pedaço de palavra que
se mantém nas variantes, chamamos de lexemas.
Análise Sintática

É o estudo das unidades básicas da
linguagem - as sentenças.

Na fase da análise sintática, o sistema de
processamento de linguagem natural
verifica se a seqüência das palavras nas
sentenças são válidas para a gramática
utilizada.
Análise Semântica

Durante a análise semântica, utiliza-se a estrutura
gerada durante a análise sintática para construir
outras estruturas que representem o significado das
sentenças.

Formalismos utilizados nesta fase do
processamento de linguagem natural podem ser
classificados em fracos e fortes:
 Formalismos fracos: redes semânticas e
frames;
 Formalismos fortes: gramáticas de
casos, dependência conceitual e scripts.
Análise do Discurso

Análise do discurso é a identificação da
estrutura do discurso. O discurso é também
organizado em unidades constituídas por um
mais elementos denominados segmentos do
discurso.
Análise Pragmática

Na análise pragmática são estudados os
enunciados, ou seja, os significados das
frases, sob o ponto de vista dos
interlocutores. Esta análise é de suma
importância principalmente nos diálogos
onde é preciso determinar as intenções dos
interlocutores.
Fundamentos Matemáticos
para o Processamento de
Linguagem Natural
Conjuntos
 Conjunto é uma coleção de objetos, distintos, de
qualquer espécie (definição intuitiva).
 Aos objetos do conjunto
denominamos elementos do conjunto.
 Os elementos do conjunto
distinguem-se uns dos outros, ou
seja, não há repetição de
elementos no conjunto.
Relação de Pertinência entre
Elemento e Conjunto
 Vamos supor o conjunto das vogais::
V = {a,e,i,o,u}
 Para indicar que u pertence ao conjunto V e
que b não pertence, escrevemos:
u  V
b  V
Relação de Pertinência entre
Elemento e Conjunto
 Em Prolog, vamos utilizar listas:
V = [a,e,i,o,u]
pertence(u,[a,e,i,o,u]).
not(pertence(b,[a,e,i,o,u]).
Listas
 Uma lista em Prolog é uma coleção de elementos
separados por vírgulas e dentro de colchetes. O
primeiro elemento da lista é denominado cabeça de
lista e os demais elementos formam uma lista
denominada cauda da lista.
A Relação pertence/2
 a relação pertence/2 pode ser estabelecida
através de duas regras:
(1) Um objeto pertence a uma lista se ele for
a cabeça da lista;
(2) Um objeto pertence a uma lista se ele
pertence à cauda da lista.
pertence/2 em Visual Prolog
Domains
stringlist = string*
Predicates
nondeterm pertence(string,stringlist)
Clauses
pertence(X,[X|_]).
pertence(X,[_|T]):pertence(X,T).
pertence/2 - Exemplos
 Goal pertence(u,[a,e,i,o,u]).
yes
 Goal not(pertence(b,[a,e,i,o,u])).
yes
pertence/2 - Exemplos
 Se quisermos saber quais os objetos de um
dado conjunto (por exemplo: [a,e,i,o,u]),
perguntaríamos em Prolog:
Goal pertence(X,[a,e,i,o,u]).
X=a
X=e
X=i
X=o
X=u
5 Solutions
Conjunto Vazio
 Um conjunto sem objetos, denominado
conjunto vazio, é denotado por {} ou .
Para utilização de Prolog vamos representar
o conjunto vazio por [], ou seja,
 = []
Subconjunto
 Um dado conjunto A é subconjunto de B
se e somente se todo elemento de A
pertence também a B, que se representa
como:
A  B
e dizemos que o conjunto A está contido no
conjunto B, ou ainda que B contém A:
B  A
Subconjunto
em Prolog, teremos:
esta_contido(A,B).
contem(B,A).
esta_contido/2
Domains
stringlist = string*
Predicates
nondeterm esta_contido(stringlist,stringlist
nondeterm pertence(string,stringlist)
Clauses
esta_contido([],_).
esta_contido([H1|T1],L2):pertence(H1,L2),
esta_contido(T1,L2).
esta_contido/2 - Exemplos
Goal esta_contido([],[c,b,a]).
yes
Goal esta_contido([a,b],[c,b,a]).
yes
Goal esta_contido([a,b],[b,a]).
yes
Goal esta_contido([b,a],[c,b,a]).
yes
contem/2
Domains
stringlist = string*
Predicates
nondeterm contem(stringlist,stringlist)
nondeterm esta_contido(stringlist,stringlist)
Clauses
contem(B,A):esta_contido(A,B).
contem/2 - Exemplos
Goal contem([a,b],[]).
yes
Goal A = [a], B = [a,e,i,o,u],
contem(B,A).
A = [a]
B = [a,e,i,o,u]
yes
eh_subconjunto/2
 Para verificar se um conjunto A é subconjunto de um
conjunto B podemos criar o predicado
eh_subconjunto/2, que responda sim ou não (yes/no)
caso A seja subconjunto ou não de B. Basta utilizar
uma das relações definidas (esta_contido/2 ou
contem/2)
Igualdade de Conjuntos
 Dois conjuntos A e B são iguais quando
qualquer elemento que pertence a A
pertence também a B e vice-versa (todo
elemento que pertence a B pertence também
a A), isto é: A = B, se, e somente se,
A  B e B  A.
igual/2
Predicates
nondeterm igual(stringlist,stringlist)
Clauses
igual(A,B):esta_contido(A,B),
esta_contido(B,A).
igual/2 - Exemplos
Goal A = [a,b,c], B = [b,c,a],
igual(A,B).
A = [a,b,c]
B = [b,c,a]
1 Solution
Goal igual([a,b,c],[b,a,c]).
yes
OBS: Note-se pelos exemplos acima que a ordem dos
elementos dentro do conjunto não importa. Dados dois
conjuntos, se eles tiverem os mesmos objetos, eles são
considerados iguais.
Conjunto Potência
 Seja A um conjunto. Definimos como
conjunto potência de A ou conjunto das
partes de A, ao conjunto cujos elementos
são os subconjuntos de A. Sua denotação é:
2A. Assim:
2A = {S | S  A}
subconjunto/2
 Para definir em Prolog um predicado que
dê todos os subconjuntos de um conjunto
dado formando o seu conjunto potência,
vamos definir um predicado que gere
subconjuntos que vamos denominar de
subconjunto/2.
subconjunto/2 - regras
1 - Se A é um conjunto vazio ele só pode gerar um
conjunto vazio B;
2 - Se o primeiro elemento do conjunto A estiver
também no subconjunto B (vamos colocá-lo na
cabeça de B, pois como não importa a ordem dos
elementos de um conjunto vamos escolher esta
ordem preferencialmente), então a cauda de B é
subconjunto da cauda de A;
3 - Se o primeiro elemento do conjunto A não está no
subconjunto gerado B, então B é um subconjunto da
cauda de A.
subconjunto/2 - regras
 Esta três regras são escritas da seguinte maneira
em Prolog:
(1) subconjunto([],[]).
(2) subconjunto([CabecaA|CaudaA],[CabecaA|CaudaB]):subconjunto(CaudaA,CaudaB).
(3) subconjunto([_|CaudaA],ConjuntoB):subconjunto(CaudaA,ConjuntoB).
subconjunto/2 - regras em
Visual Prolog
Predicates
nondeterm subconjunto(stringlist,stringlist)
Clauses
subconjunto([],[]).
subconjunto([CabecaA|CaudaA],[CabecaA|CaudaB]):subconjunto(CaudaA,CaudaB).
subconjunto([_|CaudaA],ConjuntoB):subconjunto(CaudaA,ConjuntoB).
subconjunto/2 - Exemplo
Goal subconjunto([a,s,d],SUB).
SUB = [a,s,d] ;
SUB = [a,s] ;
SUB = [a,d] ;
SUB = [a] ;
SUB = [s,d] ;
SUB = [s] ;
SUB = [d] ;
SUB = '[]' ;
8 Solutions
Conjunto Potência
 O conjunto potência que é o conjunto formado por
todos os subconjuntos de um dado conjunto poderá ser
agora definido como:
Domains
stringlist = string*
llstring = stringlist*
Predicates
nondeterm potencia(stringlist,llstring)
Clauses
potencia([],[[]]).
potencia(A,P):findall(X,subconj(A,X),P).
Conjunto Potência - Exemplo
Goal potencia([a,s,d],P).
P = [[a,s,d],[a,s],[a,d],[a],[s,d],[s],[d],'[]']
1 Solution
Número de Elementos do
Conjunto Potência
 O número de elementos do conjunto das
partes de um conjunto (ou conjunto
potência) de n elementos é 2n.
 Se A tiver 3 elementos, o conjunto das
partes de A terá 23 = 8 elementos.
Exercício
 Determinar
em Visual Prolog o
tamanho do conjunto potência
definindo o predicado tamanho/2
Solução
Predicates
tamanho(llstring,integer)
Clauses
tamanho([],0).
tamanho([_|Cauda],TAM):tamanho(Cauda,TamCauda),
TAM = TamCauda + 1.
Operações com Conjuntos

Com conjuntos pode-se executar
algumas operações básicas tais como:
união;
intersecção;
diferença..
União de Conjuntos

Dados dois conjuntos A e B, a união
destes conjuntos, é o conjunto formado
com todos os elementos que pertencem
a A ou a B.
 A união
é representada por:
A  B
União de Conjuntos - Regras
1. A união de um conjunto vazio com um conjunto
qualquer A é o próprio conjunto A;
2. Dados dois conjuntos A e B, se a cabeça de A também
pertence a B a união de A com B será igual à união da cauda de
A com B pois como a cabeça de A também pertence a B, este
elemento aparecerá no conjunto formada pela união de B com a
cauda de A;
3. Se a cabeça de A não pertencer a B o conjunto união terá
como cabeça a cabeça de A e como cauda a união da cauda de
A como o conjunto B.
Exercício
 Construir
em Prolog as regras que
definem a união de dois conjuntos
Solução
Predicates
nondeterm uniao(stringlist,stringlist,stringlist).
Clauses
uniao([],C,C).
uniao([CabecaA|CaudaA],ConjuntoB,ConjuntoUniao):pertence(CabecaA,ConjuntoB),!,
uniao(CaudaA,ConjuntoB,ConjuntoUniao).
uniao([CabecaA|CaudaA],ConjuntoB,[CabecaA|CaudaUniao]):not(pertence(CabecaA,ConjuntoB)),
uniao(CaudaA,ConjuntoB,CaudaUniao).
União de Conjuntos - Exemplos
Goal uniao(["3","5","7"],["1","2","4","6"],UNIAO).
UNIAO = ["3","5","7","1","2","4","6"]
1 Solution
Goal uniao(["1","2","3"],["2","3","4","5"],U).
U = ["1,"2","3","4","5"]
i Solution
Intersecção de Conjuntos
 Dados dois conjuntos A e B, a intersecção
de A e B é o conjunto formado com os
elementos que pertencem a ambos ao
mesmo tempo. A intersecção é indicada por:
A  B
Intersecção de Conjuntos Regras
1. A interseção de um conjunto vazio com um
conjunto qualquer, é um conjunto vazio;
2. Dados dois conjuntos A e B, se a cabeça de A
também pertencer a B, o conjunto interseção
também terá como cabeça, a mesma cabeça de A, e
a sua cauda será formada pela interseção da cauda
de A com o conjunto B;
3. Se a cabeça do conjunto A não pertence ao
conjunto B, então, o conjunto interseção será obtido
pela interseção da cauda de A com o conjunto B.
Exercício

Construir em Prolog, as regras que
determinam a intersecção de
conjuntos.
Solução
Domains
stringlist = string*
Predicates
nondeterm intersecao(stringlist,stringlist,stringlist)
Clauses
intersecao([],_,[]).
intersecao([Cabeca_A|Cauda_A],Conjunto_B,[Cabeca_A|Cauda_Intersecao]):pertence(Cabeca_A,Conjunto_B),!,
intersecao(Cauda_A,Conjunto_B,Cauda_Intersecao).
intersecao([Cabeca_A|Cauda_A],Conjunto_B,Intersecao):not(pertence(Cabeca_A,Conjunto_B)),
intersecao(Cauda_A,Conjunto_B,Intersecao).
Diferença de Conjuntos
 Dados dois conjuntos A e B, denomina-se
diferença A - B ao conjunto formado pelos
elementos de A menos os elementos que
pertencem ao mesmo tempo a A e a B.
 Sejam A = {a,b,c,d,e} e B = {a,e,i,o,u}.
A - B = {b,c,d}.
Diferença de Conjuntos
Regras
1. A diferença entre um conjunto vazio e um conjunto
qualquer, é um conjunto vazio;
2. Dados dois conjuntos quaisquer A e B, se a cabeça de
A não pertencer a B, o conjunto diferença também terá
como cabeça, a mesma cabeça de A, e a sua cauda será
formada pela diferença entre a cauda de A com o
conjunto B;
3. Se a cabeça do conjunto A pertencer também ao
conjunto B, então, o conjunto diferença será obtido pela
diferença da cauda de A com o conjunto B (porque este
elemento será eliminado não fazendo parte do conjunto
diferença).
Exercício
 Construir
em Prolog as regras que
definem a diferença de dois
conjuntos
Solução
Predicates
nondeterm diferenca(stringlist,stringlist,stringlist)
Clauses
diferenca([],_,[]).
diferenca([Cabeca_A|Cauda_A],Conjunto_B,[Cabeca_A|Cauda_Diferenca]):not(pertence(Cabeca_A,Conjunto_B)),
diferenca(Cauda_A,Conjunto_B,Cauda_Diferenca).
diferenca([Cabeca_A|Cauda_A],Conjunto_B,Diferenca):pertence(Cabeca_A,Conjunto_B),
diferenca(Cauda_A,Conjunto_B,Diferenca).
Complemento
 Dados dois conjuntos A e B, denominamos
complemento de B em relação a A ao
conjunto
A – B = {x|x Є A e x  B}
 Se tivermos por exemplo os seguintes
conjuntos A = {a,s,d,f,g] e B = {d,f,h,j},
então:
A – B = {a,s,g} e B – A = {h}
Exercício
 Construir
em Prolog as regras que
definem o complemento de B em
relação a A.
Solução
Predicates
nondeterm complemento(stringlist,stringlist,stringlist)
Clauses
complemento(B,A,C):diferenca(A,B,C).
Par Ordenado
 Par ordenado é o par formado por dois
elementos de maneira que cada um deles
deve manter a sua posição em relação ao
outro, ou seja, o primeiro elemento do par
será sempre o da esquerda e o segundo
elemento do par será o da direita.
 se os elementos a e b formam um par
ordenado teremos:
(a,b)
Produto Cartesiano
 Sejam os conjuntos A e B. Podemos formar
com os elementos dos conjuntos A e B, um
conjunto de pares ordenados de forma que o
primeiro elemento do par seja do conjunto
A e o segundo elemento do conjunto B.
 A este conjunto de pares ordenados
denominamos de produto cartesiano.
Produto Cartesiano - Exemplo
A = {ponte1, ponte2}
B = {madeira, concreto, ferro}
Podemos formar o conjunto dos seguintes pares
ordenados:
{(ponte1,madeira),(ponte1,concreto),(ponte1,ferro),
(ponte2,madeira),(ponte2,concreto),(ponte2,ferro)}
Tarefa
 Programar
cartesiano
em Prolog o produto
Download

Processamento de Linguagem Natural