在进行 LDA 之前尝试查看数据 - 例如进行 TF、IDF 和 TFIDF 分析,以识别所有主题中出现的此类单词。如果您对产品定义有一些分类 - 考虑使用它。就我而言,这真的很有帮助。
为了推荐系统的目的,我尝试了 LDA 主题建模。在我们的市场服务中,我的报价很少。它在某些方面类似于您的产品问题和关键字列表。但在我们的案例中,我们没有产品定义,并且报价描述是由卖家创建的。所以你可以想象你会得到什么代币汤:-)
对我来说,关键点是在我测试过 LDA 的类别中分析 TF、IDF 和 TFIDF。例如,对于玩具类别 ( http://allegro.pl/zabawki-11818?ref=simplified-category-tree ) ~ .5M 项,LDA 仅基于其名称导致:
TOPIC:
lego 0.02282500803373657
puzzle 0.016679246682968853
gra 0.01092812347216676
klocki 0.010650330607355207
trefl 0.006797740719581059
zabawka 0.006365688767908592
lalka 0.0063546887775893105
maskotka 0.006111593588558912
dzieci 0.005888846995546501
24h 0.005736876716620104
TOPIC:
lego 0.02296167186908205
puzzle 0.016613064812376045
gra 0.010928234683331952
klocki 0.010607432835126579
trefl 0.006689061156804526
lalka 0.006317220992078405
zabawka 0.0062838718987015575
maskotka 0.006121026383268814
dzieci 0.0058569443925760144
24h 0.00578544965708585
TOPIC:
lego 0.02285507528449409
puzzle 0.016539723998111246
gra 0.010892673154789407
klocki 0.010624244094063881
trefl 0.006683424205358961
lalka 0.006350949499009139
zabawka 0.006324510823409019
maskotka 0.006148070280704085
dzieci 0.0058401580163702565
24h 0.005782372531889951
...
其余的看起来几乎一样。在运行 LDA 之前,我只进行了基本的文本预处理——我们基于字典的项目名称停用词删除和文本标记化(但没有蒸汽)。即使为主题描述结果提供更多术语看起来也不乐观。然后,在通过查看数据和图表导出词频及其提供类别后,我决定删除 TF-IDF 高于某个阈值的术语。是的,上面 - 我使用了 Spark 1.3.1 实现提供的计算(来自 mllib 的 HasingTF + IDF,没有 ml)。这样做后,我收到:
TOPIC:
interaktywny 0.0026985965530064884
pony 0.0026721637823727343
dmuchany 0.0015777211309733249
baterie 0.0012447186564456534
pojazdy 0.0011171017074143481
thomas 9.476877418459519E-4
dinozaury 8.823212274401862E-4
monsters 7.426822230409613E-4
heroes 7.365256561824247E-4
ninjago 7.344344320326593E-4
TOPIC:
pony 0.0026867880330479327
interaktywny 0.0026803244251279693
dmuchany 0.0015797940843537916
baterie 0.001263424692131187
pojazdy 0.0010685733429671523
thomas 9.87888159025782E-4
heroes 8.26066846602493E-4
ptaszek 7.952454816383102E-4
dinozaury 7.849838129629457E-4
batman 7.408185413186286E-4
结果开始彼此不同的地方。像上次一样,每个主题描述只使用 10 个术语。尽管如此,它并不完美,但更好。
所以,对于我做几个类别的实验来说,克服问题的方法是根据 TF-IDF 值将其删除。但是,对于每个类别,阈值都是单独计算的。主要是:mean(tf-idf) + 3*sd(tf-idf)。
我知道 Tf-Idf 中的 Idf 乘法因子应该自己解决这个问题,并且该术语应该因在每个文档中出现而受到惩罚。但是,使用 Spark 实现 (idf = log((m + 1) / (d(t) + 1))) 和我们的数据,在快速而肮脏的实验中以这种方式过滤它更简单。
当我找到几秒钟。我将对此进行回复,并将结果与代码和在线分享。