LDA делать получается, но это более сложная модель и рассчитываться оно будет все равно достаточно долго, для экспериментирования и тому подобного не подходит.
«Темы» можно использовать по-разному, о каких-то способах использования напишем немного попозже, плюс как говорилось выше, мы можем разбросать наши статьи по «кучкам» и быстро классифицировать новые поступления по отношению к ним.
На самом деле, мы смотрели на стандартные методики (собственно графические модели), в статье, как раз описывается, как можно использовать что-то совсем простое плюс некоторое количество эмпирик дают осмысленный результат (на достаточном количестве данных).
Мы занимаемся генерацией рекомендаций и, в нашем случае, наша система работает не только с содержимым текстов (это одно из важных измерений наших данных, но не единственное), потому выбираются «минимальные» решения (в смысле вычислительной сложности, трудозатратности на реализацию). Мы все-таки занимаемся NLP только тогда, когда нам нужно решение конкретной задачи связанной с расчетом рекомендаций.
Хорошее замечание — даже наивный Байес хорошо вылавливает кулинарию или автомобили, и делает это лучше чем с более абстрактными темами.
Мое упоминание автомобилей, как большой части трафика, однако, базируется не на том, что мы смогли отнести к этой теме много урлов (про классификацию и распределение по темам мы поговорим позже), а на том, что мы знаем какие сайты посвящены автомобильной тематике (не выученные данные, а знания об окружающем мире собранные у менеджеров по продажам). Для иллюстрации пропорций: за 26 мая у нас залогировано 113 989 677 прочтений страниц, из которых 7 114 967 гарантировано по автотематике.
Примером производительности может служить пересчет на последних 30 минутах:
got 3265319 hits
on 502801 urls
выгребло из базы и лемматизировало за 5 мин
из этого оно за пару минут нагенерировало 159 тем (изначально выбирали 300 “верхних” слов)
Мы не составляем полную матрицу tf-idf, считаем их внутри каждого документа, то есть обсчитывает 500 000 документов на словаре в примерно 140 000 вводов (на данной выборке).
Внизу пример менее очевидной темы (не рецепты или автомобили):
Как несложно заметить, это тема про изучение языков, грамматику и тому подобное.
Собственно классификация всего трафика и распределение по темам, равно как и степень покрытия придуманного классификатора и улучшения от учета n-грам — это тема следующего поста — stay tuned!
Каким образом можно привести слова к словарным формам без снятия омонимии? Как можно привести к нормализованной форме фразу: "у чудища было мыло, оно им мыло раму" без синтаксического анализа? Это не создание трудностей, а преодоление неоднозначностей естественного языка.
Мы говорим о немного разных вещах: полнотекстовом анализе русскоязычного текста (в моем случае) и ситуациях, когда не требуется нормализация текста (в вашем).
В случае русскоязычного текста нормализация, все-таки необходима: случай текстов в которых важно распределение родительного падежа пассивного причастия глагола "сублимировать" (или какая-то другая ненормализованная словоформа) довольно маргинальны, ключевые слова нужны для некого обобщения содержания текста.
Опять-таки нормализацию и вычленение ключевых слов можно делать по-разному, приведенные методы, просто являются наиболее "очевидными" примерами.
Вообще-то речи про обработку естественного языка в статье не идет: алгоритм Портера упоминается как отправная точка для тех, кто хочет об этом почитать (в основном из-за того, что он один из самых старых). По поводу обязательности: русский язык морфологически богатый, поэтому расчет tf-idf и или LDA или чего-либо еще на ненормализованных словах даст довольно плохие результаты, поскольку будут находиться распределения словоформ, а не лемм. Так что да, каким-то образом тексты перед вычленением тегов, ключевых слов, коллокаций и тому подобных штук, нужно приводить к какому-то нормализованному виду.
Излишняя лемматизация (over-stemming) это проблема, которую можно решать разными способами (включая добавление словарей и тому подобное), опять-таки в статье речи о лингвистических аспектах обработки текстов не идет.
Кстати, стеммер Портера (в своей базовой ипостаси) для русского языка, различит терминатора и терминал
val stemmer = new Stemmer
println(stemmer.stem("терминатор"))
println(stemmer.stem("терминал"))
import io.relap.Stemmer
scala> stemmer: Stemmer = Stemmer@62da83ed
scala> List(терминатор)
scala> List(термина)
суффикс актора "ор" в русском языке отсутствует и поэтому он сохранится. Ну и совсем уж занудно: терминал и терминатор — слова однокоренные от латинского terminus (конечная цель, межевой камень), так что и тут тоже все правильно — изначально Портер пытался сгруппировать однокоренные слова вместе.
«Темы» можно использовать по-разному, о каких-то способах использования напишем немного попозже, плюс как говорилось выше, мы можем разбросать наши статьи по «кучкам» и быстро классифицировать новые поступления по отношению к ним.
Мое упоминание автомобилей, как большой части трафика, однако, базируется не на том, что мы смогли отнести к этой теме много урлов (про классификацию и распределение по темам мы поговорим позже), а на том, что мы знаем какие сайты посвящены автомобильной тематике (не выученные данные, а знания об окружающем мире собранные у менеджеров по продажам). Для иллюстрации пропорций: за 26 мая у нас залогировано 113 989 677 прочтений страниц, из которых 7 114 967 гарантировано по автотематике.
Примером производительности может служить пересчет на последних 30 минутах:
Мы не составляем полную матрицу tf-idf, считаем их внутри каждого документа, то есть обсчитывает 500 000 документов на словаре в примерно 140 000 вводов (на данной выборке).
Внизу пример менее очевидной темы (не рецепты или автомобили):
Как несложно заметить, это тема про изучение языков, грамматику и тому подобное.
Собственно классификация всего трафика и распределение по темам, равно как и степень покрытия придуманного классификатора и улучшения от учета n-грам — это тема следующего поста — stay tuned!
В случае русскоязычного текста нормализация, все-таки необходима: случай текстов в которых важно распределение родительного падежа пассивного причастия глагола "сублимировать" (или какая-то другая ненормализованная словоформа) довольно маргинальны, ключевые слова нужны для некого обобщения содержания текста.
Опять-таки нормализацию и вычленение ключевых слов можно делать по-разному, приведенные методы, просто являются наиболее "очевидными" примерами.
Излишняя лемматизация (over-stemming) это проблема, которую можно решать разными способами (включая добавление словарей и тому подобное), опять-таки в статье речи о лингвистических аспектах обработки текстов не идет.
Кстати, стеммер Портера (в своей базовой ипостаси) для русского языка, различит терминатора и терминал
суффикс актора "ор" в русском языке отсутствует и поэтому он сохранится. Ну и совсем уж занудно: терминал и терминатор — слова однокоренные от латинского terminus (конечная цель, межевой камень), так что и тут тоже все правильно — изначально Портер пытался сгруппировать однокоренные слова вместе.