主要内容

比较LDA求解器

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

导入文本数据

使用arXiv API从数学论文中导入一组摘要和类别标签。方法指定要导入的记录数importSize变量。

importSize = 50000;

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

url =“https://export.arxiv.org/oai2?verb=ListRecords”+...“集=数学”+...“&metadataPrefix = arXiv”

方法提取查询URL返回的摘要文本和恢复令牌parseArXivRecords函数,该函数作为支持文件附加到本示例中。万博1manbetx要访问此文件,请将此示例作为活动脚本打开。请注意,arXiv API是有速率限制的,并且需要在多个请求之间等待。

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

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

numel(textData) < importSize . txt如果resumptionToken = =""打破结束url =“https://export.arxiv.org/oai2?verb=ListRecords”+..." &resumptionToken = "+ resumptionToken;pause(20) [textDataNew,labelsNew,resumptionToken] = parseArXivRecords(url);textData = [textData;textDataNew];结束

预处理文本数据

随机抽取10%的文件进行验证。

numDocuments = numel(textData);cvp = cvpartition(numDocuments,“坚持”, 0.1);textDataTrain = textData(训练(cvp));textDataValidation = textData(test(cvp));

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

documentsTrain = preprocessText(textDataTrain);documentsValidation = preprocessText(textDataValidation);

根据培训文档创建单词袋模型。删除总共出现次数不超过两次的单词。删除任何不包含文字的文件。

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

对于验证数据,从验证文档中创建单词袋模型。您不需要从验证数据中删除任何单词,因为任何没有出现在拟合的LDA模型中的单词都会被自动忽略。

validationData = bagOfWords(documentsValidation);

拟合和比较模型

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

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

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

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

对于随机求解器不评估验证复杂度的迭代,随机求解器报告FitInfo财产。为了绘制验证复杂度,从报告值中删除nan。

numObservations = bag.NumDocuments;数字I = 1:数字(求解器)求解器=求解器(I);lineSpec = lineSpec (i);如果解算器= =“savb”numIterationsPerDataPass = ceil(numObservations/1000);其他的numIterationsPerDataPass = 1;结束mdl = fitlda(包,numTopics,...“规划求解”解算器,...“InitialTopicConcentration”, 1...“FitTopicConcentration”假的,...“ValidationData”validationData,...“ValidationFrequency”numIterationsPerDataPass,...“详细”, 0);history = mdl.FitInfo.History;timeElapsed = history. timesincstart;validationPerplexity = history.ValidationPerplexity;移除nan。idx = isnan(validationPerplexity);timeElapsed(idx) = [];validationPerplexity(idx) = [];情节(timeElapsed validationPerplexity lineSpec)结束持有包含(“时间流逝(秒)”) ylabel (“验证困惑”ylim([0 inf]) legend(求解器)

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

验证复杂度越低,拟合越好。通常,解算器“savb”而且“研究生院理事会”快速收敛到一个良好的拟合。的解算器“cvb0”可能会收敛到一个更好的拟合,但收敛的时间要长得多。

FitInfo财产,fitlda函数从每个文档主题概率的最大似然估计的文档概率估计验证复杂度。这种方法的计算速度通常更快,但与其他方法相比,精度可能较低。方法计算验证复杂度logp函数。此函数计算更精确的值,但运行时间更长。举例说明如何计算困惑度logp,请参阅从字数矩阵计算文档对数概率

预处理功能

这个函数preprocessText执行以下步骤:

  1. 使用标记化文本tokenizedDocument

  2. 使用词汇normalizeWords

  3. 使用删除标点符号erasePunctuation

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

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

  6. 删除使用15个或更多字符的单词removeLongWords

函数documents = preprocessText(textData)标记文本。documents = tokenizedDocument(textData);把这些词简化。文档= addPartOfSpeechDetails(文档);文档= normalizeWords(文档,“风格”“引理”);删除标点符号。documents = eraspunctuation(文档);删除一个停止词列表。documents = removeStopWords(文档);删除2个或更少字符的单词,以及15个或更多字符的单词%字符。文档= removeShortWords(文档,2);documents = removeLongWords(documents,15);结束

另请参阅

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

相关的话题