ConjugAI

Diagrama · biblioteca conjugai-core

Fluxos em Mermaid: pipeline analisarFrase, deteção de sujeito e tempo, lema verbal, conjugar e corrigir (assets/js/conjugai-core.js).

Demo paradigma verbal Demo Diagramas demo CAA (Mermaid) README core (visual)

Pipeline analisarFrase

Mermaid

Ordem em vendors/conjugai-core/index.ts: tokens → (se aplicável) segmentar orações coordenadas (e, ou, mas, …) → sujeito → tempo → lema verbal → conjugarTempo → corrigir (com normalização SVO quando aplicável). Com várias orações, o bloco central repete-se por oração antes de juntar correções.

flowchart LR F[Frase] --> T[tokenize] T --> O[segmentar orações coordenadas] O --> S[detectarSujeito] S --> M[detectarTempo] M --> E[extrairVerbo] E --> C[conjugarTempo] C --> R[corrigir] R --> Out[correcao]

detectarSujeito

Mermaid

Implementação em vendors/conjugai-core/sujeito.ts, invocada em analisarFrase após a segmentação de orações (quando há). Primeiro detectarSujeitoComposto: prefixo antes do verbo com pelo menos três tokens e conector «e» (padrão X e Y — não usa ou para este composto). Depois detectarSujeitoSimples: pronome antes ou depois do verbo (inclui normalização SVO), Eu + mamãe/papai, pronomes básicos estáticos, nome próprio / título, ou Eu implícito por omissão.

flowchart TD SC{Sujeito composto
X e Y antes do verbo?} -->|sim| SC1[Nós / Vocês / Eles] SC -->|não| SPres{Pronome antes do verbo?} SPres -->|sim| S1[Pessoa conforme pronome] SPres -->|não| SPost{Pronome depois do verbo?} SPost -->|sim| S2[Pessoa conforme pronome — normaliza SVO] SPost -->|não| SFam{Eu + mamãe / papai?} SFam -->|sim| SN[Nós — 1.ª plural] SFam -->|não| Basic{Pronome básico estático?} Basic -->|sim| S1 Basic -->|não| SNome{Nome próprio / título?} SNome -->|sim| S3[3.ª pessoa — normaliza se pós-verbo] SNome -->|não| SDef[Padrão: Eu implícito]

detectarTempo

Mermaid

Implementação em vendors/conjugai-core/tempo.ts. Ordem efetiva: (1) argumento tempoManual em analisarFrase (botões Hoje / Ontem / Amanhã na demo CAA); (2) token tempo:<chave> ou [tempo=<chave>]; (3) se existir ontem → passado; (4) se existir amanhã e o 1.º token for presente de ir → presente; só amanhã → futuro; (5) léxico (MorphoBr via nlp-pt-br-lite) e combinações com já, quando, se, que, talvez, etc.; (6) caso contrário → presente do indicativo. O que de ter que / ter de + infinitivo não conta para o ramo subjuntivo por que isolado.

flowchart TD MAN{tempoManual nas opções?} -->|sim| TMAN[Usar esse tempo] MAN -->|não| OVR{Tag de tempo explícito na frase?} OVR -->|sim| TEXP[Tempo da tag] OVR -->|não| D1{Tem ontem?} D1 -->|sim| TP1[passado] D1 -->|não| D2{Tem amanhã?} D2 -->|sim| PIR{Primeiro token vou vai vamos vão?} PIR -->|sim| TN0[presente perífrase ir] PIR -->|não| TF[futuro] D2 -->|não| LEX{Léxico e marcadores já quando se que talvez} LEX -->|caso especial| TVAR[subjuntivo composto imperativo] LEX -->|fallback| TDEF[presente do indicativo]

* que com valor subjuntivo ignora o que de tenho que / ter que — ver temQueSubjuntivo e temLocucaoTerQue em tempo.ts.

extrairVerbo — lema

Mermaid

Implementação em conjugador.ts: (1) ir + infinitivo no início; (2) detectarLocucaoVerbalHeadLemma; (3) último que (exc. ter que) → primeiro infinitivo depois; (4) primeiro infinitivo -ar/-er/-ir/-pôr; (5) detectarVerboPorDicionario (filtro de pronomes/partículas).

flowchart TD X["extrairVerbo(tokens)"] --> C{"1.º token é vou/vais/vai/vamos/vão
e há infinitivo à frente?"} C -->|sim| D["retorna 'ir'"] C -->|não| L{"detectarLocucaoVerbalHeadLemma?"} L -->|sim| LEM["retorna lema da locução"] L -->|não| Q{"último que não ter que + inf. depois?"} Q -->|sim| QI["retorna esse infinitivo"] Q -->|não| A{"há 1.º token infinitivo -ar/-er/-ir/-pôr?"} A -->|sim| B["retorna esse infinitivo"] A -->|não| E["detectarVerboPorDicionario
(ignora pronomes/partículas)"] E --> F{lema?} F -->|sim| G["retorna infinitivo"] F -->|não| H["null"]

Fluxo de conjugar

Mermaid

Implementação em conjugador.ts: conjugarPessoaTabela (demo raiz) e conjugarTempo (pipeline) usam léxico VERBOS + regras/fallbacks.

flowchart TD A["conjugarPessoaTabela(verbo, pessoa, tempo)"] --> B{"pessoa 0 a 5?"} B -->|não| N0["null"] B -->|sim| C{"pessoa = vós (4)?"} C -->|sim| CV["conjugarVos / fallback regular"] C -->|não| D{"lema em VERBOS?"} D -->|sim| E["coluna do tempo solicitado"] E --> F{"forma na pessoa?"} F -->|sim| R["string"] F -->|não| N1["null"] D -->|não| G{"Tempo regular?"} G -->|sim| H["conjugarRegular (Pres/Pass/Fut)"] H --> I{"sufixo ok?"} I -->|sim| R I -->|não| N2["null"] G -->|não| N3["null"]

corrigir — frase final

Mermaid

corretor.ts: localiza o token verbal com indiceDoVerboNaFrase e substitui só essa forma pelo conjugado. Sujeito composto mantém os tokens à esquerda do verbo (ex.: «Mamãe e eu iremos…»). Sujeito implícito antecede o pronome em sujeito.texto.

flowchart TD K["tokens + conjugado + sujeito"] --> V{índice do verbo} V -->|encontrado| W["substituir token verbal"] W --> X{implícito?} X -->|sim| Y["anteceder pronome"] X -->|não| Z["juntar tokens"] Y --> Z V -->|não| Fb["fallback: pronome + forma"]

Pipeline visual

UI

Opcional: infinitivo para atualizar lema e exemplo de 1.ª pessoa do presente.

Demo paradigma: células

Mermaid

index.html (raiz) — ciclo por tempos simples/compostos e 6 pessoas com conjugarPessoaTabela.

sequenceDiagram participant P as index.html participant CC as ConjugaiCore loop Cada tempo loop pessoa 0 a 5 P->>CC: conjugarPessoaTabela(lema, pessoa, tempo) CC-->>P: string ou null end end

Demo CAA (analisarFrase)

Contexto

A demo CAA (demo/caa/index.html) usa analisarFrase (passos tokenização, sujeito, tempo, regra) via app.js. O index.html na raiz é só paradigma verbal (conjugar). Diagramas Mermaid adicionais: diagrama.html na raiz.

flowchart TB subgraph Lib[conjugai-core] AF[analisarFrase] CJ[conjugar] CR[corrigir] end subgraph UI["demo/caa + app.js"] IN[Entrada telegráfica] ST[Passos 1 a 4] OUT[Saída] end IN --> AF AF --> ST AF --> OUT CJ --> AF CR --> AF