Логарифмические вероятности документа и качество подгонки модели LDA
___ = logp(___,
задает дополнительные опции с помощью одного или нескольких аргументов пары "имя-значение".Name,Value
)
Чтобы воспроизвести результаты в этом примере, установите rng
к 'default'
.
rng('default')
Загрузите данные в качестве примера. Файл sonnetsPreprocessed.txt
содержит предварительно обработанные версии сонетов Шекспира. Файл содержит один сонет на строку со словами, разделенными пробелом. Извлеките текст из sonnetsPreprocessed.txt
, разделите текст в документы в символах новой строки, и затем маркируйте документы.
filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);
Создайте модель сумки слов использование bagOfWords
.
bag = bagOfWords(documents)
bag = bagOfWords with properties: Counts: [154x3092 double] Vocabulary: [1x3092 string] NumWords: 3092 NumDocuments: 154
Подбирайте модель LDA с 20 темами. Чтобы подавить многословный выход, установите 'Verbose'
к 0.
numTopics = 20;
mdl = fitlda(bag,numTopics,'Verbose',0);
Вычислите логарифмические вероятности документа учебных материалов и покажите им в гистограмме.
logProbabilities = logp(mdl,documents); figure histogram(logProbabilities) xlabel("Log Probability") ylabel("Frequency") title("Document Log-Probabilities")
Идентифицируйте эти три документа с самой низкой логарифмической вероятностью. Низкая логарифмическая вероятность может предположить, что документ может быть выбросом.
[~,idx] = sort(logProbabilities); idx(1:3)
ans = 3×1
146
19
65
documents(idx(1:3))
ans = 3x1 tokenizedDocument: 76 tokens: poor soul centre sinful earth sinful earth rebel powers array why dost thou pine suffer dearth painting thy outward walls costly gay why large cost short lease dost thou upon thy fading mansion spend shall worms inheritors excess eat up thy charge thy bodys end soul live thou upon thy servants loss let pine aggravate thy store buy terms divine selling hours dross fed rich shall thou feed death feeds men death once dead theres dying 76 tokens: devouring time blunt thou lions paws make earth devour own sweet brood pluck keen teeth fierce tigers jaws burn longlivd phoenix blood make glad sorry seasons thou fleets whateer thou wilt swiftfooted time wide world fading sweets forbid thee heinous crime o carve thy hours loves fair brow nor draw lines thine antique pen thy course untainted allow beautys pattern succeeding men yet thy worst old time despite thy wrong love shall verse ever live young 73 tokens: brass nor stone nor earth nor boundless sea sad mortality oersways power rage shall beauty hold plea whose action stronger flower o shall summers honey breath hold against wrackful siege battering days rocks impregnable stout nor gates steel strong time decays o fearful meditation alack shall times best jewel times chest lie hid strong hand hold swift foot back spoil beauty forbid o none unless miracle might black ink love still shine bright
Загрузите данные в качестве примера. sonnetsCounts.mat
содержит матрицу подсчетов слов и соответствующий словарь предварительно обработанных версий сонетов Шекспира.
load sonnetsCounts.mat
size(counts)
ans = 1×2
154 3092
Подбирайте модель LDA с 20 темами.
numTopics = 20; mdl = fitlda(counts,numTopics)
Initial topic assignments sampled in 0.039264 seconds. ===================================================================================== | Iteration | Time per | Relative | Training | Topic | Topic | | | iteration | change in | perplexity | concentration | concentration | | | (seconds) | log(L) | | | iterations | ===================================================================================== | 0 | 0.26 | | 1.159e+03 | 5.000 | 0 | | 1 | 0.14 | 5.4884e-02 | 8.028e+02 | 5.000 | 0 | | 2 | 0.11 | 4.7400e-03 | 7.778e+02 | 5.000 | 0 | | 3 | 0.10 | 3.4597e-03 | 7.602e+02 | 5.000 | 0 | | 4 | 0.13 | 3.4662e-03 | 7.430e+02 | 5.000 | 0 | | 5 | 0.03 | 2.9259e-03 | 7.288e+02 | 5.000 | 0 | | 6 | 0.10 | 6.4180e-05 | 7.291e+02 | 5.000 | 0 | =====================================================================================
mdl = ldaModel with properties: NumTopics: 20 WordConcentration: 1 TopicConcentration: 5 CorpusTopicProbabilities: [1x20 double] DocumentTopicProbabilities: [154x20 double] TopicWordProbabilities: [3092x20 double] Vocabulary: [1x3092 string] TopicOrder: 'initial-fit-probability' FitInfo: [1x1 struct]
Вычислите логарифмические вероятности документа учебных материалов. Задайте, чтобы чертить 500 выборок для каждого документа.
numSamples = 500; logProbabilities = logp(mdl,counts, ... 'NumSamples',numSamples);
Покажите логарифмические вероятности документа в гистограмме.
figure histogram(logProbabilities) xlabel("Log Probability") ylabel("Frequency") title("Document Log-Probabilities")
Идентифицируйте индексы этих трех документов с самой низкой логарифмической вероятностью.
[~,idx] = sort(logProbabilities); idx(1:3)
ans = 3×1
146
19
65
Сравните качество подгонки для двух моделей LDA путем вычисления недоумения протянутого набора тестов документов.
Чтобы воспроизвести результаты, установите rng
к 'default'
.
rng('default')
Загрузите данные в качестве примера. Файл sonnetsPreprocessed.txt
содержит предварительно обработанные версии сонетов Шекспира. Файл содержит один сонет на строку со словами, разделенными пробелом. Извлеките текст из sonnetsPreprocessed.txt
, разделите текст в документы в символах новой строки, и затем маркируйте документы.
filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);
Отложите 10% документов наугад для тестирования.
numDocuments = numel(documents);
cvp = cvpartition(numDocuments,'HoldOut',0.1);
documentsTrain = documents(cvp.training);
documentsTest = documents(cvp.test);
Создайте модель сумки слов из учебных материалов.
bag = bagOfWords(documentsTrain)
bag = bagOfWords with properties: Counts: [139x2909 double] Vocabulary: [1x2909 string] NumWords: 2909 NumDocuments: 139
Подбирайте модель LDA с 20 темами к модели сумки слов. Чтобы подавить многословный выход, установите 'Verbose'
к 0.
numTopics = 20;
mdl1 = fitlda(bag,numTopics,'Verbose',0);
Просмотрите информацию о подгонке модели.
mdl1.FitInfo
ans = struct with fields:
TerminationCode: 1
TerminationStatus: "Relative tolerance on log-likelihood satisfied."
NumIterations: 26
NegativeLogLikelihood: 5.6915e+04
Perplexity: 742.7118
Solver: "cgs"
History: [1x1 struct]
Вычислите недоумение протянутого набора тестов.
[~,ppl1] = logp(mdl1,documentsTest)
ppl1 = 781.6078
Подбирайте модель LDA с 40 темами к модели сумки слов.
numTopics = 40;
mdl2 = fitlda(bag,numTopics,'Verbose',0);
Просмотрите информацию о подгонке модели.
mdl2.FitInfo
ans = struct with fields:
TerminationCode: 1
TerminationStatus: "Relative tolerance on log-likelihood satisfied."
NumIterations: 37
NegativeLogLikelihood: 5.4466e+04
Perplexity: 558.8685
Solver: "cgs"
History: [1x1 struct]
Вычислите недоумение протянутого набора тестов.
[~,ppl2] = logp(mdl2,documentsTest)
ppl2 = 808.6602
Более низкое недоумение предполагает, что модель может быть лучшей подгонкой к протянутым тестовым данным.
ldaMdl
— Модель Input LDAldaModel
объектВведите модель LDA в виде ldaModel
объект.
documents
— Введите документыtokenizedDocument
массив | массив строк слов | массив ячеек из символьных векторовВведите документы в виде tokenizedDocument
массив, массив строк слов или массив ячеек из символьных векторов. Если documents
не tokenizedDocument
массив, затем это должен быть вектор-строка, представляющий единый документ, где каждым элементом является слово. Чтобы задать несколько документов, используйте tokenizedDocument
массив.
bag
— Модель InputbagOfWords
возразите | bagOfNgrams
объектВведите сумку слов или мешок n модели граммов в виде bagOfWords
возразите или bagOfNgrams
объект. Если bag
bagOfNgrams
объект, затем функция обрабатывает каждую n-грамму как отдельное слово.
counts
— Подсчет частот словПодсчет частот слов в виде матрицы неотрицательных целых чисел. Если вы задаете 'DocumentsIn'
быть 'rows'
, затем значение counts(i,j)
соответствует числу раз, j th слово словаря появляется в i th документ. В противном случае, значение counts(i,j)
соответствует числу раз, i th слово словаря появляется в j th документ.
Задайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
'NumSamples',500
задает, чтобы чертить 500 выборок для каждого документа'DocumentsIn'
— Ориентация документов'rows'
(значение по умолчанию) | 'columns'
Ориентация документов в матрице для подсчета количества слов в виде разделенной запятой пары, состоящей из 'DocumentsIn'
и одно из следующего:
'rows'
– Вход является матрицей подсчетов слов со строками, соответствующими документам.
'columns'
– Вход является транспонированной матрицей подсчетов слов со столбцами, соответствующими документам.
Эта опция только применяется, если вы задаете входные документы как матрицу подсчетов слов.
Примечание
Если вы ориентируете свою матрицу для подсчета количества слов так, чтобы документы соответствовали столбцам и задали 'DocumentsIn','columns'
, затем вы можете испытать значительное сокращение во время выполнения оптимизации.
'NumSamples'
— Количество выборок, чтобы чертитьКоличество выборок, чтобы чертить для каждого документа в виде разделенной запятой пары, состоящей из 'NumSamples'
и положительное целое число.
Пример: 'NumSamples',500
logProb
— Логарифмические вероятностиЛогарифмические вероятности документов в соответствии с моделью LDA, возвращенной как числовой вектор.
ppl
— НедоумениеНедоумение документов вычисляется от логарифмических вероятностей, возвращенных как положительная скалярная величина.
logp
использует выполненный с помощью итераций псевдометод счета, описанный в
[1] Уоллак, Ханна М., Иэн Мюррей, Руслан Салахутдинов и Дэвид Мимно. "Методы оценки для моделей темы". В Продолжениях 26-й ежегодной международной конференции по вопросам машинного обучения, стр 1105–1112. ACM, 2009. Гарвард
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.