Processamento de Linguagem Natural Ilson Wilmar Rodrigues Filho, Dr. inf.ufsc.br/~ilson

Post on 02-Feb-2016

45 views 1 download

description

Processamento de Linguagem Natural Ilson Wilmar Rodrigues Filho, Dr. http://www.inf.ufsc.br/~ilson ilson@inf.ufsc.br João Bosco da Mota Alves, Dr. jbosco@inf.ufsc.br. Bibliografia. - PowerPoint PPT Presentation

Transcript of Processamento de Linguagem Natural Ilson Wilmar Rodrigues Filho, Dr. inf.ufsc.br/~ilson

Processamento de Linguagem Natural

Ilson Wilmar Rodrigues Filho, Dr.http://www.inf.ufsc.br/~ilson

ilson@inf.ufsc.br

João Bosco da Mota Alves, Dr. jbosco@inf.ufsc.br

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. Addison-

Weslwy 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 norte-americano à 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 (Des- cumpre 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 advérbios pronomes preposições verbos conjunção numerais 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

Domainsstringlist = string*

Predicatesnondeterm 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*

Predicatesnondeterm esta_contido(stringlist,stringlistnondeterm pertence(string,stringlist)

Clausesesta_contido([],_).esta_contido([H1|T1],L2):- pertence(H1,L2), esta_contido(T1,L2).

esta_contido/2 - Exemplos

Goal esta_contido([],[c,b,a]).yesGoal esta_contido([a,b],[c,b,a]).yesGoal esta_contido([a,b],[b,a]).yesGoal 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 SolutionGoal igual([a,b,c],[b,a,c]).yes

OBS: Note-se pelos exemplos acima que a ordem doselementos dentro do conjunto não importa. Dados doisconjuntos, se eles tiverem os mesmos objetos, eles sãoconsiderados 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*

Predicatesnondeterm 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)

Clausestamanho([],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

Predicatesnondeterm 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

Domainsstringlist = string*

Predicatesnondeterm 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 paresordenados:

{(ponte1,madeira),(ponte1,concreto),(ponte1,ferro), (ponte2,madeira),(ponte2,concreto),(ponte2,ferro)}

Tarefa

Programar em Prolog o produto

cartesiano