Search
Write a publication
Pull to refresh
5
0
Send message
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 вводов (на данной выборке).

Внизу пример менее очевидной темы (не рецепты или автомобили):
(термин 0.5097457251705502), (существ 0.3412614732147765), (греч, 0.03721095065119164), (см, 0.03721095065119164), (сущ, 0.03464162310622841), (синоним, 0.032603880570567914), (муж, 0.027996810489944186), (кол, 0.024009922920173656), (жен, 0.02365553291397183), (словар, 0.021351997873659965), (мн, 0.017453707805439887), (прил, 0.01647913528838487), (англ, 0.016124745282183044), (русск, 0.015150172765128025), (разг, 0.01408700274652255), (ср, 0.01311243022946753), (нареч, 0.011517675201559318), (слов, 0.01001151767520156), (употр, 0.009834322672100647), (франц, 0.009479932665898822), (совер, 0.008239567644192435), (толков, 0.008062372641091522), (общ, 0.007885177637990608), (книжн, 0.007885177637990608)…

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

Собственно классификация всего трафика и распределение по темам, равно как и степень покрытия придуманного классификатора и улучшения от учета 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 (конечная цель, межевой камень), так что и тут тоже все правильно — изначально Портер пытался сгруппировать однокоренные слова вместе.

Information

Rating
Does not participate
Registered
Activity