如何改进gensim的主题模型
how to improve topic model of gensim
我想从文章中提取主题,测试文章是“https://julien.danjou.info/blog/2017/announcing-scaling-python”。
这是一篇关于 python 和缩放的文章。我试过 lsi 和 lda,大多数时候,lda 似乎效果更好。但是两者的输出都不稳定。
当然,前三五个关键词好像是中了目标。 "python"、"book"、'project'(我不认为 'project' 应该是一个有用的主题,会把它放到停用词列表中。)、scaling 或 scalable 或 openstack 应该是在关键字列表中,但根本不稳定。
主题列表和停用词列表可能会改善结果,但它不可扩展。我必须为不同的域维护不同的列表。
那么问题来了,有没有更好的方案来改进算法?
num_topics = 1
num_words = 10
passes = 20
lda模型演示代码,lsi代码相同
for topic in lda.print_topics(num_words=num_words):
termNumber = topic[0]
print(topic[0], ':', sep='')
listOfTerms = topic[1].split('+')
for term in listOfTerms:
listItems = term.split('*')
print(' ', listItems[1], '(', listItems[0], ')', sep='')
lda_list.append(listItems[1])
测试结果 1
Dictionary(81 unique tokens: ['dig', 'shoot', 'lot', 'world', 'possible']...)
# lsi result
0:
"python" (0.457)
"book" ( 0.391)
"project" ( 0.261)
"like" ( 0.196)
"application" ( 0.130)
"topic" ( 0.130)
"new" ( 0.130)
"openstack" ( 0.130)
"way" ( 0.130)
"decided"( 0.130)
# lda result
0:
"python" (0.041)
"book" ( 0.036)
"project" ( 0.026)
"like" ( 0.021)
"scalable" ( 0.015)
"turn" ( 0.015)
"working" ( 0.015)
"openstack" ( 0.015)
"scaling" ( 0.015)
"different"( 0.015)
测试结果 2
Dictionary(81 unique tokens: ['happy', 'idea', 'tool', 'new', 'shoot']...)
# lsi result
0:
"python" (0.457)
"book" ( 0.391)
"project" ( 0.261)
"like" ( 0.196)
"scaling" ( 0.130)
"application" ( 0.130)
"turn" ( 0.130)
"working" ( 0.130)
"openstack" ( 0.130)
"topic"( 0.130)
# lda result
0:
"python" (0.041)
"book" ( 0.036)
"project" ( 0.026)
"like" ( 0.021)
"decided" ( 0.015)
"different" ( 0.015)
"turn" ( 0.015)
"writing" ( 0.015)
"working" ( 0.015)
"application"( 0.015)
如果我没理解错的话,你有一篇文章,想让你的模型给你解释一下它是关于什么的。
但是,如果我没有误解的话,您可以在具有一个主题的单个文档上训练您的 LDA 模型。所以毕竟,你并没有真正提取主题,因为你只有一个主题。我不认为这就是 LDA 的用途。通常,您会希望在大型语料库(文档集合)上训练您的模型,例如所有英文维基百科文章或过去 60 年期刊中使用两位或三位数字主题编号的所有文章。这通常是 LDA 开始获得力量的时候。
通常,当我尝试通过了解其主题分布来 "understand" 文档时,我会在大型语料库上训练模型,不一定直接连接到我要查询的文档。这在您的文档很少 and/or 简短的情况下特别有用,就像您的情况一样。
如果您希望您的文档在主题上多样化,您可以在英语维基百科上训练 LDA(它提供您的主题从 ['apple'、'banana'、...] 到 ['regression'、'probit'、...])。
如果你知道你要查询的所有文档都在一个特定的领域,也许在这个领域的语料库上训练 LDA 会导致更好的结果,因为与该领域相关的主题将被更精确地分开。在您的情况下,您可以在几本 dozen/hundreds Python 相关书籍和文章上训练 LDA 模型。但这一切都取决于你的目标。
那你可以随时玩弄话题的数量。对于非常大的语料库,您可以尝试 100、200 甚至 1000 个主题。对于较小的可能是 5 或 10。
我想从文章中提取主题,测试文章是“https://julien.danjou.info/blog/2017/announcing-scaling-python”。
这是一篇关于 python 和缩放的文章。我试过 lsi 和 lda,大多数时候,lda 似乎效果更好。但是两者的输出都不稳定。
当然,前三五个关键词好像是中了目标。 "python"、"book"、'project'(我不认为 'project' 应该是一个有用的主题,会把它放到停用词列表中。)、scaling 或 scalable 或 openstack 应该是在关键字列表中,但根本不稳定。
主题列表和停用词列表可能会改善结果,但它不可扩展。我必须为不同的域维护不同的列表。
那么问题来了,有没有更好的方案来改进算法?
num_topics = 1
num_words = 10
passes = 20
lda模型演示代码,lsi代码相同
for topic in lda.print_topics(num_words=num_words):
termNumber = topic[0]
print(topic[0], ':', sep='')
listOfTerms = topic[1].split('+')
for term in listOfTerms:
listItems = term.split('*')
print(' ', listItems[1], '(', listItems[0], ')', sep='')
lda_list.append(listItems[1])
测试结果 1
Dictionary(81 unique tokens: ['dig', 'shoot', 'lot', 'world', 'possible']...)
# lsi result
0:
"python" (0.457)
"book" ( 0.391)
"project" ( 0.261)
"like" ( 0.196)
"application" ( 0.130)
"topic" ( 0.130)
"new" ( 0.130)
"openstack" ( 0.130)
"way" ( 0.130)
"decided"( 0.130)
# lda result
0:
"python" (0.041)
"book" ( 0.036)
"project" ( 0.026)
"like" ( 0.021)
"scalable" ( 0.015)
"turn" ( 0.015)
"working" ( 0.015)
"openstack" ( 0.015)
"scaling" ( 0.015)
"different"( 0.015)
测试结果 2
Dictionary(81 unique tokens: ['happy', 'idea', 'tool', 'new', 'shoot']...)
# lsi result
0:
"python" (0.457)
"book" ( 0.391)
"project" ( 0.261)
"like" ( 0.196)
"scaling" ( 0.130)
"application" ( 0.130)
"turn" ( 0.130)
"working" ( 0.130)
"openstack" ( 0.130)
"topic"( 0.130)
# lda result
0:
"python" (0.041)
"book" ( 0.036)
"project" ( 0.026)
"like" ( 0.021)
"decided" ( 0.015)
"different" ( 0.015)
"turn" ( 0.015)
"writing" ( 0.015)
"working" ( 0.015)
"application"( 0.015)
如果我没理解错的话,你有一篇文章,想让你的模型给你解释一下它是关于什么的。
但是,如果我没有误解的话,您可以在具有一个主题的单个文档上训练您的 LDA 模型。所以毕竟,你并没有真正提取主题,因为你只有一个主题。我不认为这就是 LDA 的用途。通常,您会希望在大型语料库(文档集合)上训练您的模型,例如所有英文维基百科文章或过去 60 年期刊中使用两位或三位数字主题编号的所有文章。这通常是 LDA 开始获得力量的时候。
通常,当我尝试通过了解其主题分布来 "understand" 文档时,我会在大型语料库上训练模型,不一定直接连接到我要查询的文档。这在您的文档很少 and/or 简短的情况下特别有用,就像您的情况一样。
如果您希望您的文档在主题上多样化,您可以在英语维基百科上训练 LDA(它提供您的主题从 ['apple'、'banana'、...] 到 ['regression'、'probit'、...])。
如果你知道你要查询的所有文档都在一个特定的领域,也许在这个领域的语料库上训练 LDA 会导致更好的结果,因为与该领域相关的主题将被更精确地分开。在您的情况下,您可以在几本 dozen/hundreds Python 相关书籍和文章上训练 LDA 模型。但这一切都取决于你的目标。
那你可以随时玩弄话题的数量。对于非常大的语料库,您可以尝试 100、200 甚至 1000 个主题。对于较小的可能是 5 或 10。