В этом примере показано, как хранить текст из файла как строковые массивы, отсортировать слова по их частоте, построить график результата и собрать базовую статистику для слов, найденных в файле.
Прочитайте текст из сонетов Шекспира с 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-loop, который вызывает split по одному элементу за раз.
Создайте пустые строковые массивы sonnetWords использование strings функция. Напишите цикл for-loop, который разделяет каждый элемент 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 считайте как то же слово. Найти уникальные слова используя 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