主要内容

比较LDA求解器

此示例显示如何通过比较适合的良好和适合模型所需的时间来比较潜在的Dirichlet分配(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秒的延迟暂停函数。

元素个数(textData) < importSize如果resumpathtToken ==.打破结尾url =“https://export.arxiv.org/oai2?verb=listrecords”+......" &resumptionToken = "+ resumplateToken;暂停(20)[textdatanew,labelsnew,resumplateToken] = ParsearxivRecords(URL);textdata = [textdata;textdatanew];结尾

预处理文本数据

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

numdocuments = numel(textdata);cvp = cvpartition(numfocuments,'坚持',0.1);TextDataTrain = TextData(培训(CVP));TextDataValidation = TextData(测试(CVP));

使用该功能授权和预处理文本数据PreprocessText.在本例的最后列出。

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

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

bag = bagofwords(DocumentStrain);袋= removeinfreqwinds(袋子,2);BAG = RoverimementyDocuments(袋);

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

ValidationData = BagofWords(DocumentSvalidation);

拟合和比较模型

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

numtopics = 40;solvers = [“cgs”“avb”“cvb0”“savb”];线条= [“+ -”“* - - - - - -”“X-”“O-”];

使用每个求解器拟合LDA模型。对于每个求解器,指定初始主题浓度1,每通过一次数据验证模型一次,不拟合主题浓度参数。使用的数据FitInfo.适合LDA模型的性能,绘制验证困惑和经过的时间。

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

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

numObservations = bag.NumDocuments;数字为了i = 1:磁性(求解器)求解器=溶剂(i);LinesPec = LinesPecs(i);如果解算器= =“savb”numitrationsperdatapass = ceil(numobservations / 1000);别的numIterationsPerDataPass = 1;结尾mdl = fitlda(袋、numTopics、......“规划求解”解算器,......'initialtopicconcentration',1,......“FitTopicConcentration”假的,......“ValidationData”,validationdata,......“ValidationFrequency”,numiterationsperdatapass,......'verbose', 0);历史= mdl.FitInfo.History;timeElapsed = history.TimeSinceStart;validationPerplexity = history.ValidationPerplexity;%删除NANS。IDX = ISNAN(验证性分解);时态(IDX)= [];验证性分解性(IDX)= [];绘图(定期,验证分布,线路销料)保持结尾抓住包含(“时间运行(s)”) ylabel (“验证困惑”)ylim([0 inf])传奇(求解器)

对于随机求解器,只有一个数据点。这是因为这个解算器只传递一次输入数据。要指定更多的数据传递,请使用'datapasslimit'选项。对于批量溶剂(“cgs”“avb”,“cvb0”),要指定用于适合模型的迭代次数,请使用'iterationlimit'选项。

较低的验证困惑表明更好。通常,求解器“savb”“cgs”迅速收敛到良好的契合。求解器“cvb0”可能会收敛到更好的合适,但它可能需要更长的时间来融合。

为了FitInfo.财产,菲达函数估计从文档概率的验证困惑以每份文档主题概率的最大似然估计。这通常更快地计算,但不能比其他方法更准确。或者,使用该计算验证困惑logp函数。这个函数计算更精确的值,但运行时间更长。举一个例子,说明如何使用logp, 看从单词计数矩阵计算文档日志的概率

预处理功能

这个函数PreprocessText.执行以下步骤:

  1. 使用授权文本tokenizedDocument

  2. 使用的单词释放正常化字

  3. 删除标点符号使用erasePunctuation

  4. 删除使用的停止单词列表(例如“和”,“和”和“该”)的列表Removestopwords.

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

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

函数文件= preprocessText (textData)标记文本。文档= tokenizeddocument(textdata);%lemmatize单词。= addPartOfSpeechDetails文件(文档);文档= normalizeWords(文档,'风格''引理');%擦掉标点符号。= erasePunctuation文件(文档);%删除停止单词列表。文档= Removestopwords(文件);%删除2个或更少的单词,以及15个或更大的单词%字符。文件= removeShortWords(文件,2);= removeLongWords文档(文档、15);结尾

也可以看看

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

相关的话题