2017-09-05 5 views
-1

J'ai la tâche de terminer la phrase, j'ai le subj, le verbe, l'adverbe ou le sujet et tout ce dont j'ai besoin est la préposition appropriée entre les deux. Y a-t-il un outil PNL qui peut donner une distribution sur les prépositions qui peuvent aller avec le verbe?Trouver la meilleure préposition pour un verbe

Meilleur

+2

Il s'agit du texte anglais, non? Les prépositions sont une classe fermée, ce qui signifie que vous pouvez créer une liste complète de toutes les prépositions (ce que vous ne pouvez pas faire pour les noms ou les verbes). Si vous savez où est la fente ouverte, vous pouvez simplement remplir chacun d'eux et utiliser un modèle de langue pour comparer la perplexité de la phrase entière pour chaque candidat. C'est, bien sûr, une méthode de force brute, je suis sûr qu'il existe de meilleurs moyens de le faire. – lenz

Répondre

2

Voici comment obtenir le nombre de fréquences pour toutes les paires de prépositions verbales dans le corpus Brown, puis rechercher celles du verbe «go». D'abord les comptes:

import nltk 
from nltk.corpus import brown 
prepchoices = nltk.ConditionalFreqDist((v[0], p[0]) 
    for (v, p) in nltk.bigrams(brown.tagged_words(tagset="universal")) 
     if v[1] == "VERB" and p[1] == "ADP") 

"ADP" signifie "adposition", c'est-à-dire préposition ou post-position. Maintenant, regardons ce que nous avons:

>>> prepchoices["go"] 
FreqDist({'to': 96, 'with': 20, 'into': 18, 'through': 8, 'on': 8, 'for': 7, 
'in': 5, 'out': 4, 'around': 4, 'from': 4, ...}) 

Vous pouvez obtenir les meilleurs choix, par ordre décroissant de fréquence, avec most_common():

>>> print(prepchoices["go"].most_common(5)) 
[('to', 96), ('with', 20), ('into', 18), ('through', 8), ('on', 8)] 

Je n'ai pas fait découlant des verbes ("va" et "allé" ont été comptés comme des mots séparés), ou même le cas-pliage. Vous pouvez les ajouter, mais ce qui précède devrait déjà vous donner une image décente de la distribution.

+0

C'est vraiment utile. Y at-il de toute façon à utiliser si avec des trigrammes et trouver le mot entre les deux? – ida

+0

Maintenant, vous changez la question! Vous avez spécifiquement demandé "une distribution sur les prépositions qui peuvent aller avec le verbe". Étant donné une liste 'triples = [(v1, prep1, n1), (v2, prep2, n2), ...]', vous pouvez construire la distribution comme ceci: 'nltk.ConditionalFreqDist (((v, n), prep) pour v, prep, n en triplets). Maintenant, les tuples '(v, n)' sont des clés. MAIS (a) vous aurez besoin de * beaucoup * de données supplémentaires pour obtenir une distribution fiable, et (b) habituellement, le nom ne suivra pas immédiatement la préparation, donc vous devrez faire le travail pour le trouver. Ma prédiction est qu'il vaut mieux ignorer le nom et juste utiliser ce qui précède. – alexis

+0

Si vous avez réellement besoin du nom, je construirais une table de distribution conditionnelle séparée (nom, prep) et j'utiliserais les deux pour calculer les fréquences à compléter. Cependant, vous aurez toujours besoin de trouver les noms qui suivent chaque préparation dans le corpus d'entraînement. De toute façon vous savez maintenant comment appliquer le 'nltk' à votre problème. Le reste dépend de toi. – alexis

0

J'ai entendu parler de NLTK être utile, mais je suis sûr que vous pouvez trouver beaucoup de prises en pension publics Github si vous recherchez. Certains résultats qui apparaissent sont TextBlob, Standard Core NLP, spaCy, genism.

+0

J'ai regardé dans ces bibliothèques mais je ne sais pas si elles fournissent des relations de préposition -verb – ida

0

possible idée:

Avec un corpus de phrases achevées:

  • Extrait tous bigrams du corpus
  • Extrait prépositions de bigrams
  • préposition Traiter comme classificateur de classe et en train de prévoir préposition d'un autre jeton
  • Application du classificateur à de nouvelles données

Je ne sais pas comment cela fonctionnerait car je n'ai jamais essayé. Bien que tout cela puisse être fait en utilisant spacy + sklearn.

+0

Si le verbe est la seule fonction prédictive, vous n'avez pas besoin de vous embêter avec un classificateur. Utilisez simplement les fréquences directement. – alexis