Вычисление вероятности маркера, являющегося спамом в Байесовском фильтре спама

Мне нравится разбивать обработку на две части:

const zipWith = (fn) => (a, b) => [...Array(Math.max(a.length, b.length))]
  .map((_, i) => fn(a[i], b[i]))

const combine = zipWith ((a, b) => 
  a && b ? {...a, ...b} : a ? {...a} : b ? {...b} : null)

console.log(combine([null, null, {a: 1}], [{c: 3}, null, {a: 3, b: 2}]))
console.log(combine([], [null, null, {t: 4}]))
.as-console-wrapper { max-height: 100% !important; top: 0; }

«zip» является общее имя для функции, которая объединяет два массива, индекс за индексом. Иногда «zipWith» используется для расширения, которое принимает функцию для решения, как объединить эти два значения. Эта версия zipWith немного сложнее, чем другие варианты, так как она использует большую длину двух входных массивов, а не только длину первого (что может быть записано zip = (fn) => (a1, a2) => a1.map((a, i) => fn(a, a2[i])).)

[1119 ] combine вызывает это с помощью функции, которая обрабатывает четыре случая: a null / b null, a null / b non-null, a non-null / b null и a non-null / b non-null, используя или комбинируя предоставленные значения.

zipWith - это многократно используемая функция, которая может оказаться полезной в других местах вашего приложения. combine более конкретно относится к этому случаю.

8
задан Alex B 11 April 2009 в 21:41
поделиться

4 ответа

В этом документе EACL Карла-Михаэля Шнайдера (PDF) говорится, что вы должны использовать полиномиальную модель, то есть общее количество токенов, для расчета вероятности. Пожалуйста, смотрите документ для точных расчетов.

2
ответ дан 6 December 2019 в 00:59
поделиться

Можете ли вы изменить свой код, чтобы использовать другие методы? Затем вы можете протестировать другой набор данных и опубликовать результаты.

0
ответ дан 6 December 2019 в 00:59
поделиться

Вы можете взглянуть на PopFile, проверенную временем реализацию perl. Это очень хорошая работа. Я уверен, что это открытый исходный код, и вы могли видеть, какую формулу они используют.

0
ответ дан 6 December 2019 в 00:59
поделиться

Как правило, большинство фильтров перешло алгоритмы, изложенные в статье Грэма. Мое предложение было бы получить источник SpamBayes и прочитать комментарии, изложенные в spambayes / classifier.py (в частности) и spambayes / tokenizer.py (особенно в верхней части). Там много истории о ранних экспериментах, которые проводились, оценивая подобные решения.

видел (любое количество раз), а nham и nspam - общее количество сообщений):

hamratio = hamcount / nham
spamratio = spamcount / nspam
prob = spamratio / (hamratio + spamratio)
S = options["Classifier", "unknown_word_strength"]
StimesX = S * options["Classifier", "unknown_word_prob"]
n = hamcount + spamcount
prob = (StimesX + n * prob) / (S + n)

unknown_word_strength равно (по умолчанию) 0,45, а unknown_word_prob равно (по умолчанию) 0,5.

1
ответ дан 6 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: