主要内容

比较LDA解决者

这个例子展示了如何通过比较模型的拟合优度和拟合时间来比较潜在的Dirichlet分配(LDA)求解器。

导入文本数据

使用arXiv API从数学论文导入一组摘要和类别标签。使用进口尺寸变量。

进口规模=50000;

创建用set查询记录的URL“数学”和元数据的前缀“arXiv”

网址=“https://export.arxiv.org/oai2?verb=ListRecords”+...“&set=math”+...“&metadataPrefix = arXiv”

使用parseArXivRecords作为支持文件附加到此示例的函数。若要访问此文件,请将此示例作为实时脚本打开。请注意,arXiv 金宝appAPI受速率限制,需要在多个请求之间等待。

[textData,~,resumptionToken]=parseArXivRecords(url);

迭代地导入更多的记录块,直到达到所需的数量,或者没有更多的记录。要继续从停止的地方导入记录,请在查询URL中使用先前结果中的恢复令牌。要遵守arXiv API施加的速率限制,在使用暂停函数。

虽然numel(文本数据)如果resumptionToken = =""打破结束网址=“https://export.arxiv.org/oai2?verb=ListRecords”+...“&resumptionToken=”+ resumptionToken;pause(20) [textdat一新,labelsNew, resumtiontoken] = parseArXivRecords(url);textData = [textData;textDataNew];结束

预处理文本数据

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

numDocuments =元素个数(textData);本量利= cvpartition (numDocuments,“坚持”, 0.1);textDataTrain = textData(培训(cvp));textDataValidation = textData(测试(cvp));

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

documentsTrain=预处理文本(textDataTrain);documentsValidation=预处理文本(textDataValidation);

从培训文档中创建一个单词包模型。删除总共出现不超过两次的单词。删除任何不包含单词的文档。

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

对于验证数据,从验证文档中创建一个单词包模型。您不需要从validaiton数据中删除任何单词,因为任何未出现在已安装的LDA模型中的单词都会被自动忽略。

validationData = bagOfWords (documentsValidation);

拟合和比较模型

对于每个LDA解算器,拟合一个包含40个主题的模型。要在相同轴上打印结果时区分解算器,请为每个解算器指定不同的线特性。

numTopics = 40;解决= [“研究生院理事会”“真空断路”“cvb0”“savb”];lineSpecs = ["+-""*-"“x -”“啊——”];

使用每个解算器拟合LDA模型。对于每个解算器,指定初始主题浓度1,以在每次数据传递时验证模型一次,并且不拟合主题浓度参数。使用FitInfo拟合LDA模型的性质,绘制验证复杂度和经过的时间。

默认情况下,随机解算器使用最小批量1000,并每10次迭代验证一次模型。对于此解算器,要在每次数据传递时验证一次模型,请将验证频率设置为ceil(numObservations/1000),在那里numObservations为培训数据中的文档数。对于其他求解器,将验证频率设置为1。

对于随机解算器未评估验证复杂性的迭代,随机解算器报告FitInfo财产。要绘制验证复杂度,请从报告值中删除nan。

numObservations=bag.NumDocuments;图I = 1:numel(solvers) solver = solvers(I);lineSpec = lineSpecs(我);如果解算器==“savb”numIterationsPerDataPass =装天花板(numObservations / 1000);其他的numIterationsPerDataPass=1;结束mdl=菲特尔达(袋、numTopics、,...“解算器”,解算器,...“InitialTopicConcentration”1....“fittopiconcentration”错误的...“验证数据”validationData,...“验证频率”numIterationsPerDataPass,...“详细”,0);history=mdl.FitInfo.history;timeappeased=history.timescentstart;validationcomplexity=history.validationcomplexity;%去除nan。idx = isnan (validationPerplexity);timeElapsed (idx) = [];validationPerplexity (idx) = [];情节(timeElapsed validationPerplexity lineSpec)在…上结束持有xlabel(“经过的时间”)伊拉贝尔(“验证困惑”ylim([0 inf])图例(求解器)

对于随机解算器,只有一个数据点。这是因为此解算器只传递一次输入数据。若要指定更多数据传递,请使用“DataPassLimit”选择。批处理解决程序(“研究生院理事会”“真空断路”“cvb0”),要指定用于拟合模型的迭代次数,请使用“IterationLimit”选择。

更低的验证困惑意味着更好的匹配。通常,解决“savb”“研究生院理事会”迅速地收敛到一个很好的匹配。的解算器“cvb0”可能收敛得更好,但收敛的时间要长得多。

FitInfo财产fitlda函数根据每个文档主题概率的最大似然估计,从文档概率估计验证复杂度。这通常计算起来更快,但可能比其他方法不准确。或者,使用logp函数。此函数计算更精确的值,但运行时间可能更长。例如,演示如何使用logp,请参阅从字数矩阵计算文档日志概率

预处理函数

功能preprocessText执行以下步骤:

  1. 使用标记文本标记化文档

  2. 用英语把单词语法化normalizeWords

  3. 使用删除标点符号删除标点符号

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

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

  6. 删除超过15个字符的单词removeLongWords

作用文档=预处理文本(文本数据)%标记文本。文件= tokenizedDocument (textData);将单词义化。documents=addPartOfSpeechDetails(documents);文档=规范化日志(文档、,“风格”“引理”);%删除标点符号。文件=标点符号(文件);删除一个停止词列表。= removeStopWords文件(文档);%删除包含2个或更少字符的单词,以及包含15个或更多字符的单词%人物。documents=removeShortWords(documents,2);documents=removeLongWords(documents,15);结束

另请参阅

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

相关话题