这个例子展示了如何为潜在的Dirichlet分配(LDA)模型确定适当数量的主题。
要确定适当数量的主题,您可以将LDA模型的拟合优度与不同数量的主题进行比较。您可以通过计算一组文档的复杂度来评估LDA模型的拟合优度。复杂度表示模型对一组文档的描述程度。较低的复杂度表示非常适合。
加载示例数据factoryReports.csv
包含工厂报告,包括每个事件的文本描述和分类标签。从字段中提取文本数据描述
.
文件名=“factoryReports.csv”; 数据=可读性(文件名,“文本类型”,“字符串”);textData = data.Description;
使用函数标记和预处理文本数据preprocessText
在本例的最后列出。
文档=预处理文本(textData);文档(1:5)
ans=5×1标记文档:6个标记:项目偶尔卡住扫描仪滑阀7个标记:响亮的嘎嘎声传来装配机活塞4个标记:切断电源启动设备3个标记:油炸电容器装配机3个标记:混合器跳闸保险丝
随机留出10%的文件进行验证。
numDocuments =元素个数(文件);本量利= cvpartition (numDocuments,“坚持”,0.1); 文件应变=文件(cvp.培训);文件验证=文件(cvp.测试);
从培训文档中创建词汇袋模型。删除总出现次数不超过两次的单词。删除任何不含文字的文档。
bag=bagOfWords(documentsTrain);bag=删除常用词(bag,2);bag=删除空文档(bag);
我们的目标是选择一系列主题,与其他数量的主题相比,这些主题可以最大程度地减少困惑。这不是唯一的考虑因素:适合更多主题的模型可能需要更长的时间才能收敛。要查看折衷的效果,请计算拟合优度和拟合时间。如果最佳主题数量较高,则y您可能希望选择一个较低的值以加快拟合过程。
为主题数量的一系列值拟合一些LDA模型。比较测试文件中各模型的拟合时间和复杂度。困惑是这个问题的第二个输出logp
函数。要获得第二个输出而不将第一个输出赋值给任何东西,请使用~
象征拟合时间是最短的时间连续启动
上次迭代的值。此值位于历史
结构FitInfo
LDA模型的属性。
为了更快的适应,指定“规划求解”
成为“savb”
。若要抑制详细输出,请设置“冗长”
到0
.这可能需要几分钟来运行。
numTopicsRange = [5 10 15 20 40];对于i = 1: numTopics (numTopicsRange) numTopics = numTopicsRange(i);mdl = fitlda(袋、numTopics、...“规划求解”,“savb”,...“冗长”,0);[~,validationComplexity(i)]=logp(mdl,documentsValidation);timePassed(i)=mdl.FitInfo.History.TimesRunStart(end);终止
显示绘图中每个主题数量的困惑和经过的时间。在左轴上绘制困惑,在右轴上绘制经过的时间。
图yyaxis左边绘图(numTopicsRange、ValidationComplexity、,“+ -”) ylabel (“验证困惑”) yyaxis正当绘图(numTopicsRange、TIMEASED、,“o-”) ylabel (“时间运行(s)”)传说([“验证困惑”“时间运行(s)”],“位置”,“东南”)包含(“主题”)
该图表明,拟合一个包含10-20个主题的模型可能是一个不错的选择。与具有不同主题数的模型相比,复杂度较低。使用该解算器,这么多主题的运行时间也是合理的。使用不同的解算器,您可能会发现增加主题数可以获得更好的拟合,但拟合效果不理想模型需要更长的时间才能收敛。
这个函数preprocessText
,按顺序执行以下步骤:
使用将文本数据转换为小写降低
.
使用tokenizedDocument
.
删除标点符号使用erasePunctuation
.
使用删除停止词列表(如“and”、“of”和“the”)removeStopWords
.
使用删除包含2个或更少字符的单词removeShortWords
.
使用删除包含15个或更多字符的单词removeLongWords
.
使使用的词义化正常化森林
.
函数文件= preprocessText (textData)%将文本数据转换为小写。cleanTextData =低(textData);标记文本。文档=标记化文档(cleanTextData);%擦掉标点符号。= erasePunctuation文件(文档);%删除停止词列表。文件=删除文字(文件);%删除2个或更少的单词,以及15个或更大的单词%字符。文件= removeShortWords(文件,2);= removeLongWords文档(文档、15);%把这些词用柠檬语法化。= addPartOfSpeechDetails文件(文档);文档= normalizeWords(文档,“风格”,“引理”);终止
tokenizedDocument
|巴格沃兹
|removeStopWords
|logp
|巴格沃兹
|菲特尔达
|阿尔达莫代尔
|erasePunctuation
|removeShortWords
|removeLongWords
|正常化森林
|addPartOfSpeechDetails
|删除常用词
|删除空文档