这个例子展示了如何比较潜在狄利克雷分配解决(LDA)通过比较拟合优度和时间适应模型。
导入一组抽象和分类标签从数学论文使用arXiv API。指定数量的记录导入使用importSize
变量。
importSize = 50000;
创建一个URL查询记录集“数学”
和元数据的前缀“arXiv”
。
url =“https://export.arxiv.org/oai2?verb=ListRecords”+…“集=数学”+…“&metadataPrefix = arXiv”;
提取抽象查询返回的文本和恢复令牌使用的URLparseArXivRecords
函数附加到这个例子作为支持文件。金宝app访问这个文件,打开这个例子作为一个活的脚本。注意,arXiv API之间的速率是有限的,需要等待多个请求。
[textData, ~, resumptionToken] = parseArXivRecords (url);
迭代进口更多的记录,直到达到所需的金额,或没有记录。继续从你离开的地方,进口记录使用恢复令牌从以前的结果查询中的URL。遵守速度限制强加的arXiv API,添加一个20秒的延迟在每个查询使用暂停
函数。
而元素个数(textData) < importSize如果resumptionToken = =”“打破结束url =“https://export.arxiv.org/oai2?verb=ListRecords”+…" &resumptionToken = "+ resumptionToken;暂停(20)[textDataNew、labelsNew resumptionToken] = parseArXivRecords (url);textData = [textData;textDataNew];结束
留出10%的随机文件进行验证。
numDocuments =元素个数(textData);本量利= cvpartition (numDocuments,“坚持”,0.1);textDataTrain = textData(培训(cvp));textDataValidation = textData(测试(cvp));
使用函数标记和文本数据进行预处理preprocessText
年底上市这个例子。
documentsTrain = preprocessText (textDataTrain);documentsValidation = preprocessText (textDataValidation);
从培训文档创建一个bag-of-words模型。删除的话,不会出现超过两倍。删除任何包含没有单词的文档。
袋= bagOfWords (documentsTrain);袋= removeInfrequentWords(袋,2);袋= removeEmptyDocuments(袋);
验证数据,创建一个bag-of-words模型的验证文件。你不需要删除任何单词从validaiton数据因为任何单词,不会出现在安装LDA模型自动忽略。
validationData = bagOfWords (documentsValidation);
LDA的解决者,适合一个模型与40个话题。区分解决当策划结果在同一轴上,指定不同的属性为每个解算器。
numTopics = 40;解决= [“研究生院理事会”“真空断路”“cvb0”“savb”];lineSpecs = [“+ -”“* - - - - - -”“x -”“啊——”];
适合一个LDA模型用每个解算器。对于每个解算器,指定初始浓度1主题,每个数据来验证模型一次通过,和不符合主题集中参数。使用中的数据FitInfo
属性的装备LDA模型,验证困惑和时间的阴谋。
随机解算器,默认情况下,使用mini-batch大小为1000每10迭代和验证模型。解算器,一旦每个数据通过验证模型,验证频率装天花板(numObservations / 1000)
,在那里numObservations
在训练数据的文档的数量。对于其他解决方案,验证频率设置为1。
随机的迭代解算器不评估验证困惑,随机解算器报告南
在FitInfo
财产。绘制验证困惑、删除报道的nan值。
numObservations = bag.NumDocuments;图为i = 1:元素个数(解决)解算器=解决(我);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)在结束持有从包含(“时间运行(s)”)ylabel (“验证困惑”)ylim([0正])传说(解决)
随机解算器,只有一个数据点。这是因为这个解算器通过输入数据一次。指定更多的数据,使用“DataPassLimit”
选择。批处理解决(“研究生院理事会”
,“真空断路”
,“cvb0”
),指定用于符合模型的迭代次数,使用“IterationLimit”
选择。
较低的验证困惑提出了一个更好的选择。通常,解决“savb”
和“研究生院理事会”
快速收敛的一个不错的选择。的解算器“cvb0”
可能收敛到一个更好的选择,但它可能需要更长的时间收敛。
为FitInfo
财产,fitlda
函数估计验证困惑从文档中概率的最大似然估计每个文档主题概率。这通常是更快的计算,但是可以比其他方法不准确。另外,计算验证使用的困惑logp
函数。这个函数计算更精确值但可以运行的时间较长。为一个例子,演示如何使用计算困惑logp
,请参阅从字数计算文档Log-Probabilities矩阵。
这个函数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);结束
tokenizedDocument
|bagOfWords
|removeStopWords
|logp
|fitlda
|ldaModel
|wordcloud
|removeInfrequentWords
|removeEmptyDocuments
|erasePunctuation
|removeShortWords
|removeLongWords
|normalizeWords
|addPartOfSpeechDetails