选择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
最后一次迭代的值。该值在历史
的结构FitInfo
LDA模型的属性。
为了更快地匹配,请指定“规划求解”
是“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
,按顺序执行以下步骤:
将文本数据转换为小写
较低的
.使用标记文本
tokenizedDocument
.使用
erasePunctuation
.删除使用的停止词列表(例如“and”,“of”和“the”)
removeStopWords
.删除包含2个或更少字符的单词
removeShortWords
.删除包含15个或更多字符的单词
removeLongWords
.用引理法排列单词
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(文档,“风格”,“引理”);结束
另请参阅
tokenizedDocument
|bagOfWords
|removeStopWords
|logp
|bagOfWords
|fitlda
|ldaModel
|erasePunctuation
|removeShortWords
|removeLongWords
|normalizeWords
|addPartOfSpeechDetails
|removeInfrequentWords
|removeEmptyDocuments