В сглаживании Кнезера-Нея, как обрабатываются невидимые слова?


15

Из того, что я видел, формула сглаживания Кнезера-Ней (второго порядка) так или иначе задается как

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

с нормализующим коэффициентом λ(wn1) заданным как

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

и вероятность продолжения Pcont(wn) слова wn

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

где N1+(w) - количество контекстов, в которых w был замечен, или, проще, количество различных слов которые предшествуют данному слову w . Из того, что я понял, формула может быть применена рекурсивно.

Теперь это хорошо обрабатывает известные слова в неизвестных контекстах для разных длин n-грамм, но не объясняет, что делать, когда есть слова вне словаря. Я попытался следовать этому примеру, в котором говорится, что на этапе рекурсии для униграмм P_ { cont } (/) = P ^ 0_ {KN} (/) = \ frac {1} {V}Pcont(/)=PKN0(/)=1V . Затем в документе используется это - цитирование Чена и Гудмена - для обоснования приведенной выше формулы как PKN1(w)=Pcont(w) .

Я не вижу, как это работает при наличии неизвестного слова w=unknown . В этих случаях Pcont(unknown)=0something поскольку, очевидно, неизвестное слово не продолжает ничего относительно обучающего набора. Точно так же количество n-грамм будет C(wn1,unknown)=0 .

Кроме того, весь термин wC(wn1,w) может быть нулевым, если встречается последовательность неизвестных слов, скажем, триграмма слов OOD.

Что мне не хватает?


Я тоже борюсь с КН. Я думаю, что вероятность невидимого биграмма P (w1w2) может откатиться к вероятности продолжения последнего униграммы w2. Когда вы остаетесь с невидимой униграммой, у вас ничего не было. Что делать дальше? Я не знаю.
Момобо

Я сейчас пытаюсь внедрить KN самостоятельно и застрял с этой же проблемой. Кто-нибудь из вас сумел найти решение?
Jbaiter

Я вернулся к сглаживанию Good-Turing для невидимых униграмм (подгонка степенной функции к частотам и частотам) ... с различными результатами.
июня

Ответы:


6

Дэн Юрафски опубликовал главу о моделях N-Gram, в которой немного говорится об этой проблеме:

По окончании рекурсии униграммы интерполируются с равномерным распределением:

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

Если мы хотим включить неизвестное слово <UNK>, оно просто включается как обычный словарный запас с нулевым счетом, и, следовательно, его вероятность будет:

λ(ϵ)|V|

Я пытался выяснить, что это значит, но не уверен, что означает просто . Если это так, и вы предполагаете, что, поскольку счетчик обнуляется, возможно, переходит к , в соответствии с:ϵlimx0xλ(ϵ)d

λ(wi1)=dc(wi1)|{w:c(wi1,w)>0}|

тогда неизвестному слову просто присваивается доля скидки, т.е.

λ(ϵ)|V|=d|V|

Я не уверен в этом ответе вообще, но хотел получить его там на случай, если он вызовет еще некоторые мысли.

Обновление: копаясь еще немного, кажется, что обычно используется для обозначения пустой строки (""), но все еще неясно, как это влияет на вычисление . по-прежнему моя лучшая догадкаϵλd|V|


2
Хороший ответ, но, как и вы, я не уверен в этом на 100%. Я реализовал версию сценария perl research.microsoft.com/en-us/um/redmond/groups/srg/papers/…s в python - но понял, что он работает только как есть, если у вас есть закрытый словарь (проблема с 0 пробами) ) - то есть все тестовые надписи также находятся в поезде. Как полагает Ян lagunita.stanford.edu/c4x/Engineering/CS-224N/asset/slp4.pdf I заменил первый экземпляр каждого слова с <УНК> во время предварительной обработки. Тем не менее, при разбиении, есть некоторые тестовые униграммы не в поезде, как "goofedup". Поэтому я использовал д / | V | Вот. Благодарность!
Джош Морел

1

Есть много способов тренировать модель, <UNK>хотя Юрафски предлагает выбрать те слова, которые встречаются в процессе обучения очень редко, и просто изменить их на <UNK>.

Затем просто обучите вероятности, как обычно.

Смотрите это видео, начиная с 3:40 -

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

Другой подход заключается в том, чтобы просто рассматривать слово как <UNK>самый первый раз, когда оно встречается на тренировке, хотя из моего опыта этот подход назначает слишком большую часть вероятностной массы <UNK>.


0

Всего несколько мыслей, я далеко не эксперт в этом вопросе, поэтому я не собираюсь давать ответ на вопрос, а анализировать его.

Самое простое, что можно сделать, - это вычислить , задав сумму, равную единице. Это разумно, так как пустая строка никогда не видна в обучающем наборе (ничто не может быть предсказано из ничего), и сумма должна быть равна единице. Если это так, то можно оценить как: Помните, что здесь получается из биграмной модели.λ(ϵ)λ(ϵ)

λ(ϵ)=1wmax(CKN(w)d,0)wCKN(w)
CKN(w)

Другой вариант - оценить <unk>вероятность с помощью методов, упомянутых Рэнди, и рассматривать ее как обычный токен.

Я думаю, что этот шаг сделан, чтобы гарантировать, что формулы последовательны. Обратите внимание, что термин не зависит от контекста и присваивает фиксированные значения вероятностям каждого токена. Если вы хотите предсказать следующее слово, вы можете предварительно предсказать этот термин, с другой стороны, если вы хотите сравнить вероятность Кнезера - Нейя, назначенную каждому токену в двух или более различных контекстах, вы можете использовать его.λ(ϵ)|V|


Предполагается, что ответы предназначены для реальных ответов.
Майкл Р. Черник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.