Ajuda algorítimo plural para singular

13 respostas
wilsonsbo

Olá a todos!
Venho aqui pedir uma contribuição de conhecimento para contrução de um algoritimo capaz de receber uma plural e transforma-lá em singular, como a necessidade veio agora, não tive muito tempo para compilar a ideia e comecei simples para com o tempo melhorar o código.
De começo tenho o seguinte

public class trataString {
     
     public List<Character> vogais = Arrays.asList('a','ã','e','i','o','u');

     public String pluralSingular(String substantivo) {
    
          int tamanho = substantivo.length();

          //Verifica se a ultima letra do substantivo é "S"
          if(substantivo.charAt(tamanho-1) == 's') {
          
               //Verifica se a penultima letra do substantivo é uma Vogal 
               if(this.vogais.contains(substantivo.charAt(tamanho-2))) {
               
               //Se for uma vogal ele retorna a palavra apenas sem o S
               //Exemplo Singular de CARROS é CARRO

              //Agora vem a pergunta como eu retorno a palavra apenas sem o S?
              //Como eu pego a palavra e tiro apenas o S? 
               }
          }
     }
}

13 Respostas

Ironlynx

Se é a última letra, isso resolve:
palavra = palavra.substring (0, palavra.length() - 1);

Mas vc tem noção que vc precisaria ver algumas regras para eliminar/transformar todas as palavras com plural, para singular, certo?

E

Nossa Senhora, você está com dificuldades de escrever um “substring”?

Não levando em conta que você também não fez sua lição de casa e procurou as regras exatas da língua portuguesa para passar uma palavra do plural para o singular (eu acho que há tantas exceções que, na prática, eu faria uma lista gigante de palavras e usar a regra só em último caso, quando a palavra não estiver na lista), o uso de substring no seu caso é bem simples.

Digamos que a palavra seja “serviços”.

Então:

String pl = "serviços";
String sn = pl.substring (0, pl.length() - 1);
E

As regras são bem complicadas, a rigor. Veja um monte de palavras que não se enquadram na sua regra simples que você estipulou. Como eu disse, eu faria uma lista gigante de palavras :slight_smile:

pães -> pão
cidadãos -> cidadão
exceções -> exceção
bens -> bem
males -> mal
normais -> normal

E isso que você não está pensando nos verbos, apenas nos substantivos.

Incluindo os verbos, você vai ter mais problemas:

vendemos -> vendo
vendem -> vende
amamos -> amo
amam -> ama
partimos -> parti

Sem contar as coisas bizarras:

quaisquer -> qualquer

drsmachado

A primeira coisa que penso quando falam em algo dessa natureza é justamente o que o entanglement disse.
A língua portuguesa é extremamente recheada de exceções (seria a regra ser uma exceção?).
Por exemplo, no teu código você coloca lá

//Se for uma vogal ele retorna a palavra apenas sem o S

Considere a palavra pães, a penúltima letra é uma vogal. Porém, o retorno correto não seria “pãe”, mas “pão”.
Outro caso que traria problema seria ônibus. A palavra atende à regra que você impôs, mas ninguém anda de “ônibu”.

Z

cria uma lista de regras. p.e.

-se a palavra for igual a ‘onibus’, ou ‘quaisquer’. retorne o singular hardcode da palavra.

-senao, se a palavra termina em -ães retorna ão, -ãos retorna ão, -ões ão, e assim por diante.

-senao, se termina em -emos, retorna -o, se termina em -em retorna e.

-e em último caso, se termina em -s, retorna sem o s.

e assim voce procura todas as regras possíveis.

E

Hum hum hum… “temos” -> “to” ? “trem” -> “tre”?
Note que é bem mais complicado que parece.

drsmachado

entanglement:
zslnd:

-senao, se termina em -emos, retorna -o, se termina em -em retorna e.

Hum hum hum… “temos” -> “to” ? “trem” -> “tre”?
Note que é bem mais complicado que parece.


A última flor do lácio é assim.
O ideal seria pegar um bom livro de gramática em que existam tais regras, aplicar cada uma e então, para cada exceção, criar uma variante.
Sem que seja assim, será impossível cobrir tudo.

E

Só para ter uma ideia.
Como você deve ter percebido, as regras de plural/singular para verbos são diferentes das regras de plural/singular para substantivos e adjetivos.
Portanto, a primeira coisa para fazer é determinar qual é a categoria gramatical.
O problema é que é mais fácil ter uma lista gigante de palavras que determinar a categoria gramatical assim, só de olhar a palavra (“temos” é um verbo, “Lemos” um substantivo (sobrenome), “lemos” um verbo) . Note que uma palavra, em determinadas posições da frase, pode ser um verbo (lemos) ou um substantivo (“Lemos”).

E

E mais uma coisa - “lemos” pode estar no passado ou no presente. Se estiver no passado, o singular é “li”. Se estiver no presente, o singular é “leio”.

wilsonsbo

Olá a todos novamente :) gostei de ver que o fórum é bem ativo e que me deram um monte de opinião fico feliz.
A ideia de criar uma lista com todas as palavras no plural e verificar o que o usuário digita e buscar o plural nessa lista, é algo a se pensar, uma pensa que é complicado por são muitas palavras, tem que ser algo que o código seja capaz de fazer.
A respeito das regras do português eu já sabia que ia ocorrer esse problema que nem todas são iguais e tem exceções, eu criei uma classe bem simples que deve ser melhorada.

Eu pretendo tratar aquelas palavras que não se encaixam nos comparadores a baixo, criando uma lista de verbos irregulares para plural, como "Avós" ele ta na classificação de "Sem S" mas lá dentro eu verificaria se a palavra termina com S e se não esta nessa lista de verbos irregulares para assim depois fazer o singular ou pegar o singular dessa variável lista.

Esse é um desafio bem grande :) eu até cheguei achar uma classe capaz de fazer isso mas em palavras do ingles :(
Caso saia algo produtivo volto a postar o código aqui para todos.

A mais uma coisa, eu tivesse essa duvida besta de como tirar apenas o S porque sou Autodidata mas se alguém fodão tiver interessado em me ensinar tamo ai :D

public String pluralSingular(String substantivo) {
       
        int tamanho = substantivo.length();

        String singular = "";
        String auxiliar = "";
         
        auxiliar = ""+substantivo.charAt(tamanho-2)+substantivo.charAt(tamanho-1);
            
        if(auxiliar.equals("ão")) {
            return "é com ão";
        } else {

            auxiliar = ""+substantivo.charAt(tamanho-3)+substantivo.charAt(tamanho-2)+substantivo.charAt(tamanho-1);

            if(auxiliar.equals("ões")) {
                return "é com ões";
            } else {

                auxiliar = ""+substantivo.charAt(tamanho-2)+substantivo.charAt(tamanho-1);

                if(auxiliar.equals("ns")) {
                    for(int i = 0; i < tamanho-2;) {
                        singular = singular+substantivo.charAt(i);
                        i++;
                    }
                    return singular+"m";
                } else {

                    auxiliar = ""+substantivo.charAt(tamanho-1);
                    if(auxiliar.equals("s")) {
                        if(this.vogais.contains(substantivo.charAt(tamanho-2))) {
                            for(int i = 0; i < tamanho-1;) {
                                singular = singular+ substantivo.charAt(i);
                                i++;
                            }
                            return singular;
                        } else {
                            return "é com apenas S";
                        }
                    } else {
                        return "está pronta já";
                    } } } } 
    }
E

Que mania o de o pessoal chamar “problema” de “desafio” :slight_smile: - de qualquer forma, os plurais em inglês são realmente mais simples, porque você tem uma lista de plurais irregulares (como o de ganso, “goose” -> “geese”) e para verbos (exceto em uma lista pequena) você tem uma regra quase simples: terminou em “s”, está no presente, terceira pessoa do singular.

Português é realmente português - e antes de falar qualquer coisa, as outras línguas latinas (espanhol, italiano, francês, etc.) também são complicadas nesse ponto.

E

Wilson-san, só um pequeno parêntese.

A linguagem Java representa strings de uma forma terrivelmente ineficiente para a parte de concatenação (por exemplo, você escreveu uma forma de obter uma string que contém todos os caracteres de uma outra string, exceto o último, de uma forma que não é nem um pouco recomendável em código eficiente).

Em Java é necessário usar as coisas prontas (como substring) ou então, se precisar realmente montar uma string a partir de seus componentes, usar um StringBuilder.

wilsonsbo

entanglement
O código que vc e o Ironlynx postou eu não conhecia, e sabendo o que vc disse sobre desempenho e analisando que é uma forma mais simples, vou passar a utilizar, Obrigado aos 2;

palavra = palavra.substring (0, palavra.length() - 1);
String sn = pl.substring (0, pl.length() - 1);

E em relação ao desafio. Pra min desafio é aquilo que pode ser feito mais é difícil de ser alcançado ou simplesmente sinônimo para problema.

Criado 11 de maio de 2013
Ultima resposta 13 de mai. de 2013
Respostas 13
Participantes 5