Dans le lissage de Kneser-Ney, comment les mots invisibles sont-ils traités?


15

D'après ce que j'ai vu, la formule de lissage (de second ordre) de Kneser-Ney est d'une manière ou d'une autre donnée comme

PKN2(wn|wn1)=max{C(wn1,wn)D,0}wC(wn1,w)+λ(wn1)×Pcont(wn)

avec le facteur de normalisation λ(wn1) donné comme

λ(wn1)=DwC(wn1,w)×N1+(wn1)

et la probabilité de continuation Pcont(wn) d'un mot wn

Pcont(wn)=N1+(wn)wN1+(w)

N1+(w) est le nombre de contextes w été vu dans ou, plus simplement, le nombre de mots distincts qui précèdent le mot donné w . D'après ce que j'ai compris, la formule peut être appliquée de manière récursive.

Maintenant, cela gère bien les mots connus dans des contextes inconnus pour différentes longueurs de n-grammes, mais ce qu'il n'explique pas, c'est quoi faire quand il y a des mots hors du dictionnaire. J'ai essayé de suivre cet exemple qui indique que dans l'étape de récursivité pour les unigrammes, Pcont(/)=PKN0(/)=1V . Le document utilise ensuite cela - citant Chen et Goodman - pour justifier la formule ci-dessus comme PKN1(w)=Pcont(w) .

Cependant, je ne vois pas comment cela fonctionne en présence d'un mot inconnu w=inconnue . Dans ces cas, Pcont(inconnue)=0quelque chose car, évidemment, le mot inconnu ne continue rien concernant l'ensemble d'apprentissage. De même, le nombre de n-grammes va être C(wn-1,inconnue)=0 .

De plus, le terme entier wC(wn-1,w) peut être nul si une séquence de mots inconnus - disons, un trigramme de mots OOD - est rencontrée.

Qu'est-ce que je rate?


Je me bats aussi avec KN. Je pense que la probabilité d'un bigramme invisible P (w1w2) pourrait reculer vers la probabilité de continuation du dernier unigramme w2. Lorsque vous vous retrouvez avec un unigramme invisible, vous n'avez rien. Que faire ensuite? Je ne sais pas.
momobo

J'essaie d'implémenter KN moi-même pour le moment et je suis coincé avec ce même problème. L'un de vous deux a-t-il réussi à trouver une solution?
jbaiter

Je suis retombé au lissage de Good-Turing pour les unigrammes invisibles (ajustement d'une fonction de puissance aux fréquences et fréquences de fréquences) ... avec des résultats variables.
sunside

Réponses:


6

Dan Jurafsky a publié un chapitre sur les modèles N-Gram qui parle un peu de ce problème:

À la fin de la récursivité, les unigrammes sont interpolés avec la distribution uniforme:

PKN(w)=max(cKN(w)-,0)wcKN(w)+λ(ϵ)1|V|

Si nous voulons inclure un mot inconnu <UNK>, il est simplement inclus comme une entrée de vocabulaire régulière avec un compte zéro, et donc sa probabilité sera:

λ(ϵ)|V|

J'ai essayé de comprendre ce que cela signifie, mais je ne sais pas si signifie simplement . Si tel est le cas et que vous supposez que lorsque le nombre atteint zéro, peut-être passe à , selon:lim x 0 x λ ( ϵ ) dϵlimX0Xλ(ϵ)

λ(wje-1)=c(wje-1)|{w:c(wje-1,w)>0}|

alors le mot inconnu ne reçoit qu'une fraction de la remise, c'est-à-dire:

λ(ϵ)|V|=|V|

Je ne suis pas du tout sûr de cette réponse, mais je voulais la diffuser au cas où cela susciterait d'autres réflexions.

Mise à jour: En fouillant un peu plus, il semble que soit généralement utilisé pour désigner la chaîne vide (""), mais on ne sait toujours pas comment cela affecte le calcul de . est toujours ma meilleure estimationλ dϵλ|V|


2
Bonne réponse mais comme vous je n'y suis pas à 100% confiant. J'ai implémenté une version du script perl research.microsoft.com/en-us/um/redmond/groups/srg/papers/… en python - mais j'ai réalisé que cela ne fonctionne que tel que si vous avez un vocabulaire fermé (problème 0 problème ) - c'est-à-dire que tous les unigrammes d'essai sont également en train. Comme suggéré par Jan lagunita.stanford.edu/c4x/Engineering/CS-224N/asset/slp4.pdf j'ai remplacé première instance de chaque mot avec <UNK> pendant le prétraitement. Cependant, lors du partitionnement, il y a des unigrammes de test qui ne sont pas en train comme "goofedup". J'ai donc utilisé d / | V | ici. Merci!
Josh Morel

1

Il existe de nombreuses façons de former un modèle, <UNK>bien que Jurafsky suggère de choisir ces mots qui apparaissent très peu de fois dans la formation et de les changer simplement en <UNK>.

Ensuite, entraînez simplement les probabilités comme vous le feriez normalement.

Voir cette vidéo à partir de 3:40 -

https://class.coursera.org/nlp/lecture/19

Une autre approche consiste à considérer simplement un mot comme <UNK>la toute première fois qu'il est vu dans la formation, bien que d'après mon expérience, cette approche attribue trop de masse de probabilité à <UNK>.


0

Juste quelques réflexions, je suis loin d'être un expert en la matière donc je n'ai pas l'intention de répondre à la question mais de l'analyser.

La chose simple à faire serait de calculer en forçant la somme à un. Ceci est raisonnable car la chaîne vide n'est jamais vue dans l'ensemble d'apprentissage (rien ne peut être prédit à partir de rien) et la somme doit être une. Si tel est le cas, peut être estimé par: Rappelez-vous qu'ici est obtenu à partir du modèle bigramme.λ ( ϵ )λ(ϵ)λ(ϵ)

λ(ϵ)=1-wmuneX(CKN(w)-,0)wCKN(w)
CKN(w)

Une autre option serait d'estimer la <unk>probabilité avec les méthodes mentionnées par Randy et de la traiter comme un jeton régulier.

Je pense que cette étape est faite pour s'assurer que les formules sont cohérentes. Notez que le terme ne dépend pas du contexte et attribue des valeurs fixes aux probabilités de chaque jeton. Si vous souhaitez prédire le mot suivant, vous pouvez annuler ce terme, d'autre part, si vous souhaitez comparer la probabilité de Kneser - Ney attribuée à chaque jeton dans deux ou plusieurs contextes différents, vous pouvez l'utiliser.λ(ϵ)|V|


Les réponses sont censées être des réponses réelles.
Michael R. Chernick
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.