27 votes

Sélection du texte le plus fluide parmi un ensemble de possibilités via la vérification de la grammaire (Python)

Certains d'arrière-plan

Je suis une littérature étudiant à l'université de Floride, il travaille actuellement sur un plan très ambitieux projet de création. Le projet est orienté vers l'algorithmique de génération de la poésie. Il est écrit en Python. Mon Python connaissances en Traitement du Langage Naturel et de connaissances ne viennent que de l'enseignement de moi-même les choses à travers l'internet. J'ai travaillé avec ce genre de choses pendant environ un an, donc je ne suis pas impuissant, mais à différents points que j'ai eu du mal à aller de l'avant dans ce projet. Actuellement, je suis entre dans la dernière phase de développement, et ont frappé un petit barrage.

J'ai besoin de mettre en œuvre une certaine forme de la grammaire de la normalisation, de sorte que la sortie ne se passe pas comme non - conjugué/fléchies de l'homme des cavernes-parler. Il y a un mois certains amicale des gens sur DONC, m'a donné quelques conseils sur comment je pourrais résoudre ce problème en utilisant un ngram langage de modélisation, en gros-mais je cherche encore d'autres solutions, comme il semble que NLTK de NgramModeler n'est pas adapté à mes besoins. (Les possibilités de POS tagging ont également été mentionnées, mais mon texte est peut-être trop fragmentaires et étrange pour une mise en œuvre de tel pour venir facilement, compte tenu de mon amateur-ness.)

Peut-être que j'ai besoin de quelque chose comme AtD, mais espérons-le, moins complexe

Je pense qu'il faut quelque chose qui fonctionne comme Après la date Limite ou de Queequeg, mais aucune de ces semblent tout à fait exact. Queequeg est probablement pas un bon ajustement -- il a été écrit en 2003 pour Unix et je ne peux pas le faire fonctionner sur Windows pour la vie de moi (avoir tout essayé). Mais j'aime que tout ce qu'il vérifie est la bonne conjugaison des verbes et l'accord en nombre.

D'autre part, AtD est beaucoup plus rigoureux, offrant plus de fonctionnalités que j'ai besoin. Mais je n'arrive pas à obtenir les liaisons python pour qu'il fonctionne. (J'ai 502 erreurs de l'AtD serveur, qui je suis sûr sont faciles à corriger, mais ma demande va être en ligne, et je préfère ne pas dépendre d'un autre serveur. Je ne peux pas se permettre de courir un AtD serveur de moi-même, parce que le nombre de "services" à ma demande va exiger de mon hébergeur, c'est déjà menaçant de provoquer des problèmes dans l'obtention de cette application hébergée à moindre coût.)

Les choses que j'aimerais éviter

Bâtiment Ngram modèles de langue moi-même ne semble pas approprié pour la tâche. mon application génère beaucoup d'inconnues vocabulaire, ce qui fausse tous les résultats. (Sauf si j'utilise un corpus qui est si grande qu'elle s'exécute de manière trop lent pour mon application-l'application doit être assez accrocheur.)

Strictement la vérification de la grammaire est ni de droite, pour la tâche. la grammaire n'a pas besoin d'être parfait, et les phrases n'ont pas à être plus sensible que le genre de l'anglais-comme jibberish que vous pouvez générer à l'aide de ngrams. Même si c'est jibberish, j'ai juste besoin de faire respecter la conjugaison des verbes, l'accord en nombre, et faire des choses comme enlever les articles supplémentaires.

En fait, je n'ai même pas besoin de tout type de suggestions pour les corrections. Je pense que tout ce que je besoin est quelque chose de compte combien d'erreurs semblent se produire dans chaque phrase dans un groupe de phrases possibles, afin que je puisse trier par leur score et choisir celui avec le moins de fautes grammaticales.

Une solution simple? La notation de la fluidité par la détection d'erreurs évidentes

Si un script existe qui prend soin de tout cela, je serais ravi (je n'ai pas trouvé encore). Je peux écrire du code pour ce que je ne trouve pas, bien sûr; je suis à la recherche pour obtenir des conseils sur la manière d'optimiser mon approche.

Disons que nous avons un tout petit peu de texte déjà mis en oeuvre:

existing_text = "The old river"

Maintenant, disons que mon script a besoin de comprendre que l'inflexion du verbe "supporter" pourrait venir à la prochaine. Je suis ouvert à toute suggestion au sujet de cette routine. Mais j'ai besoin d'aide surtout à l'étape #2, la cote de la maîtrise en pointant les erreurs grammaticales:

  1. Utilisez la Conjugaison du Verbe méthodes de NodeBox Linguistique à venir avec toutes les conjugaisons de ce verbe; ['bear', 'bears', 'bearing', 'bore', 'borne'].
  2. Itérer sur les possibilités, (faiblement) la vérification de la grammaire de la chaîne résultant de la existing_text + " " + possibility "("Le vieux de la rivière de l'ours", "Le vieux de la rivière de l'ours", etc). Compter le nombre d'erreurs pour chaque construction. Dans ce cas, la seule construction pour générer une erreur, apparemment, serait "La vieille rivière de l'ours".
  3. Emballage devrait être facile... les possibilités avec le plus faible nombre d'erreurs, de sélectionner au hasard.

10voto

seafangs Points 509

Vérification de la grammaire avec Lien de Grammaire

Intro de Lien de Grammaire

Lien de la Grammaire, développé par Davy Temperley, Daniel Sleator, et Jean Lafferty, est un analyseur syntaxique de l'anglais: "une phrase, le système affecte à une structure syntaxique, qui se compose d'un ensemble de étiquetés liens qui relient les paires de mots. L'analyseur produit aussi une "constituante" la représentation d'une phrase (montrant le syntagme nominal, le verbe des phrases, etc.)." Vous pouvez lire plus sur le Lien de Grammaire et d'interagir avec un analyseur ici.

Il y A quelques années AbiWord a pris le projet en cours. Ils expliquent que AbiWord Lien de la Grammaire pour vérifier la grammaire. Je ne connais pas les subtilités de la façon dont AbiWord remplit, en réalité, leur vérification de la grammaire, mais j'ai lu à propos de l'approche de base à un Q&a sur la grammaire de vérification (le lien que j'ai aujourd'hui perdu). Contrairement à certains autres analyseurs qui j'ai interagi avec, Lien de Grammaire produit des résultats très différents lorsqu'une phrase n'est pas grammaticalement bien formées: il ne peut pas trouver un complet de liaison pour grammaticalement incorrecte des phrases.

Vous pouvez voir par vous-même avec la ligne de l'analyseur: entrer dans la phrase "il est l'homme dont le chien, j'ai acheté" produit 1 de liaison, alors que "Ce sont l'homme dont le chien, j'ai acheté" produit pas de liens.

Ce n'est pas "compter" le nombre d'erreurs, comme je l'ai demandé. Cependant, il ne s'acquitter de l'original de manière à exclure grammaticalement invraisemblable (c'est à dire mal conjugué) possibilités.

Liaisons Python: ils existent!

Lien de la Grammaire est écrit en C. il s'agit d'un problème pour moi, lorsque j'ai commencé la recherche, comme je ne suis qu'un an en Python de codage et j'ai du mal à créer des liaisons de moi-même. J'étais aussi inquiet au sujet de mon processus/service de compter, de sorte que je ne voulais pas courir le Lien le programme de Grammaire sur le dessus de mon Python processus. Mais un jour ou deux après la publication de cette question sur Janv. 13, je suis tombé sur Jeff Elmore l' (enzondio) contribution de pylinkgrammar de PyPi -- ce qui est arrivé seulement un jour avant.

Comme le pylinkgrammar page explique, vous avez encore à construire et à installer linkgrammar premier. Des Instructions sur la façon de l'utiliser sont sur cette page. Mais quelques mises en garde à propos de l'installation de pylinkgrammar:

  1. Je n'ai pas été en mesure d'obtenir pylinkgrammar de travail sur Python 2.7 avec Windows 7, je pense que c'est dû à des problèmes à obtenir CMake travailler avec Python 2.7 sous Windows 7.
  2. Donc j'ai déménagé l'ensemble de mon projet dans Ubuntu (10.10), parce que j'avais besoin de ce que les mauvaises. Mais quand j'installe Ubuntu, j'ai essayé d'installer tout pour Python 2.7 (même enlevé 2.6). Je ne pouvais toujours pas obtenir pylinkgrammar de travail avec Python 2.7. Je pense que c'est encore en raison de problèmes entre CMake & Python 2.7.
  3. J'ai commencé avec mon Ubuntu installer parce que les choses avaient obtenu en désordre, et, au lieu de mettre tout en place avec la version 2.6 de Python. J'ai maintenant obtenu pylinkgrammar de travail avec la version 2.6 de Python. (Mais je dois taper from pylinkgrammar.linkgrammar import Parser, qui diffère légèrement de la pypi de la page d'instructions).

NodeBox la Linguistique: l'autre partie de ma solution

Dans ma question, j'ai indiqué la nécessité de générer tous les flexions/conjugaisons d'une phrase donnée, afin de vérifier l'ensemble de ces variations et d'éliminer grammaticalement invraisemblable éléments. (Je suis en utilisant WordNet pour le changement de certaines pièces des entrées de l'utilisateur avant de sortir, et le WordNet résultats sont sans altération; ils doivent être déclinées pour faire les sorties (plus) intelligible).

Un très instructif blog m'a conduit à la NodeBox Linguistique de la bibliothèque, un ensemble d'outils avec lesquels vous pouvez le faire inflexion de la grammaire et de la sémantique des opérations sur des contenus en anglais." En effet, la bibliothèque peut être utilisé pour conjuguer des verbes au singulier et au pluriel les noms, parmi de nombreuses autres opérations. C'est juste ce dont j'avais besoin. Mon application sait quels mots dans une entrée, il a troqué les nouvelles, sans altération de la langue; ces pièces sont celles qu'il génère des variations en utilisant les méthodes de NodeBox Linguistique.

Je me nourris de ces variations dans pylinkgrammar et déposer des variations pour lesquelles il n'y a pas de liens peut être trouvé. Parfois, cela ne produit pas de résultats à tous les, mais le plus souvent, il produit des résultats utiles. Veuillez noter que le Lien de la Grammaire ne trouverez pas complet liens pour la plupart des phrases incomplètes. Si vous voulez vérifier les conjugaisons de la fragmentation des phrases comme je le fais, essayer d'étendre fragmenté phrases avec remplissage avant de contrôler, puis déposer la plaque avant de sortir. Je reçois ce "remplissage" en prenant le dernier mot à partir des données, la recherche dans le Brown corpus, et en ajoutant le reste de cette phrase du corpus.

Je n'ai pas de tests de rapport sur le degré de précision de cette approche est que statistiquement, mais il a travaillé pour mon (propre) à des fins plupart du temps. Je suis encore dans le processus de développer cette mise en œuvre et de l'écriture des cas exceptionnels et moyens pour nettoyer les données d'entrée. J'espère que cette information aide à quelqu'un d'autre aussi! N'hésitez pas à demander des éclaircissements.

2voto

Johnny Brown Points 601

Projet très cool, tout d'abord.

J'ai trouvé un vérificateur de grammaire java . Je ne l'ai jamais utilisé, mais les documents affirment qu'il peut fonctionner en tant que serveur. Java et l'écoute d'un port doivent être pris en charge n'importe où.

Je viens de me lancer dans la PNL avec un arrière-plan CS, donc cela ne me dérangerait pas d'entrer dans les détails pour vous aider à intégrer ce que vous décidez d'utiliser. N'hésitez pas à demander plus de détails.

1voto

hapagolucky Points 136

Une autre approche serait d'utiliser ce qu'on appelle un overgenerate et le rang de l'approche. Dans la première étape, vous avez votre générateur de poésie générer plusieurs candidat générations. Ensuite, en utilisant un service comme d'Amazon Mechanical Turk pour recueillir les jugements humains de la fluidité. En fait, je peux suggérer la collecte simultanée des jugements pour un certain nombre de phrases générées à partir de la même graine conditions. Enfin, on extrait les caractéristiques de l'généré des phrases (probablement en utilisant une certaine forme de l'analyseur syntaxique) pour former un modèle de taux ou de classer question de la qualité. Vous pourriez même jeté dans l'heuristique énumérés ci-dessus.

Michael Heilman utilise cette approche pour une question de génération. Pour plus de détails, lire ces articles: Bonne Question! Statistiques de Classement pour la Question de la Générationet de la Cote Générées par Ordinateur des Questions avec Mechanical Turk.

1voto

Victor Points 73

Le lien pylinkgrammar fourni ci-dessus est un peu obsolète. Il pointe vers la version 0.1.9 et les exemples de code pour cette version ne fonctionnent plus. Si vous suivez ce chemin, assurez-vous d'utiliser la dernière version disponible sur:

https://pypi.python.org/pypi/pylinkgrammar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X