当前位置:   article > 正文

在MATLAB中使用主题模型对福尔摩斯书籍进行文本分析_matlab 文本分析

matlab 文本分析

由于之前主要研究现代信号处理,对自然语言处理NLP不太了解,所以这篇文章诸位权当看个乐子。

福尔摩斯就不介绍了,大家都懂的,因此直接进入正题。本文使用Latent Dirichlet Allocation(LDA)主题模型分析福尔摩斯的原著小说和短篇小说中的文本。 LDA 是自然语言处理中的生成统计模型,可以发现文档中的潜在主题并推断主题中的单词概率,本文分为2个部分。在第1部分中,仅涉及福尔摩斯的原创作品。 2个数据集的总词数分别为203936个和454214,一共处理和分析了 658,150 个单词。福尔摩斯原著小说中共发现了4个主题,分别是“sir, holmes, think, case, watson“(“福尔摩斯与华生—友谊与主角”),“say, come, know, well, man”(“谜团和解谜”),“时间,小,房间,方式,发现”(“困难(例如时间和空间限制)”)和“人,得到,拿,问,做"(“案例的属性”)。在第 2 部分中,使用 3 部经典小说(简·奥斯汀的《理智与情感》、艾米莉·勃朗特的《呼啸山庄》和夏洛特·勃朗特的《简爱》)与福尔摩斯的短篇故事集来训练另一个 LDA 模型。第2部分新增的3部经典小说(《理智与情感》、《呼啸山庄》和《简爱》)分别为186302字、116537字和119580字,合计422419字。

首先开始第一部分,从第1组小说中加载和提取文本数据

  1. data = readtable("SH_novels.csv",TextType="string");
  2. head(data)

  1. textData = data.Text;
  2. textData(1:4)

准备用于分析的文本数据

定义停用词列表

  1. customStopWords = [stopWords "down" "upon" "back" "though" "away"];
  2. reshape(customStopWords,[46 5])

然后进行处理

  1. documents = preprocessText(textData);
  2. documents(1:4)

创建词袋模型

bag = bagOfWords(documents)

词袋模型中删除总共出现不超过2次的词,并从词袋模型中删除任何不包含单词的文档。

  1. bag = removeInfrequentWords(bag,2);
  2. bag = removeEmptyDocuments(bag)

列出第一组小说中排名靠前的单词的频率

找出模型中排名前 20 的单词

  1. k = 20;
  2. T = topkwords(bag,k)

选择 LDA 模型的主题数量

随机留出 25% 的文档进行验证

  1. numDocuments = numel(documents)
  2. cvp = cvpartition(numDocuments,'HoldOut',0.25);
  3. documentsTrain = documents(cvp.training);
  4. documentsValidation = documents(cvp.test);

从训练文档创建一个词袋模型,删除总共不超过两次的单词,删除任何不包含单词的文档

  1. bagTrain = bagOfWords(documentsTrain);
  2. bagTrain = removeInfrequentWords(bagTrain,2);
  3. bagTrain = removeEmptyDocuments(bagTrain);

选择与其他数量的主题相比最小化perplexity的主题

  1. for i = 1:numel(numTopicsRange)
  2. numTopicsTrain = numTopicsRange(i);
  3. mdl = fitlda(bagTrain,numTopicsTrain, ...
  4. 'Solver','savb', ...
  5. 'Verbose',0);
  6. [~,validationPerplexity(i)] = logp(mdl,documentsValidation);
  7. timeElapsed(i) = mdl.FitInfo.History.TimeSinceStart(end);
  8. end

显示图中每个主题数量的perplexity和时间

  1. figure
  2. yyaxis left
  3. plot(numTopicsRange,validationPerplexity,'+-')
  4. ylabel("Validation Perplexity")
  5. yyaxis right
  6. plot(numTopicsRange,timeElapsed,'o-')
  7. ylabel("Time Elapsed (s)")
  8. legend(["Validation Perplexity" "Time Elapsed (s)"],'Location','southeast')
  9. xlabel("Number of Topics")

上图表明,拟合具有 3 个主题的模型效果还是不错的

LDA 模型拟合

尽管在上面的方法中发现这组文档的最佳主题数是 3,但在运行期间发现,拟合具有 4 个主题的 LDA 模型所需的时间也不多

  1. rng("default")
  2. numTopics = 4;
  3. mdl = fitlda(bag,numTopics,Verbose=0);

使用Word Clouds可视化主题

列出第一组小说中每个主题的 5 个热门词

  1. k = 5;
  2. for topicIdx = 1:numTopics
  3. "Topic "+ topicIdx + " in Novels:"
  4. tbl = topkwords(mdl,k,topicIdx)
  5. topWords(topicIdx) = join(tbl.Word,", ");
  6. end

tbl = 5×2 table

WordScore
1"sir"0.0227
2"holmes"0.0134
3"think"0.0109
4"case"0.0105
5"watson"0.0104

tbl = 5×2 table

WordScore
1"say"0.0453
2"come"0.0313
3"know"0.0198
4"well"0.0174
5"man"0.0152

tbl = 5×2 table

WordScore
1"time"0.0185
2"little"0.0147
3"room"0.0120
4"way"0.0116
5"find"0.0115

tbl = 5×2 table

WordScore
1"man"0.0301
2"get"0.0159
3"take"0.0143
4"ask"0.0137
5"make"0.0127

查看第一组小说的主题概率

  1. figure
  2. bar(mdl.CorpusTopicProbabilities)
  3. xlabel("Topic")
  4. xticklabels(topWords);
  5. ylabel("Probability")
  6. title("Document Topic Probabilities in Novels")

  1. figure
  2. barh(mdl.DocumentTopicProbabilities,"stacked")
  3. xlim([0 1])
  4. title("Topic Mixtures in Novels")
  5. xlabel("Topic Probability")
  6. yticklabels(data.Title)
  7. legend(topWords, ...
  8. Location="southoutside", ...
  9. NumColumns=1)

使用分组条形图可视化多个主题的组合

未完待续

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/447548
推荐阅读
相关标签
  

闽ICP备14008679号