这个例子展示了如何通过比较拟合优度和拟合模型所花费的时间来比较潜在的狄利克雷分配(LDA)求解器。
使用arXiv API从数学论文中导入一组摘要和类别标签。方法指定要导入的记录数importSize
变量。
importSize = 50000;
创建一个使用set查询记录的URL“数学”
元数据前缀“arXiv”
.
url =“https://export.arxiv.org/oai2?verb=ListRecords”+...“集=数学”+...“&metadataPrefix = arXiv”;
方法提取查询URL返回的摘要文本和恢复令牌parseArXivRecords
函数,该函数作为支持文件附加到本示例中。金宝app要访问此文件,请将此示例作为实时脚本打开。注意arXiv API是有速率限制的,需要在多个请求之间等待。
[textData,~,resumptionToken] = parseArXivRecords(url);
迭代地导入更多的记录块,直到达到所需的数量,或者没有更多的记录。要从您停止的地方继续导入记录,请在查询URL中使用前一个结果的恢复令牌。方法执行arXiv API施加的速率限制,在每次查询之前添加20秒延迟暂停
函数。
而numel(textData) < importSize如果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(training(cvp));textdatavalization = textData(test(cvp));
使用函数对文本数据进行标记和预处理preprocessText
在这个例子的最后列出了。
documentsTrain = preprocessText(textDataTrain);documentsValidation = preprocessText(textdatavalfication);
从培训文档创建一个单词包模型。去掉总共出现次数不超过两次的单词。删除任何不含文字的文档。
bag = bagOfWords(documentsTrain);bag = removeInfrequentWords(bag,2);包= removeEmptyDocuments(包);
对于验证数据,从验证文档创建一个单词包模型。您不需要从验证数据中删除任何单词,因为没有出现在拟合的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:numel(solvers) solver = solvers(I);lineSpec = linespes (i);如果解算器= =“savb”numIterationsPerDataPass = ceil(numObservations/1000);其他的numIterationsPerDataPass = 1;结束mdl = fitlda(bag,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
执行以下步骤:
使用标记化文本tokenizedDocument
.
把这些词用normalizeWords
.
删除使用的标点符号erasePunctuation
.
删除一个停止使用的单词列表(例如“and”,“of”和“the”)removeStopWords
.
删除含有2个或更少字符的单词removeShortWords
.
删除含有15个或更多字符的单词removeLongWords
.
函数documents = preprocessText(textData)标记文本。documents = tokenizedDocument(textData);把这些词记下来。文档= addPartOfSpeechDetails(文档);文档= normalizeWords“风格”,“引理”);删除标点符号。文档= erasePunctuation(文档);删除停止词列表。文档= removeStopWords(文档);删除2个或更少字符的单词,以及15个或更多字符的单词%字符。documents = removeShortWords(documents,2);documents = removeLongWords(documents,15);结束
tokenizedDocument
|bagOfWords
|removeStopWords
|logp
|fitlda
|ldaModel
|wordcloud
|removeInfrequentWords
|removeEmptyDocuments
|erasePunctuation
|removeShortWords
|removeLongWords
|normalizeWords
|addPartOfSpeechDetails