В этом примере показано, как сохранить текст из файла в виде строкового массива, отсортировать слова по их частоте, построить график результата и собрать базовую статистику для слов, найденных в файле.
Прочитать текст из «Сонетов Шекспира» с fileread функция. fileread возвращает текст в виде символьного вектора 1 на 100266.
sonnets = fileread('sonnets.txt');
sonnets(1:35)ans =
'THE SONNETS
by William Shakespeare'
Преобразование текста в строку с помощью string функция. Затем разделите его на символы новой строки с помощью splitlines функция. sonnets становится массивом строк 2625 на 1, где каждая строка содержит одну строку из стихотворений. Отображение первых пяти строк sonnets.
sonnets = string(sonnets); sonnets = splitlines(sonnets); sonnets(1:5)
ans = 5x1 string
"THE SONNETS"
""
"by William Shakespeare"
""
""
Вычисление частоты слов в sonnets, сначала очистите его, удалив пустые строки и знаки препинания. Затем преобразуйте его в строковый массив, содержащий отдельные слова в качестве элементов.
Удалить строки с нулевыми символами ("") из массива строк. Сравнить каждый элемент sonnets кому "", пустая строка. Начиная с R2017a, можно создавать строки, включая пустую строку, используя двойные кавычки. TF является логическим вектором, который содержит истинное значение, где sonnets содержит строку с нулевыми символами. Проиндексировать в sonnets с TF и удалите все строки с нулевыми символами.
TF = (sonnets == "");
sonnets(TF) = [];
sonnets(1:10)ans = 10x1 string
"THE SONNETS"
"by William Shakespeare"
" I"
" From fairest creatures we desire increase,"
" That thereby beauty's rose might never die,"
" But as the riper should by time decease,"
" His tender heir might bear his memory:"
" But thou, contracted to thine own bright eyes,"
" Feed'st thy light's flame with self-substantial fuel,"
" Making a famine where abundance lies,"
Замените некоторые знаки препинания пробелами. Например, замените точки, запятые и точки с запятой. Храните апострофы, потому что они могут быть частью некоторых слов в сонетах, таких как свет.
p = [".","?","!",",",";",":"]; sonnets = replace(sonnets,p," "); sonnets(1:10)
ans = 10x1 string
"THE SONNETS"
"by William Shakespeare"
" I"
" From fairest creatures we desire increase "
" That thereby beauty's rose might never die "
" But as the riper should by time decease "
" His tender heir might bear his memory "
" But thou contracted to thine own bright eyes "
" Feed'st thy light's flame with self-substantial fuel "
" Making a famine where abundance lies "
Стрип начальных и конечных символов пробела из каждого элемента sonnets.
sonnets = strip(sonnets); sonnets(1:10)
ans = 10x1 string
"THE SONNETS"
"by William Shakespeare"
"I"
"From fairest creatures we desire increase"
"That thereby beauty's rose might never die"
"But as the riper should by time decease"
"His tender heir might bear his memory"
"But thou contracted to thine own bright eyes"
"Feed'st thy light's flame with self-substantial fuel"
"Making a famine where abundance lies"
Разделение sonnets в строковый массив, элементы которого являются отдельными словами. Вы можете использовать split функция для разделения элементов строкового массива на символы пробела или на заданные разделители. Однако split требует, чтобы каждый элемент строкового массива был разделен на равное количество новых строк. Элементы sonnets имеют разное количество пробелов и поэтому не делятся на равные числа строк. Для использования split функция на sonnets, запишите цикл for, который вызывает split на одном элементе за один раз.
Создать пустой строковый массив sonnetWords с использованием strings функция. Запишите цикл for, разделяющий каждый элемент sonnets с использованием split функция. Объединение выходных данных split на sonnetWords. Каждый элемент sonnetWords является отдельным словом из sonnets.
sonnetWords = strings(0); for i = 1:length(sonnets) sonnetWords = [sonnetWords ; split(sonnets(i))]; end sonnetWords(1:10)
ans = 10x1 string
"THE"
"SONNETS"
"by"
"William"
"Shakespeare"
"I"
"From"
"fairest"
"creatures"
"we"
Найдите уникальные слова в sonnetWords. Подсчитайте их и сортируйте по частоте.
Для подсчета слов, различающихся только по регистру как одно и то же слово, преобразуйте sonnetWords в нижний регистр. Например, The и the count как одно и то же слово. Поиск уникальных слов с помощью unique функция. Затем подсчитайте количество раз, когда каждое уникальное слово встречается с помощью histcounts функция.
sonnetWords = lower(sonnetWords); [words,~,idx] = unique(sonnetWords); numOccurrences = histcounts(idx,numel(words));
Сортировка слов в sonnetWords по количеству вхождений, от большинства до наименьших распространенных.
[rankOfOccurrences,rankIndex] = sort(numOccurrences,'descend');
wordsByFrequency = words(rankIndex);Постройте график появления слов в сонетах из наиболее или менее распространенных слов. Закон Ципфа гласит, что распределение встречаемости слов в большом тексте тела следует за распределением степенного закона.
loglog(rankOfOccurrences); xlabel('Rank of word (most to least common)'); ylabel('Number of Occurrences');

Отображение десяти наиболее распространенных слов в сонетах.
wordsByFrequency(1:10)
ans = 10x1 string
"and"
"the"
"to"
"my"
"of"
"i"
"in"
"that"
"thy"
"thou"
Вычислите общее количество вхождений каждого слова в sonnetWords. Вычислите количество вхождений в процентах от общего числа слов и вычислите суммарный процент от большинства до наименьших общих. Запишите слова и основные статистические данные в таблицу.
numOccurrences = numOccurrences(rankIndex); numOccurrences = numOccurrences'; numWords = length(sonnetWords); T = table; T.Words = wordsByFrequency; T.NumOccurrences = numOccurrences; T.PercentOfText = numOccurrences / numWords * 100.0; T.CumulativePercentOfText = cumsum(numOccurrences) / numWords * 100.0;
Отображение статистики по десяти наиболее распространенным словам.
T(1:10,:)
ans=10×4 table
Words NumOccurrences PercentOfText CumulativePercentOfText
______ ______________ _____________ _______________________
"and" 490 2.7666 2.7666
"the" 436 2.4617 5.2284
"to" 409 2.3093 7.5377
"my" 371 2.0947 9.6324
"of" 370 2.0891 11.722
"i" 341 1.9254 13.647
"in" 321 1.8124 15.459
"that" 320 1.8068 17.266
"thy" 280 1.5809 18.847
"thou" 233 1.3156 20.163
Наиболее распространённое слово в Сонетах, и, встречается 490 раз. Вместе на десять наиболее распространенных слов приходится 20,163% текста.
histcounts | join | lower | replace | sort | split | splitlines | string | strip | table | unique