4.3 选择主题个数
到目前为止,我们使用了固定个数的主题(100)。这纯粹是一个随意的值;我们也可以采用20或200个主题。幸运的是,对于多数用户来讲,这个值并不重要。如果你像我们之前那样,只把这些主题的使用当做一个中间步骤,那么系统的最终表现极少会对主题个数敏感。这意味着,只要你使用了足够的主题,不管是用100个主题还是200个,从这个过程中得到的推荐并没有太大差别。100通常是一个比较好的值(20对于一般文档集合来说太少了)。设置alpha(α)值也是如此。尝试不同的值会改变主题,但对于这种改变,最终的结果不会受到多大影响。
提示 主题模型通常是一个面向目标的终端服务。在这种情况下,你具体选择了哪些参数并不总是很重要。不同的主题数或者参数值(例如alpha)会得到效果几乎相同的系统。
如果你想自己探究一下这些主题,或者构建一个可视化工具,你可能应该尝试一下不同的取值,看看哪些值可以带给你最有用或最具吸引力的结果。
然而,还有一些方法可以根据数据集自动帮你确定主题的个数。有一个很流行的模型叫做层次狄利克雷过程。再一次,它背后的所有数学模型都非常复杂,超出了本书的讨论范围。但我们可以告诉你的是,在该方法中,主题本身是由数据生成的,而不是预先将主题固定,然后通过对数据的反向工程把它们恢复出来。当书写者开始撰写一个新文档时,他可以使用已有的主题,也可以创建一个全新的主题。
这意味着,我们拥有的文档越多,最后得到的主题也越多。这种方式初看起来并不是很直观,但思考一下就会觉得它非常有意义。我们是在学习主题时,样本越多,就可以把主题切分得越细。如果我们只有少量的新闻文章样本,那么体育将会是一个主题。然而,随着我们拥有更多的文档,我们就可以开始把它们切分成一些独立的部分,例如曲棍球、足球等等。随着我们拥有越来越多的数据,我们可以开始对细小的差别进行区分,从文章中把每只队伍或者每个球员分离出来。对于人,也是一样的。在一组不同背景的人群中(其中包含一些“IT人士”),你可能会把他们放在一起;在一个更大一点的分组中,你可能会让程序员和系统经理分别聚在一起。在真实世界中,Python程序员和Ruby程序员甚至会有各自的分组。
有一个能够自动确定主题个数的方法叫做层次狄利克雷过程 (HDP),可以在gensim 中使用,而且使用方法很简单。例如前面实现的LDA代码,我们只需要把对gensim.models.ldamodel.LdaModel 的调用替换成一个对HdpModel 构造函数的调用即可,如下所示:
>>> hdp = gensim.models.hdpmodel.HdpModel(mm, id2word)
这样就可以了。(不过,它需要更长时间来计算——没有免费的午餐。)现在除了不需要给出主题个数,我们还可以像使用LDA模型一样使用这个模型。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论