Как стать автором
Обновить

Комментарии 4

Огромная благодарность за последние три ссылки!
Distribution[Topic] ??? Topic => Distribution[Words] = Distribution[Words]
Ответ — flatMap

Если использовать монаду «список» то слова в итоговом распределении будут повторяться:
Distribution[ пессимистичный топик ] = { (всё, 0.5), (плохо, 0.5) }
Distribution[ оптимистичный топик ] = { (всё, 0.5), (хорошо, 0.5) }
->
Distribution[ взвешенный текст ] = { (всё, 0.25), (плохо, 0.25), (всё, 0.25), (хорошо, 0.25) }

А с монадой «множество» не знаю как в Scala, а в Haskell до сих пор непонятно, есть она или нет.
С другой стороны, если работать с множествами слов, комбинаторного взрыва быть не должно. Кроме того, упорядочив множество по убыванию встречаемости слов, можно использовать выгоду ленивых списков: в расчете метрик текста анализировать только начало списка, отсекая слова с малой вероятностью, или отбросив хвост, когда вес всего хвоста меньше порога.
Интересно, нельзя ли как-нибудь красиво абстрагировать байесовские зависимости между событиями, к примеру, оценивая совместную встречаемость слов.
А зачем использовать монаду «список», а не монаду «Distribution»? Думаю у монады Distribution проблемы повторения значений нет.
Да в том-то и дело, что надо обеспечить отсутствие повторений, реализовав слияние одинаковых слов в операции «bind» монады. List:flatMap вам этого просто так не сделает. В Haskell с этим трудности, поскольку для объединения значений типа их нужно уметь сравнивать на равенство, а такое ограничение ломает сигнатуру «bind». В репозитории из статьи я кода слияния не увидел, но я Scala не знаю.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий