Resumos de aula: PLN - 2019


Nota: Arquivo gerado por um programa.

Nome Resumo
Jair Edipo Jeronimo Uma expressão regular, também conhecida com Regex ou Regexp é uma cadeia de texto especial, em uma linguagem formal, utilizada para extrair ou buscar trechos de um texto. Elas são o primeiro passo para iniciar o processamento de um texto, além de servirem para realizar radicalização, divisão de tokens, segmentação de frases e normalização de textos. Além do mais, uma expressão regular pode ser representada por um autômato finito determinístico. Um exemplo de aplicação de expressões regulares, é quando queremos buscar um texto e digitamos a primeira letra da busca em maiúsculo ou minúsculo. Nesse caso, isso não deve impactar no resultado da pesquisa e a expressão regular pode tratar isso. Existem certas operações que podemos realizar em expressões regulares. Uma das principais operações é a disjunção que nos permite escolher um entre dois ou mais caracteres. Por exemplo, se quisermos encontrar a palavra cachorro ou Cachorro, podemos representar através da expressão [cC]achorro, onde o termo entre colchetes representa a disjunção do caractere. Além disso, podemos representar conjuntos maiores de caracteres, isto é, uma faixa de termos, através de um hífen, como por exemplo, para encontrar um único digito utilizamos [0-9], ou até mesmo uma letra minúscula nós podemos representar por [a-z]. Outra operação que podemos utilizar é a negação de uma disjunção, que nos permite identificar qual caractere ou faixa de caracteres não desejamos encontrar na palavra ou expressão. Por exemplo, se não queremos encontrar números podemos utilizar a expressão [^0-9], onde o acento circunflexo representa a negação da expressão. Uma observação importante, o acento circunflexo só indica a negação se for o primeiro termo dentro da disjunção, fora isso ele é tratado como um caractere normal. Há também uma forma de representar uma disjunção entre palavras utilizando uma barra vertical entre elas. Por exemplo, se eu quiser buscar entre gato ou cachorro, posso utilizar a expressão gato|cachorro. Existem também outras operações importantes, representadas por caracteres especiais. Se quisermos representar que um caractere é opcional, podemos utilizar o ponto de interrogação após o caractere desejado. Por exemplo a expressão casal? pode representar as palavras casa e casal. Agora, se quisermos repetir uma quantidade de um mesmo caractere, podemos utilizar os símbolos * ou +, onde o * indica que o caractere predecessor pode aparecer na expressão em qualquer quantidade, inclusive nenhuma, enquanto o + indica que o caractere predecessor aparece pelo menos uma vez. Outro símbolo especial que podemos utilizar é o ponto, que representa que qualquer caractere pode ocupar aquele espaço. Por exemplo, a expressão pat. pode identificar as palavras pata e pato. Além disso, existem caracteres que podem representar se o valor da expressão se encontra no início (^) ou no final de uma linha ($). Um ponto importante é que, para que os caracteres especiais possam ser utilizados normalmente em uma busca, eles devem conter como predecessor uma barra invertida. Durante a aula, o professor Jesús nos indicou o site do Regex101, que serve para testar expressões regulares. Além de nos dar uma pequena tabela com um conjunto de caracteres e expressões simples que podemos utilizar. Após algumas tentativas e erros, foi discutido também os possíveis tipos de erros que o processamento de linguagem natural tem de lidar: os falsos positivos, que são os termos que foram identificados e não deveriam e os falsos negativos, que deveriam ser identificados e não foram. Por fim, os resultados das expressões regulares são classificados e utilizados em técnicas de aprendizado de máquina, para dar continuidade no processamento. Durante a aula, foram apresentados também dois exemplos importantes de aplicações de PLN, sendo um deles o chatterbot Eliza, um programa bem limitado, que servia para manter uma conversa com o usuário, e o outro exemplo foi o de uma pesquisa cientifica, que identificava pessoas importantes citadas em artigos. Além disso, os alunos realizaram um teste para aplicar o conhecimento aprendido de expressões regulares durante a aula, que consistia em 6 questões, onde tínhamos que identificar quais seriam as expressões regulares que atingiam os critérios propostos, desde regras simples a combinações mais elaboradas.
Jefferson Leite Rodrigues Dantas Expressões Regulares (Regular expression – RE ou ER) são cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto e podem ser utilizadas para extrair trechos a partir de texto, elas são case sensitive. As ERs são comumente utilizadas para: normalização de textos, divisão em tokens, radicalização, segmentação. Podemos chamar ainda de Regex ou Regexp. Utilizamos o site regex101 para treinar as expressões regulares. Expressões regulares possuem algumas técnicas que nos ajudam a refinar nossas buscas, abaixo citarei algumas delas. Disjunção: Para buscar cada caractere de uma cadeia em um texto maior podemos colocar os caracteres entre colchetes [], especificando uma disjunção. Por exemplo: se buscarmos por [cC]apivara vamos casar tanto com capivara quanto com Capivara. Ainda podemos buscar por faixas de caracteres, [0-9] pegaria apenas o primeiro digito de um texto/frase, [A-Z] pegaria apenas um caractere em maiúscula. Negação em Disjunções: O símbolo do acento circunflexo(^) é utilizado para negar uma disjunção, porém a negação só é válida para o primeiro caractere. [^A-Z] faria com que eu pegasse o primeiro caractere que não fosse letra maiúscula, no caso da palavra Ciência eu pegaria o caractere ‘i’. Ainda em disjunções podemos utilizar a barra vertical ‘|’ para funcionar como uma “or”, [cC]apivara|[cC]arpincho casaria com capivara, Capivara, carpincho e Carpincho. OBS: [a|b|c] = [abc] Outros caracteres para buscas: Interrogação(?) indica que o caractere predecessor é opcional, pa?ra casaria com pra ou para. Asterisco(*) indica que o caractere predecessor pode existir 0 ou mais vezes, aa*h! casaria com ah!, aah!, aaah!.. Soma(+) indica que o caractere predecessor pode existir 1 ou mais vezes, a+h! casaria com ah!, aah!... Ponto(.) substitui o ponto por qualquer outro caractere, am.r casaria com amar, amor, amcr... Caracteres âncora: Circunflexo(^) é uma âncora de inicio de linha, ^[A-Z] buscaria a primeira letra maiúscula da linha. Cifrão($) é uma âncora de final de linha, a$ buscaria a última letra a de uma linha. Barra(\\) é um caractere de escape, \\.$, indicaria que o caractere sucessor(.) não é especial. Utilizando essas expressões podemos chegar em dois tipos de erros: falso positivo que é identificar cadeias que não deveriam ser identificadas e falso negativo que é não identificar cadeias que deveriam ser identificadas. Tivemos um teste de avaliação com 6 questões que era para basicamente buscarmos determinados padrões utilizando as expressões regulares. No segundo exercício tínhamos que buscar todas as cadeias alfabéticas(em minúsculas) que terminavam com a letra m, no caso a resposta é: [a-z]*m\b, o \b indica que não pode haver nenhum outro caractere após a sequência de caracteres. A última questão foi a mais complicada, tínhamos que armazenar a instrução, colocando-a dentro de parênteses e então utilizar a instrução \1 para referenciar essa instrução e utilizá-la novamente. Uma resposta seria: \b(\w+)\W+1. OBS: \w = [a-Za-z0-9] e \W = [^\w]. Outras expressões são a \s que dá um espaço, e {n} que indica n ocorrências de um caractere/palavra anterior. Por fim vimos um exemplo prático, o chatterbot Eliza que procurava padrões textuais nas conversas e então substituía esses padrões, dando uma ilusão de entendimento da conversa, além disso ela mantinha uma conversa bem superficial.
Pedro Ricardo Bronze O tema dessa aula foram as 'REGEX': Expressões Regulares. Foram introduzidos os principais autores como Daniel Jurafsky e James Martin, com seu livro 'Speech and language processing' de 2000 com re-edição em 2009 e outra prevista para 2019 que pode atrasar um pouco mais. Os capítulos utilizados do livro são o Cap. 2 e partes do Cap.3 referentes a Regular Expressions As 'regex' são utilizadas de diversas formas dentro do campo de PLN por exemplo em Normalização de texto, tokenização, Radicalização e Segmentação de frases. O que elas são exatamente? "Cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto. Alguns dos seus sinônimos são Regex, Regexp, ER (Português). Alguns padrões são: 'Disjunções' nas quais quaisquer caracteres que estiverem dentro de colchetes serão retornados na busca em conjunto com o restante dos caracteres fora: [cCK]apivara retornaria tanto 'Capivara', 'capivara' ou 'Kapivara', servindo para dígitos, pontos e outros caracteres diversos. Podemos utilizar faixas de caracteres considerando o sistema ASCII. '[0-9]' procura quaisquer caracteres entre os dígitos 0 e 9, enquanto [A-Z] quaisquer letras maiúsculas entre 'A' e 'Z'. O acento circunflexo é utilizado para negar tudo que o segue, por exemplo [^K-P] procura todos os caracteres que não a faixa de letras entre 'K' e 'P' maiúsculas. Barras verticais '|' servem para determinar que se buscam um dos termos conectados pelas barras, i.e. eu|voce retorna do texto o termos que seja ou 'eu' ou 'voce'. Caracteres especiais são utilizados para determinar casos especiais. '?' aceita termos com o caractere precedente presente ou não. 'p?ara' retorna do texto 'para' ou 'ara', mas não 'mara' por exemplo. '*' aceitar repetições de zero ou mais repetições do termo/caractere anterior. '+' aceita uma ou mais repetições do termo/caractere anterior. '.' aceita qualquer caractere no lugar do ponto, exemplo 'c.os' retornaria termos como 'cpos', 'ctos' , 'c0os', 'c&os' etc. Se utilizamos em conjunto com '[]' podemos procurar por palavras ou termos com repetições com certos padrões de caracteres específicos, i.e. '[ab]*' retornaria 'aaaa','aab','abbbb','bbbb','abab', justamente porque procuram-se termos que tenham contenham 'a' ou 'b' repetidos zero ou mais vezes. Caracteres âncores como '^' determinam o ínicio de uma linha e '$' o fim da linha. Neste caso buscamos termos que estejam no início ou fim de uma linha, exemplo: ^[A-Z] procuraria por letras maiúsculas em inícios de linha, já '[ab]$' retornaria a localização de linhas que terminam em 'a' ou 'b'. Foi apresentada uma lista com mais das expressões regulares disponíveis para buscas mais detalhadas em textos, esta disponível no tidia em repositório. Existe uma ótima ferramenta para checarmos se as regex que estamos usando buscam o que queremos de fato: regex.101.com. Devemos nos atentar para determinados tipos de erros como falsos positivos (erros Tipo I) e negativos (erros Tipo II) ao realizarmos buscas textuais. Minimizar estes erros respectivamente implica em aumentarmos precisão ou cobertura para nossa amostra. Foi nos dado um desafio de criarmos uma regex que identifique alguns formatos de e-mails. Além disso, um teste nos foi dado em sala e ao fim apresentado um chatbot simples chamado 'Eliza' que consegue interagir com entradas textuais em linguagem humana, português no caso.
Fabio Figueiredo Rodrigues Na aula 2 de processamento de linguagem natural foi abordado o tema expressões regulares em uma visão no meio termo entre básico e avançado. A bibliografia que referente ao assunto é o livro Speech and language processing, Daniel Jurafsky & James H. Martin, onde a aula abordou o capítulo 2. Expressão regular nada mais é do que uma linguagem de busca de padrões, ou seja, utiliza-se uma linguagem formal e cadeias de texto especiais para buscar o extrair trechos de um texto. Utilizamos a linguagem para definir o padrão de texto que queremos encontrar, passamos o texto alvo e utilizamos um motor para avaliar o texto e fazer a busca. Elas são comumente utilizadas para normalização de texto, divisão em tokens, radicalização e segmentação de frases. Por exemplo, como podemos procurar por qualquer um dos seguintes nomes: capivara, Capivara. Para isso utilizamos as disjunções, onde a representação é feita por colchetes com uma cadeia de caracteres entre eles, onde apenas um desses caracteres é utilizado para corresponder o padrão. Neste caso, ficaria como “[Cc]apivara” a expressão regular para identificar qualquer uma das duas palavras acima. Podemos utilizar o hífen para indicar faixas de caracteres, por exemplo, ao invés de escrever todos os dígitos entre zero e nove um a um, podemos representar por [0-9], e também se aplica aos caracteres do alfabeto minúsculos e maiúsculos ([a-z], [A-Z]). Isto acontece pois esta abreviação tem como base a tabela ASCII. Além disso, podemos utilizar a negação em disjunções, que é representado pelo símbolo de acento circunflexo, sendo válido apenas como primeiro caractere, negando toda a cadeia de caracteres presente entre os colchetes. Ex: [^Aa] - nem ‘A’, nem ‘a’. Também temos a barra vertical (|), que representa basicamente o “ou”, o ponto de interrogação, que define que o caractere predecessor é opcional, o asterisco (*), que diz que o caractere predecessor aparece zero ou mais vezes, o sinal de mais (+), onde o caractere predecessor pode aparecer uma ou mais vezes, e também temos o ponto, que representa qualquer caractere. Além disso, temos os caracteres âncoras, onde o acento circunflexo (^) indica o início de uma linha, e o cifrão ($) indica o final de uma linha. Através dos conceitos descritos acima, podemos combina-los para descrever e buscar inúmeros padrões. Através do site regex101.com, podemos testar e observar as expressões regulares criadas. Ao utilizar as expressões regulares podemos ter dois tipos de erros: o falso positivo, que identifica cadeias que não deveriam ser identificadas, e o falso negativo, que não identifica cadeias que deveriam ser identificados. Para finalizar, uma expressão regular pode ser representada ou descrita por uma MEF, que é uma máquina abstrata que está em um número finito de estados, ou autômato finito determinístico, que pode auxiliar na verificação de uma expressão regular e determinar se está bem construída. Por padrão, as expressões regulares utilizam estratégias gulosas. Ao final da aula foi dado um teste de avaliação contendo seis perguntas que tinham como objetivo a construção de expressões regulares para atender os requisitos da pergunta.
Eracton Ferreira Ramalho A aula desta semana foi “prática” como combinado no encontro anterior (as aulas de quinta-feira serão práticas e é altamente recomendável que seja levado um notebook para realizar as atividades). O primeiro tópico do dia foi mostrar e discutir um pouco da biografia recomendada. No caso é a “Speech and language processing: An introduction to natural language processing, computational linguistics, and speech recognition” e os autores são Daniel Jurafsky & James H. Martin. São conhecidos como os primeiros a desenvolverem um material deste ramo da computação. O primeiro ponto de fato da disciplina são as expressões regulares (regular expression – RE ou ER). Estas expressões são à base de todo o estudo de processamento de linguagem natural (PLN) por se tratar de extrair trechos a partir de um texto. Elas são usadas principalmente para normalização de texto, divisão em tokens, radicalização e segmentação de frases. Mas qual a definição de ERs? São cadeias de textos especiais, utilizando uma linguagem formal, para extrair/buscar determinados trechos em textos. São sinônimos de expressões regulares: regex e regexp. Para estudar este tema é interessante utilizar um site que ajuda muito, segue o link: . Primeiro vimos o caso disjunção, onde é usado colchetes para delimitar os casos que devem ser encontrados. Exemplo: [eE] onde encontra todos os “e” maiúsculo e minúsculo. A forma de encontrar faixas de caracteres, exemplo: [0-9], onde encontra todos os números do intervalor, logo são todos. O símbolo circunflexo é uma negação da disjunção. Exemplo: [^eE], onde encontra todos, exceto os “Es”. Usar barras verticais une a busca, exemplo: urso|cavalo, isso irá buscar todas as palavras urso e cavalo do texto. Há uma série de comandos, que é bem extensa (como todas as linguagens). Sendo assim, recebemos uma pequena lista com vários comandos que serão bem uteis e são bem poderosos. Encontrar fragmentos de cadeias em um texto pode ser desafiador e não é tão simples quanto parece ao começar a exercitar. Vimos que a dois tipos comuns de erro: Falso positivo (quando não é possível encontrar casos que não são verdadeiros, logo não deveriam ter sido encontrados) ou falso negativo (quando não se encontra algo que deveria ser “encontrável”). Como minimizar os falsos positivos? Aumentando a precisão. Como minimizar os falsos negativos? Aumentando a cobertura. O resultado de uma ER é utilizado em classificadores de técnicas de aprendizado de máquina. Uma ER poderia ser representada/descrita por uma MEF (maquina de estado finito) ou Autômato finito determinístico. A primeira aplicação de uma PLN foi o chatterbot chamado Eliza. Basicamente ela mantinha uma conversa limitada, com base nos padrões da conversa que ela reconhecia. Por fim, foi feito uma pequena atividade em sala. A atividade era bem simples e realmente mostrava o que tinha sido visto até então. Era simples, mas não trivial. Houve muitos erros de inicio, por estar se familiarizando com a linguagem. Além disso, o último ponto tinha necessidade de um comando que até então não conhecíamos. Este, basicamente, guardava a informação imputada anteriormente.
Michelle Kaori Hamada Expressões regulares - RE ou ER, ou também conhecidas como regex ou regexp, é uma linguagem formal que por meio de cadeias de texto especiais realiza busca/extração de trechos de texto. A utilização de ER pode consistir em normalização de texto, divisão em tokens, radicalização ou também em segmentação de frases. Para procurar padrões textuais, por exemplo o nome 'capivara', ela pode aparecer tanto com letra maiúscula quanto minuscula, para procurar por ela podemos usar a expressão [cC]apivara que a encontrará em ambas as formas. Ou seja, a cadeia de caracteres entre os colchetes especifica uma disjunção de caracteres para a busca que podem ser dígitos ou uma faixa de caracteres. Há também a negação da disjunção, quando não se quer tal carácter ou uma faixa de caracteres. Existem outras expressões que podem ser usados na elaboração da ER: ^ para início de linha, $ para final de linha, ? onde o carácter predecessor é opcional, * carácter predecessor deve aparecer 0 ou mais vezes, entre outros. Contudo, na utilização de ER pode ocorrer dois tipos de erros: o falso positivo, onde é identificado cadeias que não deveriam ser identificadas, e o falso negativo que não identifica cadeiras que eram para serem identificadas. Esses problemas são encontrados tanto em PLN como em qualquer outro problema que precise de reconhecimento de padrões. Os resultados das ERs podem ser utilizados em classificadores de técnicas de aprendizado de máquina, já que também são utilizadas como primeiro passo para qualquer processamento de texto. Uma ER pode ser descrito por uma Máquina de estados finita ou Autômato finito determinístico, conceito que descreve uma máquina abstrata que está em um número finito de estados, ou seja, ela está em apenas um estado por vez. Se bem construída, uma ER pode representar a instrução usando um autômato finito determinista, uma máquina de estados finita que aceita ou rejeita cadeias de símbolos gerando um único ramo de computação para cada cadeia de entrada. Um exemplo prático de ER que podemos citar é o chatterbot Eliza, um dos primeiros sistemas de PLN que conseguia manter uma conversa - limitada/superficial - com um usuário, imitando suas respostas. O programa basicamente procurava padrões textuais na conversa. No teste de avaliação realizado foi preciso escrever ER para seis questões. A primeira bastava selecionar todas as cadeias alfabéticas com a ER [a-zA-Z]+. Na segunda questão em diante já precisávamos usar mais expressões pois precisávamos selecionar todas as cadeias alfabéticas (em minuscula) que terminavam com a letra 'm' [a-z]*m\b. Na terceira todas as cadeiras que começavam no início da linha com um número inteiro e que terminavam no final da linha com uma palavra ^[0-9]+\b.*\b[a-zA-Z]+$ ou ^\d+\b.*\b\w+$. Na terceira era selecionar cadeias alfabéticas com as palavras 'gato' ou 'cachorro' e na quarta com as palavras 'gato gato'ou 'cachorro' que seriam (gato)|(cachorro) e na outra (gato\s){2}|(cachorro). Por fim, na última cadeias com duas palavras repetidas consecutivamente: \b(\w+)\W+\1.
Mauro Mascarenhas de Araujo PLN - RESUMO DA AULA DE 06/06/2019 EXPRESSÕES REGULARES 1\. Expressões regulares podem ser utilizadas para extrair trechos a partir de um texto. 1.1. Podem ser usadas para: • Normalizar textos. • Dividir em tokens. • Radicalização. • Segmentação de frases. 1.2. Exemplo: "[cC]apivara" -> Identifica a palavra "capivara" com inicial maiúscula ou minúscula. 1.3. Construção e operadores: 1.3.1. "[]" \- Operador de disjunção: Apenas um dos caracteres (ou intervalo) é usado para realizar a busca. 1.3.1.1. No exemplo da capivara, busca por c ou C como primeiro caractere. 1.3.2. "-" \- Faixas de caracteres ~ (Sempre do menor para o maior, de acordo com a tabela ASCII [regra de compiladores antigos]). • "[0-9]" : Apenas um dígito entre 0 e 9 (Equivalente a "[0123456789]"). • "[a-z]" : Caractere minúsculo entre 'a' e 'z'. • "[A-Z]" : Caractere maiúsculo entre 'a' e 'z'. 1.3.3. "^" \- Operador de negação de disjunção: • "[^a-z]" : Nenhum caractere minúsculo. • "[^sS]" : Nem 's' e nem 'S'. • "[^a^]" : Nem 'a' e nem '^'. 1.3.3.1. Fora dos colchetes, o '^' torna-se um caractere comum. 1.3.4. "|" : Operador 'ou': • eu|voce : Busca por "eu" ou "voce". • "[cC]apivara|[cC]aprincho" : Busca por capivara ou caprincho (caso insensível na inicial). • "[a|b|c]" = "[abc]". 1.3.5. "?" : Operador de opcionalidade do caractere predecessor: • "par?a" : Busca por "para" ou "pra". 1.3.6. "*" : Operador de repetição do caractere predecessor (deve ocorrer 0 ou mais vezes). • "aaa*h" : Busca por "aah", "aaah", "aaaah" ... 1.3.6. "*" : Operador de repetição do caractere predecessor (deve ocorrer 1 ou mais vezes). • "aaa+h" : Busca por "aaah", "aaaah" ... [note que "aah" não é mais uma correspondência]. 1.3.7. "*" : Operador caractere "coringa", que pode ser substituído por qualquer outro caractere no momento da busca. • "ca*a" : Busca por "casa", "cama", "casa", "caça" ... 1.3.8. Âncoras: 1.3.8.1. "^" \- Âncora de início de linha. • "^a" : Busca por linhas que comecem com o caractere 'a'. 1.3.8.2. "^" \- Âncora de término de linha. • "a$" : Busca por linhas que terminem com o caractere 'a'. DESAFIO: \- Elaborar uma expressão regular para validação de email. • Resposta (professor) : "[\w._%+-]+@[\w.-]+\\.[a-zA-Z]{2,4}". • Resposta (melhorada) {existem TLDs com mais de 4 caracteres} : "[\w._%+-]+@[\w.-]+\\.[a-zA-Z]{2,}". OBSERVAÇÕES: 1\. Para testar se uma expressão regular está correta, basta verificar se seu Autômato Finito Não Determinístico reconhece a linguagem desejada. 2\. Por padrão, algoritmos de busca por expressões regulares utilizam o método guloso. 2.1. Para evitar que ele pegue a maior "sub string" deve-se usar o caractere '?' antes do "\b". AVALIAÇÃO: \- Para a avaliação foram propostos 6 desafios: 1\. Selecionar todas as cadeias alfabéticas: • "[a-zA-Z]+" 2\. Cadeias alfabéticas minúsculas que terminam com a letra 'm': • "[a-z]*m\b" 3\. Cadeias que começam com um número inteiro e que terminam com uma palavra ao final da linha: • "^[0-9]+.*[a-zA-Z]+$" ou "^\d+\b.*\b\w+$" 4\. Cadeias que contenham "gato" ou "cahorro": • "(gato)|(cachorro)" 5\. Cadeias que contenham "gato gato" ou "cahorro": • "(gato\sgato)|(cachorro)" ou "(gato\s){2}|(cachorro)" 6\. Cadeias com duas palavras repetidas consecutivamente: • "\b(\w+)\W+\1"
Yago Sorrilha Expressões Regulares (Regex ou Regexp) As expressões regulares podem ser utilizadas para extrair trechos a partir de texto. São normalmente usadas para: * Normalização de texto * Divisão em tokens * Radicalização * Segmentação de frases Basicamente são cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto 1. Disjunções Cadeia de caracteres entre colchetes especifica uma disjunção. Ex: [cC]apivara : pode encontrar Capivara ou capivara * Faixa de caracteres: * [0-9] - apenas um dígito * [a-z] um caractere em minúscula * [A-Z] um caractere em maiúscula * [5-8] apenas um digito entre 5 e 8 * Negação O símbolo ^ é utilizado para negar uma disjunção, sendo que a negação é válida apenas para o primeiro caractere [^A-Z] não um caractere em maiúscula [^Ss] nem 'S' nem 's' 1. Mais sobre disjunções: | (pipe) O pipe é utilizado como "ou" Ex: eu|voce, que encontraria eu/voce 1. Outras opções: ? Considera o caractere predecessor opcional: pa?ra: para,pra * Considera o caractere predecessor aparecendo 0 ou mais vezes: aa*h!: ah!, aah!, aaaaah! \+ considera o caractere predecessor aparecendo 1 ou mais vezes: o+h!: oh!, ooh!, ooooh! . Considera qualquer caractere em seu lugar: ca.a: casa, caza, caça 1. Caracteres âncoras: ^$ Início de linha: ^ Final de linha: $ ^[A-Z] linha começando com maiúscula a$ linha termina com 'a' \\.$ linha termina com . (aqui a \ é o escape para considerar o ponto como caractere e não como o . de uma regex) Â UFABC\\. Linha contendo exatamente "A UFABC." Erros Dois tipos de Erros * Falso positivo: identificar cadeias que não deveriam ser identificadas * Falso negativo: não identificar cadeias que deveriam ser identificadas Em NLP devemos lidar com esses dois tipos de erro * Minimizar Falsos Positivos: aumentar a precisão * Minimizar Falsos Negativos: aumentar a cobertura Precision: verdadeiros positivos/(verdadeiros postivos + verdadeiros negativos) Recall: verdadeiros positivos/(falsos positivos + false negatives) Expressões Regulares * As regex são utilizadas, frequentemente, como primeiro passo para qualquer processamento de texto * O resultado é utilizado em classificadores de técnicas de aprendizado de máquina Máquina de Estados Finita * Uma regex pode ser representada/descrita por uma máquina de estados finita ou Autômato finito determinístico. * Uma MEF é uma máquina abstrata que está em um número finito de estados. * Para verificar se uma regex está bem construída pode descrever/representar a instrução usando um autômato finito determinista Greedy vs Non-greedy * Nas regex, por padrão são utilizadas estratégias gulosas (greedy), o que pode, por exemplo, causar uma regex trazer mais dados do que o esperado. Teste de avaliação Nesta aula foi aplicado um pequeno teste de avaliação que tinha questões ordenadas, aparentemente, por ordem crescente de dificuldade. O teste foi muito importante para colocar em prática o que estava sendo falado. Quando estávamos apenas ouvindo a aula e vendo as expressões, parecia fácil, mas houve certa dificuldade na realização de alguns exercícios, o que gerou dúvidas e aprendizado. Além de ser possível verificar que para algumas finalidades, várias regex se aplicam, não havendo uma solução única
Lucas Kenzo Kurokawa As expressões regulares, também referenciadas por Regex ou Regexp, são cadeias de texto especiais para busca ou extração de trechos de texto. Geralmente são utilizadas para normalização de textos (padronizar o texto), divisão em tokens ou tokenização (divisão das palavras), radicalização (lematização, que é deflexionar uma palavra para seu lema, ou stemming, que é o processo de reduzir as palavras a seu tronco ou “stem” em inglês), segmentação de frases (divisão em frases usando a pontuação para operações em que nos interessa separar um texto em frases). Quando buscamos padrões textuais, temos diversas ferramentas para realizar uma busca mais avançada. Por exemplo, podemos especificar numa regex se procuramos uma palavra com e ou sem letras maiúsculas (chamam-se também de case sensitive). Para isso, podemos os colchetes ou também chamados de parênteses retos ‘[‘ e ']’, que se tratando de regex nos especifica que estamos tratando de uma disjunção de caracteres quando realizar a busca. Dentro desta disjunção podemos passar uma lista ou faixas de caracteres onde alguns compiladores conseguem os interpretar como uma lista. Também podemos passar negações de disjunções, ou seja, tudo que não estiver dentro da disjunção será considerada. Quando quisermos passar uma palavra completa em uma disjunção, podemos usar a barra vertical (ou pipe em inglês) para especificarmos condição de OU. Outras ferramentas muito úteis ao se tratar de regex é o uso de alguns caracteres especiais como ‘?’ sendo um caractere que nos diz que o valor anterior é opcional, ‘*’ que nos diz que o valor anterior pode repetir nenhuma ou infinitas vezes, ‘+’ que define que o valor anterior deve acontecer 1 ou mais vezes ou ‘.’ que determina que qualquer valor pode ocorrer naquela posição. Outros caracteres importantes são os ‘^’ antes de uma disjunção para nos dizer que é o começo de uma linha e o `$` que nos diz que é o fim de uma linha. O caractere ‘\’ serve para nos dizer que o caractere sucesso não é especial (muito útil quando usamos caracteres reservados em buscas com regex). Uma ferramenta muito útil para testarmos se uma regex escrita está funcionando de acordo com o que esperamos é o site regex101, pois nele podemos definir uma regra e listarmos alguns exemplos para testarmos como o regex está se comportando. Ao testarmos, nos deparamos com 2 tipos de erros que são o erro de falsos positivos, quando a regex identifica cadeias que não deveriam, e falsos negativos, quando não identificam cadeias que deveriam ser. Uma regex pode ser convertida em um autômato finito determinístico, que nos ajuda a avaliar se uma regex foi bem construída. Um exemplo histórico do uso de regex foi a Eliza, que foi o primeiro chat-bot (datado dos anos 60), que funcionava basicamente procurando padrões textuais na conversa e agia como uma espécie de psicóloga. Depois fizemos um teste de avaliação onde testamos os conhecimentos de regex, e também reparamos como problemas aparentemente simples podem ser difíceis.
Augusto Goncalves da Silva Quando precisamos entender uma expressão não exata, no sentido de não haver apenas uma forma de escrever uma mesma coisa, temos que adaptar a programação para ser possível interpretar entradas textuais com pequenas variações. Um método muito utilizado para esse fim é o das Expressões Regulares. Diversas linguagens de programação possuem funções para a utilização da técnica das Expressões. Com o uso das tais expressões, conseguimos identificar textos com diferenças, e associá-los com outras strings, por exemplo. As Expressões Regulares se baseiam em caracteres especiais inseridos estrategicamente posicionados para a identificação do texto em questão. Um pouco da codificação abaixo. Disjunções: [Aa] - tudo que está entre colchetes é considerado. Ex.: [Cc]apivara; [A-Z] - o hífen indica uma sequência que pode ser considerada. Ex.: [1-9] um dígito de 1 a 9. Negação de Disjunções: [^Aa] - nega o que está entre os colchetes. Ex.: [^0-9] tudo que não é um dígito. Barra vertical em Disjunções: [A|B|C] - tem o sentido de "ou" na expressão em questão. Ex.: (eu) | (você) qualquer um é considerado Outros códigos: "?" indica que o caractere predecessor é opcional; "*" indica que o caractere predecessor deve aparecer 0 ou mais vezes; "+" indica que o caractere predecessor deve aparecer 1 ou mais vezes; "{n}" indica que o caractere predecessor deve aparecer n vezes"; "{n,m}" indica que o caractere predecessor deve aparecer de n a m vezes; "{n,}" indica que o caractere predecessor deve aparecer pelo menos n vezes; "." indica que qualquer caractere pode ser aceito; "^" indica início de uma linha; "$" indica o final de uma linha; "\" indica que o próximo caractere especial não deve ser processado como uma instrução de Expressões Regulares; "\d" indica qualquer dígito (equivalente a [0-9]); "\w" indica qualquer caractere alfanumérico ou underline (equivalente [A-Za-z0-9_]); "\s" indica um espaço em branco; "\D" indica qualquer dígito (equivalente a [^0-9]); "\W" indica qualquer caractere não alfanumérico e não underline (equivalente [^A-Za-z0-9]); "\S" indica um não espaço em branco; "\n" indica uma quebra de linha; e "\t" indica um tab. Um grande desafio da implementação de expressões regulares é a adaptação do código para que seja identificado a maior parte das entradas que se deseja serem identificadas, sem aumentar a identificação de entradas que não deveriam ser identificadas. A seguir, alguns exemplos do uso de expressões regulares para identificação de textos padrões. Selecionar todas as cadeias alfabéticas: "[A-Za-z]+"; Selecionar todas as cadeias alfabéticas (em letra minúscula) que terminam com m: "[a-z]*m\b"; Selecionar todas as cadeias de caracteres que iniciam a linha com números e terminam a linha com letras: "^[0-9]+\b.*\b[A-Za-z]+$" ou "^\d+\b.*\b\w+$"; Selecionar todas as cadeias alfabéticas que contenham a palavra "gato" ou "cachorro": "(gato)|(cachorro)"; e Selecionar todas as cadeias alfabéticas que contenham a palavra "gato gato" ou "cachorro": "(gato\s){2}|(cachorro)".
Ramon Neres Teixeira Jardim Resumo 2 – Processamento de linguagem natural A segunda aula do curso tratou do assunto de expressões regulares. Expressões regulares são cadeias de texto utilizadas para busca de trechos com um dado padrão em um dado texto. Algumas de suas utilidades são: normalização de texto, divisão em tokens, radicalização e segmentação de frases. Existem vários operadores para se utilizar em expressões regulares, sendo alguns deles: |, ^, ., ?, *, + e $. O operador | é utilizado para fazer disjunções, assim como os colchetes podem ser utilizados para o mesmo propósito. Os caracteres colocados dentro de colchetes são considerados na busca e o primeiro encontrado é retornado, por exemplo, a expressão regular “[Cc]apivara” poderá encontrar a palavra capivara com c maiúsculo ou minúsculo. Outra forma de usar os colchetes é por meio de faixa de caracteres, por exemplo [0-9], que encontra um dígito de 0 a 9, [A-Z] que encontra uma letra maiúscula de A a Z e [7-9], que encontra um dígito entre 7 e 9. É possível negar o conteúdo dos colchetes com o operador ^, que encontra tudo o que não satisfaz a expressão dos colchetes, por exemplo, [^Cc] encontra qualquer coisa que não seja a letra c minúscula ou maiúscula. O operador | é utilizado de forma diferente mas tem uma função parecida, as cadeias em ambos os lados do operador serão buscadas, por exemplo ao utilizar a ER “oi|tchau” as palavras oi e tchau serão buscadas no texto. O ponto de interrogação indica que o caractere que o antecede é opcional na busca, exemplo, ao utilizar a expressão “insec?to”, tanto “insecto” quanto “insecto” serão buscadas. O asterisco e o sinal de mais tem funções parecidas. O (*) indica que o caractere anterior à ele pode aparecer 0 ou mais vezes, enquanto o (+) indica que o caractere que o antecede pode aparecer 1 ou mais vezes. Por exemplo, a expressão “([Hh][Aa]+)*” encontrará possíveis risadas de qualquer tamanho sem diferenciar maiúsculos e minúsculos, desde que a letra h não se repita. O operador (.) funciona como um coringa, aceitando qualquer caracter na sua posição, por exemplo, “ca.a”, busca por: casa, cada, caca, capa, O operador ^ tem uma segunda função e muitas vezes é utilizado em conjunto com o operador $. O acento circunflexo quando utilizado fora dos colchetes indica início da linha, enquanto o operador $ indica fim da linha, por exemplo, “^Processamento.*natural$” busca por uma linha que comece com “Processamento” e termine com “natural”. Também pode-se usar números entre chaves para indicar uma repetição do conteúdo da expressão regular por um número específico de vezes, por exemplo “(casa){2}” busca pela palavra “casacasa”. Ao fim da aula foi passada uma atividade com 6 questões sobre ERs que foram resolvidas utilizando os operadores apresentados anteriormente e com 3 novos: \b, \s e \w, que representam, início/fim de palavra, espaço em branco e caracter alfa-numérico/underline respectivamente.
Willian Teruya Kimura A aula do dia 06/06/2019 se refere a expressão regular, conhecido também como regex, em que ser trata de cadeias de textos especiais, utilizando-se de linguagem formal, cujo objetivo é buscar e/ou extrair trechos de textos. Expressões regulares normalmente são utilizadas para: 1) Normalização de Texto; 2) Divisão em tokens; 3) Radicalização; 4) Segmentação de frases. Em expressões regulares, existem estruturas que são importantes para modelar os possíveis caracteres e palavras que serão extraídas em um texto, tendo como base Disjunções, uma cadeia de caracteres que estão inseridos dentro de colchetes (‘[ ]’) e especifica um disjunto a ser buscado dentro de um texto. É possível utilizar “ - “ para delinear uma faixa de caracteres a ser buscado e/ou extraído, como por exemplo: “a-zA-Z”. Para complementar a estrutura, existe o símbolo de negação, sobre o qual é representado por “ ^ ”, em que nega uma disjunção. É importante declarar a negação dentro do colchete como primeiro caractere para validar a negação. Para definir uma lógica “ou”, é utilizado a barra vertical (“ | ”), que pode selecionar diferentes sequências de caracteres, desde que busque adequadamente. Para melhor compreensão, é interessante colocar exemplos: 1. Eu|Voce -> pode selecionar tanto a string “Eu” quanto “Voce” 2. [a|b|c] = [abc] Obs: quando a sequência de caracteres está fora dos colchetes, ela é interpretada como uma cadeia de símbolos a serem buscadas. Para expressões regulares, existem outros operadores essenciais para realizar a extração de trechos no texto alvo, sendo eles: “?“-> O caractere predecessor é opcional; “*“ -> é possível repetir 0 ou mais vezes o caractere predecessor; “+”-> é possível repetir 1 ou mais vezes o caractere predecessor; “.”-> representa qualquer caractere. Há caracteres em regex que são conhecidas como âncoras, que são os caracteres “^” e “$”, em que representam, respectivamente, o início de linha e o final da linha. Embora o caractere “^” seja usado como negação, dependendo de sua posição na expressão regular, ele pode assumir comportamentos diferentes, sendo que, quando instanciado fora do colchete a expressão assume “ ^ ” como início de linha, e, caso contrário, assume negação. Além desses dois caracteres, temos outro símbolo especial, o “ \ “, em que indica que o caractere sucessor não é especial, assumindo sua forma original. Para compreender melhor os conceitos apresentados em aula, foi utilizado uma aplicação web sob a qual era possível extrair informação de um dado texto ao inserir uma expressão regular, verificando assim todos os conceitos verificados de maneira prática. Com base nas aplicações, foi visto algumas aplicações reais utilizadas para o desenvolvimento de sistemas de PLN, dentre um deles foi o Eliza, um chatterbot programado para manter uma conversa, através de mimetização de respostas. Em relação ao teste de avaliação, acredito que os exercício propostos mostraram uma ambiguidade, o que causou uma confusão na sala em relação às respostas finais, porém, embora ocorrera esse contratempo, foi claro o entendimento do conteúdo da matéria no dia.
Renan Baisso Nesta aula, foi reforçado o uso do livro Jurafsky, D. & Martin, J. H. (2009). Speech and language processing. An introduction to natural language processing, computational linguistics, and speech recognition. Pearson/Prentice Hall para esta primeira parte da matéria. O conteúdo da aula se encontra no capítulo 2, o qual trata de Expressões Regulares, conhecidas popularmente como Regex. e também de Normalização de Texto. Expressões regulares são utilizadas para encontrar padrões textuais com a finalidade de realizar extrações, normatizações, divisões, radicalização e segmentação de frases. Para que um pedaço de string seja captado pela expressão regular, basta que algum padrão seja especificado, como encontrar a palavra”‘capivara” em um texto, basta digitar a palavra em uma ferramenta capaz de realizar a operação, como o site Regex 101.com. Porém, mesmo uma palavra específica pode ter suas variações, por estar em maiúsculo ou com erro de digitação, como a falta de acentuacao. Para contornar estes problemas, as Regex aceitam operadores que auxiliam na detecção de padrões, o primeiro a ser apresentado foi o par de colchetes [ ] que representa uma disjunção, e.g, uma cadeia de caracteres a ser buscada no texto, no caso descrito podemos construir a seguinte expressão [Capivara para buscar um variação com início em maiúscula. Este operador ainda aceita intervalo de caracteres como [a-z] ou [A-Z] para buscar todas as letras do alfabeto, ainda temos [0-9] ou [5-8] para buscar dígitos numéricos de determinado intervalo. Além da disjunção, ainda temos outros operadores, como a negação que é o operador ^ dentro de uma disjunção [^], para buscar o oposto do que está dentro da disjunção. Também temos operadores coringas “?” que representa um caractere opcional, “*” indica que a cadeira antecessora pode aparecer 0 ou mais vezes, “+” indica que a cadeira antecessora pode aparecer 1 ou mais vezes e “.” que indica toda a cadeia. Ainda temos operadores âncoras, para indicar começo “^” (fora da disjunção) ou final de uma linha “$”. Foi realizado um exemplo prático, para extrair a preposição “de” de um texto utilizando a expressão regular “[^A-Za-z][Dd]e[^A-Za-z]. Após tentativas de extrair o texto corretamente, podemos analisar que para avaliar a precisão da Regex, podemos utilizar técnicas estatísticas de análise de desempenho, como recall e precision, para avaliar falsos positivos e falsos negativos. Em seguida, foram realizados alguns exercícios teóricos para fixacao, em que um deles consistia em construir uma expressão que reconhecesse qualquer padrão de email válido, em que uma possível resolução poderia ser [\w._%+-]+@[\w.+]+\\.[a-zA-Z]{2,4}. Logo depois, foi apresentado a descrição de Regex como máquinas de estado e também técnicas para evitar expressões gulosas, que podem ter performance mais lenta. Por fim, houve a exposição da mini Eliza, que uma versão reduzida do programa Eliza, o qual foi o primeiro algoritmo para interação automática com usuário para parecer uma conversa.
Leonardo Nascimento Uma das primeiras coisas que fazemos em um processo de descoberta de conhecimento ou análise de dados em documentos não estruturados é normalizar o texto. Para isso, utilizamos uma ferramenta chamada expressões regulares, também conhecida como regex ou regexp. Com expressões regulares podemos também fazer divisão em tokens, radicalização e segmentação de frases. Expressões regulares são uma sequência de caracteres que definem um padrão de busca. Assim, se quisermos buscar em um tempo a palavra “capivara” sem nos importar se a primeira letra será maiúscula ou minúscula, usamos o padrão “[cC]apivara”. Os caracteres entre os colchetes especificam uma disjunção e a ordem dos caracteres é irrelevante. Outro exemplo com disjunções poderia ser verificar se o número de um apartamento é válido. Assim, sabendo que o prédio tem 6 andares e que os apartamentos estão numerados de 1 a 4 no andar, a expressão regular “[123456][1234]” poderia ser utilizada. Uma notação mais compacta usando faixas de caracteres seria “[1-6][1-4]”. As faixas de caracteres são definidas pela ordem dos caractres na tabela ASCII. Deste modo, a expressão regular “[A-z]” reconhe todas as letras sem diacríticos, mas também inclui os caracteres “[”, “\”, “]”, “^”, “_” e “`”, e por isso uma expressão regular melhor seria “[A-Za-z]”. É importante notar as letras maiúsculas precedem as minúsculas na tabela ASCII, e é por isso que a expressão regular “a-Z” não é válida. Para identificar se existem caracteres que não são letras sem diacríticos em uma palavra, podemos usar a expressão regular “[^A-Za-z]”, onde o símbolo “^” imediatamente após a abertura dos colchetes representa a negação da disjunção. Para identificar ou uma palavra ou outra, como os pronomes de tratamento tu e você presentes em um texto, a expressão regular “tu|você” poderia ser empregada. Os símbolos “?”, “*” e “+” são quantificadores de ocorrência. Considerando as onomatopeias “boom” e “boom!” podemos identificar ambas com a expressão regular “boom!?”. Para identificar também mais letras “o” ou exclamações a expressão regular poderia ser “boo+m!*”. Como queremos pelo menos duas ocorrências da letra “o”, outra expressão regular válida seria “bo{2,}m!*”. Âncoras e expressões de posição são importantes para podemos especificar melhor o que estamos procurando e ajudam a evitar falsos positivos e falsos negativos. Algo que vale mencionar é que as estratégias usadas por expressões regulares são gulosas por padrão. Assim, ao capturar as frutas que começam e terminam com a letra “a” na lista “amora, acerola, abacaxi” com a expressão regular “\ba.*a\b” o resultado é “amora, acerola”. Todavia, com expressão regular “\ba.*?a\b”, onde especifica-se uma estratégia preguiçosa para o quantificador “*”, o resultado é “amora” e “acerola”. Só com expressões regulares é possível construir um chatbot, ainda que limitado, capaz de criar uma ilusão de entendimento e imitar um usuário. O sistema Eliza tinha essas características e foi pioneiro.
Lucas Ferraz Nicolau Para realização de procura de padrões textuais, foi apresentada a ferramenta de expressão regular (ER), uma cadeia de caracteres em uma linguagem específica que delimita um padrão em uma linguagem regular, onde é possível discernir se uma certa cadeia caracteres se encontra neste padrão ou não. As ERs poderiam então ser utilizadas para identificação desses padrões em um texto permitindo busca, substituição e identificação da frequência dos elementos desejados, solucionando problemas básicos dentro da área de PLN. Dentre as possibilidades permitidas pelas ERs, podemos citar a concatenação ou conjunção de caracteres indicadas pela apresentação comum dos caracteres em sequência; a disjunção dos caracteres indicada pela delimitação de colchetes (“[” e “]”) ou uso do operador barra vertical ou pipe (|), existindo ainda a possibilidade de disjunção para caracteres seguidos na tabela ASCII para fácil identificação de caracteres numéricos, alfabéticos minúsculos ou alfabéticos maiúsculos através do hífen (-); a negação de disjunções indicada pelo acento circunflexo (^) como primeiro caractere entre colchetes. Outras operações possíveis através das ERs seriam a identificação de predecessor opcional através do ponto de interrogação (?), de predecessor genérico com ponto (.) e de um predecessor repetido diversas vezes através do asterisco (*) ou do sinal de adição (+), onde, no segundo caso, pelo menos uma ocorrência é necessária. Também podemos identificar início e fim de uma linha, respectivamente, pelo acento circunflexo e pelo símbolo de cifrão ($) e ainda determinar os limites de uma única palavra pelo termo “\b”. Diversos atalhos são possíveis através do uso do caractere de escape barra invertida (\\), além de outras funções como determinar quantidade de repetições de um termo ou de referenciação de um termo encontrado anteriormente na busca. Foram abordados também aspectos teóricos de ERs como: a correlação direta que possuem com autômatos finitos determinísticos, onde toda expressão pode ser representada por um autômato equivalente; a natureza gulosa de como são processadas na busca por caracteres, que pode ser burlada através do uso do acento de interrogação; e a necessidade de lidar com erros nas buscas com expressões que podem prejudicar a precisão e a cobertura (recall) das pesquisas. Durante a aula foi realizada uma avaliação baseada na criação de ERs que encontrassem apenas as descrições desejadas possuindo exercícios de dificuldade incremental. Apesar de problemas de interpretação dos enunciados, os exercícios apresentados foram em sua maioria de fácil resolução com exceção apenas da questão 6 que necessitava do uso referenciamento a palavras encontradas anteriormente que não havia sido apresentado em aula. Ainda em aula, foi apresentada a ferramenta encontrada em regex101.com para realização de testes de ERs que, atualmente, encontra implementação em quase toda linguagem de programação. Por fim, foram exibidas aplicações do seu uso como o software Eliza, que simularia uma conversa simples com um terapeuta que se comunicaria apenas com respostas espelhadas às perguntas do usuário, e uma pesquisa científica que baseou suas conclusões nos resultados de ERs.
Lucas Zanoni de Oliveira A aula de Expressões de Regulares (ER) trouxe consigo a apresentação do conceito de busca de padrões de textos, que nada mais é do que a capacidade de identificar uma determinada forma textual localizada em um elemento textual mais amplo, como por exemplo palavras iniciadas com a letra "A" em um livro. Esse conceito possibilita uma série de ações, tais como a padronização de textos, divisão de palavras com base em elementos como os espaços, divisão de frases com base na pontuação e lematização (busca de variações de uma palavras, como "pensar" e "pensamento"), dentre outros. Portanto, podemos definir que as expressões regulares são formas específicas de texto em linguagem formal, que possuem como objetivo procurar ou extrair trechos determinados de textos. Para que a busca seja possível, são utilizados certos padrões textuais. O primeiro apresentado, foram as disjunções que podem ser identificadas por uma cadeia de caracteres entre colchetes ([]), tendo como exemplo [aA] que tem o "poder" de buscar um elemento que possua qualquer forma da letra "A", seja maiúscula ou minúscula. Já a negação das disjunções, tem como função a busca de padrões que se enquadrem ao inverso do padrão especificado entre os colchetes, como por exemplo [^Aa] que identificará palavras que não possuam nenhuma forma da letra "A" dentre suas letras formadoras. Foi apresentada também a barra vertical (|) que tem como função realizar a combinação de disjunções, atuando como se fosse um operador OR, como por exemplo [ele | ela] que identificará palavras que possuam pelo menos uma destas combinações textuais. Além disso temos outras opções, como o "?" que fará com que um caractere seja opcional, o "*" que possibilitará a repetição de um certo caractere em sequência (podendo não havê-lo), o "+" atua como o "*" porém garante com que haja pelo menos uma vez o caractere referido, e o "." que servirá como um coringa, aceitando qualquer caractere em sua posição. Outro conceito demonstrado foi o de caracteres âncoras, que atuam tanto na fixação de um padrão no início da palavras (^[]), quanto no final de uma palavra ($). No reconhecimento de padrões, estamos suscetíveis a dois tipos erros, sendo o falso positivo, que ocorre quando cadeias indevidas são identificadas, podendo ser corrigido por meio do aumento da precisão do modelo, e o falso negativo, que ocorre quando padrões devidos não são identificados, podendo ser solucionado por meio do aumento de cobertura do mesmo. Vale ressaltar que uma ER pode ser representada por uma máquina de estados finito ou um autômato finito determinístico. Já o teste de avaliação em aula, teve como importância a fixação dos conceitos apresentados durante a aula, por meio da apresentação de cenários que solicitavam como resposta uma ER que atendesse o solicitado, de tal forma que os conceitos de disjunções, combinações, caracteres especiais (?, *, +, .) e caracteres âncoras (^, $), fossem exercitados por meio da formação das expressões regulares finais.
Igor Neres Trindade A aula de hoje, 06/06/2019, revisou um conceito muito importante para a procura de padrões textuais: expressões regulares. Como referência para essa aula, indica-se a leitura do segundo capítulo de “Speech and Language Processing”, de Dan Jurafsky. As expressões regulares são escritas em uma sintaxe bem específica, podendo, por consequência, ser interpretada por um processador de ER qualquer. Para entender algumas expressões da sintaxe, atacamos o problema inicial de extrair uma palavra, independentemente de sua maiusculização, como, por exemplo, “Capivara” e “capivara”. Para esse problema, especificamos uma disjunção de caracteres para a busca por meio de colchetes, da forma “[Cc]apivara” e, por consequência, extraímos ambas as formas. A disjunção pode ser feita em faixas de caracteres também. Em vez de considerar a letra C em suas duas formas, poderíamos considerar um caractere qualquer, maiúsculo ou minúsculo com “[a-zA-Z]apivara”. Assim, “Aapivara” e “Zapivara” poderiam ser extraídos também. Da mesma forma, podemos fazer a negação dessa disjunção com o uso de um acento circunflexo. Dado um texto, podemos selecionar tudo com exceção do caractere “a”, com “[^a]”. Podemos, ainda, incluir o próprio acento circunflexo nesse grupo exclusivo, com “[^a^]”. É importante enfatizar que a negação funciona somente dentro da disjunção. Dessa forma, se quisermos excluir uma palavra da extração, podemos usar parênteses, com a sintaxe “[^(palavra)]”. Há ainda a barra vertical, usada para criar uma condição OR em uma expressão; sinal de interrogação, que indica a existência ou não de um elemento; o asterisco, que indica nenhum ou mais elementos; o sinal de soma, que indica um ou mais elementos; e o ponto, que generaliza um elemento qualquer. Um cheatsheet com toda essa sintaxe pode ser encontrado no site do tidia da disciplina. Na aula, utilizamos o website https://regex101.com/ para realizar testes com as ERs. Nesses testes, identificamos dois tipos de erros: falso positivo e falso negativo. No primeiro caso, identificamos cadeias que não deveriam ser identificadas. Um exemplo disso foi identificar partes de palavras, em vez de palavras inteiras. E isso ocorreu por dois motivos: esquecemos de especificar o limite na ER e a expressão não considerava caracteres acentuados, que são típicos de línguas latinas. Isso seria possivelmente resolvido aumentando a precisão da ER. No segundo caso, não identificamos cadeias que deveriam ser identificadas, talvez pela grande especificidade da ER. Poderíamos, então, aumentar a cobertura. Na aula, criamos uma ER para verificar a validade de um e-mail e respondemos a um teste de avaliação. No teste, uma sintaxe curiosa foi utilizada. Aprendemos a fazer a referência a n-ésima expressão delimitada por parênteses com \n. Por fim, aplicamos as ERs com um programa simples em Python, uma reprodução do que foi feito com Eliza, um chatterbot. Vimos também que é possível fazer pesquisa nessa área.
Giselle Silva de Santana Nesta segunda aula, do dia 06/06, foi apresentado o conceito de Expressões Regulares, assunto abordado no Capítulo 2 do livro texto utilizado na disciplina (“Speech and Language Processing”, Dan Jurafsky e James H. Martin). Também nos foi apresentado o site https://regex101.com/, que foi utilizado ao longo da aula para demonstração de exemplos, e onde é possível criar e testar funções regulares de forma rápida e online. A aula iniciou-se com a exposição da teoria, de pois foi feita uma atividade com exercícios de fixação e por fim uma breve apresentação prática sobre o algoritmo Eliza. Expressões regulares costumam ser usadas para a extração de trechos a partir de textos. Utiliza-se colchetes “[]” para determinar os caracteres que serão buscados (disjunção). O padrão [0-9] busca apenas um 1 dígito dentro do intervalo de 0 a 9; [a-z] busca um caractere minúsculo dentro do intervalo; [A-Z] busca um caractere maiúsculo dentro do intervalo. Um acento circunflexo “^” pode ser utilizado para realizar a negação de uma disjunção e é válido com esse propósito apenas se estiver como primeiro caractere dentro dos colchetes, como por exemplo, o padrão [^a-z] busca um caractere não minúsculo (faria match no primeiro caractere maiúsculo presente na cadeia textual. Pode-se utilizar uma barra vertical (conhecida como pipe) “|” para representar um ou outro, por exemplo, [cCapivara | cCarpincho] vai dar match com capivara, Capivara, carpincho e Carpincho. Um sinal de interrogação “?” representa que o caractere antecessor é opcional, como por exemplo, pa?ra dará match com para, pra. O asterisco “*” significa que o caractere predecessor poderá aparecer 0 ou mais vezes, por exemplo, oo*h! dará match com oh!, ooh!, ooooh!. Já o mais “+” significa que o caractere predecessor pode aparecer 1 ou mais vezes, por exemplo, a+h! drá match com ah!, aah!, aaaah!. Utilizar um ponto “.” Representa que qualquer caractere pode dar match, como por exemplo, p.r poderá dar match com por, per, pir, par. Para indicar que uma linha deva iniciar com determinada caractere utiliza-se o acento circunflexo antes do padrão e fora dos colchetes e para indicar o final da linha utiliza-se um cifrão “$”. Outros exemplos de padrões para expressões regulares, operadores e precedência, foram apresentados durante a aula e podem ser encontrados na folhinha impressa fornecida pelo professor ou nas notas de aula presentes no site da disciplina. Após a apresentação da teoria foram realizados alguns exercícios em uma folha de atividades, onde devíamos criar expressões regulares para satisfazer as exigências propostas. Por fim, nos foi apresentado sobre um dos primeiros sistemas de PLN criados, o chatterbot Eliza, que foi desenvolvido para manter uma conversa superficial com o usuário imitando suas respostas. Ao final da aula, houve uma pequena demonstração prática de um “mini Eliza” desenvolvido em Python.
Vinicius Narciso da Silva Expressões Regulares (Regex) são cadeias de texto especiais, as quais exigem um formalismo, com a finalidade de extrair (ou buscar) trechos de textos. Para atender a este formalismo, temos alguns caracteres reservados por essas expressões que nos ajudam a definir o que queremos extrair do texto: 1) Disjunções ('[' e ']') - Todas as variações que estiverem entre os colchetes serão consideradas (podendo trabalhar com intervalos, por exemplo [0-9] representa de 0 a 9). Ex: [cC]apivara serão consideradas as cadeias 'capivara' e 'Capivara'; 2) Negação em disjunções ('^') - Tudo o que estiver após o circunflexo, dentro da disjunção, não será considerado. Ex: [^vV] todos os caracteres 'v' e 'V' serão desconsiderados; 3) Barra vertical ('|') - Tem a mesma função da disjunção e pode ser usada dentro ou fora de uma disjunção. Exs: vinicius|Vinicius serão consideradas as cadeias 'vinicius' e 'Vinicius'. [v|x] é equivalente a [vx]; 4) Outras opções ('?', '*', '+', '.') - '?' para predecessor opcional. Ex: mano? considera 'man' e 'mano'. '*' para repetição do caractere predecessor 0 ou mais vezes. Ex: mano* considera 'man', 'mano', 'manoo', 'manooo', e assim vai. '+' para repetição do caractere predecessor 1 ou mais vezes. Ex: mano+ considera 'mano', 'manoo', 'manooo', e assim vai. '.' caractere coringa. Ex: man. considera 'mano', 'mana', 'manx', e assim vai. Podemos combinar disjunções com essas opções especiais para gerar comportamentos únicos. Ex: [ab]* considera de 0 a infinitas interpolações de a e b, não sendo necessários os dois caracteres juntos, 'a', 'b', 'aa', 'bb', 'ab', 'ba', 'aaaaa', 'bbbbb' e assim vai; 5) Caracteres âncora ('^' e '$') - '^' é usado para início de linha e '$' é usado para final de linha. Ex: Na frase 'Eu sou a lei', i$ considera apenas o i final, ^E considera apenas o E inicial e ^Eu sou a lei$ considera a frase toda. Vale ressaltar a importância do caractere '\' como caractere de escape ou "ativador" de função. Ex: Como caractere de escape, \\. refere-se ao caractere ponto, enquanto . refere-se à função ponto, que utilizada como caractere coringa; Como "ativador", \b, por exemplo, define um limite de reconhecimento. Analisando novamente a frase anterior, .u reconhece as cadeias 'Eu' e 'ou', já \b.u reconhece apenas 'Eu'. Ao escrever Expressões Regulares podemos nos deparar com Falsos positivos (cadeias reconhecidas que não deveriam ser) e Falsos negativos (cadeias não reconhecidas que deveriam ser). Para lidar com essas situações, podemos: 1) Aumentar a precisão (Falsos positivos) e/ou 2) Aumentar a cobertura (Falsos negativos); Expressões regulares são comumente utilizadas para pré-processar textos e para servir de classificador para técnicas de aprendizado de máquina. Como exemplo de uma Expressão complexa podemos utilizar que reconhece e-mails: /[\w._%+-]+@[\w.-]+\\.[a-zA-Z]{2,4}/. Por fim, toda Expressão Regular pode ser representada por um autômato finito determinístico e quão melhor for escrita a Expressão, mais facilmente o autômato será reconhecido.
Matheus Fama Machado de Sousa Em ciência da computação, expressões regulares são padrões de caracteres que associam sequências de caracteres no texto. As regex (abreviação do inglês “regular expression”) são escritas numa linguagem formal que pode ser interpretada por um processador de expressão regular que, basicamente, serve como um gerador de analisador sintático ou um examinador de texto que identifica partes dada uma especificação. Em processamento de linguagens naturais ou em qualquer outro problema que envolva reconhecimento de padrões, deve-se lida com dois tipos de erros: Falsos Positivos e Falsos Negativos. Falsos Positivos ocorrem quando a regex identifica uma cadeias de caracteres que não deveriam ser identificadas e Falsos Negativos ocorrem quando a regex não identifica cadeias que deveriam ser identificadas. Falsos Positivos podem ser minimizados aumentando a precisão da sua regex enquanto que, para minimizar Falsos Negativos é preciso aumentar a cobertura. Dada a definição e aplicabilidade é preciso aprender a manipular tais expressões. Para isso, devemos conhecer os símbolos e a sintaxe dessas expressões. “.” – Representa qualquer caractere. Por exemplo cas. identifica casa, caso,case “[ ]”- Lista de caracteres. Casa uma ocorrência de qualquer caractere contido na lista. Por exemplo,ca[rs]o aceita caro ou aso. É possível definir intervalos de caracteres como, por exemplo, [a-z] representando qualquer caractere de “a” a “z”. “[^ ]”- Lista negada de caracteres. Casa uma ocorrência de qualquer caractere não contido na lista. Por exemplo, [^cC] casa qualquer caractere que não seja “c” ou “C”. “^” – Começo de uma cadeia de caracteres. “$”- Fim de uma cadeia de caracteres. “\b”- Casa o padrão especificado no inicio, final ou palavra exata. Por exemplo, \bdia casa com diafragma, dialogo. dia\b casa com melodia, bom-dia. “*”- Repete zero ou mais vezes a expressão regular anterior. Por exemplo, a* casa com “”,”aa”,”aaa”... “+”- Repete uma oua mais vezes a expressão regular anterior. Por exemplo, a+ casa com “a”,”aa”,”aaa”... “?”- Exatamente zero ou uma vez a expressão regular anterior. Por exemplo, carr?o casa com carro e caro “{n}”- Repete n vezes a expressão regular anterior. Por exemplo, a{2} casa com “aa” “{n,m}”- Repete pelo menos n e não mais que m vezes a expressão regular anterior. Por exemplo, a{1,3} casa com “a”,“aa” e ”aaa” “{n,}” – Pelo menos n vezes a expressão regular anterior. “|” – Casa ou a expressão regular anterior ou a a expressão regular que a sucede. Por exempo, aa|abc casa “aa” ou “abc” “\d” – Representa qualquer digito. Equivalente a [0-9] “\D”- Representa qualquer não digito. Equivalente a [^0-9] “\w” – Representa qualquer alfanumérico e underscore. Equivalente a [a-zA-Z0-9_] “\W”- Representa a negação de \w. Equivalente a [^a-zA-Z0-9_] “\s” – Representa espaço em branco. Equivalente a [\r\t\n\f] “\S” – Representa a negação de \s. Equivalente a [^\r\t\n\f]
Thiago Bruini Cardoso Silva A segunda aula teve como tema central o estudo de expressões regulares e realização de exercícios em papel e no computador resolvendo reconhecimento de cadeias a partir de utilização de ER. As ER são escritas em linguagem formal e constituem cadeias de caracteres capazes de reconhecer cadeias de caracteres. Alguns dos operadores utilizados serão explicados abaixo: Disjunção [ ] - Utilizada quando deseja-se reconhecer um dentre os caracteres listados entre colchetes. Por exemplo, "[Aa]belha" reconhece tanto as cadeias "abelha" quanto "Abelha", mas não "Ábelha". Caso deseje-se reconhecer caracteres que encontram-se em uma faixa, podemos utilizar um traço para representar essa indução. A ER "[a-z]belha" reconhece as cadeias "abelha", "bbelha" ... "zbelha". Negação [^] - É útil para excluir caracteres que não desejam ser reconhecidos em uma cadeira. Por exemplo, "[^a]belha" não reconhece a cadeira "abelha", mas reconhece a cadeia "Abelha". Barra vertical | - Tem como objetivo representar disjunção de cadeias completas. Por exemplo, queremos reconhecer tanto "abelha" quanto "zangao". Para isso, podemos utilizar a ER "abelha|zangao". E caso quiséssemos reconhecer ambas variações anteriores podendo começar com letras maiúsculas? Poderíamos utilizar a expressão "[aA]belha|[zZ]angao". As ER "[a|A]belha", "[aA]belha" e "abelha|Abelha" reconhecem as mesmas cadeias. Caracter predecessor opcional ? - Denota que o caracter anteriores ao operador pode aparecer 0 ou 1 vezes. A ER "ab?elha" reconhece tanto "abelha" quanto "aelha". Caracter predecessor 0 ou mais vezes * - Funciona de forma semelhante ao operador anterior, porém, é capaz de reconhecer cadeias em que o caracter anterior ao operador aparece inúmeras vezes. "abelha?" reconhece as cadeias "abelh", "abelha", "abelhaa" e quaisquer outras que possuam recursão do caracter anterior ao operador que, no nosso exemplo, é o 'a' ao final da palavra. Caracter predecessor 1 ou mais vezes + - É quase idêntico ao operador anterior, porém, não reconhece cadeias que não possuam o caracter anterior ao operador. "abelha+" reconhece "abelha", "abelha" e "abelhaaaaaaaaaaaaaaaaaa", mas não reconhece "abelh". Qualquer caracter . - Esse operador permite que reconhecer cadeias que possuam qualquer caracter na posição indicada. ".belha" reconhece "abelha", hbelha", "9belha", "_belha" e qualquer outra variação com alteração do primeiro caracter da palavra. Início de linha ^ - Primeiro de tudo, é importante entender que o operador '^' dentro de colchetes representa a negação e não confundir com a representação de início de linha. Esse operador reconhece somente cadeias que estejam no início de uma linha. "^be", não reconhece a cadeia "abelha", mas reconhece o início da cadeia "bebê". Final de linha $ - Funciona de forma semelhante ao operador anterior, porém, exige que a cadeia reconhecida pela ER esteja no final da linha ao invés do começo. Por exemplo, "abelha$" não reconhece "de acordo com todas as leis da aviação, uma abelha não deveriam conseguir voar", mas reconhece a palavra "abelha" ao final da cadeia "AAAAAAAAA UMA abelha".
Marcelo de Souza Pena A aula 2 de PLN teve como tema expressões regulares. Nos foi mostrado o livro texto da aula, cujo pdf da mais nova versão está disponível na página do professor Jurafsky em sua página na universidade de Stanford. O capítulo 2 fala sobre expressões regulares. O que faremos nas próximas semanas: normalização de texto, divisão em tokens, radicalização e segmentação de frases. Expressões regulares são cadeias de texto especiais para busca e extração de trechos de texto. O primeiro texto de exemplo falava sobre Capivaras. A expressão [cC]apivara representa disjunção, de forma que buscará a palavra capivara com c minúsculo ou maiúsculo, devendo ser escrito entre colchetes. Da mesma forma, pode-se buscar um número ou letra em um intervalo usando hífen para separar o caractere inicial do final, por exemplo um número entre 1 e 9 seria [0-9] e uma letra minúscula entre a e z seria [a-z]. Vimos o site [regex101.com](http://regex101.com/) utilizado para testar expressões regulares. A negação é representada pelo acento circunflexo, de forma que a expressão [^A] buscará qualquer coisa que não seja A. O caractere pipe | é usado como operador ou, o ponto de interrogação ? indica que o predecessor é opcional, o asterisco * indica que o predecessor pode ser repetido zero ou mais vezes, o sinal de mais + indica que o predecessor deve aparecer pelo menos 1 ou mais vezes, o ponto final . substitui um caractere por outro qualquer, o asterisco após um colchete indica que aquele trecho pode ser repetido nenhuma ou várias vezes. Também vimos caracteres para inicio e fim de linha, uso de \ antes de caracteres especiais para usá-los como não-especiais e recebemos uma folha com uma lista de expressões e seus significados. Revimos o conceito de falso positivo/negativo e comosua redução aumenta a precisão ou a cobertura. Testamos várias delas no site antes mencionado e tentamos fazer uma que reconhecesse e-mails. Relembramos que uma ER pode ser representada por uma máquina de estados finita, um automato. Fizemos um teste onde precisávamos criar expressões regulares que selecionassem o que era pedido. A primeira estava dada, as outras 5 pareciam fáceis, consegui desenvolver, mas não acertei totalmente nenhuma delas ao comparar com o gabarito. Faltaram detalhes em todas elas, não lembrei de usar o \b, não percebi a existência do \w e do uso de chaves para repetições, nem do \1. Apesar dos erros, entendi bem o conteúdo. Vimos ainda o Eliza, um chatbot que procura padrões textuais e retorna respostas simulando uma conversa, como o Robô Ed. Vimo um exemplo de código desses chatbots e uma lista de diferentes e bots disponíveis e suas características. Vimos ainda um exemplo de pesquisa feita com expressões regulares: encontrar nomes famosos.
Renato de Avila Lopes Expressões regulares Expressões regulares são utilizadas para extrair trechos em um texto. Comumente usadas para: normalização de texto (padronizar o texto convenientemente), divisão em tokens (divisão em palavras usando os espaços), radicalização (lemmatization, stemming), segmentação de frases (divisão em frases usando a pontuação). Cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto. São sinônimos de expressão regular: Regex, Regexp. Na aula o professor apresentou como exemplo a palavra capivara com c minúsculo e com C maiúsculo. Utilizando a disjunção [cC]apivara atinge-se o objetivo de encontrá-la. As outras disjunções apresentadas foram [0123456789] para qualquer dígito (apenas um caractere). Utilizando [0-9] obtém-se o mesmo efeito, utilizando faixa de caracteres. Alfabeto minúsculo [a-z], maiúsculo [A-Z], faixa de dígitos de 5 a 8 [5-8]. Negação de disjunção: o símbolo do acento circunflexo é usado para negar uma disjunção. [^A-Z] não um caractere maiúsculo, [^Ss] não 'S' nem 's'. Barra vertical: [cC]apivara | [cC]arpincho (capivara, Capivara, carpincho, Carpincho), eu | voce (eu, voce), Outras opções (?*+.), pa?ra \- opcional - (para, pra), aa*h! - zero ou mais vezes - (ah!, aah!, aaah!), o+h! - uma ou mais vezes - (oh!, ooh!, oooh!), ca.a \- qualquer caractere único - (casa, caza, caça) , ^[A-Z] início de linha, a$ final de linha , Erros: falso positivo (identificar cadeias que não deveriam ser identificadas), falso negativo (não identificar cadeias que deveriam ser identificadas). Minimizar falsos positivos aumentando a precisão, minimizar falsos negativos aumentando a cobertura. Desafio: criar uma expressão regular para identificar e-mails: /[\w._%+-]+@[\w.-]+\\.[a-zA-Z]{2-4}/ Uma expressão regular pode ser representada por um autômato finito determinístico. Pode-se usar um AFD para verificar se a expressão regular está bem construída. Sobre o teste de avaliação Em certo ponto da aula o professor entregou um teste de avaliação com seis questões sobre expressões regulares. A primeira questão era um exemplo e já estava respondida. Ela pedia todas as cadeias alfabéticas. /[a-zA-Z]+/ O que o professor havia passado até então foi suficiente para responder as questões com exceção da última, que utilizava o operador grupo, não abordado até então. A segunda questão pedia para selecionar todas as cadeias alfabéticas em minúsculo que terminam com a letra 'm'. /[a-z]*m\b/ A terceira pedia todas as cadeias que começam com um número inteiro no começo da linha e terminam com uma palavra no final da linha. /^[0-9]+\b.*\b[a-zA-Z]+$ ou ^\d\b.*\b\w+$/ Quarta questão pedia todas as cadeias alfabéticas tenham 'gato' ou 'cachorro'. /gato | cachorro/ Quinta: 'gato gato' ou 'cachorro'. /(gato\s?){2} | cachorro/ Na última questão pedia-se para encontrar duas palavras repetidas consecutivas. /\b(\w+)\W+\1/
Rodolfo Azevedo Dos Santos Expressões Regulares (Regular Expression – RE), também são chamadas de Regex. Podem ser utilizadas para extrair trechos (ou palavras) a partir de textos. Podem ser utilizadas para: 1) Normalização de textos (Ex: Padronizar o texto, ou seja, padronizar as palavras) 2) Divisão em Tokens 3) Radicalização 4) Separação de frases ER: São cadeias de texto para buscar/extrair trechos de um texto. Aplicação: Procurando por padrões textuais Exemplo: Buscar por capivara OU Capivara: [Cc]apivara => Neste exemplo, extrai-se em um texto ambas as palavras: Capivara ou capivara. 1) Disjunções: A cadeia entre colchetes/parênteses retos especifica uma disjunção para a busca [Cc] apivara = Capivara Ou capivara [01234567890] =Qualquer dígito (apenas um dígito) [0-9]: Qualquer dígito (Apenas um dígito) [a-z] :Qualquer caractere de a—z (apenas um caractere) 2) Negação: Significa negação do que está dentro dos colchetes (^) . Ou seja, é utilizado para negar uma disjunção É valido apenas entre colchetes [^A-Z] : NÃO é um caractere em maiúscula [^0-9]: NÃO é um dígito 3) Barra vertical | (pipe) : É a junção de duas ou mais disjunções [Cc] apivara | [Cc] arpincho = Capirava / capiravara / carpincho/ Carpincho eu | tu | eles = eu / tu / eles 4) ? : Caractere predecessor opcional. Ex: pa?ra = para /pra *: Caractere predecessor 0 ou mais vezes: Ex: aa*h = ah/ aah/ aaaaaaaaaah + : Caractere predecessor 1 ou mais vees. Ex: 0+h = oh / oooh/ oooooh . : “Qualquer caractere/dígito”. Ex: Ca.a = Casa/ caza/ caça/ cara 5) Caracteres âncoras : ^: Fora dos colchetes indica início de linha. Ex. ^[A-Z] = São Paulo $: Final de linha. Ex: e$ = Estudante \\. : Indica que o caractere sucessor não é especial Site: regex101.com é um site para testar expressões regulares. Utilizar o padrão gm. Existem dois tipos de erros ao utilizar Regex: 1) Falso positivo: Identificar cadeias de texto que não deveriam ser identificadas. 2) Falso positivo: Não identificar a cadeia de texto que deveria ser identificada. Ex: Ao buscar a cadeia “para”: Falso positivo: Identificar Parabéns/ Para-brisa e não identificar apenas o “para”. Para minimizar falsos positivos é necessário aumentar a precisão Para minimizar os falsos negativos é necessário aumentar a cobertura. Máquina de estados finita: Uma Regex pode ser representada como um autômato finito determinístico. Com isso é possível verificar se a ER está bem construída. Teste de avaliação em aula: 1) Selecionar todas as cadeias alfabéticas: [a-ZA-Z]+ 6) Selecionar todas as cadeias com duas palavras repetidas: \b(\w+)\W+\1 ER: Por padrão utilizam estratégias greedy (gulosas). Operador ? serve para modificar o * ou + Exemplo prático: Eliza Um dos primeiros sistemas PLN. Procura por padrões textuais na conversa e responde com uma substituição desses padrões. Ou seja, procura frases e as responde com as substituições previamente programadas. (Criando uma ilusão de entendimento)
Felipe de Campos Mesquita O tema da aula dois sobre Expressões Regulares (ER, ou do inglês, RE – Regular Expression), também conhecido pelo sinônimo do inglês Regex. Regex é uma sequência de caracteres que define um padrão de busca e podem ser usadas para extrair textos. São comumente utilizadas para normalização de texto (padronizar o texto convenientemente), divisão de tokens (elementos formados por caracteres que formam algum sentido), radicalização (lemmatization, stemming) e segmentação de frases (divisão em frases usando pontuação). Regex possui um padrão de formação para reconhecimento de textos. Alguns dos conceitos de formação de uma expressão regular são: Ancoras ^ e $, para identificar, respectivamente, a cadeia pedida no começo da linha e no final da linha. Quantificadores * + ? {} indicam quantas vezes queremos a instância do caractere ou grupo, os símbolos fazem a quantificação da cadeia, respectivamente, para zero ou mais vezes (*), uma ou mais vezes (+), zero ou uma vez (?) e quantidade exata de vezes ({n}), podendo usar {n,} para indicar a quantidade mínima de vezes e {n ,m} faz a quantificação de n até m. O operador | (“pipe” em inglês) funciona como operador OU, que faz a identificação de uma cadeia do que está ante ou depois do pipe, os colchetes [] também indicam o operador OU com todas as opções dentro dos colchetes. Também temos os indicadores de range de caracteres, com suas abreviações (\d para o range [0-9], \D para não dígitos [^0-9], neste caso temos o uso da negativa usando ^ dentro dos colchetes, entre outros). O ponto em expressões regulares indica qualquer caractere e os parênteses indicam o agrupamento. Existem outras instruções e composições para fazer um regex. Sobre o teste da avaliação, o intuito era resolver alguns problemas simples de regex, mas que poderiam apresentar alguma questão interessante ou de reflexão quanto a falsos positivos (quanto identificamos cadeias que não deveriam ser identificadas) e falsos negativos (quando não identificamos cadeias que deveriam ser identificadas). Também foi visto na aula que minimizar os falsos positivos pode ser feito aumentando a precisão (que são as cadeias verdadeiramente positivas dividido pelas cadeias identificadas) e para minimizar os falsos negativos podemos aumentar a cobertura (que é o recall, as cadeias verdadeiramente positivas dividido pela soma dos falsos negativos com as cadeias verdadeiramente positivas). A bibliografia da aula é o livro (especialmente capítulo 2) Speech and language processing: An intruduction to natural language processing, computational linguistics, and speech recognition (de Daniel Jurafsky, professor de linguística e ciência da computação em Stanford University e James H. Martin, professor de ciência da computação em University of Colorado, ambos boas referências para se pesquisar sobre o assunto de Processamento de Linguagens Naturais), a terceira edição draft do livro pode ser baixada diretamente da página de stanford do livro.
Gustavo Murayama O conteúdo abordado na segunda aula foi sobre Expressões Regulares (Regular Expressions ou RegEx). São definidas como cadeias de textos especiais escritas em uma linguagem formal para busca e extração de trechos de texto e geralmente utilizam algoritmos gulosos. São comumente usadas para normalização de texto, divisão de tokens, radicalização e segmentação de frases. Uma RegEx pode ser representado por uma Máquina de Estados Finita ou por um Autômato Finito Determinístico. Foram apresentados alguns padrões de expressões regulares em aula para selecionar uma combinação de caracteres. A primeira, a disjunção, é especificada por uma cadeia de caracteres entre colchetes/parênteses para busca. Se entre colchetes, indica “qualquer caractere especificado dentro do colchetes’, se entre parênteses, significa uma captura de grupo. Um exemplo de faixas de caracteres: [0-9], que representa apenas 1 dígito que pode variar de 0 até 9. A negação de disjunções, representada pelo símbolo de acento circunflexo, busca apenas o primeiro caractere válido que satisfaça a condição da negação da disjunção: [^A-Z], dado a frase “Ciência”, retornará apenas o caractere “i”. A barra vertical representa que será selecionado a expressão tanto da esquerda quanto da direita caso seja encontrada no texto. O caractere especial ? (interrogação) indica que o caractere predecessor é opcional. O * (asterisco) indica que o caractere predecessor pode ser repetido 0 ou mais vezes. O + (mais), que o predecessor pode ser repetido 1 ou mais vezes. Já o . (ponto), que pode ser qualquer tipo de caractere exceto o de nova linha. Os caracteres de âncoras, ^ (acento circunflexo) e $ (cifrão) indicam o início de linha e final de linha, respectivamente. Por exemplo, ^UFABC$ irá retornar uma frase contendo exatamente “UFABC”. Quando tratamos dos possíveis tipos de erros que podemos cometer ao criar uma expressão regular, temos dois tipos: o falso positivo e o falso negativo. Falso Positivo identifica cadeias que não deveriam ser identificadas, já o Falso Negativo não identifica cadeias que deveriam ser identificadas. Em Processamento de Linguagem Natural, devemos lidar e minimizar esses erros. A minimização de falsos positivos aumenta a precisão do algoritmo e a minimização dos falsos negativos aumenta a cobertura do que será identificado pelo algoritmo. O teste aplicado na aula pedia para criar expressões regulares dada certas condições impostas. O primeiro exercício era para selecionar todas as cadeias alfabéticas, então a resposta era [a-zA-Z]+. Foram seis questões ao todo com variação na dificuldade de criação nas RegEx. O objetivo do teste era demonstrar esses diferentes níveis e possíveis abordagens que poderiam ser utilizadas para resolver as questões. Ao final da aula, foi apresentado um chat bot chamado “Eliza”, que foi um dos sistemas pioneiros em PLN, e uma pesquisa científica utilizando RegEx.
Laura Cestavo Borges Dos Santos Expressões regulares (ER ou RE) são cadeias de texto especiais, em uma linguagem formal usadas para extrair trechos a partir de textos, ou seja, é uma linguagem de busca de padrões. Essas cadeias ditam um padrão, o qual é passado pelo texto alvo. São frequentemente utilizadas no primeiro passo de qualquer processamento de texto. As expressões regulares possuem algumas operações/padrões. Temos a disjunção, por exemplo, que é apresentada entre parênteses, como em [Cc] qye indica que podemos buscar por c ou C. Dentro da disjunção é possível ter “intervalos”, como [A-Z], que indica que a busca procura por um caractere em maiúscula, tais intervalos podem ser feitos para letras maiúsculas e minúsculas e também números de 0 a 9 ou a combinação de todos. Dentro da disjunção pode haver uma negação, representada pelo ^ após a [. Outros símbolos usados para expressões regulares são: |, ?, *, + e . . A | indica ou, ? indica que o caractere predecessor é opcional, * indica que o caractere predecessor pode ocorrer 0 ou mais vezes, + indica que o caractere predecessor pode ocorrer 1 ou mais vezes e o . indica que pode ser qualquer caractere individual. Existem alguns outros símbolos, os quais não serão citados nesse resumo, mas foram apresentados em aula e estão contidos na folha entregue para a realização da atividade. Existem dois tipos de erros envolvidos com as ER, falso positivo, onde identifica cadeias que não deveriam ser identificadas, e o falso negativo, que não identifica cadeias que deveriam ser identificadas. Falsos positivos são minimizados aumentando a precisão e os negativos, aumentando a cobertura. ERs podem também ser representadas por autômatos finitos determinísticos e criar um autômato com base na expressão regular é uma boa forma de verificar se ela está bem construída. Um exemplo prático de uso, é a Eliza que foi um _chatbot_ que simulava um terapeuta e usava PLN. Ela procurava padrões na conversa e respondia através de uma substituição desses padrões, dessa forma “fingindo” uma conversa. A Eliza foi um projeto pioneiro, mas diversos outros surgiram depois dela. Para testar os conhecimentos de expressão regulares descritos acima e vistos em aula, foram realizados seis exercícios em sala. O primeiro exemplo já estava feito e era o mais simples. Cada exercício consistia em uma descrição do que a expressão regular deveria fazer, ou seja, do que deveria reconhecer, e alguns continham exemplos de aceitação/negação. A partir da descrição, cada aluno deveria escrever a expressão regular. No final da aula, todos os exercícios foram corrigidos e em alguns casos, o professor testou em um site de expressões regulares. Todas as questões tinham tipos de respostas bem diferentes, o que permitiu treinar o uso de diversos símbolos de expressões regulares.
Paula Keiko Miyashita A segunda aula da disciplina de Processamento de Linguagem Natural abordou Expressões Regulares. Expressões Regulares são cadeias de texto, escritas em uma linguagem formal, para busca e extração de trechos de textos, estas são comumente usadas para normalização de texto, divisão em tokens, radicalização e segmentação de frases. Podemos nos referir às Expressões Regulares como Regex. Disjunções são especificadas utilizando colchetes (‘[‘ e ‘]’), os caracteres dentro dos colchetes indicam os valores que são aceitos. Pode-se criar a negação de disjunções ao colocar o símbolo ‘^’ dentro dos colchetes como primeiro caractere, desta maneira são aceitos todos os símbolos menos os especificados dentro dos colchetes. A barra vertical ‘|’ funciona como ‘ou’ na composição de uma Regex, o ponto de interrogação ‘?’ indica que o caractere predecessor a ele é opcional, o asterisco ‘*’ indica que o caractere antecessor pode aparecer 0 ou mais vezes, o sinal de positivo ‘+’ indica que o caractere antecessor deve aparecer uma ou mais vezes e, finalmente, o ponto ‘.’ indica a que qualquer caractere pode ocupar esta posição. Podemos utilizar caracteres âncora para especificar o começo e final da linha. O circunflexo ‘^’ fora do colchete, indica que a condição seguinte deve estar no começo da linha e o sinal de cifrão ‘$’ indica o final da linha, a condição especificada antes do cifrão deve ser a última da linha. Em seguida foram demonstrados alguns exemplos no site regex101. Ao utilizar expressões regulares, encontram-se dois tipos de erro: Falso positivo (quando o Regex identifica cadeias que não deveriam ser identificadas) e Falso negativo (quando o Regex deixa de identificar cadeias que deveriam ser identificadas). Para minimizarmos os falsos positivos devemos aumentar a precisão e para minimizarmos os falsos negativos devemos aumentar a cobertura. Expressões Regulares podem ser representadas por máquinas de estado finito, uma Regex bem construída deve ser representável por um autômato finito determinista. Para testar o aprendizado de expressões regulares, foi realizado um pequeno teste durante a aula, uma folha com seis exercícios para definir expressões regulares que capturassem o que o enunciado pedia. As respostas para os exercícios foram discutidas após dado devido tempo para sua realização. Expressões Regulares, por padrão, utilizam a estratégia gulosa, ao utilizar o operador ‘?’ junto com ‘*’ ou ‘+’, modificamos sua estratégia para não-gulosa. Um exemplo prático de Regex é a Eliza, um programa que mantém conversas limitadas com o usuário. A Eliza procura por padrões textuais na pergunta do usuário para gerar respostas genéricas, mas que façam o mínimo de sentido, dando uma ilusão de entendimento. Pode-se dizer que Eliza responde como uma terapeuta. Para finalizar a aula, foi apresentada uma pesquisa que utilizou Expressões regulares para identificar pessoas importantes em publicações científicas.
Thiago Henrique Gomes Panini Na segunda aula de Processamento de Linguagem Natural, foram introduzidos os fundamentos que regem as expressões regulares. Motivado pela procura de padrões textuais para extrair trechos específicos de textos que seguem determinada lógica, o estudo das expressões regulares (regex ou regexp) podem ser definidas como cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto. Entre as funcionalidades de expressões regulares introduzidas na aula, encontram-se: 1. Disjunções [ ] : expressões responsáveis por incluir faixas de caracteres na consulta Exemplo: a expressão [a-z] procura na expressão um caractere minúsculo entre a e z; 1. Negação em Disjunções ^: o símbolo do acento circunflexo nega uma disjunção Exemplo: a expressão ^[a-z] procura tudo que não seja um caractere minúsculo entre a e z; 1. Barra Vertical | : essa expressão funciona como uma lógica OU entre as expressões. Exemplo: eu|voce procura na expressão pelas frases “eu” ou “você”; Existem diversos outros parâmetros e outras expressões regulares que realizam diversas outras procuras em trechos. Durante a aula, foram realizados diversos exercícios práticos através do site , sendo este responsável por apresentar uma excelente interface para testes em expressões regulares. Nesse site, o professor Jesus Mena aplicou e demonstrou exemplos de todas as expressões aprendidas em aula, elucidando dicas e informando sobre possíveis dificuldades durante as implementações. Em uma segunda parte da aula, foram introduzidos conceitos sobre os possíveis Tipos de Erros. O erro do Tipo 1 relaciona os exemplos classificados como Falsos Positivos que, em outras palavras, podem ser definidos como exemplos classificados dentro da classe positiva sem que estes pertençam a classe positiva. O erro do Tipo 2 refere-se a exemplos dados como Falsos Negativos, sendo estes definidos por amostras pertencentes a classe positiva mas classificadas erroneamente dentro da classe negativa. Dentro destes conceitos, foram apresentadas métricas que relacionam os Falsos Positivos, Falsos Negativos, Verdadeiros Positivos e Verdadeiros Negativos, denominados Precision e Recall. Tais métricas definem, respectivamente, a minimização das taxas de falsos positivos e falsos negativos. Existem outras métricas que relacionam Precision e Recall (f1_score, por exemplo) e podem ser utilizadas para avaliação de modelos de classificação (expressões regulares, de fato, classificam trechos textuais). Em seguida, foi apresentada na aula conceitos de Máquina de Estados Finita para exemplificar expressões regulares. Um teste com algumas questões foi aplicado em sala de aula com o objetivo de fixar o conhecimento sobre algumas técnicas de expressões regulares. Em um exemplo prático, o professor apresentou um dos primeiros sistemas de chatbot criados: Eliza. O segundo exemplo prático bem conceituado é o de aplicação de expressões regulares para identificação de pessoas importantes dentro de artigos científicos.
Carlos Eduardo Ramos Expressões regulares são definidas a partir de um conjunto de operações de concatenação, união e operação estrela (concatenação sucessiva), As ER estão relacionadas a uma linguagem formal e um autômato finito pode expressar uma expressão regular. A motivação para estudar esta área do conhecimento é a facilidade em criar expressões para a busca de padrões textuais. Diversas aplicações usam de expressões regulares para validação de dados, extração de dados e etc. No aspecto do desenvolvimento, elas também servem para normalização de textos, divisão de texto em tokens, radicalização, etc. As expressões regulares possuem operadores que podem compor a expressão, ao passo que estes operadores se referem sempre ao caracter anterior na cadeia ou a expressão regular anterior. O conceito de disjunção traz a ideia da lógica booleana "ou", quando a expressão regular possui caracteres entre colchetes, como [abc] - que aceita qualquer um dos caracteres entre 'a', 'b' ou 'c'. O conceito de Negação é através de do simbolo ^, por exemplo: [^a-z] - não permite nenhum caracter do alfabeto. Já para usar a disjunção entre expressões regulares, usamos o | , por exemplo: (casa)|(apartamento) é uma expressão regular que aceita cadeias que contenham as palavras casa ou apartamento. Para admitir alguma cadeia de caracteres opcionais, podemos usar o operador ? - que admite exatamente uma ou nenhuma expressão regular conforme a anterior. Exemplo, colou?r admite a cadeia colour ou color. A operação de concatenação pode ser usada em uma expressão regular, onde o numero de concatenações da expressão regular é zero ou mais. Esta operação é feita com o operador *. Por exemplo a* associa aaa, aa, etc. Analogamente, para usar a concatenação de expressões uma ou mais vezes, usamos +. Um caracter qualquer pode ser definido em uma expressão regular usando o simbolo '.'. Temos também os caracteres âncora, que podem ser usados para buscar o casamento de cadeias com inicio ou final de uma linha. Para inicio de linha, usamos ^ - fora dos colchetes como na negação. Já para final de linha, usamos o $. O site Regex 101, disponível em: https://regex101.com/ apresenta uma maneira de testar as expressões regulares criadas. O mesmo permite a inserção de casos de teste para verificar se o casamento das cadeias ocorre. Como por exemplo, testar uma expressão regular que apresentasse o casamento com e-mails válidos. Por fim, fizemos um teste de Avaliação sobre expressões regualres. O teste envolveu a criação de ER's. A questão mais difícil foi a última, onde a expressão regular deveria casar cadeias com repetidas consecutivas. Ex.: casa casa..
Tiago Suzukayama Expressões Regulares Expressões Regulares (Regex) Podem Ser Utlizadas Para Extrair Trechos A Partir De Texto. São Utilizadas Para: Normalização De Texto, Divisão De Tokens, Radicalização E Segmentação De Frases. Regexs Podem Ser Definidas Como Cadeias De Texto, Estruturadas Em Uma Linguagem Formal, Para Busca E Extração De Trechos De Um Texto. Especificações Da Linguagem 1) Disjunções: Representado Pelo Padrão '[$Var]', Serve Para Buscar Um Caractere Que Se Encaixa Nas Regras Definidas. Ex: [Cc] Vai Selecionar Todos Os Caracteres 'C' Ou 'C'. 2) Negação Em Disjunções: Nega A Disjunção, E Busca Todos Os Caracteres Que Se Encaixam Nas Regras Definidas. Ex.: [^Cc] Vai Selecionar Todos Os Caracteres Que Não São 'C' E 'C'. 3) Barra Vertical Em Disjunções: O Símbolo | Serve Para Buscar Cadeias De Caracteres Em Palavras. Ex.: [Voce|Eu] Irá Buscar As Cadeias 'Voce' E 'Eu' 4) Outras Opções: O Símbolo '?' Serve Para Indicar Um Caractere Opcional. Ex.: Pa?Ra Retornará 'Para' E 'Pra'; O Símbolo '*' Serve Para Indicar Um Caractere Que Pode Ser Repetido De 0 A N Vezes. Ex.: A*H! Retornará 'H!', 'Ah!', 'Aah!', Etc. O Símbolo '+' Serve Para Indicar Um Caractere Que Pode Ser Repetido De 1 A N Vezes. Ex.: A+H! Retornará 'Ah!', 'Aah!', 'Aaah!', Etc. O Símbolo '.' Indica Qualquer Caractere. Ex.: A.H! Retornaá 'Aah!', 'Abh!', 'Ach!', Etc. 5) Caracteres Âncoras: Os Símbolos '^' E '$' Indicam O Ínicio E O Fim De Uma Linha, Respectivamente. Ex.: ^[A-Z] Retornará Todo Caractere De A A Z No Ínicio De Uma Linha. Em PLN, sempre devemos lidar com 2 tipos de erros: falsos positivos, onde seu algoritmo identifica cadeias que não deveriem ser identificadas, e falsos negativos, onde o seu algoritmo não identificar cadeias que deveriam ser identificadas. Ao minimizar os falsos positivos, aumentamos nossa precisão. E ao minimizar os nossos falsos negativos, aumentamos nossa cobertura. Avaliação 1) Selecionar todas as cadeias alfabéticas: [a-zA-Z]+ 2) Selecionar todas as cadeias alfabéticas (em minúscula) que terminam com a letra 'm': [a-z]*m\b 3) Selecionar todas as cadeias que começam no início da linha cum um número inteiro e que termiam no final da linha com uma palavra: ^\d+\b.*\b\w+$ 4) Selecionar todas as cadeias alfabéticas quemm tenham as palavras 'gato' ou 'cachorro': (gato)|(cachorro) 5) Selecionar todas as cadeias alfabéticas que tenham as palavras 'gato gato' ou 'cachorro' (gato\s){2}|(cachorro) 6) Selecionar todas as cadeias com duas palavras repetidas consecutivas: \b(\w+)\W+\1
Amanda Cruz Francesconi Expressões regulares (RE) também conhecidas como Regex ou Regexp, são cadeiras de texto especiais organizados através de uma linguagem formal, elas são utilizadas para se buscar ou extrair fragmentos de um determinado texto. Algumas das aplicações são: normalizaçao do texto, divisão em tokens, radicalização (por exemplo, as palavras casamento, casa, casar, tem o mesmo radical "casa") e segmentação de frases (utilizando por exemplo pontuação ou espaçamento). As ER são sempre o primeiro passa para qualquer processamento de texto e o resultado é utilizado em classificadores de técnicas de aprendizado de máquina. A seguir algumas das regras e exemplos de ER. 1. Disjunção Pode ser representada de duas maneiras: a) [Cc]apivara b) Capivara | capivara Ambas configurações geram o mesmo resultado, é feita uma busca no texto e o retorno é positivo se a palavra "capivara" é encontrada, independente de começar com letra maiúscula ou minúscula (nesse caso). Também é possível escolher faixas de caracteres utilizando os colchetes, por exemplo: [1234] encontrará no texto algum número de 1 a 4, considerando que a resposta seja somente 1 algarismo (1 OU 2 OU 3 OU 4). O caracter especial ^ dentro do colchetes indica negaçao, ou seja [^a] identificara todos os caracteres que não forem a letra a minúscula. 2. Símbolos especiais ? caracter antecessor é opcional * caracter antecessor pode aparecer zero ou mais vezss + caracter antecessor deve aparecer pelo menos uma vez . na posição em que o ponto está, pode ser equivalente a qualquer caracter Existem dois tipos possíveis de erro considerando a classificação utilizando expressões regulares, o falso positivo em que uma cadeira de caracteres é identificada porém ela não deveria estar sendo identificada e o falso negativo, em que uma cadeia que deveria ser identificada, não é. Para se minimizar o primeiro, é necessário aumentar a precisão (calculada como os verdadeiros positivos dividido por todos os positivos identificados), já para o segundo a métrica utilizada é a cobertura (verdadeiros positivos divididos por todos os positivos identificados ou não). Nas ER são utilizadas por padrão estratégias gulosas, ao se colocar um ponto de interrogaçao após os operadores * ou +, a estratégia é alterada para nao gulosa. Um dos primeiros sistemas de PLN implantados foi o chatterbot Eliza, uma simulaçao de terapeuta que procura padrões textuais na conversa e os replica, imitando respostas. Eliza foi um sistema pioneiro, atualmente temos sistemas bem desenvolvidos utilizando o mesmo conceito base de expressões regulares.
Iasmin de Haro Pracchias Na aula do dia 06/06 o professor introduziu e desenvolveu o tópico que trata de Expressões Regulares (regex ou regexp), que em Ciência da Computação são expressões que permitem identificar caracteres específicos de interesse no texto, como por exemplo, palavras, caracteres particulares ou ainda padrões de caracteres. O capítulo 2 do livro de Jurafsky e Martin, Speech and Language Processing, foi utilizado como referência para o conteúdo da aula. O professor mencionou as principais aplicações das expressões regulares, que são utilizadas em procedimentos como normalização de texto, divisão em tokens, radicalização e segmentação de frases, tópicos que serão estudados ao decorrer do quadrimestre. Foi apresentado o conceito de Disjunções que consistem de um caractere ou uma cadeia de caracteres delimitadas por colchetes e que especifica uma disjunção de caracteres a ser buscada em um texto, como por exemplo, a disjunção [bB] na expressão regular [bB]ola executará uma busca tanto pela palavra 'bola' como para a palavra 'Bola'. utilizando o caractere '-' dentro dos colchetes também é possível especificar uma faixa de caracteres, como por exemplo a expressão regular [5-9] fará uma busca no texto pelos caracteres de 5 a 9. Quando acrescentado um acento circunflexo à disjunção, ocorrerá uma negação como por exemplo se utilizarmos a expressão regular [^a-z] a busca ignorará todos os caracteres alfabéticos de 'a' a 'z' que sejam minúsculos. Ainda foram apresentadas outras opções de caracteres especiais para auxiliar na construção das expressões regulares, como ?, *, +, ou, ., sendo que o caractere '?' quando utilizado indica que o caractere predecessor é opcional, '*' indica que o caractere predecessor aparece 0 ou mais vezes, '+' indica que o caractere predecessor aparece uma ou mais vezes, e por fim '.' indica a possibilidade de uso de qualquer caractere. Ainda nesta aula foram feitos alguns testes utilizando o website regex101.com que permite testar expressões regulares, e apenas para fins de prática foi solicitado que a turma tentasse criar uma expressão regular que pudesse identificar e-mails. Após a tentativa o professor apresentou uma das possíveis respostas. Foi feito um teste de avaliação referente ao conteúdo da aula, sem valer nota, e posteriormente sua correção. Por fim o professor nos apresentou o chatterbot Eliza, que utiliza-se de busca por padrões no texto para simular as respostas de um psicólogo a seu paciente, conseguindo assim responder satisfatoriamente uma conversa simples.
Arthur Veloso Kamienski A segunda aula de PLN teve como objetivo a introdução do conceito de expressões regulares. Expressões regulares (também chamadas de "regex", do inglês "Regular Expressions") são linhas de texto com um significado especial, que indicam uma forma de processar textos de maneira automática. As expressões regulares podem ser entendidas como fórmulas que permitem encontrar trechos pré-definidos dentro de textos, possibilitando sua identificação e extração. Expressões regulares são especialmente úteis para (i) a normalização de textos não estruturados, (ii) a divisão de textos em tokens (palavras com significados especiais), (iii) a radicalização de textos (isto é, a redução de suas palavras para sua menor parte, também chamada de raíz), e (iv) para a segmentação do texto em frases. Uma expressão regular é dada por um conjunto de caracteres. Ao se fornecer uma expressão regular a um programa de identificação de expressões regulares (como por exemplo o GREP, ou Global Regular Expression Printer), o programa fará uma busca pelo texto, encontrando qualquer trechos que se encaixem à expressão. Ao se escrever uma sequência de caracteres, por exemplo, o programa encontrará trechos do texto contendo exatamente aquela sequência. As expressões regulares podem ser expandidas com o uso de dijunções (denotadas por colchetes), que denotam um conjunto de caracteres que podem ser utilizados em alguma posição da sequência definida pela expressão. A expressão regular "[Cc]apivara", por exemplo, indica que ambas as letras "C" e "c" podem ser utilizadas na primeira posição da palavra. Expressões regulares permitem, ainda, o uso de outros modificadores como o de negação (indicado por um acento circunflexo na primeira posição da disjunção), que indica que um conjunto de caracteres não pode aparecer em uma sequência. Outros exemplos são o modificador de range, indicando um conjunto de caracteres de um determinado intervalo (como de "a" à "z"), modificadores de repetição (como "*", "+" e "?"), entre outros. Ao final da aula uma pequena avaliação foi realizada para testar os conhecimentos aprendidos em aula. O teste, apesar de simples, mostrou a importância do uso de símbolos para denotar o final de uma palavra ("\b"), e também apresentou uma técnica de "memória" em expressões regulares, na qual sequências de caracteres identificadas anteriormente (dentro de um grupo denotado por parênteses) são utilizadas novamente com o uso de indicadores de posição (como "\1" para indicar o primeiro grupo encontrado).
Guilherme Oliveira da Silva Resumo aula 2 Guilherme Oliveira, RA: 11093713 A aula uma introdução aos conceitos e fundamentos de expressões regulares iniciou-se com a discussão de padrões de textos como por exemplo a palavra capivara que pode ser buscada tanto com c maiúsculo como com c minúsculo, verificou-se que ambos temos o mesmo resultado de busca contudo como definir isso no código daí se iniciou os conceitos de expressões regulares com as disfunções ou seja com a entrada de uma sintex que permite a busca da palavra tanto com c maiúsculo como com c minúsculo. A partir ir desse ponto entrou-se nos conceitos expressões regulares iniciando pela disjunção que é quando você consegue buscar uma mesma palavra que contém uma diferenciação na letra como no caso do C maiúsculo e do C minúsculo. Também foi visto a negação das disjunções representado pela syntax do acento circunflexo no início da palavra representando a negação do termo, alguns exemplos foram vistos E então professor ligou o retroprojetor para praticar um pouco de expressões regulares para que os alunos pudessem ver como funcionava na prática utilizando esse aparato o professor continuou a aula mostrando mais alguns casos de disjunções, a barra vertical que basicamente representa o "ou" ou seja quando programa for procurar no texto a expressão regular ele procurará ou pela primeira palavra ou pela segunda ou pelas demais palavras que estiverem sido divididas por barras, foi visto também alguns outros símbolos especiais e suas funcionalidades a aula foi bem dinâmica pois era exemplificado pelo professor cada um se especiais enquanto no programa que por ele foi apresentado ele praticava e mostrava os alunos os resultados de cada símbolo especial. Também foi comentado brevemente dois tipos de erros os falsos positivos e os falsos negativos. Um identifica cadeias que não deveriam ser identificadas e o outro não identifica cadeias que deveriam ser identificadas após a explicação do professor distribuiu uma folha de atividade em que praticamos alguns exercícios de expressões regulares com os poucos conceitos que aprendemos o objetivo foi a fixação do conteúdo enquanto aprendíamos como resolver esse tipo de problema coisa atividade foi abordado brevemente dois tipos de conceito o código guloso eu não guloso um pega a maior cadeia a fim de obter o maior resultado o outro a menor cadeia possível.
Rodrigo San Martin Ignacio Gomes A descrição de padrões de texto é um passo essencial para o processamento de linguagem natural (PLN). Para tal, são utilizadas expressões regulares (ER), que são utilizadas em praticamente todas linguagens computacionais. Após determinar a notação algébrica que indica um padrão, a busca por ER percorre o corpo de texto, retornando todos locais do texto que casam com o padrão. Uma ER pode desde indicar buscar por caracteres específicos, palavras ou padrões mais complexos. Também pode retornar todos os padrões encontrados ou apenas o primeiro. As ER mais simples são as buscas por caracteres exatos, como a expressão /cadeira/, que buscará apenas pela palavras cadeira no texto. É importante notar que ela é sensível a maiúsculas e minúsculas, portanto as expressões /Carro/ e /carro/ retornam resultados diferentes. A solução para esse problema é a especificação de disjunções, que indicam que a expressão é verdadeira para qualquer um dos caracteres dentro de parênteses. Assim, /[Cc]arro/ retorna tanto Carro, como carro. Outra expressão básica é a indicação de sequências alfanuméricas dentro da disjunção, como /[0-9]/, representando /[0123456789]/. Do mesmo modo, /[a-z]/ representa o alfabeto, mas somente minúsculas. Para uma busca por todos caracteres, o range para maiúsculas também deve ser indicado. Assim /[a-zA-Z]/ buscam qualquer letra do alfabeto, não importado se é maiúscula ou minúscula. O circunflexo na primeira posição de uma disjunção indica negação da expressão, assim /[^a-z]/ nega todas alfanuméricas minúsculas. Outro caractere útil é a interrogação, que tem a função de representar um padrão que indica o caractere precedente ou nada. Por exemplo, /carros?/ procura por carro ou carros. Mais caracteres básicos importantes são o asterisco, que indica zero ou mais ocorrências do caractere ou ER precedente e o símbolo "mais" que indica uma ou mais repetições do caractere ou ER precedente. Um caractere muito importante é o ponto, que casa com qualquer caractere único. Por fim, as âncoras são caracteres que ligam ERs a posições específicas numa string, como o circunflexo, que marca o início e uma linha; o cifrão que marca o final de uma linha; o \b que representa delimitação de limite de palavra e o \B que marca um não limite.
Marcela Akemi Yamashita Esta aula aborda o tema de expressões regulares. Expressões regulares(ou regex, regexp) são uma sequência de caracteres, em uma linguagem formal, que definem um padrão de busca e podem ser utilizadas para extrair trechos a partir de texto. São utilizadas, frequentemente, como primeiro passo para qualquer processamento de texto. As regex são comumente empregadas para padronização de textos, divisão de palavras usando espaços, radicalização(encontrar a raíz da palavra) e divisão em frases utilizando a pontuação. Seus resultados são também utilizados em classificadores de técnicas de aprendizado de máquina. As regex utilizam diversas técnicas para formação de padrões de palavras. Nesta aula as principais abordadas foram: 1. Disjunção. Cadeia de caracteres entre colchetes. Exemplo: [cC]apirava irá buscar tanto por ‘capirava’ quanto ‘Capirava’. [0-9] irá buscar por um dígito entre 0 e 9. 2. Negação em disjunções: [^a^] negação de ‘a’ e ‘^’ 3. Barra vertical “I”, utilizada como OU lógico Durante as buscas podem haver dois tipos de erros: 1. Falso positivo: se identifica cadeias que não deveriam ser identificadas. Recomenda-se aumentar a precisão para diminuí-los. 2. Falso negativo: deixa de se identificar cadeias que deveriam ter sido identificadas. Recomenda-se aumentar a cobertura para diminuí-los. Uma regex pode ser representada ou descrita por um autômato finito determinístico (uma máquina abstrata que possui um número finito de estados). Para verificar se uma regex está bem elaborada, pode-se representar sua instrução através de um autômato finito determinista. As regex podem ser do tipo greedy(gulosas) ou non-greedy(não-gulosas). As greedy utilizam os operadores ‘*’ ou ‘+’ e irão consumir o máximo possível de um padrão, ainda permitindo que o resto da regex continue identificando, exaurindo todas as possibilidades. Para impedir que isso ocorra, adiciona-se o operador ‘?’ às regex para modificá-las, impedindo que isso aconteça e a regex se torne non-greedy. Eliza foi um chatbot e um dos primeiros sistemas PLN, programado para manter uma conversa superficial com o usuário, retornando as respostas em forma de perguntas. É possível reproduzir sua forma simples em um código python demonstrado pelo professor.
Brian Alves Andreossi Aula 1 Expressões Regulares Expressões Regulares são cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto. São comumente utilizadas para: Normalização de texto (padronizar o texto convenientemente) Divisão em tokens (divisão em palavras separadas por espaços) Radicalização (Diminuir palavras no menor prefixo possível) Segmentação de frases (Divisão em frases usando a pontuação) Exemplo de uso Suponha que gostaríamos de procurar pelas ocorrências de "Capivara" ou "capivara" em algum texto. Uma possível expressão regular que satisfaria essa condição é: [cC]apivara A seguir, podemos observar mais características sobre Expressões Regulares: 1\. Disjunções: A cadeia de caracteres entre colchetes especifica uma disjunção de caracteres para a busca. | [cC]apivara | Capivaracapivara| | [1234567890] ou [09]| Uma ocorr?ncia de qualquer dígito | | [az] | Uma ocorrência dequalquer caracter entre a e z, minúscula | | [az] | Uma ocorrência dequalquer caracter entre a e z, maiúscula | 2\. Negações em Disjunções: Símbolo circunflexo (sempre dentro de colchetes) representa que será conferido a nãoocorrência do padrão descrito | [^AZ] | Uma ocorrência de qualquer caracter que não seja A, B ... Z | |[^sS] | Um caracter que não seja s ou S | Observação: O caracter ^ deve ir no começo da entrada dentro do colchete, senão é considerado um caracter literal, ou seja, o próprio '^' 3\. Outro tipo de Disjunção: Uma outra forma de fazer disjunções é por meio do pipe '|'. Sua vantagem está na possibilidade de concatenar padrões de forma disjunta: | eu|voce | Uma ocorrência de qualquer caracter que não seja A, B ... Z | |[cC]apivara|[cC]arpincho | Um caracter que não seja s ou S | 4\. Outras Opções: caracteres que informam ocorrência, ou que agem como coringa (+, {}, \\*, ?) | [ab]* | Qualquer combinação com qualquer número de caracteres de a e b | | ^Caro Professor, | "Caro Professor," no começo de uma linha| | até mais!$ | "até mais!" no final de uma linha" | O[i]+ | "O" seguido de um ou mais "i" | | Oi[i]?| "Oi" seguido ou não de um "i" | Observação: Devese tomar cuidado com os Falsos Positivos! (Diminuem precisão) Observação: Devese tomar cuidado com os Falsos Negativos! (Diminuem cobertura)
Matheus de Araujo Vargas O assunto da aula do professor Jesus P. Mena do dia 06 de Junho aula foi expressões regulares, onde foi apresentada uma breve introdução do que é uma expressão regular, para que é usada, disciplinas onde se estudam expressões regulares na universidade e diversos exemplos de uso. Uma expressão regular descreve um conjunto de cadeias de caracteres, de forma concisa e precisa, sem a necessidade de listar todos os elementos desse conjunto. Por exemplo, podemos representar o conjunto das palavras "Ana", "Ama" e "Ata" com a expressão regular A[nmt]a, o que facilita bastante para casos em que queiramos descrever conjuntos muito maiores. Na UFABC, as expressões regulares são utilizadas em algumas outras disciplinas, como por exemplo em "Linguagens Formais e Autômatos" e "Compiladores". Na computação, grande parte dos problemas em que é necessário processar texto, expressões regulares são necessárias. Seguem abaixo alguns símbolos que foram apresentados na aula, que são utilizados em expressões regulares, e o que cada um deles representa: ".", representa qualquer caractere, ou seja, pode ser usado como um curinga; "[...]", representa qualquer caractere que está dentro dos colchetes (ex: [abc] pode representar "a", "b" ou "c", [0-9] representa qualquer dígito entre 0 e 9, e [a-z] representa qualquer caractere entre a e z); "[^...]", representa qualquer caractere que não está dentro dos colchetes; "\d", representa qualquer caractere numérico (apenas um caractere, entre 0 e 9); "\D", representa qualquer caractere não-numérico (ou seja, negação do "\d"); "\w", representa qualquer caractere alfanumérico (o mesmo que [a-zA-Z0-9_]); "\W", representa qualquer caractere não-alfanumérico (ou seja, negação do "\w"); "\", anula o significado especial de algum caractere (ex: "\\." representa apenas um ponto, ao invés de ser o curinga); "{n}", repete exatamente n ocorrências da expressão regular precedente; "{n, m}", repete no mínimo n ocorrências e no máximo m ocorrências; "{n,}", repete no mínimo n ocorrências; "?", repete 0 ou 1 ocorrência; "*", repete 0 ou mais ocorrências; "+", repete 1 ou mais ocorrências. Foram apresentados, além desses, mais alguns símbolos. Mas esses são os principais. Expressões regulares serão essenciais para a disciplina de PLN.
July Anne Pinheiro Aula 2: Expressões Regulares Expressões Regulares O que é: Cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto. Aplicações: As expressões regulares são utilizadas em diversas áreas, no contexto de processamento de linguagem natural, elas são utilizadas para captura de cadeias de caracteres com determinado padrão dentro de um texto. Suas utilidades variam entre normalização de texto, divisão de tokens, radicalização e segmentação de frases. Formas de representação: Além da sua representação usual, a expressão regular pode ser exibido em forma de um Autômato finito determinístico(AFD). O AFD é utilizado para testar as construções de expressões regulares. Operadores: Para a construção da expressão regular, utilizamos alguns operadores para definição de padrões e se faz necessário respeitar a precedência dos caracteres. As expressões regulares são construídas através da junção de diversos operadores como por exemplo disjunção,negação de disjunções,operador lógico ou (|), caracteres predecessores (., *, +, ?) e caracteres âncoras (^,$). Tipos de erros: Para avaliação de eficiência da expressão regular gerada, é necessário efetuar a avaliação dos resultados Falso Positivos e Falso Negativos. Para o cálculo podemos utilizar os métodos conhecidos como precisão e recall(rechamada). Eliza: O sistema foi o primeiro na área de processamento de linguagem natural, criado por Joseph Weizenbaum, em 1966 no MIT. O projeto foi programado para manter conversa bem ‘limitada’ (superficial) com um usuário, imitando respostas. Essa interação funciona através de buscas de padrões textuais na conversa, no qual a resposta de Eliza seria uma substituição desses padrões, com a finalidade de criar uma ilusão de entendimento da conversa. Hoje existe diversos modelos de sistemas de chat desenvolvidos com técnicas sofisticadas para atendimento, por exemplo, para clientes de um negócio. Mas é importante ressaltar a importância de Eliza, visto que para o tipo de sistema o mesmo foi pioneiro quando relacionado a busca de padrões. Teste de avaliação Para o teste de avaliação foi solicitado a criação de uma expressão regular para detecção de e-mail durante a aula e no final foi efetuado uma avaliação para desenvolvimento e reforço do conteúdo estudado.
Marcelo Schirbel Gomes Aula 02 Expressões Regulares Bibliografia Daniel Jurafsky & James Martin - Speech and Language Processing. Um ótimo livro sobre a área. Expressões regulares estão no capítulo 2. Procurando Padrões Textuais As expressões regulares podem ser utilizadas para extrair trechos a partir do texto. As ER's são utilizadas para: 1\. normalização de texto 2\. divisão de tokens 3\. radicalização 4\. segmentação de frases ER's são cadeias de textos especiais, em uma linguagem formal, para busca/extração de trechos de texto. Exemplo de Disjunção Para procurar duas versões de Pombos: Pombos pombos Podemos usar: [pP]ombos A cadeia de caracteres entre colchetes especifica uma disjunção. E com isso, podemos definir outras, como: \- [0-9] => apenas um dígito de 0 até 9. \- [a-z] => um caractere minusculo \- [5-8] => um digito entre 5,6,7,8 Podemos testar nossas expressões [aqui](https://regex101.com). Negação de Disjunção [^A-Z] => Não é um caractere maiúsculo [^Ss] => Nem 'S' nem 's' a^b => o caractere de negação só funciona entre colchetes Barra Vertical Podemos procurar por padrões OU outros: eu | voce => procuramos por 'eu' ou 'voce' Outras opções pa?ra => caractere predecessor opcional => para, pra aa*h => caractere predecessor em qualquer número* => ah, aah, aaah, aaaaah o+h! => caractere predecessor 1 ou mais vezes => oh!, ooh! ca.a => substitui qualquer caractere => casa, caza, ca4a, caYa [ab]* => aaaaaa, ababababababab, aaaaabbbbb, abbbbb* [0-9][0-9]* => Um número de pelo menos um dígito* Âncoras Início de Linha: ^ Final da Linha: & ^A UFABC \\.$ = Uma linha contendo exatamente 'A UFABC.' a$ => qualquer palavra que termina com 'a' Dois tipos de erros Falso positivo: identificar cadeias que nao deveriam ser identificadas. Falso negativo: identificar cadeias que deveriam ser identificadas. Em PLN devemos lidar com esses dois tipos de erros. Minimizar os FP = aumentar a precisão Minimizar os FN = aumentar a cobertura Desafio Crie uma ER para identificar emails REGEX: /[w._%+-]+@[\w.-]+\\.[a-zA-Z]{2,4}/ => isso seleciona os emails_ Máquina de estados finitos Uma ER pode ser representado por uma MEF ou Automato finito deterministico.
Felipe Rigo Yoshimura A segunda aula do curso de Processamento da Linguagem Natural teve como tema expressões regurales. Expressões regulares ou "regex" são uma linguagem formal na qual utilizando cadeias e texto especiais podem ser utilizadas para extrair fragmentos de um texto completo. Mais especificamente, pode-se utilizar "regex" para normalização de texto, divisão de tokens, radicalização e segmentação de frases. Isso é feito utilizando uma sintaxe bem definida na qual engloba dijunções, âncoras, caracteres especiais e atalhos. As dijunções são criadas através do caractere "|" ou entre "[]" e indicam a possibilidade de um mais padrões diferentes, podendo ser negadas através do "^" dentro dos "[]". Já as âncoras representadas por "^" e "$" fora das chaves significam respectivamente o começo e o final da expressão. Além disso, existem os caractéres especiais como ".", "?", "+", "*" que servem como caracteres coringas ou indicando a quantidade de repetição aceita de um determinado padrão. Os parênteses são utilizados para agrupar uma sequência de caracteres. Por fim, pode-se utilizar alguns atalhos como "\w" para representar um padrão bastante utilizado, nesse exemplo todos os caracteres alfanuméricos serão aceitos nesse padrão. Pode-se praticar expressões regulares no "link": "https://regex101.com/". Assim como na lógica booleana, existe uma precedência dos operadores que respeita a ordem do maior para o menor como: dijunções, sequências e âncoras, contadores e parênteses. Para medir a eficiência do "regex" utiliza-se métricas como precisão, na qual tenta minimizar os falso positivos(indicar como verdadeiro algo que é falso), e a cobertura que tenta minimizar os falso negativos (indicar como falso algo que é verdadeiro). Toda expressão regular pode ser traduzida para um autômato, finito e determinísitco, basta seguir um algoritmo. Além disso, por padrão o "regex" se comporta como busca gulosa, porém pode-se alterar esse comportamento utilizando os caractere "?". Uma curiosidade é que o primeiro chatbot se chama Eliza e foi projetado para se comportar como um psicólogo apenas utilizando expressões regulares. Por fim, pode-se fazer pesquisa com expressões regulares e gerar artigos interessantes, basta escolher um problema bem elaborado.
Matheus Miranda Teles Expressões regulares (RE ou ER), são cadeias de textos, seguindo uma linguagem, e são utilizadas para extrair trechos a partir de textos com o objetivo de normalização, divisão em tokens, radicalização ou segmentação de frases. Conhecidas também como Regex ou Regexp, as expressões regulares são podem ser utilizadas para achar palavras que seguem determinado padrão num texto. Por exemplo: Para encontrar a palavra capivara na seguinte frase "Capivara é o maior roedor do mundo, capivara significa comedor de capim", é necessário que ambas as formas, com letra maiúscula no início, e com letra minúscula sejam satisfeitas pela expressão regular. Logo a expressão regular que satizfaz é [cC]apivara. Existem diversos ferramentas para encontrar estes padrões, uma delas é chamada de disjunção, onde se utiliza os colchetes e dentro deles se especifica os caracteres para se buscar. [gG]ato vai encontrar tanto "Gato" quanto "gato". Também é possível encontrar faixas de caracters, como por exemplo [0-9] procura todos os dígitos, mas apenas 1, [a-z], qualquer letra minúscula e [A-Z], qualquer letra maiúscula. As disjunções podem ser negadas utilizando o acento circunflexo, (^), e só pode ser utilizada como primeiro caractere. Assim a expressão [^0-9] procura qualquer símbolo que não seja um dígito. Outos símbolos podem ser utilizados para construir estas expressões, o pipe (|) significa ou, o sinal de interrogação (?) siginifica um caractere opcional, o asterisco (*), significa o caracter anterior 0 ou mais vezes, o sinal de adição (+), significa o caractere anterior 1 ou mais vezes, e o ponto (.), significa qualquer caractere. Existem símbolos para indicar posições na linha, o (^) indica o começo da linha e o sifrão ($) o fim. Existem dois tipos de erros que podem acontecer em regex, falso positivo, que é a identificação de cadeias que não deveriam ser identificadas, e o falso negativo, onde cadeias que deveriam, não são. Para lidar com estes problemas devemos, respectivamente, aumentar a precisão e aumentar a cobertura. Uma expressão regular pode ser escrita como uma máquina de estados finita
Matheus de Oliveira Finotti A aula 2 foi sobre expressões regulares e a parte teórica foi apresentada juntamente com a parte prática. Primeiramente foi apresentado a definição de ER, assim como a bibliografia utilizada. As ERs são códigos usados para buscar ou extrair trechos ou palavras de textos. Começamos a ver parte básica de busca, sendo os colchetes usados para disjunção entre caracteres (exemplo: buscar uma palavra que começa tanto com letra maiúscula, como minúsculas), ou para faixa de caracteres e números [0-9] que cobre a busca por números de 0 a 9. Vimos também a negação em disjunção operador “^”, assim como a barra vertical para incluir na busca, e também outros operadores especiais (fim de linha ou começo de linha). Após isso o professor entregou uma tabela resumo, com os principais operadores que serão usados. Enquanto explicava a parte teórica, o professor também mostrava exemplos na prática. Foi apresentado algumas medidas de erros na busca, como o "precision" e o "recall". O professor deixou 5 minutos para a turma pensar em como fazer a busca por e-mail e depois apresentou a solução. Também foi passado um teste com 6 questões abordando os conceitos vistos durante a aula. A primeira questão já estava respondida e era para fazer uma busca pelas cadeias alfabéticas. Na segunda era para buscar palavras que terminassem com a letra m, lembrando de usar o operador "\b" para limitar a palavra. No terceiro era preciso usar alguns conceitos de início (“^”) e final de linha (“$”). O quarto exercício era apenas para buscar duas palavras e no quinto uma das palavras se repetia com espaço, então era preciso utilizar o operador "/s". O último exercício era mais complexo, e foi apresentado um operador novo "\1" que consiste em encontrar o primeiro grupo apresentado. Depois do teste o professor passou por alguns conceitos de estratégias gulosas e apresentou uma aplicação chamada "Eliza" que conversa com o usuário baseado no que ele escreve.
Mayza Cristina da Silva As expressões regulares podem ser usadas para extrair trechos a partir de texto. Elas são normalmente utilizadas para: Normalização de texto; divisão de palavras utilizando espaços; radicalização; segmentação de frases. Elas são cadeias de textos especiais em uma linguagem formal, para que seja possível realizar a busca de trechos específicos dentro de um texto. Na aula vimos os conceitos iniciais de como realizar a busca textual de expressões regulares e como prever as possíveis variações que o usuário poderia inserir. À principio temos o exemplo da palavra “Capivara”, que pode ter variação de caixa alta ou baixa para a primeira letra, ou o usuário pode inserir erroneamente algum dos caracteres, exemplo também de como utilizamos sites de busca como forma de correção ortográfica ou ter certeza de que estamos escrevendo alguma palavra corretamente. Foram realizados alguns testes de comportamento na plataforma “regex101.com”. Com isto pudemos nos familiarizar melhor com a Sintática de Expressões regulares. O professor também realizou a entrega de uma tabela de Expressões de modo que pudéssemos tentar desenvolver buscar que retornassem aquilo que se é pedido nos exercícios de teste e fixação propostos. Ao utilizar a ferramenta citada anteriormente, pudemos verificar se o desenvolvimento das nossas expressões foi adequado. Foi possível constatar também que muitas vezes a linguagem que se define não será escrita igual por todo mundo, mas mesmo assim será funcional. Vimos então as Disjunções, as negações das disjunções, alguns símbolos e seus significados nessas expressões, além de também os caracteres âncoras. Foi citado os dois tipos de erros: Falso positivo – Quando se tem certeza de que não poderia ser; e Falso negativo – Quando se tem certeza de que é. Uma Expressão Regular pode ser representada através de um autônomo finito determinístico, um MEF, que inclusive já aprendemos a projetar em outras disciplinas. O professor também nos mostrou o funcionamento da chatterbot Eliza, que foi construída em Python para identificar padrões na linguagem.
Guilherme Beo Arqueiro Expressões regulares, também referenciadas pelo termo em inglês “regex” (Regular Expression) é uma string, ou uma sequência de caracteres que especifica um padrão. Similar a uma busca comum, como as utilizadas em editor de texto, permitem fazer uma busca simples pelo arquivo, porém, uma expressão regular consegue realizar além disso, permitindo que seja procurado um padrão mais complexo, como uma letra seguida por dois dígitos, ou três dígitos seguidos por um ponto, e assim por diante. Esse tipo de funcionalidade permite buscas mais “poderosas”, como verificar uma entrada de usuário, manipular textos e até mesmo validar campos adicionados, como números de telefone e endereços de emails. Por isso, as expressões regulares são muito usadas para normalização de textos, radicalização, segmentação de frases e divisão de tokens, por exemplo. Isso torna o uso de expressões regulares muito útil para várias áreas da tecnologia, e vem sendo muito utilizada na ciência de dados. Atualmente, diversas plataformas e tecnologias suportam as expressões regulares, como SQL, Python, R, Java, LibreOffice, Notepad++, Vim, entre outros, mostrando uma utilidade praticamente universal para as regex. Na avaliação passada em sala de aula, pudemos aplicar os conceitos vistos em sala, como por exemplo o uso de barra invertida como caractere de escape para símbolos especiais, o uso de âncoras que permitem identificar início e fim de frases, barra vertical para buscar uma string ou outra, e como buscar por palavras repetidas de forma mais eficiente. Além disso, também conseguimos verificar a possibilidade de simplificação das expressões regulares, como por exemplo o uso de “\w” para buscar as letras, ao invés de uma expressão mais complexa visualmente, como [a-zA-Z]. Utilizando o site regex101.com, também pudemos observar em tempo real o uso e execução de buscas utilizando as expressões regulares, facilitando a compreensão da teoria por meio de uma ferramenta mais visual.
Jairo da Silva Freitas Junior Na aula do dia 7 de junho tratamos sobre expressões regulares. Pouco mais da metade da turma declarou ter algum tipo de contato com o assunto. O professor iniciou a aula explicando o operador disjunção para uma coleção explícita de caracteres (ex: [cC] significa c XOR C). Em seguida trabalhamos com faixas de caracteres e números (ex: [0-9] e [a-z] são interpretados como um dígito de 0 a 9 e um caractere de a a z, respectivamente) e com a negação na disjunção (usando o operador ^ após [). Fizemos exemplos usando bombeamento * (0 ou mais ocorrências) e + (pelo menos uma ocorrência). Foi introduzido o caractere ^ para reconhecimento da expressão regular no início da linha e $ para o final. Na segunda parte da aula fizemos diversos exemplos em sala usando Regex 101, onde o protocolo para criação da expressão regular ficou claro: iniciar com o padrão imaginado mais simples e incrementar com mais condições (aumentar o grau de liberdade) até cobrir todo e apenas o padrão desejado. Fizemos um exemplo de reconhecimento de e-mail e, na terceira parte da aula, todos os alunos receberam um teste individual com seis questões para selecionar cadeias que (2) terminam com m, (3) começam com número e terminam com uma palavra, (4) contem cachorro ou gato, (5) contem ‘gato gato’ ou cachorro (aqui foi introduzido o quantificador {n}, onde n é o número de repetições), e por fim (6) reconhecer cadeias com duas palavras consecutivas repetidas. Para este último exercício, que era o mais desafiador, o professor deixou como tarefa para casa o estudo do atalho \1, que recupera o valor do último cálculo dentro da expressão regular. A aula encerrou com a apresentação de um estudo sobre detecção de cientistas notáveis em textos usando expressões regulares e com a comparação de Regex com DFAs.
Alex Arantes Goncalves Expressões regulares podem ser definidas como cadeias de texto especiais, em uma linguagem formal, para busca/extração de trechos de texto. São utilizadas para extrair trechos a partir de texto, além de: normalização de texto ( padronizar o texto convenientemente), divisão em token (divisão em palavras usando espaços) radicalização além de segmentação de fraser (divisão em frases usando pontuação). Dentre os recursos disponíveis para o emprego de expressões regulares existem: Disjunções - a cadeia de caracteres entre colchetes “[ ]” especifica uma disjunção de caracteres para busca. Exemplo [cC]apivara permite que palavras Capivara e capivara sejam incluídas na busca. Podem ser usados faixas de caracteres entre os colchetes, o intervalo incluso seguirá a sequência da tabela ASCII, por exemplo [0-9] incluirá todos algoritmos de 0 a 9. O símbolo “^” é utilizado para negação, utilizando o mesmo dentro dos colchetes significa dizer que a busca não pode incluir os elementos dentro do colchetes. Barra vertical “|” é o operador lógico “ ou “, assim [cC]apivara|[cC]arpincho] retorna :Capivara, capivara, Carpincho, carpincho.Outras opções de operadores: “?” caractere predecessor opcional, “*” caractere predecessor aceito 0 ou mais vezes, “+” caractere predecessor aceito 1 ou mais vezes, “.” qualquer caractere aceito. Fora dos colchetes o “^” representa início de linha, e o sinal $ final de linha. \ indica que o caractere sucessor não se trata de especial. Em uma busca existem dois tipos de erros, o falso positivos - cadeias que não deveriam ser identificadas são retornadas , falso negativos - cadeias que deveriam ser identificadas não são.Minimizar falso positivos significa aumentar a precisão, minimizar falsos negativos dignifica aumentar a cobertura. As expressões regulares são utilizadas frequentemente como primeiro passo para qualquer processamento de texto. O resultado das expressões regulares é utilizado em técnicas de aprendizado de máquina e em classificadores. Uma ER pode ser descrito por um autômato finito determinístico.
Joao Victor Fontinelle Consonni A segunda aula da disciplina cobriu o básico a respeito de expressões regulares, também conhecidas por Regex ou Regexp. Formalmente, uma expressão regular é uma notação algébrica para caracterizar um conjunto de cadeias de caracteres de forma concisa, sem a necessidade de listar todos os elementos do conjunto. Regex são particularmente úteis para buscar determinados padrões em um texto. Uma expressão regular pesquisa todo o corpo do texto, retornando todos os trechos que correspondem ao padrão definido pela regex, se houver mais de um, ou apenas a primeira correspondência. A aula mesclou teoria e prática para mostrar e demonstrar algumas das principais regras sintáticas de expressões regulares. O primeiro elemento apresentado foi a disjunção, representada entre colchetes ("[ ]"), que especifica um conjunto de caracteres, dos quais apenas um é esperado para ocupar uma determinada posição do padrão definido pela regex. Vimos também o uso de hífen ("-") para estabelecer intervalos de valores dentro de uma disjunção, assim como o uso do circunflexo ("^") no início de uma disjunção como elemento de negação. Expressões regulares geralmente atuam sobre o alfabeto ASCII e consideram o código que representa cada símbolo, desta forma, regex são sensíveis à maiúsculas e minúsculas. A aula também cobriu o uso do caractere barra vertical ("|"), usado para cobrir a função do "OU" lógico. Além disso, foram apresentados caracteres coringas, como a interrogação ("?"), o asterisco ("*"), o sinal de adição ("+") e o ponto ("."). Vimos também os caracteres âncoras para delimitar início ("^") e fim ("$") de linha. Vários exemplos foram apresentados com o uso do simulador de expressões regulares presente no sítio . Foram cobertos também problemas como flasos positivo e falsos negativos, além da relação de expressões regulares com autômatos. A avaliação buscou testar os conhecimentos vistos durante a aula.
Eduardo Haberler Cardoso A aula ministrada pelo professor Jesus na quinta-feira, dia 06 de Junho de 2019, teve como tema principal as expressões regulares. Segundo o material apresentado, a definição de expressões regulares seria:cadeias de texto especiais, em uma linguagem formal, para busca de trechos de texto. As expressões regulares são frequentemente utilizadas para normalização de texto (padronizar o texto de forma conveniente), segmentação de frases (por exemplo, a divisão em palavras usando os espaços), radicalização (por exemplo: a redução de palavras ao seus radicais, que são as menores unidades morfológicas de significado) e divisão de tokens (por exemplo: divisão de palavras usando os espaços). Em seguida, utilizando a palavra capivara, foram ensinadas as regras de formação de uma expressão regular, as quais as principais serão descritas a seguir:Disjunção: é caracterizada pela cadeia de caracteres que são representados dentro de colchetes. Por exemplo, a expressão regular [Cc]adeira encontraria as palavras Cadeira e cadeira. Esta ferramenta pode ser utilizada também com intervalos de caracteres utilizando o hífen, tendo como referência a tabela ASCII (por exemplo [a-z], identificaria todos os caracteres alfabéticos minúsculos sem acentuação]. Ainda sobre disjunções, temos como negá-la utilizando o acento circunflexo antes do caractere ou intervalo, isto é, ao invés de encontrarmos exatamente aqueles caracteres, nós não encontramos. Por exemplo, ao utilizarmos a expressão regular [^D]adeira, encontraríamos a palavra cadeira ou ladeira, já que as palavras não iniciam com D e são seguidas pela sequência "adeira" após as primeiras letras. Temos diversas outras ferramentas para criarmos uma expressão regular que seja interessante para a aplicação específica, nos foi entregue e disponibilizado na página da disciplina no site do Tidia, um folheto contendo as regras para a construção de uma expressão regular.
Caique de Camargo Resumo da aula 2: O tema da aula foram expressões regulares. Expressões regulares são utilizadas para a extração de trechos (padrões) a partir de textos, para normalizar, dividir em tokens, radicalizar ou segmentar. Definição: São cadeias de textos, em uma linguagem formal, para a busca/extração de trechos de texto (Sinônimos: regex, regexp). Operadores utilizados na criação de expressões regulares: [] -> disjunção; ^ -> negação de disjunção; | -> o operador “ou” em disjunções; ? -> caractere predecessor opcional; * -> caractere predecessor 0 ou mais vezes; \+ -> caractere predecessor 1 ou mais vezes; . -> qualquer caractere; ^inicio, $ fim -> caracteres ancoras; É válido ressaltar que algoritmos de buscas de padrões utilizam de algoritmos gulosos, isto é, retornarão tudo o que for possível dentro daquele padrão, então é sempre importante tomar cuidado com a precisão da expressão regular utilizada. Nos retornos da função podem ocorrer falsos positivos (cadeia que não deveriam ser identificadas) ou falsos negativos (quando não se identifica cadeias que deveriam ser identificadas). Então sempre será necessário lidar com ambos, encontrando um equilíbrio entre precisão e cobertura. Uma expressão regular pode ser representada como um autômato finito determinístico, que nada mais é do que uma máquina abstrata com um número finito de estados. Se uma ER é bem construída então ela pode ser representado como um AFD. Falando sobre Eliza, foi um dos primeiros sistemas de PLN programado para manter conversa bem limitada com um usuário, imitando respostas. Basicamente são procurados padrões textuais, que são substituídos para criar uma ilusão de entendimento. Foram utilizadas técnicas de psicologia, simulando um terapeuta, onde as respostas são um espelho do pensamento do paciente, na tentativa de que os próprios pacientes descubram os motivos pelos quais queiram mudar. ER tem um campo muito grande na área de pesquisa.
Estevao Crippa da Veiga Expressões regulares (ERs) são cadeias de texto especiais, em uma linguagem formal, para busca ou extração de trechos de texto. São compostas por um conjunto de regras que definem qual conjunto pode participar da busca. A seguir listamos as principais regras: Disjunções: representada por uma cadeia de caracteres entre colchetes ou por uma faixa de caracteres entre colchetes separados por um hífen; Negação em disjunções: representado por um acento circunflexo antecedendo a cadeia de caracteres e cercado por colchetes; Símbolo de interrogação torna o caractere predecessor opcional; Asterisco repete o caractere predecessor zero ou mais vezes; O símbolo de soma repete o caractere o caractere predecessor uma ou mais vezes; O ponto final pode ser substituído por qualquer caractere; O acento circunflexo pode representar também o início de uma linha enquanto o cifrão pode representar o final de uma linha. Em PLN, as expressões regulares são muito utilizadas, porém é necessário tomar cuidado com falsos positivos e falsos negativos, minimizando suas ocorrências. Uma expressão regular pode ser representada por um autômato finito determinístico (AFD). Assim, para verificar se uma ER está bem construída, podemos representá-la por um autômato finito determinista. As ERs, além da busca por texto, podem ser utilizadas para construção de compiladores, que fazem a transformação de um código-fonte para um código em linguagem de máquina. Um caso conhecido de uso de ER foi a Eliza. Ela foi uma dos primeiros sistemas de PLN programada para interagir com um usuário e manter conversas limitadas, imitando respostas. Também é possível afirmar que ela foi uma simulação de uma terapeuta. Considerando agora o teste de avaliação realizado em aula, podemos notar a importância do boundary para início e fim das palavras.
Diego Pereira de Lima Neste aula foi abordado o conteúdo sobre expressões regulares (ERs) Também conhecida como regex, as expressões regulares são estruturas capazes de extrair trechos de texto possibilitando extrair ou identificar padrões textuais. Com ERs é capaz de extrair disjunções, negar disjunções tanto com número quanto com cadeias de caracteres. Cada linguagem de programação possui sua forma de codificação das expressões regulares, mas como exemplo temos: [Cc]asa, para identificar a palavra "casa" com sua inicial maiúscula ou minúscula; [^A-Z], utilizando ^ para negação; há outros operadores também como ? como caractere opcional; * para caractere repetido 0 ou mais vezes; + para caractere repetido 1 ou mais vezes; . para caractere indefinido; | como operador "ou"; âncoras como ^ para início de linha e $ para fim para término de linha; As ERs são extremamente poderosas a fim de encontrar padrões e realizar preparação de dados a fim de facilitar as tratativas de processamento de linguagem natural, onde modelos necessitam de interpretar e extrair do texto certos padrões. Há sites de internet que proporcionam testar e validar a as expressões regulares antes de colocar em produção em uma linguagem de programação, um deles é o https://regex101.com/. As ERs também podem ser verificadas por máquina de estado finita, e assim validadas se estão bem construídas descrevendo pelo diagrama. Também foi abordado estratégias gulosas com expressões regulares "Greedy Vs Non-greedy" utilizando-as como forma de encontrar "Tags" no texto e extrair os trechos desejados. Ao final foi realizado um teste como forma de treinamento e manipulação das ERs, abordando selecionar cadeias alfabéticas, cadeias alfabéticas terminadas em m, cadeias com números inteiros no começo da linha, encontrar as palavras gato e cachorro e encontrar palavras duplicadas.
Victor Conceicao Denis Na segunda aula estudamos sobre expressões regulares(ER) permite com que identifiquemos padrões de caracteres em meio a textos. Por exemplo, queremos identificar o primeiro caracter “a” num texto sendo ele maiusculo ou minusculo. Podemos utilizar uma expressão regular para identificar isso. Para o exemplo, seria necessária a expressão regular : [Aa] Além de identificar caracteres, é possível identificar sequência de caracteres, como “ar”, sendo primeiro “a” e depois “r” nessa ordem. Para isso, seria necessário o padrão [Aa][Rr]. Para encontrar qualquer caractere do alfabeto, usa-se a expressão [a-zA-Z]. Ela indica que deseja encontrar qualquer letra do alfabeto latino, tanto maiúscula quanto minúscula. Para os símbolos numéricos, utilizamos a expressão [0-9] sendo que quando queremos limitar um intervalo, mudamos para, por exemplo, [5-7], que indica que encontre qualquer caractere número entre 5 e 7. Além da busca direta pelo caractere, pode-se identificar padrões diferenciados como, [^a] que seria o primeiro caractere não “a”, o símbolo ^ é usado para negação. Também podemos identificar um ou mais padrões utilizando |, como por exemplo: “alto|baixo” que identifica tanto alto quanto baixo em um texto, sendo todas as letras minúsculas além de outras opções para ancorar ao começo ou o final de uma palavra a busca ou uma quantidade qualquer de caracteres. Como forma de complementar a aula, foi efetuado um teste de avaliação, para testar a junção de expressões para entendermos conjuntos de palavras, padrões no texto entre outros caracteres. A atividade de avaliação permitiu entender como usar expressões regulares para entender linhas que comecem com número e terminam com palavras, sem pontuação. Nesse caso podem ser usadas para encontrar linhas de endereços.
Rafael Pauwels de Macedo Quando falamos de reconhecer padrões em linguagens naturais estamos lidando com um problema antigo da computação porém não por isso se trata de um problema de fácil solução. Em praticamente todas as linguagens modernas é implementado as chamadas expressões regulares (Regex), que atuam como uma linguagem ubíqua onde descrevemos padrões da linguagem. As existem diversos operadores e atalhos dentro das expressões regulares, dentre elas temos a disjunção que descreve ranges ASCII, ex. [cC]apivara, disjunções de negação, ex. [^a-z], disjunção pipe, ex. (gato) | (cachorro) e as disjunções coringas como o ?*+-. Outros operadores que facilitam o reconhecimento de padrões são o ^ fora de colchetes que indica o inicio da linha e o operador $, sinalizando o final de uma linha. Dentro do reconhecimento de padrões é extremamente importante o conceito de falso positivos e falso negativos, sendo o primeiro a identificação de algo que não deveria ser considerado e o segundo caso a falha ao identificar uma cadeia alfabética que deveria se encaixar na expressão regular. Dentro dos regex existem diversos atalhos sintáticos que nos ajudam a escrever expressões mais enxutas e de menor complexida, dentre elas temos atalhos como \d para [0-9] por exemplo. Outros atalhos nos ajudam a identificar as bounderies das palavras como \b É essencial lembrar do conceito da ganancia do algoritmo (greedy vs non- greedy), por padrão as expressões regulares são gananciosas, ou seja, tendem sempre a encontrar a maior cadeia alfabética possível que se encaixe no padrão descrito, é utilizado o operador ? para modificar a ganancia dos operadores * e +, negligenciar essa caracteristica das expressões pode ser uma das causas dos previamente descritos falso positivos e falso negativos.
Matheus Dos Santos Pereira Sobre o Teste de Avaliação achei a questão 1, 2, 4 e 5 faceis, a 3 achei um pouco complicada, a minha resposta ficou bem diferente do gabarito e não consegui fazer a 6, pois não sabia do \1, porem achei bem valido e interressante o teste. Sobre Expressões Regulares (RE ou ER) podem ser utilizadas para extrair trechos a partir de texto. As ERs são comumente utilizadas para normalizaçao de texto, divisão em tokens, radicalização, segmentação de frases. Expressões regulares nada mais são do que cadeias de texto especias, em uma linguagem formal, para busca/extração de trechos de texto, possuem sinônimos: Regex, Regexp. Na sala vimos um site util chamado para testar e aprender expressões regulares. Temos 2 tipos de erros Falso Positivo e Falso Negativo, o primeiro identificar cadeias que não deveriam ser identificadas, e o segundo não identificar cadeias que deveriam ser identificadas, quando lidamos com estes problemas temos: minimizando os falsos positivos, ganhamos um aumentando de precisão, e minimizando os falsos negativos, ganhamos um aumentando de cobertura. Uma expressao regular pode ser representado/descrito por um Autômato finito determinístico.Foi mostrado o mini-eliza, que é um programa em python que utiuliza de Expressões Regulares para responder como se fosse um psicologo, usando a sua frase de entrada como uma pergunta, lembrando que o mini-Eliza é bem limitado, uma vez que utiliza apenas as suas entradas como base para montar perguntas, quando ele não consegue ele repete a entrada, o codigo pode ser encontrado no site do professor, e um bom exemplo de uso de expressões regulares no python.
Luana Ferreira do Nascimento Expressões regulares Expressões regulares são utilizadas para extrair partes de textos que combinem com um padrão pré definido. Elas são utilizadas para diversas tarefas de análise de textos, pois até uma mesma palavra pode ser escrita de varias formas (em maiúsculas, minúsculas, etc). Nos padrões de regex utilizamos colchetes para indicar o operador OU. Todos os carácteres que estiverem entre os colchetes podem ser utilizados para dar o match naquela posição. Faixas de carácteres podem ser representadas por um hífen (-). Internamente é procurado na tabela ASCII o primeiro e o último digito, então ele considera tudo que estiver entre estes dois. Ex: [1-8] seria qualquer numero entre 1 e 8. O pipe | também significa OU, mas ele compara as strings inteiras que estão entre os pipes. Ex: x|ch O ^ indica não. A lista de carácteres após ele não podem aparecer. Ex: [^a^] significa não a e não ^. Exemplo e-mail: /w@/w.[\w|.] Existe uma variedade muito grande de códigos que podem ser utilizados para representar um regex, sendo possível inclusive realizar algumas pequenas tarefas lógicas, como por exemplo detectar repetição de textos. Também temos abreviações que nos ajudam a não ter que escrever um código muito grande para representar estruturas de textos que são muito comumente utilizadas, como o \w que significa carácteres textuais + dígitos + _. Um problema ainda não resolvido em sala de aula é o fato de que os códigos que temos como padrão regex são feitos para reconhecer palavras sem acentuação, e em muitas linguagens como no português, espanhol e francês existem muitos acentos, dificultando a modelagem de regex para textos.
Jean Augusto de Araujo Resumo 2 - 06/06/19 A aula apresentou o conceito de expressões regulares (ER) ou regular expression (RE). As ERS são textos especiais, dados em uma linguagem formal, que podem ser utilizados para buscas e extrações em análises textuais. Também conhecidas como Regex e/ou Regexp. O recurso de disjunção foi demonstrado, com a utiliação de colchetes, por exemplo, na busca da palavra capivara, que pode ou não começar com letra maiúscula se tem [cC]apivara. Algumas disjunções úteis são: [0-9] e [a-z]. As disjunções também podem ser com a barra vertical (|), como eu|voce. Também é possível utilizar uma negação, com o símbolo ^. Assim, [^Ss] não retornará palavras com S nem s. Outras opções são os caracteres ? - predecessos opcional, * predecessor de 0 ou mais vezes, = predecessor 1 ou mais vezes e . que assume qualquer caractere. Dessa maneira [ab]* pode representar aaa, ababab, bbbb, baaa e afins. Já os carecteres âncora representam inicio de linha (^) e fim de linha ($). São utilizadas, frequentemente, como primeiro passo para qualquer processamento de texto.O resultado das ERs é utilizado em classificadores de técnicas de aprendizado de máquina. Uma ER pode ser representada usando um Autômato finito determínistico. Em aula, foi proposto um teste, utilizar ER para a reseolução de algumas buscas. Por exemplo, selecionar todas as cadeias alfabéticas que terminam com a letra M. Uma das respostas possíveis seria [a-z]*m\b. O teste foi importante pois cobrou a utilização prática das técnicas apresentadas. Em sequência, discutimos com os colegas sobre a resolução, até que o professor discutiu as soluções com a turma.


Número de resumos processados: 58.

Observação:


Arquivo gerado por um programa.