好的,因此通常使用主题模型(例如 LDA、pLSI 等)以无监督的方式推断可能出现在一组文档中的主题。我想知道是否有人对如何将我的问题硬塞进 LDA 框架有任何想法,因为有非常好的工具可用于解决 LDA 问题。
为了彻底起见,我将以下信息作为输入:
我要回答的问题是:对于当前文档,它的主题是什么?换句话说,对于给定的 DNA 片段,它最有可能来自哪个其他生物体(同一物种)?自从发生片段交换以来,可能存在突变等,因此两个片段不会相同。
这与经典LDA模型的主要区别在于我提前知道主题。
我最初的想法是采用 pLSA 模型 ( http://en.wikipedia.org/wiki/PLSA ) 并明确设置主题节点,然后执行标准的 EM 学习(如果只有一个像样的库可以处理贝叶斯参数)使用潜在变量学习......),然后使用任何算法进行推理(这应该无关紧要,因为无论如何模型都是多叉树)。
编辑:我想我已经解决了它,对于任何可能偶然发现的人。我发现您可以使用带标签的 LDA 并将每个标签分配给每个文档。由于每个标签都与一个主题一一对应,因此您实际上是在对算法说:对于每个文档,从给定的主题集(标签集)中选择主题,而不是自己编造。
我有一系列文档(约 50,000 个),我已经将这些文档转换为语料库并使用 R 中的 topicmodels 包构建 LDA 对象。不幸的是,为了测试 150 多个主题,需要几个小时。
到目前为止,我发现我可以使用以下方法同时测试几个不同的集群大小:
library(topicmodels)
library(plyr)
library(foreach)
library(doMC)
registerDoMC(5) # use 5 cores
dtm # my documenttermmatrix
seq <- seq(200,500, by=50)
models <- llply(seq, function(d){LDA(dtm, d)}, .parallel=T)
Run Code Online (Sandbox Code Playgroud)
有没有办法并行化 LDA 函数,使其运行得更快(而不是一次运行多个 LDA)?
有一些标准的停用词列表,给出了要从语料库中删除的诸如“a the of not”之类的词。但是,我想知道,停止列表是否应该逐案更改?
比如我有10K的期刊文章,那么由于文章的结构,基本上每篇文章都会看到“介绍、评论、结论、页面”这样的词。我担心的是:我们应该从我们的语料库中删除这些词吗?(每个文档都有的词?)感谢每一个评论和建议。
我正在尝试使用 pyldavis 在 python 中直观地描述我的主题。但是我无法查看图表。是我们必须在浏览器中查看图形还是在执行时它会弹出。下面是我的代码
import pyLDAvis
import pyLDAvis.gensim as gensimvis
print('Pyldavis ....')
vis_data = gensimvis.prepare(ldamodel, doc_term_matrix, dictionary)
pyLDAvis.display(vis_data)
Run Code Online (Sandbox Code Playgroud)
程序在执行上述命令时持续处于执行模式。我应该在哪里查看我的图表?或者会存放在哪里?它是否仅与 Ipython 笔记本集成?请指导我完成此操作。PS我的python版本是3.5。
我在 fcm 中使用 2 台 android 设备订阅了一个主题,在使用一台设备取消订阅该主题后,我仍然可以使用我取消订阅的设备发送消息。
有时它返回所有主题的概率并且一切都很好,但有时它只返回几个主题的概率并且它们加起来不等于一个,这似乎取决于文档。一般来说,当它返回的主题很少时,概率加起来或多或少是 80%,那么它是否只返回最相关的主题?有没有办法强制它返回所有概率?
也许我遗漏了一些东西,但我找不到该方法参数的任何文档。
我尝试使用 sklearn 的 LDA 模型找到最佳主题数。为此,我通过在https://gist.github.com/tmylk/b71bf7d3ec2f203bfce2上引用代码来计算困惑度。
但是当我增加话题数量时,困惑总是不合理地增加。我在实现上错了还是只是给出了正确的值?
from __future__ import print_function
from time import time
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.decomposition import NMF, LatentDirichletAllocation
n_samples = 0.7
n_features = 1000
n_top_words = 20
dataset = kickstarter['short_desc'].tolist()
data_samples = dataset[:int(len(dataset)*n_samples)]
test_samples = dataset[int(len(dataset)*n_samples):]
Run Code Online (Sandbox Code Playgroud)
print("Extracting tf features for LDA...")
tf_vectorizer = CountVectorizer(max_df=0.95, min_df=2,
max_features=n_features,
stop_words='english')
t0 = time()
tf = tf_vectorizer.fit_transform(data_samples)
print("done in %0.3fs." % (time() - t0))
# Use tf (raw term count) features for …Run Code Online (Sandbox Code Playgroud) 我第一次尝试使用 R 进行主题建模。所以,这可能是一个非常愚蠢的问题,但我被困住了,谷歌搜索也没有给出明确的答案。
给定一个文档语料库,我使用 LDA 函数来识别语料库中的不同主题。一旦模型拟合完毕,我如何将该模型应用到一批新文档上,以将它们分类到迄今为止发现的主题中?
示例代码:
data("AssociatedPress", package = "topicmodels")
n <- nrow(AssociatedPress)
train_data <- sample(1:n,0.75*n,replace = FALSE)
AssociatedPress_train <- AssociatedPress[(train_data),]
AssociatedPress_test <- AssociatedPress[!(train_data),]
ap_lda <- LDA(AssociatedPress_train, k = 5, control = list(seed = 1234))
Run Code Online (Sandbox Code Playgroud)
现在,我可以使用拟合模型 ap_lda 对 AssociatedPress_test 中的文档进行分类吗?如果是,怎么办?如果没有,为未来的分类创建模型的最佳方法是什么?
有很多关于这个具体问题的帖子,但我无法解决这个问题。我一直在 20newgroup 语料库上使用 Sklearn 和 Gensim 实现来试验 LDA。文献中描述,随着主题数量的增加,困惑度通常会降低,但我得到了不同的结果。
我已经尝试过不同的参数,但总的来说,当主题数量增加时,测试集的困惑度会增加,训练集的困惑度会减少。这可能表明模型在训练集上过度拟合。但使用其他文本数据集时也会出现类似的模式。此外,专门使用该数据集的研究也减少了困惑。(例如ng20 困惑度)
我已经尝试过 SkLearn、Gensim 和 Gensim Mallet 包装器,所有包确实显示出不同的困惑度值(这是可以预期的,因为 LDA 是随机初始化 + 不同的推理算法),但常见的模式是每个包的困惑度确实增加,这与文献中的许多论文相矛盾。
# imports for code sample
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.decomposition import LatentDirichletAllocation
Run Code Online (Sandbox Code Playgroud)
小示例代码
# retrieve the data
newsgroups_all = datasets.fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'), shuffle = True)
print("Extracting tf features for LDA...")
tf_vectorizer_train = CountVectorizer(max_df=0.95, min_df=2,stop_words='english')
X = tf_vectorizer_train.fit_transform(newsgroups_all.data)
X_train, X_test = train_test_split(X, test_size=0.2, random_state=42)
Run Code Online (Sandbox Code Playgroud)
k = N
lda = …Run Code Online (Sandbox Code Playgroud) I have to do a topic modeling based on pieces of texts containing emojis with R. Using the replace_emoji() and replace_emoticon functions let me analyze them, but there is a problem with the results.
A red heart emoji is translated as "red heart ufef". These words are then treated separately during the analysis and compromise the results.
Terms like "heart" can have a very different meaning as can be seen with "red heart ufef" and "broken heart"
The function replace_emoji_identifier() …
topic-modeling ×10
lda ×6
r ×3
perplexity ×2
python ×2
scikit-learn ×2
text-mining ×2
emoji ×1
firebase ×1
gensim ×1
python-3.x ×1
stop-words ×1