2017-08-09 4 views
1

Quel est le moyen le plus efficace d'analyser le langage naturel?Analyse syntaxique du langage naturel

Let "cordes" être un map<string, void (*func)(int,char**)> contenant des chaînes telles que:

Set the alarm for *. 
Call *. 
Get me an * at * for *. 

et leurs fonctions correspondantes. Maintenant, supposons que « entrée » est un string contenant une phrase comme:

Call David. 

Comment mettre en œuvre une fonction telle que parse qui prendrait la « entrée » et correspond à l'une des chaînes de la carte. Puis appelez sa fonction correspondante, en lui passant argc et argv contenant tous les entires sauvages (* dans les chaînes). Quel est le moyen le plus efficace de mettre en œuvre une telle fonction?

+1

Si vous avez une liste prédéfinie de commandes avec des espaces réservés fixes qui ne sont pas réels C'est un langage naturel, mais plutôt une langue spécifique au domaine ou tout au plus une langue formelle (google DSL - langage spécifique au domaine). Vous pouvez donc simplement définir un ensemble d'expressions régulières pour faire correspondre les commandes et extraire les espaces réservés par exemple. Mais votre question est assez large pour y répondre facilement. – xander

+0

Commentaire de style: Depuis C++ 11 nous écririons cela comme 'std :: function >)'. – MSalters

Répondre

1

Vous ne savez pas pourquoi cette question a reçu un downvote. C'est bien posé un non-trivial.

Il existe de nombreuses approches académiques de l'analyse, qui sont principalement nécessaires pour les grammaires dégénérées. le «langage naturel» n'est peut-être pas un terme bien défini, et les langues naturelles ont quelque ambiguïté, mais de tels sous-ensembles contraints ne sont pas problématiques.

Dans cet exemple spécifique, nous voyons que les différentes règles de production (entrées de carte) ne sont pas mutuellement ambiguës. En fait, le premier jeton est suffisant pour la désambiguïsation. Et comme un std::map est trié, nous pouvons effectuer une recherche O (log N) efficace pour ce jeton.

Par conséquent, nous avons seulement besoin de dériver les substitutions. Encore une fois, nous ignorerons les cas dégénérés. Personne ne va se soucier de "Get me an at at at for at. "`, Même si elle parse sans ambiguïté.

Au lieu de cela, pour les substitutions que vous collectez simplement des jetons jusqu'à ce que vous obtenez le jeton suivant prévu. Get me an * at * for *. signifie que le premier * obtient tous les jetons jusqu'à at, le second * recueille les jetons jusqu'à for et la * finale reçoit tous les jetons restants.

vous voyez qu'aucun retour en arrière est nécessaire. en cas d'échec l'analyse, il n'y a tout simplement pas de match.