这个例子展示了如何通过比较拟合优度和拟合模型所用的时间比较隐含狄利克雷分配(LDA)求解。
从使用的arXiv API学论文导入集摘要和类别的标签。指定的记录,使用进口数量importSize
变量。请注意,API的arXiv仅限于查询同时1000篇率,需要请求之间等待。
importSize = 50000;
导入第一组记录。
URL =“https://export.arxiv.org/oai2?verb=ListRecords”+...“&组=数学”+...“&metadataPrefix =的arXiv”;选项= weboptions('超时',160);代码= webread(URL,选项);
解析返回的XML内容,并创建数组htmlTree
对象包含的记录信息。
树= htmlTree(代码);子树= findElement(树,“记录”);numel(子树)
迭代进口记录多个数据块,直到达到所需要的量,或者没有更多的记录。要继续从你离开的地方进行导入记录,使用resumptionToken
从前面的结果属性。要坚持通过API的arXiv施加的速率限制,使用每个查询前加20秒的延迟暂停
功能。
而numel(子树)“resumptionToken”);如果的isEmpty(subtreeResumption)打破结束resumptionToken = extractHTMLText(subtreeResumption);URL =“https://export.arxiv.org/oai2?verb=ListRecords”+...“&resumptionToken =”+ resumptionToken;暂停(20)代码= webread(URL,选项);树= htmlTree(代码);子树= [子树;findElement(树,“记录”)];结束
提取解析HTML树摘要和标签。
找出“<抽象>”
使用元件findElement
功能。
subtreesAbstract = htmlTree(“”);对于I = 1:numel(子树)subtreesAbstract(ⅰ)= findElement(子树(i)中,“抽象”);结束
提取从含有使用的摘要的子树的文本数据extractHTMLText
功能。
的TextData = extractHTMLText(subtreesAbstract);
随机进行验证设置文件的预留30%。
numDocuments = numel(的TextData);CVP = cvpartition(numDocuments,'坚持',0.1);textDataTrain =的TextData(训练(CVP));textDataValidation =的TextData(试验(CVP));
令牌化和使用进行预处理功能的文本数据preprocessText
其列在该实施例中的端部。
documentsTrain = preprocessText(textDataTrain);documentsValidation = preprocessText(textDataValidation);
创建一个从训练文档中袋的词模型。删除总数没有出现两倍以上的话。删除不包含任何文字文件。
袋= bagOfWords(documentsTrain);袋= removeInfrequentWords(袋,2);袋= removeEmptyDocuments(袋);
为了验证数据,创建验证文档的袋的词模型。你并不需要从validaiton数据删除任何话,因为没有出现在拟合LDA模型的任何话都自动忽略。
validationData = bagOfWords(documentsValidation);
对于每个LDA解算器,适合与40个主题的典范。为了绘制在同一个轴上的结果时区分解算器,指定每个解算器不同的线路属性。
numTopics = 40;解算器= [“CGS”“AVB”“cvb0”“SAVB”]。lineSpecs = [“+ - ”“* - ”“X-”“邻”]。
适合使用每个求解器的LDA模型。对于每个解算器中,指定初始主题浓度1,来验证模型每一次数据传递,并且不适合主题浓度参数。使用中的数据FitInfo
拟合LDA模型的性质,情节验证困惑和经过时间。
随机求解器,默认情况下,使用1000小批量大小和验证模型,每10次迭代。对于该解算器,来验证模型每一次数据传递,设置验证频率小区(numObservations / 1000)
,其中numObservations
是在训练数据文件的数量。对于其他解算器,所述验证频率设置为1。
对于随机解算器不评估验证困惑,随机求解报告的迭代为NaN
在里面FitInfo
属性。要绘制验证困惑,从报告的值删除NaN的。
numObservations = bag.NumDocuments;数字对于I = 1:numel(解算器)求解=求解器(I);一个linespec = lineSpecs(ⅰ);如果求解==“SAVB”numIterationsPerDataPass =小区(numObservations / 1000);其他numIterationsPerDataPass = 1;结束MDL = fitlda(袋,numTopics,...“求解”,解算器,...'InitialTopicConcentration'1,...'FitTopicConcentration',假,...'ValidationData',validationData,...'ValidationFrequency',numIterationsPerDataPass,...“放牧”,0);记录= mdl.FitInfo.History;timeElapsed = history.TimeSinceStart;validationPerplexity = history.ValidationPerplexity;%删除NaN的。IDX = isnan(validationPerplexity);timeElapsed(IDX)= [];validationPerplexity(IDX)= [];图(timeElapsed,validationPerplexity,一个linespec)保持上结束保持离xlabel(“经过时间(S)”)ylabel(“验证困惑”)ylim([0 INF])图例(解算器)
对于随机解算器,只有一个数据点。这是因为该解算器通过输入一次数据。要指定更多的数据传递,使用'DataPassLimit'
选项。对于批处理求解器(“CGS”
,“AVB”
和“cvb0”
),指定用于拟合模型迭代次数,使用'IterationLimit'
选项。
较低的验证困惑提出了一种更适合。通常,求解“SAVB”
和“CGS”
迅速收敛到一个不错的选择。求解器“cvb0”
可能会收敛到一个更适合,但它可以更长采取收敛。
为了FitInfo
特性,fitlda
函数估计从文档的概率在每个文档的主题概率的最大似然估计验证困惑。这通常更快地计算为,但可以比其它方法更准确。可替代地,使用所述计算出的验证困惑的logP
功能。此函数计算更精确的值,但需要更长的时间来运行。对于示出了如何使用计算困惑的示例的logP
见计算文档记录,出现概率字数矩阵。
功能preprocessText
执行以下步骤:
使用令牌化文本tokenizedDocument
。
Lemmatize使用的话normalizeWords
。
擦除使用标点符号erasePunctuation
。
除去的停止词列表(例如,“和”,“中”,和“该”),使用removeStopWords
。
使用2个或更少的字符删除话removeShortWords
。
使用15个或更多字符的删除单词removeLongWords
。
功能文档= preprocessText(的TextData)%记号化的文字。文档= tokenizedDocument(的TextData);%Lemmatize的话。文档= addPartOfSpeechDetails(文件);文档= normalizeWords(文档,'风格','引理');%擦除标点符号。文档= erasePunctuation(文件);%删除停用词列表。文档= removeStopWords(文件);%与2个或更少的字符删除词语,并用15或更大的话%字符。文档= removeShortWords(文件,2);文档= removeLongWords(文件,15);结束
addPartOfSpeechDetails
|bagOfWords
|erasePunctuation
|fitlda
|ldaModel
|的logP
|normalizeWords
|removeEmptyDocuments
|removeInfrequentWords
|removeLongWords
|removeShortWords
|removeStopWords
|tokenizedDocument
|wordcloud