D'après ma lecture, il semble que la plupart des grammaires se préoccupent de générer un nombre infini de chaînes. Et si vous travailliez dans l'autre sens?
Si on donne n chaînes de m longueur, il devrait être possible de faire une grammaire qui générera ces chaînes, et juste ces chaînes.
Existe-t-il une méthode connue pour ce faire? Idéalement, un nom de technique que je peux rechercher. Sinon, comment pourrais-je faire une recherche documentaire pour trouver une telle méthode?
formal-languages
regular-languages
formal-grammars
finite-sets
Gustav Bertram
la source
la source
Réponses:
Cela relève du thème général de «l'induction grammaticale»; la recherche sur cette phrase fera apparaître des tonnes de littérature. Voir, par exemple, Inducing a context free grammar , https://en.wikipedia.org/wiki/Grammar_induction , https://cstheory.stackexchange.com/q/27347/5038 .
Pour les langues régulières (plutôt que sans contexte), voir aussi regex golf NP-Complete? , DFA le plus petit qui accepte des chaînes données et rejette d'autres chaînes données , Y a-t-il des améliorations sur l'algorithme de Dana Angluin pour l'apprentissage des ensembles réguliers , et https://cstheory.stackexchange.com/q/1854/5038 .
la source
Si le nombre de chaînes est fini, disons set vous pouvez toujours trouver une grammaire sans contexte qui génère toutes ces chaînes, soit A un non terminal, alors la règle peut être A → s 1 | s 2 | . . . s n . Pour un ensemble fini de chaînes, vous pouvez même proposer des automates à états finis qui n'acceptent que ces chaînes. Ainsi, le cas d'un ensemble fini de chaînes est vraiment trivial.S= { s1, s2. . . . sm} UNE A → s1| s2| . . . sn
la source
Il existe de nombreuses façons, vous devez donc imposer des critères supplémentaires sur la qualité des résultats.
la source
Ce que vous demandez s'apparente à un index de recherche. En effet, les transducteurs à états finis peuvent être créés et utilisés pour reconnaître le texte qui leur est envoyé. Par exemple, Lucene utilise cet algorithme: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698
Pour une utilisation pratique, consultez cet article de blog d'Andrew Gallant: Index 1 600 000 000 de clés avec automates et rouille
Dans le post, il décrit une méthode pour construire un FSA à partir d'un corpus de texte tel qu'il reconnaît tous les mots. Le résultat final est de construire un FST approximativement minimal à partir de clés pré-triées en temps linéaire et en mémoire constante.
L'implémentation est disponible dans sa
fst
bibliothèque: https://github.com/BurntSushi/fstla source
Une réponse à la question posée par reinierpost qui répond également à la question d'origine:
Nous construisons l'automate du dictionnaire comme suit:
La taille maximale de l'automate est la longueur totale des chaînes d'entrée. En supposant que vous pouvez simuler des transitions et en créer de nouvelles en temps constant, le temps d'exécution est également la longueur totale des chaînes d'entrée. Aucun meilleur ou pire cas.
Cet automate est minimal. comme dans le cas normal, les automates et les grammaires correspondent presque un à un, il en va de même pour la grammaire. Bien sûr, il est impossible de construire quelque chose de taille n en moins de n temps.
la source