主要内容

选择LDA模型的主题数

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

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

提取和预处理文本数据

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

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

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

documents = preprocessText(textData);文档(1:5)
ans = 5×1 tokenized文档:6个令牌:项目偶尔卡住扫描仪线轴7个令牌:响亮的摇铃声来组装活塞4个令牌:切断电源启动工厂3个令牌:炸制电容器组装3个令牌:混合器行程保险丝

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

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

从训练文档创建一个词袋模型。删除总共出现不超过两次的单词。删除任何没有文字的文档。

bag = bagOfWords(documentsTrain);bag = removeInfrequentWords(bag,2);bag = removeEmptyDocuments(包);

选择主题数量

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

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

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

numTopicsRange = [5 10 15 20 40];i = 1:num (numTopicsRange) numTopics = numTopicsRange(i);mdl = fitlda(包,numTopics,“规划求解”“savb”“详细”, 0);[~,validationPerplexity(i)] = logp(mdl,documentsValidation);timeElapsed(i) = mdl.FitInfo.History.TimeSinceStart(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(documents);删除2个或更少字符的单词,以及15个或更多字符的单词%字符。documents = removesshortwords (documents,2);documents = removeLongWords(documents,15);把单词按序排列。documents = addPartOfSpeechDetails(documents);文档= normalizeWords(文档,“风格”“引理”);结束

另请参阅

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

相关的话题