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