Sélection du texte le plus couramment à partir d'un ensemble de possibilités via le contrôle de grammaire (Python)

StackOverflow https://stackoverflow.com/questions/8842817

Question

Certains arrière-plan

Je suis un étudiant en littérature à New College of Florida, qui travaille actuellement sur un projet créatif trop ambitieux. Le projet est axé sur la génération algorithmique de la poésie . Il est écrit en Python. Mes connaissances Python et connaissances traitement du langage naturel proviennent uniquement de moi-même enseigner les choses à travers l'Internet. Je travaille avec ce genre de choses pendant environ un an, donc je ne suis pas sans défense, mais à différents points que j'ai eu du mal à aller de l'avant dans ce projet. À l'heure actuelle, je suis entrée la phase finale de développement, et ont frappé un petit barrage routier.

Je dois mettre en œuvre une certaine forme de normalisation grammaticale, de sorte que la sortie ne vient pas comme ONU- conjugué / fléchie homme des cavernes-parler. Il y a un mois des gens sympathiques sur SO m'a donné quelques conseils sur la façon dont je pourrais résoudre ce problème en utilisant un langue ngram modélisateur , essentiellement - mais je cherche encore d'autres solutions, car il semble que NgramModeler de NLTK est pas adapté à mes besoins. (Les possibilités de marquage POS ont également été mentionnés, mais mon texte peut être trop fragmentaires et étrange pour une mise en œuvre d'un tel facile à venir, compte tenu de mon amateur-ness.)

Peut-être que je besoin de quelque chose comme DAE, mais je l'espère moins complexe

Je pense besoin de quelque chose qui fonctionne comme après la date limite ou Queequeg , mais aucun de ceux-ci 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 (ont tout essayé). Mais je comme ça elle vérifie tout pour la conjugaison est bon verbe et un accord de nombre.

Par contre, DAE est beaucoup plus rigoureux, offrant plus de capacités que j'ai besoin. Mais je ne peux pas sembler obtenir le pour fonctionner. (Je reçois 502 erreurs du serveur DAE, dont je suis sûr sont faciles à résoudre, 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 gérer un serveur DAE moi-même, parce que le nombre de « services » ma demande va exiger de mon hébergeur est déjà menacé de causer des problèmes à obtenir cette application hébergée à moindre coût.)

Ce que je voudrais éviter

Modèles linguistiques du bâtiment Ngram moi-même ne semble pas juste pour la tâche. ma demande jette beaucoup de vocabulaire inconnu, biaiser tous les résultats. (À moins d'utiliser un corpus qui est si grand qu'il fonctionne trop lent pour ma demande -. Les besoins de l'application d'être assez accrocheurs)

grammaire le contrôle strict est ni bon pour la tâche. la grammaire n'a pas besoin d'être parfait, et les phrases ne doivent pas être plus sensible que le genre de l'anglais comme charabia que vous pouvez générer en utilisant ngrams. Même si elle est charabia, j'ai juste besoin d'appliquer verbe conjugaison, accord numérique, et faire des choses comme remove articles supplémentaires.

En fait, je ne même pas besoin de tout type de suggestions pour les corrections. Je pense que tout ce que je besoin est quelque chose à additionnez le nombre d'erreurs semblent se produire dans chaque phrase dans un groupe de phrases possibles, donc je peux trier par leur score et choisissez celui avec le moins de questions grammaticales.

Une solution simple? fluidité notation en détectant les erreurs évidentes

Si un script existe qui prend soin de tout cela, je serais fou de joie (je n'ai pas encore trouvé). Je peux écrire un code pour ce que je ne trouve pas, bien sûr; Je cherche des conseils sur la façon d'optimiser mon approche.

Le mot Let nous avons unepetit peu de texte déjà aménagé:

existing_text = "The old river"

Maintenant, disons que mes besoins de script pour savoir quelle inflexion du verbe « ours » pourrait venir ensuite. Je suis ouvert aux suggestions au sujet de cette routine. Mais je besoin d'aide pour la plupart du temps à l'étape 2 , la maîtrise de la note récoltant les erreurs grammaticales:

  1. Utilisez les méthodes Conjugaison dans nodebox linguistique à venir avec tous les conjugaisons ce verbe; ['bear', 'bears', 'bearing', 'bore', 'borne'].
  2. itérer sur les possibilités, (peu profondément) vérifier la grammaire de la chaîne résultant de existing_text + " " + possibility ( « Le vieux ours de la rivière », « Les vieux ours rivière », etc.). Tally le nombre d'erreurs pour chaque construction. Dans ce cas, la seule construction d'élever une erreur, apparemment, serait « l'ancienne rivière ours ».
  3. emballage jusqu'à devrait être facile ... Des possibilités avec le nombre d'erreurs le plus bas, sélectionner au hasard.
Était-ce utile?

La solution

Grammaire Vérification avec lien Grammar

Introduction à la grammaire lien

Lien Grammaire, développé par Davy Temperley, Daniel Sleator et John Lafferty, est un analyseur syntaxique de l'anglais: « Compte tenu de la peine, les ayants droit du système à une structure syntaxique, qui se compose d'un ensemble de liens étiquetés reliant des paires de mots. L'analyseur produit également un « constituant » la représentation d'une phrase (montrant des phrases nom, verbe phrases, etc.) « . Vous pouvez en savoir plus sur Lien Grammaire et interact avec un analyseur en ligne ici .

Il y a quelques années AbiWord a pris le projet sur . Ils expliquent que AbiWord utilise la grammaire lien pour vérifier la grammaire. Je ne connais pas les subtilités de la façon dont AbiWord en effectue de fait leur de contrôle de grammaire, mais je lis sur l'approche de base dans un Q & R sur-vérification de la grammaire ( le lien auquel j'ai perdu). Contrairement à d'autres parseurs J'ai interagi avec, Link Grammar produit des résultats très différents quand une phrase est grammaticalement bien formé: il ne peut pas trouver un lien complet pour des phrases grammaticalement incorrectes .

Vous pouvez voir par vous-même avec le analyseur en ligne : entrer dans la phrase «C'est l'homme dont le chien je l'ai acheté » produit 1 lien, alors que « Ce sont l'homme dont le chien je l'ai acheté » produit aucun lien complet.

Cela ne veut pas « compter » le nombre d'erreurs, comme je l'ai demandé. Cependant, il ne remplit l'original des possibilités un moyen pour écarter grammaticalement peu plausible (à savoir de manière incorrecte conjugué).

Liaisons Python: ils existent

!

La grammaire est écrit en C. Cela posait un problème pour moi quand je suis d'abord des recherches, comme je suis seulement un an dans le codage Python et je serais mal à créer moi-même les liaisons. Je suis aussi inquiet au sujet de mon comte processus / service, donc je ne voulais pas exécuter le programme Grammaire Lien sur le dessus de mon processus Python. Mais un jour ou deux après avoir publié cette question le 13 janvier, je suis tombé sur la contribution de Jeff Elmore (de enzondio) de pylinkgrammar PyPI -. qui est arrivé un jour seulement avant

pylinkgrammar explique, il vous reste à construire et installer linkgrammar premier. Instructions sur la façon de l'utiliser sont sur cette page. Mais quelques mises en garde au sujet de l'installation de pylinkgrammar:

  1. Je n'ai pas pu obtenir pylinkgrammar travailler sur Python 2.7 avec Windows 7, que je pense est en raison de problèmes avec obtenir CMake travail Python 2.7 sous Windows 7.
  2. Ainsi je me suis déplacé tout mon projet dans Ubuntu (10.10), parce que je avais besoin de ce mal que ça. Mais quand j'ai créé Ubuntu, j'ai essayé d'installer tout pour Python 2.7 (même supprimé 2.6). Je ne pouvais toujours pas pylinkgrammar travailler avec Python 2.7. Je pense que cela était encore en raison de problèmes entre CMake et Python 2.7.
  3. J'ai commencé avec mon installation d'Ubuntu parce que les choses avaient obtenu désordre, et à la place tout mettre en place avec Python 2.6. Je l'ai maintenant obtenu pylinkgrammar travailler avec Python 2.6. (Mais je dois taper from pylinkgrammar.linkgrammar import Parser, qui diffère légèrement des instructions de la page pypi).

nodebox linguistique: l'autre partie de ma solution

Dans ma question, je déclare la nécessité de générer tous les flexions / conjugaisons d'une phrase donnée, afin de vérifier toutes ces variations et éliminer les éléments grammaticalement invraisemblables. (J'utilise WordNet pour change certains éléments d'entrées de l'utilisateur avant de délivrer en sortie, et les résultats de WordNet sont non fléchi; ils doivent être infléchi pour rendre les sorties (plus) intelligible).

Un très instructif blogpost m'a conduit à nodebox linguistique , ensemble d'outils avec lesquels « vous pouvez faire inflexion grammaire et opérations sémantiques sur le contenu en anglais. » En effet, la bibliothèque peut être utilisée pour les verbes conjugués , singularisent et noms pluralize, parmi beaucoup d'autres opérations. Ceci est juste ce que je avais besoin. Mon application sait que les mots dans une entrée, il a troqué pour nouveau langage fléchie; ces morceaux sont ceux qu'il génère des variations pour, en utilisant les méthodes nodebox linguistique.

I nourrir ces variations en variations de pylinkgrammar et drop pour lesquels aucun lien complet se trouve. Parfois, cela ne donne aucun résultat du tout, mais plus souvent qu'autrement, il produit des résultats utiles. S'il vous plaît noter que La grammaire ne trouvera pas de liens complets pour la plupart des phrases incomplètes. Si vous voulez vérifier les conjugaisons des phrases fragmentées comme je le fais, essayez extension des phrases fragmentées avec remplissage avant de vérifier, puis déposez de la charge avant la sortie. Je reçois cette « charge », en prenant le dernier mot à partir des données, recherchant dans le corpus Brown, et annexant reste de cette phrase du corpus.

Je n'ai pas des tests de rapport sur la précision de cette approche est statistiquement, mais il a travaillé pour mes (particuliers) fins plus du temps. Je suis encore en train de concrétiser cette mise en œuvre et l'écriture des cas exceptionnels et des moyens pour nettoyer les données d'entrée. Espérons que cette information aide quelqu'un d'autre aussi! S'il vous plaît ne pas hésiter à demander des éclaircissements.

Autres conseils

très cool projet, tout d'abord.

J'ai trouvé un java vérificateur de grammaire . Je ne l'ai jamais utilisé, mais la documentation affirme qu'il peut fonctionner en tant que serveur. Java et écoute un port doivent être pris en charge essentiellement partout.

Je suis juste en PNL avec un fond CS, donc je ne me dérangerait pas d'aller plus en détail pour vous aider à intégrer tout ce que vous décidez d'utiliser. Ne hésitez pas à demander plus de détails.

Une autre approche serait d'utiliser ce qu'on appelle une approche overgenerate et le rang. Dans la première étape, vous avez votre poésie générateur de générer plusieurs générations de candidats. Ensuite, en utilisant un service comme Mechanical Turk d'Amazon pour recueillir les jugements humains de maîtrise. Je suggère effectivement la collecte des jugements simultanés pour un certain nombre de phrases générées à partir des mêmes conditions de semences. Enfin, vous extrayez caractéristiques des phrases générées (en utilisant probablement une certaine forme d'analyseur syntaxique) pour former un modèle à taux ou classer la qualité de question. Vous pouvez même jeté dans les heuristiques énumérés ci-dessus.

Michael Heilman utilise cette approche pour la production de question. Pour plus de détails, lire ces documents: Bonne question! Classement statistique pour la question génération Note Questions générées par ordinateur avec Mechanical Turk .

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 fonctionne plus. Si vous allez dans cette voie, assurez-vous d'utiliser la dernière version qui se trouve à l'adresse:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top