nltk language model (ngram) calcule le prob d'un mot à partir du contexte
Je suis à l'aide de Python et NLTK de construire un modèle de langage comme suit:
from nltk.corpus import brown
from nltk.probability import LidstoneProbDist, WittenBellProbDist
estimator = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)
lm = NgramModel(3, brown.words(categories='news'), estimator)
# Thanks to miku, I fixed this problem
print lm.prob("word", ["This is a context which generates a word"])
>> 0.00493261081006
# But I got another program like this one...
print lm.prob("b", ["This is a context which generates a word"])
Mais il ne semble pas fonctionner. Le résultat est comme suit:
>>> print lm.prob("word", "This is a context which generates a word")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/nltk/model/ngram.py", line 79, in prob
return self._alpha(context) * self._backoff.prob(word, context[1:])
File "/usr/local/lib/python2.6/dist-packages/nltk/model/ngram.py", line 79, in prob
return self._alpha(context) * self._backoff.prob(word, context[1:])
File "/usr/local/lib/python2.6/dist-packages/nltk/model/ngram.py", line 82, in prob
"context %s" % (word, ' '.join(context)))
TypeError: not all arguments converted during string formatting
Quelqu'un peut-il m'aider? Merci!
source d'informationauteur Huang Yen-Chieh
Vous devez vous connecter pour publier un commentaire.
Quick fix:
Je sais que cette question est vieux, mais il apparaît à chaque fois que je google nltk de NgramModel classe. NgramModel du problème de la mise en œuvre est un petit peu intuitive. La personne est confuse. Aussi loin que je peux dire, les réponses ne sont pas de grands. Depuis je n'utilise pas NgramModel souvent, cela signifie que je m'embrouille. Pas plus.
Le code source de la vie ici: https://github.com/nltk/nltk/blob/master/nltk/model/ngram.py. Voici la définition de NgramModel du problème de méthode:
(note: "l'auto[contexte].prob(mot) est l'équivalent de l'auto._model[contexte].prob(word)')
D'accord. Maintenant au moins on sait quoi chercher. Quel est le contexte? Regardons un extrait du constructeur:
Bien. Le constructeur crée une probabilité conditionnelle de distribution (de soi._model) sous condition de distribution de fréquences, dont le "contexte" est tuples de unigrams. Cela nous dit "contexte" devrait pas être une chaîne ou une liste avec un seul multi-parole de la chaîne. "contexte" DOIT être quelque chose itérable contenant unigrams. En fait, l'obligation est un peu plus stricte. Ces n-uplets ou les listes doivent être de taille n-1. Pensez-y de cette façon. Vous lui avez dit pour être un modèle trigramme. Il vaut mieux donner le contexte approprié pour les trigrammes.
Nous allons le voir en action avec un exemple plus simple:
(Comme une note de côté, en train d'essayer de faire quelque chose avec MLE que votre estimateur en NgramModel est une mauvaise idée. Les choses se délitera. Je vous le garantir.)
Comme pour la question d'origine, je suppose que je crois à ce que l'OP veut, c'est ceci:
...mais il y a tellement de malentendus qui se passe ici que je ne peux pas possible de les informer de ce qu'il était en train d'essayer de faire.
En ce qui concerne votre deuxième question: cela se produit parce que
"b"
ne se produit pas dans le Brown corpus catégorienews
que vous pouvez vérifier avec:alors que
J'avoue que le message d'erreur est très cryptique, de sorte que vous pouvez remplir un rapport de bogue avec le NLTK auteurs.
Je voudrais rester à l'écart de NLTK de NgramModel pour le moment. Il y a actuellement un lissage bug qui provoque le modèle largement surestimer les probabilités quand n>1. Si vous vous retrouvez à l'aide de NgramModel, vous devez appliquer le correctif mentionné dans le git issue tracker ici: https://github.com/nltk/nltk/issues/367