我不熟悉主题建模/潜在Dirichlet分配,并且难以理解如何将该概念应用于我的数据集(或者它是否是正确的方法)。
我有少量的文学文本(小说),并希望使用LDA提取一些一般主题。
我正在使用Python中的gensim
模块以及一些nltk
特性。为了进行测试,我将我的原始文本(仅6篇)分成30个块,每个块有1000个单词。然后,我将块转换为文档术语矩阵,并运行该html" target="_blank">算法。这就是代码(尽管我认为这与问题无关):
# chunks is a 30x1000 words matrix
dictionary = gensim.corpora.dictionary.Dictionary(chunks)
corpus = [ dictionary.doc2bow(chunk) for chunk in chunks ]
lda = gensim.models.ldamodel.LdaModel(corpus = corpus, id2word = dictionary,
num_topics = 10)
topics = lda.show_topics(5, 5)
然而,结果与我所看到的任何例子都完全不同,因为主题中充满了可以在所有源文档中找到的无意义的单词,例如“I”、“he”、“said”、“like”。。。例子:
[(2, '0.009*"I" + 0.007*"\'s" + 0.007*"The" + 0.005*"would" + 0.004*"He"'),
(8, '0.012*"I" + 0.010*"He" + 0.008*"\'s" + 0.006*"n\'t" + 0.005*"The"'),
(9, '0.022*"I" + 0.014*"\'s" + 0.009*"``" + 0.007*"\'\'" + 0.007*"like"'),
(7, '0.010*"\'s" + 0.009*"I" + 0.006*"He" + 0.005*"The" + 0.005*"said"'),
(1, '0.009*"I" + 0.009*"\'s" + 0.007*"n\'t" + 0.007*"The" + 0.006*"He"')]
我不太明白为什么会发生这种情况,或者我所看到的例子为什么不会发生这种情况。我如何让LDA模型以较少的重叠找到更独特的主题?这是一个先过滤掉更多常用词的问题吗?如何调整模型运行的次数?原文的数量是否太少?
LDA非常依赖于语料库中使用的单词以及它们出现的频率。您看到的单词都是停止词-无意义的单词,是语言中最常见的单词,例如“The”、“I”、“a”、“if”、“for”、“said”等。由于这些单词是最常见的,因此会对模型产生负面影响。
我会使用nltk
stopword语料库过滤掉这些单词:
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
然后确保您的文本不包含stop_words
列表中的任何单词(通过您使用的任何预处理方法)-下面是一个示例
text = text.split() # split words by space and convert to list
text = [word for word in text if word not in stop_words]
text = ' '.join(text) # join the words in the text to make it a continuous string again
您可能还希望删除标点符号和其他字符(“/”、“-”)等),然后使用正则表达式:
import re
remove_punctuation_regex = re.compile(r"[^A-Za-z ]") # regex for all characters that are NOT A-Z, a-z and space " "
text = re.sub(remove_punctuation_regex, "", text) # sub all non alphabetical characters with empty string ""
最后,您可能还希望筛选语料库中最频繁或最不频繁的单词,这可以使用nltk进行:
from nltk import FreqDist
all_words = text.split() # list of all the words in your corpus
fdist = FreqDist(all_words) # a frequency distribution of words (word count over the corpus)
k = 10000 # say you want to see the top 10,000 words
top_k_words, _ = zip(*fdist.most_common(k)) # unzip the words and word count tuples
print(top_k_words) # print the words and inspect them to see which ones you want to keep and which ones you want to disregard
这应该可以去掉停止词和额外的字符,但仍然留下了主题建模的巨大问题(我不会在这里解释,但会留下一些提示和链接)。
假设您对主题建模有一点了解,让我们开始吧。LDA是一个单词包模型,意思是单词顺序无关紧要。该模型为每个文档分配一个主题分布(预定数量的主题K),并为每个主题分配一个单词分布。一个非常有洞察力的高层视频在这里解释了这一点。如果你想看到更多的数学知识,但仍然是一个可访问的水平,看看这个视频。文档越多越好,通常较长的文档(包含更多单词)使用LDA也会更好——本文表明LDA在短文本(少于20个单词)中表现不佳。K取决于您的选择,实际上取决于您的文档库(它有多大,涵盖了哪些不同的主题等)。通常K值在100-300之间,但这取决于你的语料库。
LDA有两个超参数,alpha和beta(gesim中的alpha和eta)-更高的alpha表示每个文本将由更多的主题表示(因此,自然地,较低的alpha表示每个文本将由更少的主题表示)。高eta意味着每个主题由更多的单词表示,低eta意味着每个主题由更少的单词表示——因此,低eta意味着主题之间的“重叠”更少。
使用LDA你可以获得很多洞察力
>
什么词对一个话题贡献最大
语料库中哪些文档最相似(使用相似性度量)
希望这有所帮助。几个月前我还是LDA的新手,但我很快就学会了使用stackoverflow和youtube!
我一直在寻找了解这 3 个: 主题 行为主体 重播主题 我想使用它们,并知道何时、为什么使用它们,使用它们有什么好处,尽管我已经阅读了文档、观看了教程并搜索了谷歌,但我对此没有任何理解。 那么他们的目的是什么?一个真实的案例将是最受欢迎的,它甚至不需要编写代码。 我更喜欢一个干净的解释,而不仅仅是“a b = 非常感谢。
cmf分为前台模板主题和后台模板主题,两都分开独立设置,它们也在不同的目录下,前台模板在themes下,后台模板在 admin/themes下; 目前cmf默认的前后台模板主题分别是simplebootx和 simplebootx,路径分别是 themes/simplebootx,admin/themes/simplebootx; 所以这种架构形式下,前后台是都支持多主题的,如果我想增加的主题,只
我们尝试使用BehaviorSubject跨多个组件共享API数据。在我的组件上,我触发一个HTTP请求,并在返回响应后更新主题。 组件技术 服务台 请求完成后,如何仅访问行为主体的最后发出的值?
我已经读到,主题建模(从文本中提取可能的主题)最常用的技术是潜在的Dirichlet分配(LDA)。但最近我了解到另一款lda2vec。然而,我感兴趣的是尝试Word2Vec输出作为LDA的输入是否是一个好主意。 你认为为了一些研究而采用这种方法有意义吗?因为我正在做主题建模,所以需要一些新颖的方法。
Atom的界面使用HTML渲染,并且通过Less来定义样式,它是CSS的超集。不要担心之前从未听说过Less,它类似于CSS,但是带有一些便捷的扩展。 Atom支持两种主题:UI和语法。UI主题为树视图、选择夹、下拉列表和状态栏之类的元素定义样式。语法主题为编辑器中的代码定义样式。 主题可以从设置视图安装和修改,你可以选择Atom > Preferences…菜单,然后在左侧的侧栏中选择“Inst
问题内容: 我正在使用topicmodels包中的LDA,并且已经在大约30.000个文档上运行了LDA,获得了30个主题,并且获得了主题的前10个字,它们看起来非常好。但是我想看看哪些文档最有可能属于哪个主题,该怎么办? 问题答案: 如何使用内置数据集。这将向您显示哪些文档属于哪个主题的可能性最高。 那是你想做的吗? 此答案的提示:https : //stat.ethz.ch/pipermail