需要 LDA 帮助以选择功能

数据挖掘 机器学习 大数据 主题模型 低密度脂蛋白
2021-10-08 02:03:47

我目前正在通过使用 LDA 将产品的 6000 个关键字分组为主题来选择产品的功能。这是我的数据集样本,它被组织成每个产品 ID 的关键字列表。 在此处输入图像描述 对于 LDA,我将每个 id 视为“文档”,将每个关键字视为“文档”中的“单词”。它没有像我预期的那样奏效,因为每个主题都有许多相同的关键字,但权重不同。我删除了 100 个最常见的关键字,但主题中仍有一些相同的关键字。这是示例输出: 在此处输入图像描述

如何处理主题中相同的关键字?以及如何处理我删除的 100 个最常见的关键字?

这是显示所有“文档”中单词出现频率的图表 在此处输入图像描述 每个单词在每个文档中只出现一次,但可能出现在不同的文档中。我更新了单词频率的新图表

太感谢了。任何建议表示赞赏。

3个回答

在进行 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))) 和我们的数据,在快速而肮脏的实验中以这种方式过滤它更简单。

当我找到几秒钟。我将对此进行回复,并将结果与​​代码和在线分享。

我认为,即使在进行 LDA 之前,您也应该删除出现在文档中超过“x”% 的单词。从 80% 开始尝试不同的“x”然后下降。逻辑是,如果这个词在许多文档中很常见,那么它不会区分这些,应该被忽略。

当语料库中文档的索引错误时,您可能会遇到关键字相同的问题,即出现向量列表具有错误的文档ID(例如所有文档的文档ID相同):

<id_doc_0>, <vector of occurrences for doc 0>
<id_doc_1>, <vector of occurrences for doc 1>
...
<id_doc_1>, <vector of occurrences for doc 1>