这个示例展示了如何为潜在Dirichlet分配(LDA)模型确定合适的主题数量。
要决定合适数量的主题,您可以比较LDA模型的高度适合符合不同数量的主题。您可以通过计算一组文件集的困惑来评估LDA模型的健康。困惑表明模型描述了一组文档的程度。较低的困惑表明更适合。
加载示例数据。文件factoryreports.csv.
包含工厂报告,包括每个事件的文本描述和分类标签。从字段中提取文本数据描述
.
filename =.“factoryReports.csv”;数据= readtable(文件名,'texttype'那'细绳');textData = data.Description;
使用该功能授权和预处理文本数据preprocessText
在本例的最后列出。
文档= preprocesstext(textdata);文件(1:5)
ans = 5×1令牌Document:6个代币:物品偶尔得到扫描仪卷轴7令牌:响亮的拨浪鼓响起来了瓶子活塞4令牌:切割电源启动工厂3令牌:Fry电容器组件3令牌:搅拌机跳闸保险丝
随机预留10%的文件以进行验证。
numDocuments =元素个数(文件);本量利= cvpartition (numDocuments,'坚持',0.1);documentstrain =文档(cvp.train);documentsvalidation =文档(cvp.test);
从培训文档中创建词汇袋模型。删除总出现次数不超过两次的单词。删除任何不含文字的文档。
bag = bagofwords(DocumentStrain);袋= removeinfreqwinds(袋子,2);BAG = RoverimementyDocuments(袋);
目标是选择许多主题,与其他主题相比,最小化困惑。这不是唯一的考虑因素:模型适合大量主题可能需要更长的时间来收敛。要查看权衡的影响,请计算适合的身高和配件时间。如果最佳主题数很高,那么您可能希望选择较低的值以加快拟合过程。
适用于某种值的LDA模型,以获得主题次数。比较每个模型对所持式测试文档集的拟合时间和困惑。困惑是第二个输出logp
函数。要获得第二个输出而不将第一个输出赋值给任何东西,请使用〜
象征。配件时间是TimesIncestart.
最后迭代的价值。这个值是在的历史
结构的结构FitInfo.
LDA模型的属性。
为了更快的适应,指定“规划求解”
成为“savb”
.要抑制详细输出,请设置“详细”
到0.
.这可能需要几分钟来运行。
numTopicsRange = [5 10 15 20 40];为了i = 1: numTopics (numTopicsRange) numTopics = numTopicsRange(i);mdl = fitlda(袋、numTopics、......“规划求解”那“savb”那......“详细”,0);[〜,ValidationPerplexity(i)] = logp(mdl,documentValidation);TimeLapsed(i)= mdl.fitinfo.history.timesIncestart(END);结尾
为绘图中的每个主题显示困惑和经过的时间。绘制左轴上的困惑,右轴上经过的时间。
图yyaxis剩下绘图(NumtopicsRange,ValidationPerplearity,“+ -”) ylabel (“验证困惑”) yyaxis对绘图(NumtopicsRange,TimeLapsed,'O-') ylabel (“时间运行(s)”)传说([“验证困惑”“时间运行(s)”],“位置”那“东南”)包含(“主题”)
绘图表明,用10-20个主题拟合模型可能是一个不错的选择。与具有不同主题数量不同的模型相比,困惑低。通过这个解决者,这么多主题的经过时间也是合理的。通过不同的求解器,您可能会发现增加主题的数量可能导致更好的合适,但拟合模型需要更长的时间来收敛。
这个函数preprocessText
,按顺序执行以下步骤:
将文本数据转换为小写使用较低的
.
使用授权文本tokenizedDocument
.
删除标点符号使用erasePunctuation
.
删除使用的停止单词列表(例如“和”,“和”和“该”)的列表removeStopWords
.
使用2或更少的字符删除单词removeShortWords
.
使用15个或更多字符删除单词removelongwords.
.
使使用的词义化正常化字
.
函数文件= preprocessText (textData)%将文本数据转换为小写。cleanTextData =低(textData);标记文本。文档= tokenizeddocument(cleantextdata);%擦掉标点符号。= erasePunctuation文件(文档);%删除停止单词列表。文档= Removestopwords(文件);%删除2个或更少的单词,以及15个或更大的单词%字符。文件= removeShortWords(文件,2);= removeLongWords文档(文档、15);%lemmatize单词。= addPartOfSpeechDetails文件(文档);文档= normalizeWords(文档,'风格'那'引理');结尾
addPartOfSpeechDetails
|Bagofwords.
|Bagofwords.
|erasePunctuation
|菲达
|ldamodel.
|logp
|正常化字
|删除程序
|removeinfrequentwords.
|removelongwords.
|removeShortWords
|removeStopWords
|tokenizedDocument