主要内容

选择LDA模型的主题数

这个示例展示了如何为潜在Dirichlet分配(LDA)模型确定合适的主题数量。

为了确定合适的主题数量,可以比较LDA模型与不同数量的主题的匹配度。您可以通过计算保留文档集的复杂度来评估LDA模型的拟合程度。这种困惑表明模型对一组文档的描述有多好。更低的困惑意味着更好的契合。

提取和预处理文本数据

加载示例数据。该文件factoryReports.csv包含工厂报告,包括每个事件的文本描述和分类标签。从字段中提取文本数据描述

文件名=“factoryReports.csv”;data = readtable(文件名,“TextType”“字符串”);textData = data.Description;

使用该函数对文本数据进行标记和预处理preprocessText在本例的最后列出。

文件= preprocessText (textData);文档(1:5)
ans = 5×1 tokenizedDocument: 6代币:物品偶尔被卡住扫描仪卷轴7代币:响亮的叮当声巨响来组装器活塞4代币:切断电源启动工厂3代币:炸电容器组装器3代币:搅拌器trip fuse

随机留出10%的文件进行验证。

numDocuments =元素个数(文件);本量利= cvpartition (numDocuments,“坚持”, 0.1);documentsTrain =文档(cvp.training);documentsValidation =文档(cvp.test);

从培训文档中创建词汇袋模型。删除总出现次数不超过两次的单词。删除任何不含文字的文档。

袋= bagOfWords (documentsTrain);袋= removeInfrequentWords(袋,2);袋= removeEmptyDocuments(袋);

选择主题数量

我们的目标是选择一些主题,与其他主题相比,将困惑最小化。这并不是唯一需要考虑的问题:适合更多主题的模型可能需要更长的时间来收敛。为了观察权衡的效果,计算拟合优度和拟合时间。如果主题的最佳数量很高,那么您可能希望选择一个较低的值来加快拟合过程。

将一些LDA模型适用于主题数量的值范围。比较各模型在保留的测试文档集上的拟合时间和复杂度。困惑是第二个输出logp函数。要获得第二个输出而不将第一个输出赋值给任何东西,请使用的象征。合适的时间是TimeSinceStart值的最后一次迭代。这个值在历史结构体的FitInfoLDA模型的属性。

为了更快的适应,指定“规划求解”“savb”.要抑制verbose输出,请设置“详细”0.这可能需要几分钟来运行。

numTopicsRange = [5 10 15 20 40];i = 1: numTopics (numTopicsRange) numTopics = numTopicsRange(i);mdl = fitlda(袋、numTopics、“规划求解”“savb”“详细”, 0);(~ validationPerplexity (i)] = logp (mdl documentsValidation);timeElapsed (i) = mdl.FitInfo.History.TimeSinceStart(结束);结束

显示情节中每个主题数量的复杂程度和经过的时间。在左轴上绘制困惑,在右轴上绘制时间。

图yyaxis情节(numTopicsRange validationPerplexity,“+ -”) ylabel (“验证困惑”) yyaxis正确的情节(numTopicsRange timeElapsed,“啊——”) ylabel (“时间运行(s)”)传说([“验证困惑”“时间运行(s)”],“位置”“东南”)包含(“主题”

从图中可以看出,拟合一个包含10-20个主题的模型可能是一个不错的选择。与主题数不同的模型相比,该模型的复杂度较低。有了这个解算器,这么多主题的运行时间也是合理的。使用不同的求解器,您可能会发现增加主题的数量可以得到更好的拟合,但拟合模型需要更长的时间才能收敛。

例子预处理功能

这个函数preprocessText,依次执行以下步骤:

  1. 使用。将文本数据转换为小写较低的

  2. 使用标记文本tokenizedDocument

  3. 删除标点符号使用erasePunctuation

  4. 删除使用停止词的列表(如“and”,“of”和“the”)removeStopWords

  5. 删除使用2个或更少字符的单词removeShortWords

  6. 删除超过15个字符的单词removeLongWords

  7. 使使用的词义化normalizeWords

函数文件= preprocessText (textData)%将文本数据转换为小写。cleanTextData =低(textData);标记文本。文件= tokenizedDocument (cleanTextData);%擦掉标点符号。= erasePunctuation文件(文档);删除一个停止词列表。= removeStopWords文件(文档);%删除2个或更少的单词,以及15个或更大的单词%字符。文件= removeShortWords(文件,2);= removeLongWords文档(文档、15);将单词义化。= addPartOfSpeechDetails文件(文档);文档= normalizeWords(文档,“风格”“引理”);结束

另请参阅

|||||||||||||

相关的话题