O problema disso é limitar o número de frases, como você atrela "joao casou com maria ontem noite" com "noticia joao maria" outras "noticia joao maria" ficam como? Por exemplo:
"joao jantou com maria ontem noite"
Como fica?
Uma forma mais generica é identificar e tratar palavras removendo diacríticos, preposição direta e modo por exemplo:
- João: Substantivo próprio (nome de pessoa)
- casou: Verbo (pretérito perfeito do indicativo)
- com: Preposição
- Maria: Substantivo próprio (nome de pessoa)
- ontem: Advérbio de tempo
- à: Preposição + artigo definido (a preposição "a" combinada com o artigo "a", formando "à")
- noite: Substantivo comum (refere-se a um período do dia)
Viraria:
- joao: Substantivo
- casar: Verbo
- com: Preposição
- maria: Substantivo
- ontem: Advérbio de tempo
- noite: Substantivo
E você reordenaria por generalização:
- casar: Verbo
- com: Preposição
- ontem: Advérbio
Por fim você armazena um padrão
%0 %1 com %2 ontem %3
Parece disperdício mas armazenando padrões o que você passa para obter a frase original são apenas indices para uma função, por exemplo (números randomicos para ilustrar) para você obter de volta a frase seria:
F5 João E3 Maria A5 noite
Vamos dizer que nosso padrão está no indice F5, E3 seja o verbo casar (no infinitivo), A5 ontem
E3 é um verbo, se você casa ou dança você casa ou dança com alguém,
%0 = João,
%1 = E3, que expande para "casou com"
%2 = Maria
A5 = expande para ontem a
%3 = noite
Ok mas vamos testar o desperdício, em E7 armazenamos o verbo jantar
F5 Marcos E7 Débora A5 noite
%0 = Marcos,
%1 = E3, que expande para "jantou com"
%2 = Débora
A5 = expande para ontem a
%3 = noite
Então armazenando um padrão e as palavras separadas temos de fato um uso maior de bytes na memória, porém um mecanismo muito mais versátil que cresce muito mais lentamente e de forma deduplicada