Remover stopwords de uma string em C++

Como eu removo stopwords de uma string em c++? Eu fiz um algoritmo mas não está funcionando
As palavras só devem ser removidas se casarem totalmente, ou seja, uma palavra
dedo não deve ser removida, mesmo casando o “de”, já que o casamento deve ser
na palavra inteira.
Após a remoção das stopwords e impressão da string corrigida, neste milestone
você também deve contar quantas vezes cada palavra ocorreu na string, e imprimir
esta contagem para cada palavra, em ordem alfabética. Por exemplo, na entrada:
Em 2017, 'eu$# não sei nada de nada de nada ueeeeee
A saída deve ser:
2017, ‘eu sei nada nada nada uee’

vamos la

antes de saber como remover palavras vc precisa definir o que é uma palavra.

uma palavra é, grosso modo, uma sequencia de letras e vc tem simbolos como o ., a ,, o espaço em branco e tc que não fazem parte da palavra.

fica a pensar como vc lidaria com este caso: apresento-lhe – talvez não seja necessario agora.

vamos la

um algoritmo simples seria vc ter uma string de entrada e uma string de saida, que não deve conter as stopwords definidas no problema. alem disso vc precida definir uma lista de boundaries, ou seja, de caracteres que vão limitar as palavras. vamos supor que seja apenas o espaço em branco pra ficar simples.

existem duas formas formas de analisar:

A) forma continua

vc inicia a analise da string de entrada estudando caracter a caracter. esta procurando o primeiro caracter que não seja um boundary. quando vc encontrar, vc começou a ler uma palavra

vc armazena os bytes da palavra lidos em uma variavel temporaria até encontrar um novo boundary (ou chegar no fim da string). nesse momento vc leu sua primeira palavra!

agora vc verifica se a palavra faz parte de alguma stopword. se sim, vc ignora ela e continua a percorrer a string de entrada.

quando vc encontrar uma palavra que não faça parte do conjunto de stopwords, vc vai adicionar na string de saida. se vc esta adicionando pela primeira vez, apenas coloque a palavra, caso contrario coloque um espaço em branco na frente.

se vc seguir esse raciocinio vc vai perceber que, quando vc le a string de entrada vc tem que lidar com um estado que é “estou lendo uma palavra ou nao”. quando vc muda esse estado de true para false ( ou seja, quando vc terminou de ler uma palalvra ) é que vc tem algo para analisar.

esse metodo é chato mas vc trabalha com pouca memoria disponivel: a string de entrada, de saida e uma variavel temporaria ( + um contador inteiro, + um booleano). o pior caso é ter uma frase sem nenhuma stopword.

B) quebrar a frase em diversas palavras.

esse metodo é mais simples e mais logico.

primeiro vc quebra a sua string de entrada em diversas strings ( um array delas ). em C++ vc tem diversas formas de fazer isso

http://www.cplusplus.com/reference/cstring/strtok/

http://www.cplusplus.com/articles/2wA0RXSz/

uma vez que vc tem um array de palavras, vc apenas verifica se cada uma é uma stopword ou não, e vai montando a string de saida.

este metodo vc cria uma copia adicional fragmentada da string de entrada, porem é muito mais simples de usar e de entender.

boa sorte

1 curtida

obrigado!