Normaal gesproken wordt bij het onderzoek naar het automatisch genereren van natuurlijke taal een onderscheid gemaakt tussen twee verschillende componenten: een component die bepaalt wat er gezegd moet worden, en een component die bepaalt hoe dit gezegd moet worden. In het geval van taalgeneratie als component van een natuurlijke-taalinterface is de eerste component meestal onderdeel van de component die zorgt voor de dialoogvoering en het raadplegen van de database. Het is vaak zo dat deze ``dialoogvoerder'' een betekenisrepresentatie oplevert waarvoor de taalgeneratiemodule dan een bijbehorende zin moet opleveren. We houden ons hier dus alleen bezig met de hoe component.
In bepaalde opzichten is taalgeneratie het omgekeerde van syntactische en semantische analyse. Bij analyse is de opdracht voor een gegeven zin de relevante betekenisrepresentatie op te leveren; bij generatie is de betekenisrepresentatie al gegeven, maar moet de bijbehorende zin worden teruggevonden. Deze symmetrie leidt ertoe dat soms wel geprobeerd wordt de generatiecomponent gebruik te laten maken van dezelfde grammatica als de analysecomponenten. In dat geval noemt men de grammatica omkeerbaar of reversibel, omdat de grammatica immers in twee richtingen kan worden gebruikt.
Net als bij de syntactische analyse bestaan er vele verschillende generatie algoritmes. En net als bij syntactische analyse kunnen we deze algoritmes karakteriseren aan de hand van:
Een eenvoudige top-down generatieprocedure werkt bijvoorbeeld als volgt. Om deze procedure uit te leggen nemen we even aan dat in elke syntactische regel de categorieën een bijbehorende semantische waarde hebben. Om een zin met een bepaalde semantiek Sem te produceren zoeken we een regel die aan de linkerkant van de pijl de categorie zin/Sem heeft. Vervolgens moeten we dan voor de categorieen rechts van de pijl dezelfde procedure recursief toepassen. Dit doen we net zolang we alleen woorden overhouden: de zin. Het volgende figuurtje illustreert de procedure:
doel: zin/slaan(ik,maarten23) regel: zin/Pred(Arg1,Arg2) --> onderwerp/Arg1, gezegde/Pred(Arg2) doel: onderwerp/ik gezegde/slaan(maarten23) regel: onderwerp/Sem --> naamwoordgroep/Sem doel: naamwoordgroep/ik gezegde/slaan(maarten23) regel: naamwoordgroep/ik --> ik doel: ik gezegde/slaan(maarten23) regel: gezegde/Pred(Arg2) --> werkwoord/Pred, lijdend_voorwerp/Arg2 doel: ik werkwoord/slaan, lijdend_voorwerp/maarten23 regel: werkwoord/slaan --> sloeg doel: ik sloeg lijdend_voorwerp/maarten23 regel: lijdend_voorwerp/Sem --> naamwoordgroep/Sem doel: ik sloeg naamwoordgroep/maarten23 regel: naamwoordgroep/maarten23 --> Maarten 't Hart doel: ik sloeg Maarten 't Hart
Er zijn ook belangrijke verschillen tussen analyse en generatie. Bij analyse is een belangrijk probleem om ambiguiteiten op te lossen. Bij generatie hebben we dit probleem natuurlijk niet. Wel is het soms zo dat meerdere mogelijke zinnen voor een gegeven semantische structuur mogelijk zijn. In dat geval bestaat er een vergelijkbaar probleem omdat we dan de meest geschikte zin willen genereren. Om te bepalen wat de meest geschikte zin is kunnen we een aantal criteria gebruiken. Het is bijvoorbeeld mogelijk om te proberen ambigue zinnen te vermijden. Die zouden immers gemakkelijk tot misverstanden bij de luisteraar kunnen leiden. Daarnaast kun je je voorstellen dat je wellicht de eenvoudigste zin wilt gebruiken.
Het probleem van robuustheid dat wel bestaat bij analyse heb je niet bij generatie. De reden hiervoor is dat je bij analyse de input niet in de hand hebt (je weet ten slotte nooit wat de spreker zal gaan zeggen). Bij generatie heb je wel invloed op de input: die wordt immers door het systeem zelf gemaakt.
Vanwege de afwezigheid van de ambiguiteits- en robuustheidsproblematiek kun je de generatiecomponent beschouwen als een eenvoudigere component dan de analysecomponent.