2017-09-20 71 views
2

我是主题建模/潜在Dirichlet分配的新手,并且无法理解如何将该概念应用于我的数据集(或者它是否是正确的方法)。了解LDA /主题建模 - 太多的主题重叠

我有少量的文学文本(小说),并希望使用LDA提取一些常规主题。

我在Python中使用gensim模块以及一些nltk功能。对于测试,我已将原始文本(只有6个)分成30个块,每个块包含1000个单词。然后我将块转换为文档项矩阵并运行算法。这是代码(虽然我觉得没关系的问题):

# 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) 

但是结果是我在那个主题见过任何例子完全不同的是充满意义的话,可以是发现于全部源文件,例如“我”,“他”,“说”,“喜欢”,...例如:

[(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模型找到更少重叠的更有特色的主题?是否首先过滤出更常见的词?如何调整模型的运行次数?原文的数量是否太少?

回答

5

LDA非常依赖于语料库中使用的单词以及它们出现的频率。您所看到的词语都是无用词 - 无意义的单词是一种语言中最常用的单词,例如“the”,“I”,“a”,“if”,“for”,“said”等。由于这些词最为频繁,因此会对模型产生负面影响。

我会用nltk停止字语料过滤掉这些话:

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的)主题分布,并向每个主题分配单词分布。非常有洞察力的high level video explains this here。如果你想看到更多的数学,但仍然在一个可访问的水平,请检查this video。使用LDA - this paper的文档越多越好,通常较长的文档(使用更多的文字)也更好,这表明LDA对于短文本(小于20个词)表现不佳。K取决于你选择的文件,真正取决于你的文件语料(文件大小,文件内容等)。通常K值在100-300之间,但这又取决于你的语料库。 (LDMS有两个超参数,alpha和beta(gemsim中的alpha和eta) - 更高的alpha表示每个文本将由更多主题表示(所以自然,较低的alpha表示每个文本将由较少的主题表示)。高eta意味着每个主题都用更多的单词表示,而低eta意味着每个主题都用较少的单词表示 - 因此,如果低eta,则主题之间的“重叠”会减少。

有许多见解,你可能获得使用LDA

  1. 什么是语料库的主题(命名主题可能无所谓您的应用程序,但如果这样做,这可以通过在检查的话做话题,因为你在上面所做的)

  2. 什么话最有助于话题

  3. 在文集文档是最相似的是什么(使用similarity metric

希望这对我有所帮助。几个月前我刚接触LDA,但我很快就使用了stackoverflow和youtube!

+0

如果您觉得这回答了您的问题@OP,不要害怕点击绿色复选标记并将其标记为正确答案:)如果不是,请告诉我是否有任何可以扩展/解释的地方更好 – killerT2333