主要内容

为LDA模型选择主题数量

这个例子展示了如何为潜在狄利克雷分配(LDA)模型决定适当数量的主题。

为了确定合适的主题数量,您可以比较LDA模型与不同数量的主题的拟合优度。您可以通过计算一组文档的复杂度来评估LDA模型的拟合优度。perplexity表示模型对一组文档描述的好程度。困惑度越低,拟合越好。

提取和预处理文本数据

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

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

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

documents = preprocessText(textData);文档(1:5)
ans = 5×1 tokenizedDocument: 6令牌:物品偶尔卡住扫描仪线轴7令牌:巨大的嘎嘎声巨响来装配活塞4令牌:切断电源启动装置3令牌:炸电容器装配3令牌:混合器跳闸保险丝

随机抽取10%的文件进行验证。

numDocuments = numel(文档);cvp = cvpartition(numDocuments,“坚持”, 0.1);documentsTrain = documents(cvp.training);documentsValidation = documents(cvp.test);

根据培训文档创建单词袋模型。删除总共出现次数不超过两次的单词。删除任何不包含文字的文件。

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

选择主题数量

目标是选择一定数量的主题,与其他数量的主题相比,最大限度地减少困惑。这并不是唯一需要考虑的问题:适合大量主题的模型可能需要更长的时间才能收敛。为了看到权衡的影响,计算拟合优度和拟合时间。如果主题的最佳数量很高,那么您可能希望选择一个较低的值来加快拟合过程。

为主题数量的值范围拟合一些LDA模型。比较各模型对测试文档的拟合时间和复杂度。perplexity是第二个输出logp函数。若要获得第二个输出而不将第一个输出赋值给任何对象,请使用的象征。拟合时间为TimeSinceStart值。该值在历史的结构FitInfoLDA模型的性质。

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

numTopicsRange = [5 10 15 20 40];i = 1: numTopicsRange numtopic = numTopicsRange(i);mdl = fitlda(包,numTopics,...“规划求解”“savb”...“详细”, 0);[~,validationPerplexity(i)] = logp(mdl,documentsValidation);timeElapsed(i) = mdl. fitinfo . history . timesincstart (end);结束

显示图中每个主题数量的困惑度和消耗时间。在左轴上绘制困惑度,在右轴上绘制时间。

图yyaxis情节(numTopicsRange validationPerplexity,“+ -”) ylabel (“验证困惑”) yyaxis正确的情节(numTopicsRange timeElapsed,“啊——”) ylabel (“时间流逝(秒)”)传说([“验证困惑”“时间流逝(秒)”),“位置”“东南”)包含(“题目数目”

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

使用实例预处理

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

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

  2. 使用标记化文本tokenizedDocument

  3. 使用删除标点符号erasePunctuation

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

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

  6. 删除使用15个或更多字符的单词removeLongWords

  7. 使用词汇normalizeWords

函数documents = preprocessText(textData)将文本数据转换为小写。cleanTextData = lower(textData);标记文本。documents = tokenizedDocument(cleanTextData);删除标点符号。documents = eraspunctuation(文档);删除一个停止词列表。documents = removeStopWords(文档);删除2个或更少字符的单词,以及15个或更多字符的单词%字符。文档= removeShortWords(文档,2);documents = removeLongWords(documents,15);把这些词简化。文档= addPartOfSpeechDetails(文档);文档= normalizeWords(文档,“风格”“引理”);结束

另请参阅

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

相关的话题